From 272b804fe91353697918cdcf0dd1346f8efd9037 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 2 Jun 2020 11:11:09 +0200 Subject: [PATCH] Stop notifications fixes + scheduling/canceling management --- .../model/extensions/SessionExtensions.kt | 41 ++++++++++++++++++- .../android/model/realm/Session.kt | 5 ++- .../android/ui/fragment/SettingsFragment.kt | 11 ++--- .../ui/modules/session/SessionFragment.kt | 29 ++++--------- .../android/util/StopNotificationManager.kt | 30 ++++++++++++++ 5 files changed, 88 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/util/StopNotificationManager.kt diff --git a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt index dd25bd23..93f07352 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt @@ -1,11 +1,17 @@ package net.pokeranalytics.android.model.extensions import android.content.Context +import androidx.work.Data +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.util.NotificationSchedule import net.pokeranalytics.android.util.extensions.toCurrency import java.util.* +import java.util.concurrent.TimeUnit enum class SessionState { PENDING, @@ -46,7 +52,7 @@ fun Session.getState(): SessionState { } /** - * Formate the session game type + * Format the session game type */ fun Session.getFormattedGameType(context: Context): String { @@ -84,6 +90,39 @@ fun Session.getFormattedGameType(context: Context): String { return parameters.joinToString(separator = " ") } +fun Session.currentDuration(): Long { + return this.startDate?.let { + this.endDate().time - it.time + } ?: 0L +} + +fun Session.cancelStopNotification(context: Context) { + WorkManager.getInstance(context).cancelAllWorkByTag(this.id) +} + +fun Session.scheduleStopNotification(context: Context, optimalDuration: Long) { + + val timeDelay = optimalDuration - this.currentDuration() + if (timeDelay <= 0) throw PAIllegalStateException("A stop notif has been setup for the past: start=${this.startDate}, end=${this.endDate}, optimalDuration=$optimalDuration") + + val title = context.getString(R.string.stop_notification_title) + val body = context.getString(R.string.stop_notification_body) + + val data = Data.Builder() + .putString(NotificationSchedule.ParamKeys.TITLE.value, title) + .putString(NotificationSchedule.ParamKeys.BODY.value, body) + + val work = OneTimeWorkRequestBuilder() + .setInitialDelay(timeDelay, TimeUnit.MILLISECONDS) + .setInputData(data.build()) + .addTag(this.id) + .build() + + WorkManager.getInstance(context).enqueue(work) + +} + + val AbstractList.hourlyDuration: Double get() { val intervals = mutableListOf() diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index a23d6b68..faf740ab 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -22,6 +22,7 @@ import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState +import net.pokeranalytics.android.model.extensions.cancelStopNotification import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition @@ -559,7 +560,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat /** * Stop a session */ - fun stop() { + fun stop(context: Context) { realm.executeTransaction { when (val state = getState()) { SessionState.STARTED, SessionState.PAUSED -> { @@ -568,6 +569,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat else -> throw Exception("Stopping session in unmanaged state: $state") } } + cancelStopNotification(context) } /** @@ -1202,6 +1204,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } + @Ignore override val realmObjectClass: Class = Session::class.java diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index 15a647f4..566fdef4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -32,10 +32,7 @@ import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow -import net.pokeranalytics.android.util.FileUtils -import net.pokeranalytics.android.util.Preferences -import net.pokeranalytics.android.util.URL -import net.pokeranalytics.android.util.UserDefaults +import net.pokeranalytics.android.util.* import net.pokeranalytics.android.util.billing.AppGuard import net.pokeranalytics.android.util.billing.IAPProducts import net.pokeranalytics.android.util.csv.ProductCSVDescriptors @@ -175,7 +172,11 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep override fun onRowValueChanged(value: Any?, row: RowRepresentable) { when (row) { SettingRow.STOP_NOTIFICATION -> { - Preferences.setShowStopNotifications(value as Boolean, requireContext()) + val show = value as Boolean + if (!show) { + StopNotificationManager.stopAllStopNotifications(requireContext()) + } + Preferences.setShowStopNotifications(show, requireContext()) } else -> {} } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt index c9ccbcc4..99221b91 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt @@ -24,7 +24,9 @@ import net.pokeranalytics.android.calculus.optimalduration.CashGameOptimalDurati import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.extensions.SessionState +import net.pokeranalytics.android.model.extensions.cancelStopNotification import net.pokeranalytics.android.model.extensions.getState +import net.pokeranalytics.android.model.extensions.scheduleStopNotification import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.realm.Location import net.pokeranalytics.android.model.realm.Session @@ -266,6 +268,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate { SessionRow.BUY_IN, SessionRow.TIPS, SessionRow.START_DATE, SessionRow.END_DATE, SessionRow.BANKROLL, SessionRow.BREAK_TIME -> updateSessionUI() } + } /** @@ -401,8 +404,8 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate { if (!isDetached) { optimalDuration?.let { - val delay = it.toLong() - scheduleNotification(delay, "stop notif tag") + val delay = 5000L //it.toLong() + currentSession.scheduleStopNotification(requireContext(), delay) val formattedDuration = (it / 3600 / 1000).formattedHourlyDuration() Timber.d("Setting stop notification in: $formattedDuration") @@ -414,29 +417,11 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate { } - private fun scheduleNotification(timeDelay: Long, tag: String) { - - val title = requireContext().getString(R.string.stop_notification_title) - val body = requireContext().getString(R.string.stop_notification_body) - - val data = Data.Builder() - .putString(NotificationSchedule.ParamKeys.TITLE.value, title) - .putString(NotificationSchedule.ParamKeys.BODY.value, body) - - val work = OneTimeWorkRequestBuilder() - .setInitialDelay(timeDelay, TimeUnit.MILLISECONDS) - .setInputData(data.build()) - .addTag(tag) - .build() - - WorkManager.getInstance(requireContext()).enqueue(work) - } - /** * Stop the current session */ private fun stopSession() { - currentSession.stop() + this.currentSession.stop(requireContext()) updateSessionUI() } @@ -463,6 +448,8 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate { * Delete a session */ private fun deleteSession() { + + this.currentSession.cancelStopNotification(requireContext()) this.currentSession.bankroll?.id?.let { bankrollId -> BankrollReportManager.notifyBankrollReportImpact(bankrollId) } diff --git a/app/src/main/java/net/pokeranalytics/android/util/StopNotificationManager.kt b/app/src/main/java/net/pokeranalytics/android/util/StopNotificationManager.kt new file mode 100644 index 00000000..e9b63372 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/StopNotificationManager.kt @@ -0,0 +1,30 @@ +package net.pokeranalytics.android.util + +import android.content.Context +import io.realm.Realm +import net.pokeranalytics.android.model.extensions.cancelStopNotification +import net.pokeranalytics.android.model.realm.Session + +class StopNotificationManager { + + companion object { + + fun stopAllStopNotifications(context: Context) { + val realm = Realm.getDefaultInstance() + realm.where(Session::class.java).isNull("endDate").findAll().forEach { + it.cancelStopNotification(context) + } + realm.close() + } + +// fun resumeStopNotifications(context: Context) { +// val realm = Realm.getDefaultInstance() +// getUnfinishedSessions(realm).forEach { +// +// } +// realm.close() +// } + + } + +} \ No newline at end of file