Stop notifications fixes + scheduling/canceling management

hh
Laurent 6 years ago
parent ec2586aadb
commit 272b804fe9
  1. 41
      app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt
  2. 5
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  3. 11
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt
  4. 29
      app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt
  5. 30
      app/src/main/java/net/pokeranalytics/android/util/StopNotificationManager.kt

@ -1,11 +1,17 @@
package net.pokeranalytics.android.model.extensions package net.pokeranalytics.android.model.extensions
import android.content.Context 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.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.util.NotificationSchedule
import net.pokeranalytics.android.util.extensions.toCurrency import net.pokeranalytics.android.util.extensions.toCurrency
import java.util.* import java.util.*
import java.util.concurrent.TimeUnit
enum class SessionState { enum class SessionState {
PENDING, 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 { fun Session.getFormattedGameType(context: Context): String {
@ -84,6 +90,39 @@ fun Session.getFormattedGameType(context: Context): String {
return parameters.joinToString(separator = " ") 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<NotificationSchedule>()
.setInitialDelay(timeDelay, TimeUnit.MILLISECONDS)
.setInputData(data.build())
.addTag(this.id)
.build()
WorkManager.getInstance(context).enqueue(work)
}
val AbstractList<Session>.hourlyDuration: Double val AbstractList<Session>.hourlyDuration: Double
get() { get() {
val intervals = mutableListOf<TimeInterval>() val intervals = mutableListOf<TimeInterval>()

@ -22,6 +22,7 @@ import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TableSize
import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.extensions.SessionState 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.getState
import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
@ -559,7 +560,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
/** /**
* Stop a session * Stop a session
*/ */
fun stop() { fun stop(context: Context) {
realm.executeTransaction { realm.executeTransaction {
when (val state = getState()) { when (val state = getState()) {
SessionState.STARTED, SessionState.PAUSED -> { SessionState.STARTED, SessionState.PAUSED -> {
@ -568,6 +569,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
else -> throw Exception("Stopping session in unmanaged state: $state") else -> throw Exception("Stopping session in unmanaged state: $state")
} }
} }
cancelStopNotification(context)
} }
/** /**
@ -1202,6 +1204,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
} }
@Ignore @Ignore
override val realmObjectClass: Class<out Identifiable> = Session::class.java override val realmObjectClass: Class<out Identifiable> = Session::class.java

@ -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.modules.datalist.DataListActivity
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow
import net.pokeranalytics.android.util.FileUtils import net.pokeranalytics.android.util.*
import net.pokeranalytics.android.util.Preferences
import net.pokeranalytics.android.util.URL
import net.pokeranalytics.android.util.UserDefaults
import net.pokeranalytics.android.util.billing.AppGuard import net.pokeranalytics.android.util.billing.AppGuard
import net.pokeranalytics.android.util.billing.IAPProducts import net.pokeranalytics.android.util.billing.IAPProducts
import net.pokeranalytics.android.util.csv.ProductCSVDescriptors import net.pokeranalytics.android.util.csv.ProductCSVDescriptors
@ -175,7 +172,11 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep
override fun onRowValueChanged(value: Any?, row: RowRepresentable) { override fun onRowValueChanged(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SettingRow.STOP_NOTIFICATION -> { SettingRow.STOP_NOTIFICATION -> {
Preferences.setShowStopNotifications(value as Boolean, requireContext()) val show = value as Boolean
if (!show) {
StopNotificationManager.stopAllStopNotifications(requireContext())
}
Preferences.setShowStopNotifications(show, requireContext())
} }
else -> {} else -> {}
} }

@ -24,7 +24,9 @@ import net.pokeranalytics.android.calculus.optimalduration.CashGameOptimalDurati
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.extensions.SessionState 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.getState
import net.pokeranalytics.android.model.extensions.scheduleStopNotification
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.model.realm.Location import net.pokeranalytics.android.model.realm.Location
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
@ -266,6 +268,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate {
SessionRow.BUY_IN, SessionRow.TIPS, SessionRow.START_DATE, SessionRow.BUY_IN, SessionRow.TIPS, SessionRow.START_DATE,
SessionRow.END_DATE, SessionRow.BANKROLL, SessionRow.BREAK_TIME -> updateSessionUI() SessionRow.END_DATE, SessionRow.BANKROLL, SessionRow.BREAK_TIME -> updateSessionUI()
} }
} }
/** /**
@ -401,8 +404,8 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate {
if (!isDetached) { if (!isDetached) {
optimalDuration?.let { optimalDuration?.let {
val delay = it.toLong() val delay = 5000L //it.toLong()
scheduleNotification(delay, "stop notif tag") currentSession.scheduleStopNotification(requireContext(), delay)
val formattedDuration = (it / 3600 / 1000).formattedHourlyDuration() val formattedDuration = (it / 3600 / 1000).formattedHourlyDuration()
Timber.d("Setting stop notification in: $formattedDuration") 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<NotificationSchedule>()
.setInitialDelay(timeDelay, TimeUnit.MILLISECONDS)
.setInputData(data.build())
.addTag(tag)
.build()
WorkManager.getInstance(requireContext()).enqueue(work)
}
/** /**
* Stop the current session * Stop the current session
*/ */
private fun stopSession() { private fun stopSession() {
currentSession.stop() this.currentSession.stop(requireContext())
updateSessionUI() updateSessionUI()
} }
@ -463,6 +448,8 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate {
* Delete a session * Delete a session
*/ */
private fun deleteSession() { private fun deleteSession() {
this.currentSession.cancelStopNotification(requireContext())
this.currentSession.bankroll?.id?.let { bankrollId -> this.currentSession.bankroll?.id?.let { bankrollId ->
BankrollReportManager.notifyBankrollReportImpact(bankrollId) BankrollReportManager.notifyBankrollReportImpact(bankrollId)
} }

@ -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()
// }
}
}
Loading…
Cancel
Save