From fce4c949b3130131ec969506dd7244cc2737a15d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deniz=20D=C3=BCzg=C3=B6ren?= Date: Wed, 21 Aug 2019 10:26:54 +0200 Subject: [PATCH] Ping service now subscribes to Firebase topics every 15 minutes to keep the app alive, courses and rooms are now struck through if the course is cancelled --- app/build.gradle | 13 ++---- app/src/main/AndroidManifest.xml | 5 ++ .../denizd/substitutionplan/CardAdapter.kt | 8 +++- .../substitutionplan/FBNotificationService.kt | 5 +- .../denizd/substitutionplan/FBPingService.kt | 46 +++++++++++++++++++ .../java/com/denizd/substitutionplan/Main.kt | 26 +++++++---- .../substitutionplan/SettingsFragment.kt | 20 ++++---- .../denizd/substitutionplan/SubstDatabase.kt | 8 ++-- .../main/res/layout/diagnostics_dialog.xml | 2 +- 9 files changed, 98 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/com/denizd/substitutionplan/FBPingService.kt diff --git a/app/build.gradle b/app/build.gradle index b95dbe9..7218425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.denizd.substitutionplan" minSdkVersion 21 targetSdkVersion 28 - versionCode 27 - versionName "2.2.4" + versionCode 28 + versionName "2.2.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -27,17 +27,14 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.1.0-rc1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.2.0-beta01' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-beta01' implementation 'org.jsoup:jsoup:1.11.3' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.recyclerview:recyclerview:1.1.0-beta02' + implementation 'androidx.recyclerview:recyclerview:1.1.0-beta03' implementation 'com.google.android.material:material:1.1.0-alpha09' implementation 'com.android.support:customtabs:28.0.0' - implementation 'com.google.firebase:firebase-core:17.0.1' - implementation 'com.google.firebase:firebase-messaging:19.0.1' + implementation 'com.google.firebase:firebase-core:17.1.0' + implementation 'com.google.firebase:firebase-messaging:20.0.0' // implementation 'androidx.core:core-ktx:1.0.2' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1285c7c..f29991b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/CardAdapter.kt b/app/src/main/java/com/denizd/substitutionplan/CardAdapter.kt index 6afd0fe..ae6c15a 100644 --- a/app/src/main/java/com/denizd/substitutionplan/CardAdapter.kt +++ b/app/src/main/java/com/denizd/substitutionplan/CardAdapter.kt @@ -63,6 +63,12 @@ class CardAdapter(private var mSubst: List) : RecyclerView.Adapter) : RecyclerView.Adapter "Maths" "eng", "enp", "ena" -> "English" "spo", "spp", "spth" -> "PhysEd" - "pol", "pop" -> "ics" + "pol", "pop" -> "Politics" "dar", "dap" -> "Theatre" "phy", "php" -> "Physics" "bio", "bip", "nw1", "nw2", "nw3", "nw4" -> "Biology" diff --git a/app/src/main/java/com/denizd/substitutionplan/FBNotificationService.kt b/app/src/main/java/com/denizd/substitutionplan/FBNotificationService.kt index 8007ab2..fbf6dc6 100644 --- a/app/src/main/java/com/denizd/substitutionplan/FBNotificationService.kt +++ b/app/src/main/java/com/denizd/substitutionplan/FBNotificationService.kt @@ -5,7 +5,8 @@ import com.google.firebase.messaging.RemoteMessage class FBNotificationService : FirebaseMessagingService() { - override fun onMessageReceived(p0: RemoteMessage?) { - DataFetcher(true, true, true, applicationContext, application, null).execute() + override fun onMessageReceived(p0: RemoteMessage) { + DataFetcher(isplan = true, ismenu = true, isjobservice = true, context = applicationContext, + application = application, parentview = null).execute() } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/FBPingService.kt b/app/src/main/java/com/denizd/substitutionplan/FBPingService.kt new file mode 100644 index 0000000..10d369e --- /dev/null +++ b/app/src/main/java/com/denizd/substitutionplan/FBPingService.kt @@ -0,0 +1,46 @@ +package com.denizd.substitutionplan + +import android.app.job.JobParameters +import android.app.job.JobService +import android.preference.PreferenceManager +import com.google.firebase.FirebaseApp +import com.google.firebase.messaging.FirebaseMessaging + +class FBPingService : JobService() { + + private var jobCancelled = false + private val context = this + + override fun onStartJob(params: JobParameters): Boolean { + doBackgroundWork(params) + return true + } + + override fun onStopJob(params: JobParameters?): Boolean { + jobCancelled = true + return true + } + + private fun doBackgroundWork(params: JobParameters) { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + + FirebaseApp.initializeApp(context) + + if (prefs.getBoolean("notif", true)) { + FirebaseMessaging.getInstance().subscribeToTopic("substitutions-android") + } else { + FirebaseMessaging.getInstance().unsubscribeFromTopic("substitutions-android") + } + + if (prefs.getBoolean("subscribedToFBDebugChannel", false)) { + FirebaseMessaging.getInstance().subscribeToTopic("substitutions-debug") + } else { + FirebaseMessaging.getInstance().unsubscribeFromTopic("substitutions-debug") + } + + FirebaseMessaging.getInstance().subscribeToTopic("substitutions-broadcast") + prefs.edit().putInt("pingFB", prefs.getInt("pingFB", 0) + 1).apply() + + jobFinished(params, false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/Main.kt b/app/src/main/java/com/denizd/substitutionplan/Main.kt index 0a71013..8d93360 100644 --- a/app/src/main/java/com/denizd/substitutionplan/Main.kt +++ b/app/src/main/java/com/denizd/substitutionplan/Main.kt @@ -1,5 +1,8 @@ package com.denizd.substitutionplan +import android.app.job.JobInfo +import android.app.job.JobScheduler +import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.SharedPreferences @@ -53,14 +56,7 @@ class Main : AppCompatActivity(R.layout.app_bar_main) { edit.putInt("launchDev", prefs.getInt("launchDev", 0) + 1) edit.apply() - FirebaseApp.initializeApp(context) - - if (prefs.getBoolean("notif", true)) { - FirebaseMessaging.getInstance().subscribeToTopic("substitutions-android") - } else { - FirebaseMessaging.getInstance().unsubscribeFromTopic("substitutions-android") - } - FirebaseMessaging.getInstance().subscribeToTopic("substitutions-broadcast") + pingFirebaseTopics() val appbarlayout = findViewById(R.id.appbarlayout) val toolbarTxt = findViewById(R.id.toolbarTxt) @@ -237,8 +233,7 @@ class Main : AppCompatActivity(R.layout.app_bar_main) { val dialog = AlertDialog.Builder(context) val dialogView = LayoutInflater.from(context).inflate(R.layout.simple_dialog, null) dialogView.findViewById(R.id.textviewtitle).text = getString(R.string.information) - val sb = StringBuilder() - val dialogText = sb.append(getText(R.string.lastUpdated)).append((prefs.getString("timeNew", "") ?: "") + ".\n\n").append(prefs.getString("informational", "")) + val dialogText = "${getString(R.string.lastUpdated)} ${prefs.getString("timeNew", "")}.\n\n${prefs.getString("informational", "")}" dialogView.findViewById(R.id.dialogtext).text = dialogText dialog.setView(dialogView).show() } @@ -247,4 +242,15 @@ class Main : AppCompatActivity(R.layout.app_bar_main) { supportFragmentManager.beginTransaction().replace(R.id.fragment_container, fragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit() return true } + + private fun pingFirebaseTopics() { + val componentName = ComponentName(this, FBPingService::class.java) + val info = JobInfo.Builder(42, componentName) + .setRequiresCharging(false) + .setPersisted(true) + .setPeriodic(900000) + .build() + val scheduler = getSystemService(JOB_SCHEDULER_SERVICE) as JobScheduler + scheduler.schedule(info) + } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt b/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt index 59ef748..5f7a29e 100644 --- a/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt @@ -369,7 +369,7 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen } resetNotifBtn.setOnClickListener { - edit.putInt("notificationTestNumberDev", 0).apply() + edit.putInt("pingFB", 0).apply() devDialogText.text = getDiagnosticsText(prefs) } @@ -386,7 +386,7 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen } } "_NOTIFICATION" -> { - edit.putString("time", "").putString("timeFood", "").apply() + edit.putString("timeNew", "").putString("timeFoodNew", "").apply() Toast.makeText(mContext, "Notification times cleared", Toast.LENGTH_LONG).show() } // TODO add option to clear database "_FIRSTTIME" -> { @@ -400,10 +400,8 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen } "_DEVCHANNEL" -> { val subbed = if (prefs.getBoolean("subscribedToFBDebugChannel", false)) { - FirebaseMessaging.getInstance().unsubscribeFromTopic("substitutions-debug") "Unsubscribed from" } else { - FirebaseMessaging.getInstance().subscribeToTopic("substitutions-debug") "Subscribed to" } edit.putBoolean("subscribedToFBDebugChannel", !prefs.getBoolean("subscribedToFBDebugChannel", false)).apply() @@ -418,11 +416,13 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen } private fun getDiagnosticsText(prefs: SharedPreferences): String { - return "First Launch: " + prefs.getString("firstTimeDev", "") + - "\n\nApp launched: " + prefs.getInt("launchDev", 0) + - "\n\nNotification Service fired: " + prefs.getInt("notificationTestNumberDev", 0) + - "\n\nDevice Name: " + name + - "\n\nDevice Model: " + model + - "\n\nAndroid Version: " + Build.VERSION.RELEASE + return "First Launch: ${prefs.getString("firstTimeDev", "")}" + + "\n\nApp launched: ${prefs.getInt("launchDev", 0)}" + + "\n\nFirebase ping service fired: ${prefs.getInt("pingFB", 0)}" + + "\n\nDevice Name: $name" + + "\n\nDevice Model: $model" + + "\n\nAndroid Version: ${Build.VERSION.RELEASE}" + + "\n\nSubscribed to notification channel: ${prefs.getBoolean("notif", false)}" + + "\n\nSubscribed to dev channel: ${prefs.getBoolean("subscribedToFBDebugChannel", false)}" } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/SubstDatabase.kt b/app/src/main/java/com/denizd/substitutionplan/SubstDatabase.kt index 246ac2a..636bf18 100644 --- a/app/src/main/java/com/denizd/substitutionplan/SubstDatabase.kt +++ b/app/src/main/java/com/denizd/substitutionplan/SubstDatabase.kt @@ -27,17 +27,19 @@ public abstract class SubstDatabase : RoomDatabase() { return instance } + private var foodInstance: SubstDatabase? = null + fun getFoodInstance(context: Context): SubstDatabase? { - if (instance == null) { + if (foodInstance == null) { synchronized (SubstDatabase::class) { - instance = Room.databaseBuilder(context.applicationContext, + foodInstance = Room.databaseBuilder(context.applicationContext, SubstDatabase::class.java, "food_database") .fallbackToDestructiveMigration() .build() } } - return instance + return foodInstance } } } \ No newline at end of file diff --git a/app/src/main/res/layout/diagnostics_dialog.xml b/app/src/main/res/layout/diagnostics_dialog.xml index 71db70e..28e16b7 100644 --- a/app/src/main/res/layout/diagnostics_dialog.xml +++ b/app/src/main/res/layout/diagnostics_dialog.xml @@ -60,7 +60,7 @@ android:layout_marginStart="24dp" android:layout_marginEnd="24dp" android:layout_marginBottom="16dp" - android:text="Reset notification counter" + android:text="Reset ping counter" style="@style/Widget.MaterialComponents.Button.OutlinedButton"/>