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.UserConfigObserver
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.billing.AppGuard
import timber.log.Timber
@ -79,7 +79,7 @@ class PokerAnalyticsApplication : Application() {
Patcher.patchAll(this)
// Processors
SessionManager.configure(this.applicationContext)
DataManager.configure(this.applicationContext)
UserConfigObserver.create()
// 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 io.realm.Realm
import io.realm.RealmQuery
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.PAIllegalStateException
import net.pokeranalytics.android.model.realm.Currency
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.SessionSet
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,
* representing the sequenced time frames where the user plays.
*/
object SessionManager {
object DataManager {
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 netModifiedSessionIds: MutableSet<String> = mutableSetOf()
private var statsToComputeSessionIds: MutableSet<String> = mutableSetOf()
var context: Context? = null
private set
private var changedCurrencies: MutableSet<String> = mutableSetOf()
var reportWhistleBlower: ReportWhistleBlower? = null
@ -38,67 +36,79 @@ object SessionManager {
val realm = Realm.getDefaultInstance()
this.sessions = realm.where(Session::class.java).findAllAsync()
this.sessions?.addChangeListener { results ->
if (this.statsToComputeSessionIds.isNotEmpty()) {
results.realm.writeAsync { asyncRealm ->
for (sessionId in statsToComputeSessionIds) {
Timber.d("Session Manager > compute stats")
asyncRealm.findById<Session>(sessionId)?.let { session ->
session.computeStats()
session.sessionSet?.computeStats()
}
}
this.statsToComputeSessionIds.clear()
}
sessions = realm.where(Session::class.java).findAllAsync()
sessions?.addChangeListener { results ->
results.realm.writeAsync { asyncRealm ->
computeStatsIfNecessary(asyncRealm)
computeDatesIfNecessary(asyncRealm)
reportWhistleBlower?.requestReportLaunch()
}
}
if (this.dateModifiedSessionIds.isNotEmpty()) {
results.realm.writeAsync { asyncRealm ->
for (sessionId in dateModifiedSessionIds) {
Timber.d("Session Manager > manage dates")
asyncRealm.findById<Session>(sessionId)?.let { session ->
if (session.endDate != null) {
this.updateTimeline(session)
} else if (session.sessionSet != null) {
this.removeFromTimeline(session)
}
this.currencies = realm.where(Currency::class.java).findAll()
this.currencies?.addChangeListener { _, _ ->
if (changedCurrencies.isNotEmpty()) {
realm.writeAsync { asyncRealm ->
for (currencyId in this.changedCurrencies) {
asyncRealm.findById<Currency>(currencyId)?.let { currency ->
Timber.d("Compute currency ${currency.code} ")
currency.refreshRelatedRatedValues()
}
}
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()
}
fun configure(context: Context) {
this.context = context
this.reportWhistleBlower = ReportWhistleBlower(context)
reportWhistleBlower = ReportWhistleBlower(context)
}
fun sessionToCompute(session: Session) {
Timber.d("sessionToCompute")
statsToComputeSessionIds.add(session.id)
}
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 sessionToCompute(session: Session) {
this.statsToComputeSessionIds.add(session.id)
fun currencyToCompute(currency: Currency) {
Timber.d("sessionToCompute")
changedCurrencies.add(currency.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")
}
val sessionSets = this.matchingSets(session)
val sessionSets = matchingSets(session)
cleanupSessionSets(session, sessionSets)
}
@ -164,11 +174,9 @@ object SessionManager {
allImpactedSessions.forEach { 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...")
when (sessionSets.size) {
0 -> this.createOrUpdateSessionSet(session)
else -> this.mergeSessionGroups(session, sessionSets)
0 -> createOrUpdateSessionSet(session)
else -> mergeSessionGroups(session, sessionSets)
}
}
@ -195,7 +203,7 @@ object SessionManager {
set.startDate = session.startDate!! // tested above
set.endDate = session.endDate!!
} else {
this.createSessionSet(session)
createSessionSet(session)
}
}
@ -206,12 +214,20 @@ object SessionManager {
private fun createSessionSet(session: Session) {
Timber.d("createSessionSet...")
val set: SessionSet = SessionSet.newInstance(session.realm)
val realm = session.realm
val set = SessionSet.newInstance(realm)
set.startDate = session.startDate!!
set.endDate = session.endDate!!
set.breakDuration = session.breakDuration
session.sessionSet = set
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) }
sessions.remove(session)
Timber.d(">>> sessionSet.deleteFromRealm")
sessionSet.deleteFromRealm()
sessions.forEach {

@ -1,12 +1,8 @@
package net.pokeranalytics.android.calculus
import android.content.Context
import android.os.CountDownTimer
import io.realm.Realm
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.model.LiveOnline
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.util.extensions.findById
import net.pokeranalytics.android.util.extensions.formattedHourlyDuration
import net.pokeranalytics.android.util.extensions.writeAsync
import kotlin.coroutines.CoroutineContext
interface NewPerformanceListener {
@ -36,7 +30,7 @@ class ReportWhistleBlower(var context: Context) {
private var paused: Boolean = false
private var timer: CountDownTimer? = null
// private var timer: CountDownTimer? = null
init {
@ -70,18 +64,20 @@ class ReportWhistleBlower(var context: Context) {
return
}
this.timer?.cancel()
launchReportTask()
val launchStart = 100L
val timer = object : CountDownTimer(launchStart, launchStart) {
override fun onTick(p0: Long) {}
override fun onFinish() {
launchReportTask()
}
}
this.timer = timer
timer.start()
// this.timer?.cancel()
//
// val launchStart = 100L
// val timer = object : CountDownTimer(launchStart, launchStart) {
// override fun onTick(p0: Long) {}
//
// override fun onFinish() {
// launchReportTask()
// }
// }
// this.timer = timer
// timer.start()
}
@ -133,8 +129,8 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co
private var cancelled = false
private val coroutineContext: CoroutineContext
get() = Dispatchers.Default
// private val coroutineContext: CoroutineContext
// get() = Dispatchers.Default
fun start() {
launchReports()
@ -145,29 +141,29 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co
}
private fun launchReports() {
CoroutineScope(coroutineContext).launch {
// CoroutineScope(coroutineContext).launch {
val realm = Realm.getDefaultInstance()
val realm = Realm.getDefaultInstance()
// Basic
for (basicReport in StaticReport.basicReports) {
if (cancelled) {
break
}
launchReport(realm, basicReport)
// Basic
for (basicReport in StaticReport.basicReports) {
if (cancelled) {
break
}
launchReport(realm, basicReport)
}
// CustomField
val customFields = realm.where(CustomField::class.java)
.equalTo("type", CustomField.Type.LIST.uniqueIdentifier).findAll()
for (customField in customFields) {
if (cancelled) {
break
}
launchReport(realm, StaticReport.CustomFieldList(customField))
// CustomField
val customFields = realm.where(CustomField::class.java)
.equalTo("type", CustomField.Type.LIST.uniqueIdentifier).findAll()
for (customField in customFields) {
if (cancelled) {
break
}
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.objectId = performanceQuery.objectId
currentPerf.customFieldId = customField?.id
realm.writeAsync { asyncRealm ->
asyncRealm.copyToRealm(currentPerf)
this.whistleBlower.notify(currentPerf)
}
// realm.copyToRealm(currentPerf)
this.whistleBlower.notify(currentPerf)
}
}
@ -266,21 +260,17 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co
customField?.id,
null
)
realm.writeAsync { asyncRealm ->
asyncRealm.copyToRealm(performance)
this.whistleBlower.notify(performance)
}
realm.copyToRealm(performance)
this.whistleBlower.notify(performance)
}
} ?: run { // if there is no max but a now irrelevant Performance, we delete it
// Timber.d("NO best computed value, current perf = $currentPerf ")
currentPerf?.let { perf ->
realm.writeAsync { asyncRealm ->
// Timber.d("Delete perf: stat = ${perf.stat}, report = ${perf.reportId}")
asyncRealm.findById<Performance>(perf.id)?.deleteFromRealm()
realm.findById<Performance>(perf.id)?.deleteFromRealm()
// perf.deleteFromRealm()
}
}
}
@ -312,26 +302,20 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co
if (storePerf) {
perf.name = formattedDuration
perf.value = duration
realm.writeAsync { asyncRealm ->
asyncRealm.copyToRealm(perf)
}
// realm.copyToRealm(perf)
}
}
if (storePerf) {
val perf =
Performance(staticReport, key, name = formattedDuration, value = duration)
realm.writeAsync { asyncRealm ->
asyncRealm.copyToRealm(perf)
this.whistleBlower.notify(perf)
}
realm.copyToRealm(perf)
this.whistleBlower.notify(perf)
}
} ?: run { // no duration
performance?.let { perf ->
realm.writeAsync { asyncRealm ->
asyncRealm.findById<Performance>(perf.id)?.deleteFromRealm()
}
realm.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>? {
FilterHelper.fieldNameForQueryType<T>(S::class.java)?.let {
val realm = Realm.getDefaultInstance()
realm.refresh()
if (!realm.isInTransaction) {
realm.refresh()
}
val distincts = when (T::class) {
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.handhistory.HandHistory
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.Preferences
import net.pokeranalytics.android.util.extensions.writeAsync
@ -174,7 +174,7 @@ class Patcher {
val sessions = asyncRealm.where(Session::class.java)
.isNotNull("startDate").isNotNull("endDate").findAll()
sessions.forEach { session ->
SessionManager.updateTimeline(session)
DataManager.updateTimeline(session)
}
}
realm.close()
@ -202,7 +202,7 @@ class Patcher {
val performanceCount = realm.where<Performance>().findAll().size
if (sessionCount > 1 && performanceCount == 0) {
SessionManager.reportWhistleBlower?.requestReportLaunch()
DataManager.reportWhistleBlower?.requestReportLaunch()
}
realm.close()
}

@ -3,11 +3,13 @@ package net.pokeranalytics.android.model.realm
import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.calculus.DataManager
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.util.UserDefaults
import java.util.*
open class Currency : RealmObject() {
open class Currency : RealmObject(), Identifiable {
companion object {
@ -17,7 +19,10 @@ open class Currency : RealmObject() {
}
@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...
@ -39,6 +44,10 @@ open class Currency : RealmObject() {
* The rate of the currency with the main currency
*/
var rate: Double? = DEFAULT_RATE
set(value) {
field = value
DataManager.currencyToCompute(this)
}
fun refreshRelatedRatedValues() {

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

@ -6,23 +6,20 @@ import android.content.Intent
import android.os.Build
import android.os.Bundle
import com.google.android.material.bottomnavigation.BottomNavigationView
import io.realm.RealmResults
import net.pokeranalytics.android.BuildConfig
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.NewPerformanceListener
import net.pokeranalytics.android.calculus.DataManager
import net.pokeranalytics.android.databinding.ActivityHomeBinding
import net.pokeranalytics.android.model.filter.Query
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.utils.SessionManager
import net.pokeranalytics.android.ui.activity.components.BaseActivity
import net.pokeranalytics.android.ui.adapter.HomePagerAdapter
import net.pokeranalytics.android.util.Preferences
import net.pokeranalytics.android.util.billing.AppGuard
import net.pokeranalytics.android.util.extensions.findAll
import net.pokeranalytics.android.util.extensions.isSameMonth
import net.pokeranalytics.android.util.extensions.writeAsync
import java.util.*
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 val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
if (binding.viewPager.currentItem == Tab.REPORTS.identifier) {
SessionManager.reportWhistleBlower?.clearNotifications()
DataManager.reportWhistleBlower?.clearNotifications()
}
when (item.itemId) {
@ -97,36 +93,16 @@ class HomeActivity : BaseActivity(), NewPerformanceListener {
}
}
observeRealmObjects()
initUI()
checkFirstLaunch()
SessionManager.reportWhistleBlower?.addListener(this)
DataManager.reportWhistleBlower?.addListener(this)
}
override fun onDestroy() {
super.onDestroy()
SessionManager.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()
}
}
}
DataManager.reportWhistleBlower?.removeListener(this)
}
/**
@ -169,12 +145,10 @@ class HomeActivity : BaseActivity(), NewPerformanceListener {
}
override fun newBestPerformanceHandler() {
if (Preferences.showInAppBadges(this)) {
binding.navigation.getOrCreateBadge(R.id.navigation_reports).isVisible = true
binding.navigation.getOrCreateBadge(R.id.navigation_reports).number = 1
}
}
private fun lookForCalendarBadge() {

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

@ -26,7 +26,7 @@ import net.pokeranalytics.android.model.combined
import net.pokeranalytics.android.model.interfaces.Deletable
import net.pokeranalytics.android.model.realm.Performance
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.components.ReportActivity
import net.pokeranalytics.android.ui.activity.components.RequestCode
@ -187,13 +187,13 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc
ReportCreationActivity.newInstanceForResult(this, requireContext())
}
SessionManager.reportWhistleBlower?.addListener(this)
DataManager.reportWhistleBlower?.addListener(this)
}
override fun onDestroy() {
super.onDestroy()
SessionManager.reportWhistleBlower?.removeListener(this)
DataManager.reportWhistleBlower?.removeListener(this)
}
// Rows
@ -266,7 +266,7 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc
override fun boolForRow(row: RowRepresentable): Boolean {
val reportRow = row as PerformanceRow
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) {

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

Loading…
Cancel
Save