From c08396b63816c6b8c42b4bcc858fc027fdfc7982 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 13 Jan 2023 10:30:47 +0100 Subject: [PATCH] more work in progress --- app/build.gradle | 12 +- .../components/RealmInstrumentedUnitTest.kt | 3 +- .../android/model/CriteriaTest.kt | 6 +- .../unitTests/BankrollInstrumentedUnitTest.kt | 5 +- .../unitTests/StatsInstrumentedUnitTest.kt | 20 +++ .../android/PokerAnalyticsApplication.kt | 18 ++- .../android/calculus/Calculator.kt | 6 +- .../pokeranalytics/android/calculus/Stat.kt | 6 +- .../calculus/bankroll/BankrollCalculator.kt | 10 +- .../android/model/migrations/Patcher.kt | 4 +- .../android/model/realm/Session.kt | 10 +- .../{SessionSetManager.kt => TimeManager.kt} | 122 ++++++++++++++---- .../android/ui/fragment/StatisticsFragment.kt | 5 +- .../ui/modules/calendar/CalendarFragment.kt | 2 +- .../android/ui/modules/feed/FeedFragment.kt | 4 +- .../FeedSessionRowRepresentableAdapter.kt | 2 +- app/src/main/res/values/strings.xml | 2 +- 17 files changed, 169 insertions(+), 68 deletions(-) rename app/src/main/java/net/pokeranalytics/android/model/utils/{SessionSetManager.kt => TimeManager.kt} (76%) diff --git a/app/build.gradle b/app/build.gradle index 88ceffcf..dd170374 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -145,15 +145,15 @@ dependencies { implementation 'com.android.volley:volley:1.2.1' // Instrumented Tests - androidTestImplementation 'androidx.test:core:1.3.0' - androidTestImplementation 'androidx.test:runner:1.3.0' - androidTestImplementation 'androidx.test:rules:1.3.0' - androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test:core:1.5.0' + androidTestImplementation 'androidx.test:runner:1.5.2' + androidTestImplementation 'androidx.test:rules:1.5.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' // Test testImplementation 'junit:junit:4.12' - testImplementation 'com.android.support.test:runner:1.0.2' - testImplementation 'com.android.support.test:rules:1.0.2' + testImplementation 'androidx.test.ext:junit:1.1.5' + testImplementation 'androidx.test:rules:1.5.0' // gross, somehow needed to make the stop notif work implementation 'com.google.guava:guava:27.0.1-android' diff --git a/app/src/androidTest/java/net/pokeranalytics/android/components/RealmInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/components/RealmInstrumentedUnitTest.kt index 30d84082..2fcdc54b 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/components/RealmInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/components/RealmInstrumentedUnitTest.kt @@ -20,8 +20,9 @@ open class RealmInstrumentedUnitTest { fun newSessionInstance(realm: Realm, isCashGame: Boolean = true) : Session { val session = realm.createObject(Session::class.java, UUID.randomUUID().toString()) session.startDate = Date() + session.endDate = Date() session.type = if (isCashGame) Session.Type.CASH_GAME.ordinal else Session.Type.TOURNAMENT.ordinal - session.result = realm.createObject(Result::class.java) + session.result = realm.createObject(Result::class.java, UUID.randomUUID().toString()) return session } diff --git a/app/src/androidTest/java/net/pokeranalytics/android/model/CriteriaTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/model/CriteriaTest.kt index bd0bf7ee..7389b24d 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/model/CriteriaTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/model/CriteriaTest.kt @@ -34,7 +34,7 @@ class CriteriaTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val yearQueries = Criteria.Years.queryConditions + val yearQueries = Criteria.Years.queryConditions(realm) assertEquals(16, yearQueries.size) @@ -57,7 +57,7 @@ class CriteriaTest : BaseFilterInstrumentedUnitTest() { fun combined() { val criterias = listOf(Criteria.MonthsOfYear, Criteria.DaysOfWeek) - val combined = criterias.combined() + val combined = criterias.combined(this.mockRealm) val context = InstrumentationRegistry.getInstrumentation().context combined.forEach { @@ -92,7 +92,7 @@ class CriteriaTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() val context = InstrumentationRegistry.getInstrumentation().context - val allMonths = Criteria.AllMonthsUpToNow.queries + val allMonths = Criteria.AllMonthsUpToNow.queries(realm) allMonths.forEach { it.conditions.forEach { qc-> println("<<<<< ${qc.getDisplayName(context)}") diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/BankrollInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/BankrollInstrumentedUnitTest.kt index 5a21a604..4985ffe0 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/BankrollInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/BankrollInstrumentedUnitTest.kt @@ -16,7 +16,7 @@ import java.util.* class BankrollInstrumentedUnitTest : SessionInstrumentedUnitTest() { private fun createDefaultTransactionTypes(realm: Realm) { - TransactionType.Value.values().forEachIndexed { index, value -> + TransactionType.Value.values().forEachIndexed { _, value -> val type = TransactionType() type.additive = value.additive type.kind = value.uniqueIdentifier @@ -64,10 +64,12 @@ class BankrollInstrumentedUnitTest : SessionInstrumentedUnitTest() { val s1 = newSessionInstance(realm) s1.bankroll = br1 s1.result?.cashout = 200.0 + s1.preCompute() val s2 = newSessionInstance(realm) s2.bankroll = br2 s2.result?.cashout = 500.0 + s2.preCompute() } @@ -113,6 +115,7 @@ class BankrollInstrumentedUnitTest : SessionInstrumentedUnitTest() { val s1 = newSessionInstance(realm) s1.bankroll = br1 s1.result?.cashout = 200.0 + s1.endDate = Date() } diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt index ac31a69d..29752201 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt @@ -65,6 +65,9 @@ class StatsInstrumentedUnitTest : SessionInstrumentedUnitTest() { s1.location = l1 s2.location = l1 + s1.preCompute() + s2.preCompute() + realm.commitTransaction() assertEquals(2, computableResults.size) @@ -249,6 +252,9 @@ class StatsInstrumentedUnitTest : SessionInstrumentedUnitTest() { // netDuration = 1h, hourly = -100, bb100 = -200bb / 25hands * 100 = -800 // netDuration = 4h, hourly = 100, bb100 = 150 / 75 * 100 = +200 + s1.preCompute() + s2.preCompute() + } val stats: List = listOf(Stat.NET_RESULT, Stat.AVERAGE) @@ -316,6 +322,10 @@ class StatsInstrumentedUnitTest : SessionInstrumentedUnitTest() { realm.copyToRealmOrUpdate(s2) realm.copyToRealmOrUpdate(s3) + s1.preCompute() + s2.preCompute() + s3.preCompute() + realm.commitTransaction() val stats: List = listOf(Stat.NET_RESULT, Stat.AVERAGE) @@ -454,6 +464,9 @@ class StatsInstrumentedUnitTest : SessionInstrumentedUnitTest() { s1.endDate = ed1 realm.copyToRealmOrUpdate(s1) + + s1.preCompute() + realm.commitTransaction() val sets = realm.where(SessionSet::class.java).findAll() @@ -498,6 +511,9 @@ class StatsInstrumentedUnitTest : SessionInstrumentedUnitTest() { realm.copyToRealmOrUpdate(s1) realm.copyToRealmOrUpdate(s2) + s1.preCompute() + s2.preCompute() + realm.commitTransaction() val sets = realm.where(SessionSet::class.java).findAll() @@ -731,6 +747,10 @@ class StatsInstrumentedUnitTest : SessionInstrumentedUnitTest() { s2.startDate = sd2 s2.endDate = ed2 + + s1.preCompute() + s2.preCompute() + } val group = ComputableGroup(Query(), listOf()) diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index cfbbda06..f8360258 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -21,7 +21,7 @@ import net.pokeranalytics.android.model.migrations.PokerAnalyticsMigration import net.pokeranalytics.android.model.realm.FlatTimeInterval import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.utils.Seed -import net.pokeranalytics.android.model.utils.SessionSetManager +import net.pokeranalytics.android.model.utils.TimeManager import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.util.FakeDataManager import net.pokeranalytics.android.util.PokerAnalyticsLogs @@ -96,7 +96,7 @@ class PokerAnalyticsApplication : Application() { // Reports this.reportWhistleBlower = ReportWhistleBlower(this.applicationContext) - SessionSetManager.configure() + TimeManager.configure() // Infos val locale = Locale.getDefault() @@ -107,10 +107,10 @@ class PokerAnalyticsApplication : Application() { val emptyFTI = realm.where(FlatTimeInterval::class.java).isEmpty("sessions").findAll() if (emptyFTI.isNotEmpty()) { Timber.w(">>> WARNING: There are ${emptyFTI.size} FTIs without sessions") - Timber.w(">>> DELETING THE EMPTY FTIs") - realm.executeTransactionAsync { - it.where(FlatTimeInterval::class.java).isEmpty("sessions").findAll().deleteAllFromRealm() - } +// Timber.w(">>> DELETING THE EMPTY FTIs") +// realm.executeTransactionAsync { +// it.where(FlatTimeInterval::class.java).isEmpty("sessions").findAll().deleteAllFromRealm() +// } } val ftis = realm.where(FlatTimeInterval::class.java).sort("startDate").findAll() @@ -119,6 +119,12 @@ class PokerAnalyticsApplication : Application() { Timber.d("fti > ${it.startDate} / ${it.endDate}") } + Timber.d("================") + val sessions = realm.where().findAll() + sessions.forEach { + Timber.d("Session FTI count = ${it.flatTimeIntervals.size}") + } + } /** Defines callbacks for service binding, passed to bindService() */ diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index f78e8152..3a314d91 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -11,7 +11,6 @@ import net.pokeranalytics.android.model.filter.filter import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.utils.SessionInterval import net.pokeranalytics.android.util.extensions.startOfDay -import timber.log.Timber import java.util.* import kotlin.math.max import kotlin.math.min @@ -75,7 +74,6 @@ class Calculator { } } - /** * The type of evolution numericValues */ @@ -249,7 +247,6 @@ class Calculator { // Timber.d(">>> group ${group.name} in $duration seconds") } - return report } @@ -277,6 +274,9 @@ class Calculator { // Timber.d("$$$ buyin = ${it.ratedBuyin} $$$ net result = ${it.ratedNet}") // } + val ftis = realm.where(FlatTimeInterval::class.java).findAll() + results.addStat(FTI_COUNT, ftis.size.toDouble()) + var ratedNet = computables.sum(ComputableResult.Field.RATED_NET.identifier).toDouble() if (options.includedTransactions.isNotEmpty()) { for (transactionType in options.includedTransactions) { diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt index 7399047d..de540292 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -55,7 +55,8 @@ enum class Stat(override var uniqueIdentifier: Int) : IntIdentifiable, RowRepres RISK_OF_RUIN(28), STANDARD_DEVIATION_BB(29), TOURNAMENT_ITM_RATIO(30), - TOTAL_TIPS(31) + TOTAL_TIPS(31), + FTI_COUNT(32) ; companion object : IntSearchable { @@ -136,6 +137,7 @@ enum class Stat(override var uniqueIdentifier: Int) : IntIdentifiable, RowRepres TOTAL_BUYIN -> R.string.total_buyin TOURNAMENT_ITM_RATIO -> R.string.itm_ratio TOTAL_TIPS -> R.string.total_tips + FTI_COUNT -> R.string.players_count else -> throw PAIllegalStateException("Stat ${this.name} name required but undefined") } } @@ -162,7 +164,7 @@ enum class Stat(override var uniqueIdentifier: Int) : IntIdentifiable, RowRepres return TextFormat(value.formatted, color) } // white integers - NUMBER_OF_SETS, NUMBER_OF_GAMES, HANDS_PLAYED, LOCATIONS_PLAYED, DAYS_PLAYED -> { + NUMBER_OF_SETS, NUMBER_OF_GAMES, HANDS_PLAYED, LOCATIONS_PLAYED, DAYS_PLAYED, FTI_COUNT -> { return TextFormat("${value.toInt()}") } // white durations HOURLY_DURATION, AVERAGE_HOURLY_DURATION, MAXIMUM_DURATION -> { diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt index 6ff628a0..1b1110de 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt @@ -31,7 +31,7 @@ class BankrollCalculator { var initialValue = 0.0 var transactionNet = 0.0 - bankrolls.forEach { bankroll -> + for (bankroll in bankrolls) { val rate = if (setup.virtualBankroll) bankroll.rate else 1.0 @@ -70,8 +70,8 @@ class BankrollCalculator { val transactions = Filter.queryOn(realm, baseQuery) report.addDatedItems(transactions) - transactions.forEach { - report.addTransaction(it) + for (transaction in transactions) { + report.addTransaction(transaction) } val sessionQuery = Query(QueryCondition.DateNotNull).merge(baseQuery) @@ -83,8 +83,8 @@ class BankrollCalculator { val options = Calculator.Options(stats = listOf(Stat.NET_RESULT, Stat.HOURLY_RATE, Stat.STANDARD_DEVIATION_HOURLY)) val group = ComputableGroup(baseQuery) val result = Calculator.compute(realm, group, options) - result.computedStat(Stat.NET_RESULT)?.let { - report.netResult = it.value + result.computedStat(Stat.NET_RESULT)?.let { computedStat -> + report.netResult = computedStat.value } this.computeRiskOfRuin(report, result) diff --git a/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt b/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt index a154fd1b..e852dc53 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt @@ -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.SessionSetManager +import net.pokeranalytics.android.model.utils.TimeManager import net.pokeranalytics.android.util.BLIND_SEPARATOR import net.pokeranalytics.android.util.Preferences import java.text.NumberFormat @@ -173,7 +173,7 @@ class Patcher { asyncRealm.where(SessionSet::class.java).findAll().deleteAllFromRealm() val sessions = asyncRealm.where(Session::class.java).isNotNull("startDate").isNotNull("endDate").findAll() sessions.forEach { session -> - SessionSetManager.updateTimeline(session) + TimeManager.updateTimeline(session) } } realm.close() 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 a14f175e..eca7dc6e 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 @@ -27,7 +27,7 @@ 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.SessionSetManager +import net.pokeranalytics.android.model.utils.TimeManager import net.pokeranalytics.android.ui.adapter.UnmanagedRowRepresentableException import net.pokeranalytics.android.ui.graph.Graph import net.pokeranalytics.android.ui.view.* @@ -216,7 +216,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim this.endDate = null } - SessionSetManager.startChanged(this, min(previous, value)) + TimeManager.startChanged(this, min(previous, value)) // this.computeStats() } @@ -238,7 +238,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim } this.computeNetDuration() - SessionSetManager.endChanged(this, max(previous, value)) + TimeManager.endChanged(this, max(previous, value)) this.defineDefaultTournamentBuyinIfNecessary() // this.computeStats() } @@ -711,10 +711,10 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim // Updates the timeline this.sessionSet?.let { - SessionSetManager.removeFromTimeline(this) + TimeManager.removeFromTimeline(this) } - SessionSetManager.sessionDateChanged(this) + TimeManager.sessionDateChanged(this) // cleanup unnecessary related objects this.flatTimeIntervals.deleteAllFromRealm() diff --git a/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt b/app/src/main/java/net/pokeranalytics/android/model/utils/TimeManager.kt similarity index 76% rename from app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt rename to app/src/main/java/net/pokeranalytics/android/model/utils/TimeManager.kt index 8b255202..50eaf05e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/utils/TimeManager.kt @@ -17,10 +17,13 @@ import java.util.* class CorruptSessionSetException(message: String) : Exception(message) /** - * The manager is in charge of updating the concept of timeline, - * representing the time frames where the user plays. + * The TimeManager pre-computes time related data: + * - SessionSet: All overlapping sessions are grouped into a SessionSet, + * used to calculate the number of sessions and break durations + * - FlatTimeInterval: Sessions time intervals are breaked down into smaller intervals + * when overlapping occurs to get faster duration calculations */ -object SessionSetManager { +object TimeManager { var sessions: RealmResults? = null @@ -55,29 +58,82 @@ object SessionSetManager { sessions = realm.where(Session::class.java).findAllAsync() sessions?.addChangeListener { _, _ -> - if (this.start != null && this.end != null) { - realm.executeTransactionAsync { asyncRealm -> - processSessions(asyncRealm) - cleanUp() - } + + if (sessionIdsToProcess.isNotEmpty()) { + + realm.executeTransactionAsync({ asyncRealm -> + + val sessions = sessionIdsToProcess.mapNotNull { asyncRealm.findById(it) } + sessionIdsToProcess.clear() + + for (session in sessions) { + Timber.d("Session id = ${session.id}") + Timber.d("Session time intervals count = ${session.flatTimeIntervals.size}") + session.flatTimeIntervals.deleteAllFromRealm() + val fti = FlatTimeInterval() + session.flatTimeIntervals.add(fti) + asyncRealm.insertOrUpdate(session) + } + + }, { + Timber.d("executeTransactionAsync onSuccess listener...") + val timeIntervals = realm.where(FlatTimeInterval::class.java).findAll() + Timber.d("Total timeIntervals count = ${timeIntervals.size}") + + timeIntervals.forEach { + Timber.d(">>> Time interval session count = ${it.sessions?.size}, session id = ${it.sessions?.firstOrNull()?.id}") + } + + }, {}) + } + } +// sessions?.addChangeListener { _, _ -> +// +// Timber.d("...sessions change at ${Date().time}") +// +// val start = this.start +// val end = this.end +// if (start != null && end != null) { +// +// Timber.d("...process date changes from $start to $end") +// +// this.start = null +// this.end = null +// +// realm.executeTransactionAsync ({ asyncRealm -> +// processSessions(asyncRealm, start, end) +// cleanUp() +// }, { +// Timber.d(">>>>> ON SUCCESS") +// +// realm.where(FlatTimeInterval::class.java).findAll().forEach { +// Timber.d("######## sessions count = ${it.sessions?.size}") +// } +// +// }, { +// Timber.d("Transaction failed : $it") +// }) +// } +// } + realm.close() } private fun cleanUp() { this.start = null this.end = null -// this.sessionIdsToProcess.clear() + this.sessionIdsToProcess.clear() } - private fun processSessions(realm: Realm) { + private fun processSessions(realm: Realm, start: Date, end: Date) { Timber.d("***** processSessions, process count = ${sessionIdsToProcess.size}") - val start = this.start - val end = this.end +// val start = this.start +// val end = this.end val sessions = sessionIdsToProcess.mapNotNull { realm.findById(it) } for (session in sessions) { @@ -94,9 +150,7 @@ object SessionSetManager { } // FlatTimeIntervals - if (start != null && end != null) { - processFlatTimeInterval(realm, sessions.toSet(), start, end) - } + processFlatTimeInterval(realm, sessions.toSet(), start, end) val ftis = realm.where(FlatTimeInterval::class.java).findAll() Timber.d("*** FTIs count = ${ftis.size}") @@ -306,16 +360,21 @@ object SessionSetManager { private fun processFlatTimeInterval(realm: Realm, changedSessions: Set, start: Date, end: Date) { - Timber.d("***************************************************") - Timber.d("*** processFlatTimeInterval, from: $start, to $end") - Timber.d("***************************************************") +// Timber.d("***************************************************") +// Timber.d("*** processFlatTimeInterval, from: $start, to $end") +// Timber.d("***************************************************") val sessions = matchingData(realm, start, end) - Timber.d("*** matching sessions: ${sessions.size}") val intervalsStore = IntervalsStore(sessions.toSet()) intervalsStore.processSessions(changedSessions) - intervalsStore.intervals.forEach { it.deleteFromRealm() } + Timber.d("*** sessions count = ${intervalsStore.sessions.size}") + Timber.d("*** ftis to delete: ${intervalsStore.intervals.size}") + for (fti in intervalsStore.intervals) { + fti.deleteFromRealm() + } + +// intervalsStore.intervals.forEach { it.deleteFromRealm() } val intervals = SessionInterval.intervalMap(intervalsStore.sessions) @@ -333,17 +392,25 @@ object SessionSetManager { (sd != null && ed != null && sd <= s && ed >= e) } if (matchingSessions.isNotEmpty()) { - Timber.d("**** Create FTI: $s - $e") +// Timber.d("**** Create FTI: $s - $e") val fti = FlatTimeInterval() fti.startDate = s fti.endDate = e - matchingSessions.forEach { it.flatTimeIntervals.add(fti) } + for (session in matchingSessions) { + session.flatTimeIntervals.add(fti) + realm.insertOrUpdate(session) + } realm.insertOrUpdate(fti) } else { Timber.w("The FTI has no sessions") } } } + + sessions.forEach { + Timber.d("ending process...session FTI count = ${it.flatTimeIntervals.size}") + } + } } @@ -366,7 +433,7 @@ class IntervalsStore(sessionSet: Set) { fun processSessions(sessions: Set) { this.sessions.addAll(sessions) for (session in sessions) { - Timber.d("PROCESS > s = ${session.startDate} / e = ${session.endDate} ") +// Timber.d("PROCESS > s = ${session.startDate} / e = ${session.endDate} ") loadIntervals(session) } } @@ -382,6 +449,7 @@ class IntervalsStore(sessionSet: Set) { this.sessionIds.add(session.id) + Timber.d("session FTI count = ${session.flatTimeIntervals.size}") for (fti in session.flatTimeIntervals) { this.intervals.add(fti) @@ -411,7 +479,7 @@ class SessionInterval(session: Session) { this.start = session.startDate!! this.end = session.endDate - Timber.d("INTERVAL init: s = $start, e = $end") +// Timber.d("INTERVAL init: s = $start, e = $end") this.addSession(session) } @@ -454,9 +522,9 @@ class SessionInterval(session: Session) { } } - intervals.forEach { - Timber.d("s = ${it.start}, e = ${it.end}") - } +// intervals.forEach { +// Timber.d("s = ${it.start}, e = ${it.end}") +// } return intervals } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt index 3e2284f5..da3b2ae5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt @@ -179,7 +179,7 @@ class StatisticsFragment : FilterableFragment(), RealmAsyncListener { val e = Date() val duration = (e.time - s.time) / 1000.0 - Timber.d(">>> computations took $duration seconds") +// Timber.d(">>> computations took $duration seconds") } async.await() @@ -197,7 +197,7 @@ class StatisticsFragment : FilterableFragment(), RealmAsyncListener { */ private fun createSessionGroupsAndStartCompute(realm: Realm): Report { - Timber.d(">>> Launch statistics computations") +// Timber.d(">>> Launch statistics computations") val filter: Filter? = this.currentFilter(this.requireContext(), realm)?.let { if (it.filterableType == currentFilterable) { it } else { null } @@ -210,6 +210,7 @@ class StatisticsFragment : FilterableFragment(), RealmAsyncListener { Stat.NUMBER_OF_SETS, Stat.AVERAGE_HOURLY_DURATION, Stat.HOURLY_DURATION, + Stat.FTI_COUNT, Stat.HANDS_PLAYED ) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt index 4474e1dd..9814c8da 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt @@ -399,7 +399,7 @@ class CalendarFragment : RealmFragment(), StaticRowRepresentableDataSource, val e = Date() val duration = (e.time - s.time) / 1000.0 - Timber.d(">>> computations took $duration seconds") +// Timber.d(">>> computations took $duration seconds") } async.await() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt index 4efb015f..6be7f46a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt @@ -24,7 +24,7 @@ import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.handhistory.HandHistory -import net.pokeranalytics.android.model.utils.SessionSetManager +import net.pokeranalytics.android.model.utils.TimeManager import net.pokeranalytics.android.ui.activity.BillingActivity import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -481,7 +481,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis for (id in sessions) { r.findById(id)?.let { s -> s.tableSize = 6 - SessionSetManager.sessionDateChanged(s) + TimeManager.sessionDateChanged(s) } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt index 4dfcb5ec..9ecccd7c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt @@ -210,7 +210,7 @@ class FeedSessionRowRepresentableAdapter( } sortedHeaders = headersPositions.toSortedMap() - Timber.d("Create viewTypesPositions in: ${System.currentTimeMillis() - start}ms") +// Timber.d("Create viewTypesPositions in: ${System.currentTimeMillis() - start}ms") } /** diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1ca14ba..562044e9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -432,7 +432,7 @@ Place Player Players - Player\'s count + Players count Please check if your values are valid Please confirm the import of \'%s\'? An internal issue has occurred. We would be glad if you could report a bug with the steps to reproduce the bug. Thank you!