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
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<NotificationSchedule>()
.setInitialDelay(timeDelay, TimeUnit.MILLISECONDS)
.setInputData(data.build())
.addTag(this.id)
.build()
WorkManager.getInstance(context).enqueue(work)
}
val AbstractList<Session>.hourlyDuration: Double
get() {
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.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<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.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 -> {}
}

@ -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<NotificationSchedule>()
.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)
}

@ -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