More fixes, notably the fact that the currency update was always called when updating sessions, could be huge!

realmasync
Laurent 2 years ago
parent 56f21c0876
commit fb9241874c
  1. 4
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  2. 139
      app/src/main/java/net/pokeranalytics/android/calculus/DataManager.kt
  3. 100
      app/src/main/java/net/pokeranalytics/android/calculus/ReportWhistleBlower.kt
  4. 4
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  5. 6
      app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt
  6. 13
      app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt
  7. 8
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  8. 34
      app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt
  9. 7
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt
  10. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt
  11. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt

@ -15,7 +15,7 @@ import net.pokeranalytics.android.model.migrations.PokerAnalyticsMigration
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.UserConfigObserver import net.pokeranalytics.android.model.realm.UserConfigObserver
import net.pokeranalytics.android.model.utils.Seed import net.pokeranalytics.android.model.utils.Seed
import net.pokeranalytics.android.model.utils.SessionManager import net.pokeranalytics.android.calculus.DataManager
import net.pokeranalytics.android.util.* import net.pokeranalytics.android.util.*
import net.pokeranalytics.android.util.billing.AppGuard import net.pokeranalytics.android.util.billing.AppGuard
import timber.log.Timber import timber.log.Timber
@ -79,7 +79,7 @@ class PokerAnalyticsApplication : Application() {
Patcher.patchAll(this) Patcher.patchAll(this)
// Processors // Processors
SessionManager.configure(this.applicationContext) DataManager.configure(this.applicationContext)
UserConfigObserver.create() UserConfigObserver.create()
// this.reportWhistleBlower = ReportWhistleBlower(this.applicationContext) // this.reportWhistleBlower = ReportWhistleBlower(this.applicationContext)

@ -1,12 +1,13 @@
package net.pokeranalytics.android.model.utils package net.pokeranalytics.android.calculus
import android.content.Context import android.content.Context
import io.realm.Realm import io.realm.Realm
import io.realm.RealmQuery import io.realm.RealmQuery
import io.realm.RealmResults import io.realm.RealmResults
import net.pokeranalytics.android.calculus.ReportWhistleBlower import io.realm.kotlin.where
import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.exceptions.ModelException
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.realm.Currency
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.model.realm.SessionSet
import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.findById
@ -20,17 +21,14 @@ class CorruptSessionSetException(message: String) : Exception(message)
* The manager is in charge of updating the abstract concept of timeline, * The manager is in charge of updating the abstract concept of timeline,
* representing the sequenced time frames where the user plays. * representing the sequenced time frames where the user plays.
*/ */
object SessionManager { object DataManager {
private var sessions: RealmResults<Session>? = null private var sessions: RealmResults<Session>? = null
// private var results: RealmResults<Result>? = null private var currencies: RealmResults<Currency>? = null
private var dateModifiedSessionIds: MutableSet<String> = mutableSetOf() private var dateModifiedSessionIds: MutableSet<String> = mutableSetOf()
// private var netModifiedSessionIds: MutableSet<String> = mutableSetOf()
private var statsToComputeSessionIds: MutableSet<String> = mutableSetOf() private var statsToComputeSessionIds: MutableSet<String> = mutableSetOf()
private var changedCurrencies: MutableSet<String> = mutableSetOf()
var context: Context? = null
private set
var reportWhistleBlower: ReportWhistleBlower? = null var reportWhistleBlower: ReportWhistleBlower? = null
@ -38,67 +36,79 @@ object SessionManager {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
this.sessions = realm.where(Session::class.java).findAllAsync() sessions = realm.where(Session::class.java).findAllAsync()
this.sessions?.addChangeListener { results -> sessions?.addChangeListener { results ->
results.realm.writeAsync { asyncRealm ->
if (this.statsToComputeSessionIds.isNotEmpty()) { computeStatsIfNecessary(asyncRealm)
results.realm.writeAsync { asyncRealm -> computeDatesIfNecessary(asyncRealm)
for (sessionId in statsToComputeSessionIds) { reportWhistleBlower?.requestReportLaunch()
Timber.d("Session Manager > compute stats")
asyncRealm.findById<Session>(sessionId)?.let { session ->
session.computeStats()
session.sessionSet?.computeStats()
}
}
this.statsToComputeSessionIds.clear()
}
} }
}
if (this.dateModifiedSessionIds.isNotEmpty()) { this.currencies = realm.where(Currency::class.java).findAll()
results.realm.writeAsync { asyncRealm -> this.currencies?.addChangeListener { _, _ ->
for (sessionId in dateModifiedSessionIds) { if (changedCurrencies.isNotEmpty()) {
Timber.d("Session Manager > manage dates") realm.writeAsync { asyncRealm ->
asyncRealm.findById<Session>(sessionId)?.let { session -> for (currencyId in this.changedCurrencies) {
if (session.endDate != null) { asyncRealm.findById<Currency>(currencyId)?.let { currency ->
this.updateTimeline(session) Timber.d("Compute currency ${currency.code} ")
} else if (session.sessionSet != null) { currency.refreshRelatedRatedValues()
this.removeFromTimeline(session)
}
} }
} }
this.dateModifiedSessionIds.clear() changedCurrencies.clear()
} }
} }
this.reportWhistleBlower?.requestReportLaunch()
// if (this.netModifiedSessionIds.isNotEmpty()) {
// results.realm.writeAsync { asyncRealm ->
// for (sessionId in netModifiedSessionIds) {
// asyncRealm.findById<Session>(sessionId)?.computeNet(false)
// }
// this.dateModifiedSessionIds.clear()
// }
// }
} }
realm.close() realm.close()
} }
fun configure(context: Context) { fun configure(context: Context) {
this.context = context reportWhistleBlower = ReportWhistleBlower(context)
this.reportWhistleBlower = ReportWhistleBlower(context) }
fun sessionToCompute(session: Session) {
Timber.d("sessionToCompute")
statsToComputeSessionIds.add(session.id)
} }
fun sessionDateChanged(session: Session) { fun sessionDateChanged(session: Session) {
this.dateModifiedSessionIds.add(session.id) Timber.d("sessionDateChanged")
dateModifiedSessionIds.add(session.id)
} }
// fun sessionNetChanged(session: Session) {
// this.netModifiedSessionIds.add(session.id) fun currencyToCompute(currency: Currency) {
// } Timber.d("sessionToCompute")
fun sessionToCompute(session: Session) { changedCurrencies.add(currency.id)
this.statsToComputeSessionIds.add(session.id) }
private fun computeStatsIfNecessary(realm: Realm) {
if (statsToComputeSessionIds.isNotEmpty()) {
for (sessionId in statsToComputeSessionIds) {
Timber.d("Session Manager > compute stats")
realm.findById<Session>(sessionId)?.let { session ->
session.computeStats()
session.sessionSet?.computeStats()
}
}
statsToComputeSessionIds.clear()
}
}
private fun computeDatesIfNecessary(realm: Realm) {
if (dateModifiedSessionIds.isNotEmpty()) {
for (sessionId in dateModifiedSessionIds) {
Timber.d("Session Manager > manage dates")
realm.findById<Session>(sessionId)?.let { session ->
if (session.endDate != null) {
updateTimeline(session)
} else if (session.sessionSet != null) {
removeFromTimeline(session)
}
}
}
dateModifiedSessionIds.clear()
}
} }
/** /**
@ -119,7 +129,7 @@ object SessionManager {
throw ModelException("End date should never be null here") throw ModelException("End date should never be null here")
} }
val sessionSets = this.matchingSets(session) val sessionSets = matchingSets(session)
cleanupSessionSets(session, sessionSets) cleanupSessionSets(session, sessionSets)
} }
@ -164,11 +174,9 @@ object SessionManager {
allImpactedSessions.forEach { impactedSession -> allImpactedSessions.forEach { impactedSession ->
val sets = matchingSets(impactedSession) val sets = matchingSets(impactedSession)
this.updateTimeFrames(sets, impactedSession) updateTimeFrames(sets, impactedSession)
} }
// Timber.d("netDuration 3 = : ${set.timeFrame?.netDuration}")
} }
/** /**
@ -178,8 +186,8 @@ object SessionManager {
Timber.d("updateTimeFrames...") Timber.d("updateTimeFrames...")
when (sessionSets.size) { when (sessionSets.size) {
0 -> this.createOrUpdateSessionSet(session) 0 -> createOrUpdateSessionSet(session)
else -> this.mergeSessionGroups(session, sessionSets) else -> mergeSessionGroups(session, sessionSets)
} }
} }
@ -195,7 +203,7 @@ object SessionManager {
set.startDate = session.startDate!! // tested above set.startDate = session.startDate!! // tested above
set.endDate = session.endDate!! set.endDate = session.endDate!!
} else { } else {
this.createSessionSet(session) createSessionSet(session)
} }
} }
@ -206,12 +214,20 @@ object SessionManager {
private fun createSessionSet(session: Session) { private fun createSessionSet(session: Session) {
Timber.d("createSessionSet...") Timber.d("createSessionSet...")
val set: SessionSet = SessionSet.newInstance(session.realm) val realm = session.realm
val set = SessionSet.newInstance(realm)
set.startDate = session.startDate!! set.startDate = session.startDate!!
set.endDate = session.endDate!! set.endDate = session.endDate!!
set.breakDuration = session.breakDuration set.breakDuration = session.breakDuration
session.sessionSet = set session.sessionSet = set
set.computeStats() set.computeStats()
Timber.d("SET SESSION count = ${set.sessions?.size}")
val t = 0
val f = realm.where<SessionSet>().equalTo("sessions.type", t).findAll()
Timber.d("CASH SET COUNT = ${f.size}")
} }
/** /**
@ -288,6 +304,7 @@ object SessionManager {
sessionSet.sessions?.asIterable()?.let { sessions.addAll(it) } sessionSet.sessions?.asIterable()?.let { sessions.addAll(it) }
sessions.remove(session) sessions.remove(session)
Timber.d(">>> sessionSet.deleteFromRealm")
sessionSet.deleteFromRealm() sessionSet.deleteFromRealm()
sessions.forEach { sessions.forEach {

@ -1,12 +1,8 @@
package net.pokeranalytics.android.calculus package net.pokeranalytics.android.calculus
import android.content.Context import android.content.Context
import android.os.CountDownTimer
import io.realm.Realm import io.realm.Realm
import io.realm.RealmQuery import io.realm.RealmQuery
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import net.pokeranalytics.android.calculus.optimalduration.CashGameOptimalDurationCalculator import net.pokeranalytics.android.calculus.optimalduration.CashGameOptimalDurationCalculator
import net.pokeranalytics.android.model.LiveOnline import net.pokeranalytics.android.model.LiveOnline
import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.CustomField
@ -15,8 +11,6 @@ import net.pokeranalytics.android.model.realm.PerformanceKey
import net.pokeranalytics.android.ui.view.rows.StaticReport import net.pokeranalytics.android.ui.view.rows.StaticReport
import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.findById
import net.pokeranalytics.android.util.extensions.formattedHourlyDuration import net.pokeranalytics.android.util.extensions.formattedHourlyDuration
import net.pokeranalytics.android.util.extensions.writeAsync
import kotlin.coroutines.CoroutineContext
interface NewPerformanceListener { interface NewPerformanceListener {
@ -36,7 +30,7 @@ class ReportWhistleBlower(var context: Context) {
private var paused: Boolean = false private var paused: Boolean = false
private var timer: CountDownTimer? = null // private var timer: CountDownTimer? = null
init { init {
@ -70,18 +64,20 @@ class ReportWhistleBlower(var context: Context) {
return return
} }
this.timer?.cancel() launchReportTask()
val launchStart = 100L // this.timer?.cancel()
val timer = object : CountDownTimer(launchStart, launchStart) { //
override fun onTick(p0: Long) {} // val launchStart = 100L
// val timer = object : CountDownTimer(launchStart, launchStart) {
override fun onFinish() { // override fun onTick(p0: Long) {}
launchReportTask() //
} // override fun onFinish() {
} // launchReportTask()
this.timer = timer // }
timer.start() // }
// this.timer = timer
// timer.start()
} }
@ -133,8 +129,8 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co
private var cancelled = false private var cancelled = false
private val coroutineContext: CoroutineContext // private val coroutineContext: CoroutineContext
get() = Dispatchers.Default // get() = Dispatchers.Default
fun start() { fun start() {
launchReports() launchReports()
@ -145,29 +141,29 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co
} }
private fun launchReports() { private fun launchReports() {
CoroutineScope(coroutineContext).launch { // CoroutineScope(coroutineContext).launch {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
// Basic // Basic
for (basicReport in StaticReport.basicReports) { for (basicReport in StaticReport.basicReports) {
if (cancelled) { if (cancelled) {
break break
}
launchReport(realm, basicReport)
} }
launchReport(realm, basicReport)
}
// CustomField // CustomField
val customFields = realm.where(CustomField::class.java) val customFields = realm.where(CustomField::class.java)
.equalTo("type", CustomField.Type.LIST.uniqueIdentifier).findAll() .equalTo("type", CustomField.Type.LIST.uniqueIdentifier).findAll()
for (customField in customFields) { for (customField in customFields) {
if (cancelled) { if (cancelled) {
break break
}
launchReport(realm, StaticReport.CustomFieldList(customField))
} }
realm.close() launchReport(realm, StaticReport.CustomFieldList(customField))
} }
realm.close()
// }
} }
@ -249,10 +245,8 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co
currentPerf.name = performanceName currentPerf.name = performanceName
currentPerf.objectId = performanceQuery.objectId currentPerf.objectId = performanceQuery.objectId
currentPerf.customFieldId = customField?.id currentPerf.customFieldId = customField?.id
realm.writeAsync { asyncRealm -> // realm.copyToRealm(currentPerf)
asyncRealm.copyToRealm(currentPerf) this.whistleBlower.notify(currentPerf)
this.whistleBlower.notify(currentPerf)
}
} }
} }
@ -266,21 +260,17 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co
customField?.id, customField?.id,
null null
) )
realm.writeAsync { asyncRealm -> realm.copyToRealm(performance)
asyncRealm.copyToRealm(performance) this.whistleBlower.notify(performance)
this.whistleBlower.notify(performance)
}
} }
} ?: run { // if there is no max but a now irrelevant Performance, we delete it } ?: run { // if there is no max but a now irrelevant Performance, we delete it
// Timber.d("NO best computed value, current perf = $currentPerf ") // Timber.d("NO best computed value, current perf = $currentPerf ")
currentPerf?.let { perf -> currentPerf?.let { perf ->
realm.writeAsync { asyncRealm ->
// Timber.d("Delete perf: stat = ${perf.stat}, report = ${perf.reportId}") // Timber.d("Delete perf: stat = ${perf.stat}, report = ${perf.reportId}")
asyncRealm.findById<Performance>(perf.id)?.deleteFromRealm() realm.findById<Performance>(perf.id)?.deleteFromRealm()
// perf.deleteFromRealm() // perf.deleteFromRealm()
}
} }
} }
@ -312,26 +302,20 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co
if (storePerf) { if (storePerf) {
perf.name = formattedDuration perf.name = formattedDuration
perf.value = duration perf.value = duration
realm.writeAsync { asyncRealm -> // realm.copyToRealm(perf)
asyncRealm.copyToRealm(perf)
}
} }
} }
if (storePerf) { if (storePerf) {
val perf = val perf =
Performance(staticReport, key, name = formattedDuration, value = duration) Performance(staticReport, key, name = formattedDuration, value = duration)
realm.writeAsync { asyncRealm -> realm.copyToRealm(perf)
asyncRealm.copyToRealm(perf) this.whistleBlower.notify(perf)
this.whistleBlower.notify(perf)
}
} }
} ?: run { // no duration } ?: run { // no duration
performance?.let { perf -> performance?.let { perf ->
realm.writeAsync { asyncRealm -> realm.findById<Performance>(perf.id)?.deleteFromRealm()
asyncRealm.findById<Performance>(perf.id)?.deleteFromRealm()
}
} }
} }

@ -96,7 +96,9 @@ sealed class QueryCondition : RowRepresentable {
inline fun <reified T : Filterable, reified S : QueryCondition, reified U : Comparable<U>> distinct(): RealmResults<T>? { inline fun <reified T : Filterable, reified S : QueryCondition, reified U : Comparable<U>> distinct(): RealmResults<T>? {
FilterHelper.fieldNameForQueryType<T>(S::class.java)?.let { FilterHelper.fieldNameForQueryType<T>(S::class.java)?.let {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
realm.refresh() if (!realm.isInTransaction) {
realm.refresh()
}
val distincts = when (T::class) { val distincts = when (T::class) {
String::class, Int::class -> realm.where<T>().distinct(it).findAll().sort(it, Sort.ASCENDING) String::class, Int::class -> realm.where<T>().distinct(it).findAll().sort(it, Sort.ASCENDING)

@ -9,7 +9,7 @@ import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.model.realm.handhistory.HandHistory import net.pokeranalytics.android.model.realm.handhistory.HandHistory
import net.pokeranalytics.android.model.utils.Seed import net.pokeranalytics.android.model.utils.Seed
import net.pokeranalytics.android.model.utils.SessionManager import net.pokeranalytics.android.calculus.DataManager
import net.pokeranalytics.android.util.BLIND_SEPARATOR import net.pokeranalytics.android.util.BLIND_SEPARATOR
import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.Preferences
import net.pokeranalytics.android.util.extensions.writeAsync import net.pokeranalytics.android.util.extensions.writeAsync
@ -174,7 +174,7 @@ class Patcher {
val sessions = asyncRealm.where(Session::class.java) val sessions = asyncRealm.where(Session::class.java)
.isNotNull("startDate").isNotNull("endDate").findAll() .isNotNull("startDate").isNotNull("endDate").findAll()
sessions.forEach { session -> sessions.forEach { session ->
SessionManager.updateTimeline(session) DataManager.updateTimeline(session)
} }
} }
realm.close() realm.close()
@ -202,7 +202,7 @@ class Patcher {
val performanceCount = realm.where<Performance>().findAll().size val performanceCount = realm.where<Performance>().findAll().size
if (sessionCount > 1 && performanceCount == 0) { if (sessionCount > 1 && performanceCount == 0) {
SessionManager.reportWhistleBlower?.requestReportLaunch() DataManager.reportWhistleBlower?.requestReportLaunch()
} }
realm.close() realm.close()
} }

@ -3,11 +3,13 @@ package net.pokeranalytics.android.model.realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.calculus.DataManager
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.UserDefaults
import java.util.* import java.util.*
open class Currency : RealmObject() { open class Currency : RealmObject(), Identifiable {
companion object { companion object {
@ -17,7 +19,10 @@ open class Currency : RealmObject() {
} }
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() override var id = UUID.randomUUID().toString()
@Ignore
override val realmObjectClass: Class<out Identifiable> = Currency::class.java
/** /**
* The currency code of the currency, i.e. USD, EUR... * The currency code of the currency, i.e. USD, EUR...
@ -39,6 +44,10 @@ open class Currency : RealmObject() {
* The rate of the currency with the main currency * The rate of the currency with the main currency
*/ */
var rate: Double? = DEFAULT_RATE var rate: Double? = DEFAULT_RATE
set(value) {
field = value
DataManager.currencyToCompute(this)
}
fun refreshRelatedRatedValues() { fun refreshRelatedRatedValues() {

@ -11,6 +11,7 @@ import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.DataManager
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.calculus.StatFormattingException import net.pokeranalytics.android.calculus.StatFormattingException
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
@ -26,7 +27,6 @@ import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.filter.QueryCondition.* import net.pokeranalytics.android.model.filter.QueryCondition.*
import net.pokeranalytics.android.model.interfaces.* import net.pokeranalytics.android.model.interfaces.*
import net.pokeranalytics.android.model.realm.handhistory.HandHistory import net.pokeranalytics.android.model.realm.handhistory.HandHistory
import net.pokeranalytics.android.model.utils.SessionManager
import net.pokeranalytics.android.ui.adapter.UnmanagedRowRepresentableException import net.pokeranalytics.android.ui.adapter.UnmanagedRowRepresentableException
import net.pokeranalytics.android.ui.graph.Graph import net.pokeranalytics.android.ui.graph.Graph
import net.pokeranalytics.android.ui.view.* import net.pokeranalytics.android.ui.view.*
@ -505,7 +505,7 @@ open class Session : RealmObject(), Savable, RowRepresentable, Timed,
*/ */
private fun dateChanged() { private fun dateChanged() {
SessionManager.sessionDateChanged(this) DataManager.sessionDateChanged(this)
// if (this.endDate != null) { // if (this.endDate != null) {
// SessionSetManager.updateTimeline(this) // SessionSetManager.updateTimeline(this)
@ -592,7 +592,7 @@ open class Session : RealmObject(), Savable, RowRepresentable, Timed,
* Pre-compute various statIds * Pre-compute various statIds
*/ */
private fun addToComputeQueue() { private fun addToComputeQueue() {
SessionManager.sessionToCompute(this) DataManager.sessionToCompute(this)
} }
/** /**
@ -817,7 +817,7 @@ open class Session : RealmObject(), Savable, RowRepresentable, Timed,
// Updates the timeline // Updates the timeline
this.sessionSet?.let { this.sessionSet?.let {
SessionManager.removeFromTimeline(this) DataManager.removeFromTimeline(this)
} }
// cleanup unnecessary related objects // cleanup unnecessary related objects
// this.deleteFromRealm() // this.deleteFromRealm()

@ -6,23 +6,20 @@ import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
import io.realm.RealmResults
import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.BuildConfig
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.NewPerformanceListener import net.pokeranalytics.android.calculus.NewPerformanceListener
import net.pokeranalytics.android.calculus.DataManager
import net.pokeranalytics.android.databinding.ActivityHomeBinding import net.pokeranalytics.android.databinding.ActivityHomeBinding
import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.Currency
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.utils.SessionManager
import net.pokeranalytics.android.ui.activity.components.BaseActivity import net.pokeranalytics.android.ui.activity.components.BaseActivity
import net.pokeranalytics.android.ui.adapter.HomePagerAdapter import net.pokeranalytics.android.ui.adapter.HomePagerAdapter
import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.Preferences
import net.pokeranalytics.android.util.billing.AppGuard import net.pokeranalytics.android.util.billing.AppGuard
import net.pokeranalytics.android.util.extensions.findAll import net.pokeranalytics.android.util.extensions.findAll
import net.pokeranalytics.android.util.extensions.isSameMonth import net.pokeranalytics.android.util.extensions.isSameMonth
import net.pokeranalytics.android.util.extensions.writeAsync
import java.util.* import java.util.*
enum class Tab(var identifier: Int) { enum class Tab(var identifier: Int) {
@ -43,13 +40,12 @@ class HomeActivity : BaseActivity(), NewPerformanceListener {
} }
} }
private lateinit var currencies: RealmResults<Currency>
private var homePagerAdapter: HomePagerAdapter? = null private var homePagerAdapter: HomePagerAdapter? = null
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item -> private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
if (binding.viewPager.currentItem == Tab.REPORTS.identifier) { if (binding.viewPager.currentItem == Tab.REPORTS.identifier) {
SessionManager.reportWhistleBlower?.clearNotifications() DataManager.reportWhistleBlower?.clearNotifications()
} }
when (item.itemId) { when (item.itemId) {
@ -97,36 +93,16 @@ class HomeActivity : BaseActivity(), NewPerformanceListener {
} }
} }
observeRealmObjects()
initUI() initUI()
checkFirstLaunch() checkFirstLaunch()
SessionManager.reportWhistleBlower?.addListener(this) DataManager.reportWhistleBlower?.addListener(this)
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
SessionManager.reportWhistleBlower?.removeListener(this) DataManager.reportWhistleBlower?.removeListener(this)
}
private fun observeRealmObjects() {
val realm = getRealm()
// observe currency changes
this.currencies = realm.where(Currency::class.java).findAll()
this.currencies.addChangeListener { _, _ ->
realm.writeAsync { asyncRealm ->
val currencies = asyncRealm.where(Currency::class.java).findAll()
currencies.forEach { currency ->
currency.refreshRelatedRatedValues()
}
}
}
} }
/** /**
@ -169,12 +145,10 @@ class HomeActivity : BaseActivity(), NewPerformanceListener {
} }
override fun newBestPerformanceHandler() { override fun newBestPerformanceHandler() {
if (Preferences.showInAppBadges(this)) { if (Preferences.showInAppBadges(this)) {
binding.navigation.getOrCreateBadge(R.id.navigation_reports).isVisible = true binding.navigation.getOrCreateBadge(R.id.navigation_reports).isVisible = true
binding.navigation.getOrCreateBadge(R.id.navigation_reports).number = 1 binding.navigation.getOrCreateBadge(R.id.navigation_reports).number = 1
} }
} }
private fun lookForCalendarBadge() { private fun lookForCalendarBadge() {

@ -12,8 +12,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.DataManager
import net.pokeranalytics.android.databinding.FragmentImportBinding import net.pokeranalytics.android.databinding.FragmentImportBinding
import net.pokeranalytics.android.model.utils.SessionManager
import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.util.csv.CSVImporter import net.pokeranalytics.android.util.csv.CSVImporter
import net.pokeranalytics.android.util.csv.ImportDelegate import net.pokeranalytics.android.util.csv.ImportDelegate
@ -64,7 +64,6 @@ class ImportFragment : RealmFragment(), ImportDelegate {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
this.initUI() this.initUI()
this.startImport() this.startImport()
} }
@ -92,7 +91,7 @@ class ImportFragment : RealmFragment(), ImportDelegate {
private fun startImport() { private fun startImport() {
SessionManager.reportWhistleBlower?.pause() DataManager.reportWhistleBlower?.pause()
this.importer = CSVImporter(uri, requireContext()) this.importer = CSVImporter(uri, requireContext())
this.importer.delegate = this this.importer.delegate = this
@ -143,7 +142,7 @@ class ImportFragment : RealmFragment(), ImportDelegate {
} }
private fun end() { private fun end() {
SessionManager.reportWhistleBlower?.resume() DataManager.reportWhistleBlower?.resume()
activity?.finish() activity?.finish()
} }

@ -26,7 +26,7 @@ import net.pokeranalytics.android.model.combined
import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Deletable
import net.pokeranalytics.android.model.realm.Performance import net.pokeranalytics.android.model.realm.Performance
import net.pokeranalytics.android.model.realm.ReportSetup import net.pokeranalytics.android.model.realm.ReportSetup
import net.pokeranalytics.android.model.utils.SessionManager import net.pokeranalytics.android.calculus.DataManager
import net.pokeranalytics.android.ui.activity.ReportCreationActivity import net.pokeranalytics.android.ui.activity.ReportCreationActivity
import net.pokeranalytics.android.ui.activity.components.ReportActivity import net.pokeranalytics.android.ui.activity.components.ReportActivity
import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.activity.components.RequestCode
@ -187,13 +187,13 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc
ReportCreationActivity.newInstanceForResult(this, requireContext()) ReportCreationActivity.newInstanceForResult(this, requireContext())
} }
SessionManager.reportWhistleBlower?.addListener(this) DataManager.reportWhistleBlower?.addListener(this)
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
SessionManager.reportWhistleBlower?.removeListener(this) DataManager.reportWhistleBlower?.removeListener(this)
} }
// Rows // Rows
@ -266,7 +266,7 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc
override fun boolForRow(row: RowRepresentable): Boolean { override fun boolForRow(row: RowRepresentable): Boolean {
val reportRow = row as PerformanceRow val reportRow = row as PerformanceRow
return Preferences.showInAppBadges(requireContext()) return Preferences.showInAppBadges(requireContext())
&& (SessionManager.reportWhistleBlower?.has(reportRow.performance.id) ?: false) && (DataManager.reportWhistleBlower?.has(reportRow.performance.id) ?: false)
} }
override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) {

@ -74,6 +74,7 @@ class StatisticsFragment : FilterableFragment(), RealmAsyncListener {
addRealmChangeListener(this, UserConfig::class.java) addRealmChangeListener(this, UserConfig::class.java)
addRealmChangeListener(this, ComputableResult::class.java) addRealmChangeListener(this, ComputableResult::class.java)
addRealmChangeListener(this, SessionSet::class.java)
addRealmChangeListener(this, Transaction::class.java) addRealmChangeListener(this, Transaction::class.java)
} }

Loading…
Cancel
Save