From d9638ce516ea7a7cef62b9bb15f2839d983497a1 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 7 Dec 2022 10:24:40 +0100 Subject: [PATCH] changes and improvements --- .../android/calculus/ReportWhistleBlower.kt | 36 ++++++----- .../android/model/realm/ComputableResult.kt | 8 ++- .../android/model/realm/Session.kt | 9 +-- .../android/model/realm/SessionSet.kt | 20 ++++++- .../android/model/utils/SessionSetManager.kt | 60 +++++++------------ .../android/ui/fragment/StatisticsFragment.kt | 13 ++-- .../ui/fragment/components/RealmFragment.kt | 27 +++++---- .../fragment/report/AbstractReportFragment.kt | 3 +- .../ui/modules/calendar/CalendarFragment.kt | 19 +++--- .../ui/modules/data/DataManagerFragment.kt | 2 +- .../ui/modules/data/EditableDataFragment.kt | 2 +- .../android/ui/modules/feed/FeedFragment.kt | 29 ++++----- .../FeedHandHistoryRowRepresentableAdapter.kt | 2 - .../FeedSessionRowRepresentableAdapter.kt | 8 +-- .../FeedTransactionRowRepresentableAdapter.kt | 2 - .../ui/modules/feed/NewDataMenuActivity.kt | 7 +-- .../ui/modules/filter/FiltersFragment.kt | 4 +- .../ui/modules/filter/FiltersListFragment.kt | 2 +- .../handhistory/model/EditorViewModel.kt | 2 +- .../ui/modules/session/SessionFragment.kt | 2 +- .../settings/DealtHandsPerHourFragment.kt | 2 +- .../settings/TransactionFilterFragment.kt | 2 +- .../net/pokeranalytics/android/util/Global.kt | 6 ++ .../android/util/csv/PACSVDescriptor.kt | 1 - 24 files changed, 135 insertions(+), 133 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/ReportWhistleBlower.kt b/app/src/main/java/net/pokeranalytics/android/calculus/ReportWhistleBlower.kt index 6dec8ba3..bed93683 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/ReportWhistleBlower.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/ReportWhistleBlower.kt @@ -13,7 +13,9 @@ import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveOnline import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.ui.view.rows.StaticReport +import net.pokeranalytics.android.util.Global import net.pokeranalytics.android.util.extensions.formattedHourlyDuration +import timber.log.Timber interface NewPerformanceListener { fun newBestPerformanceHandler() @@ -39,20 +41,20 @@ class ReportWhistleBlower(var context: Context) { val realm = Realm.getDefaultInstance() - this.sessions = realm.where(Session::class.java).findAll() - this.sessions?.addChangeListener { _ -> - requestReportLaunch() - } - - this.results = realm.where(Result::class.java).findAll() - this.results?.addChangeListener { _ -> - requestReportLaunch() - } - - this.sessionSets = realm.where(SessionSet::class.java).findAll() - this.sessionSets?.addChangeListener { _ -> - requestReportLaunch() - } +// this.sessions = realm.where(Session::class.java).findAll() +// this.sessions?.addChangeListener { _ -> +// requestReportLaunch() +// } +// +// this.results = realm.where(Result::class.java).findAll() +// this.results?.addChangeListener { _ -> +// requestReportLaunch() +// } +// +// this.sessionSets = realm.where(SessionSet::class.java).findAll() +// this.sessionSets?.addChangeListener { _ -> +// requestReportLaunch() +// } realm.close() } @@ -140,11 +142,14 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co } fun cancel() { + Timber.d("Reportwhistleblower task CANCEL") this.cancelled = true } private fun launchReports() { + Timber.d("====== Report whistleblower launch batch...") + CoroutineScope(Dispatchers.Default).launch { val realm = Realm.getDefaultInstance() @@ -159,7 +164,8 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co // CustomField 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) { if (cancelled) { break diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt index bbc7bc31..2a846b3d 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt @@ -38,8 +38,12 @@ open class ComputableResult : RealmObject(), Filterable { this.bbNet = session.bbNet this.hasBigBlind = if (session.cgBiggestBet != null) 1 else 0 this.estimatedHands = session.estimatedHands - this.bbPer100Hands = - session.bbNet / (session.numberOfHandsPerHour * session.hourlyDuration) * 100 + + this.bbPer100Hands = if (this.estimatedHands > 0.0) { + session.bbNet / this.estimatedHands * 100 + } else { + 0.0 + } } 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 096e0fb0..08d0c5ad 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 @@ -381,7 +381,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim } private fun dateChanged() { - SessionSetManager.dateChange = true + SessionSetManager.sessionDateChanged(this) } // /** @@ -435,7 +435,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim get() { val bb = this.cgBiggestBet val result = this.result - return if (bb != null && result != null) { + return if (bb != null && bb > 0.0 && result != null) { result.net / bb } else { 0.0 @@ -472,7 +472,6 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim fun preCompute() { this.computeStats() - this.sessionSet?.computeStats() this.result?.computeNumberOfRebuy() } @@ -504,7 +503,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim /** * Approximates the number of hands played per hour at the table */ - val numberOfHandsPerHour: Double + private val numberOfHandsPerHour: Double get() { val tableSize = this.tableSize ?: 9 // 9 is the default table size if null @@ -513,8 +512,6 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim playerHandsPerHour = if (this.isLive) config.liveDealtHandsPerHour else config.onlineDealtHandsPerHour } -// val config = UserConfig.getConfiguration(this.realm) -// val playerHandsPerHour = if (this.isLive) config.liveDealtHandsPerHour else config.onlineDealtHandsPerHour return this.numberOfTables * playerHandsPerHour / tableSize.toDouble() } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt index 95ed2768..2af33b08 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt @@ -15,8 +15,10 @@ import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.TextFormat +import kotlin.math.min import java.text.DateFormat import java.util.* +import kotlin.math.max open class SessionSet : RealmObject(), Timed, Filterable { @@ -63,7 +65,7 @@ open class SessionSet : RealmObject(), Timed, Filterable { this.ratedNet = this.sessions?.sumOf { it.computableResult?.ratedNet ?: 0.0 } ?: 0.0 this.estimatedHands = this.sessions?.sumOf { it.estimatedHands } ?: 0.0 this.bbNet = this.sessions?.sumOf { it.bbNet } ?: 0.0 - this.breakDuration = this.sessions?.max("breakDuration")?.toLong() ?: 0L + updateBreakDuration() } /** @@ -141,5 +143,21 @@ open class SessionSet : RealmObject(), Timed, Filterable { @Ignore override val realmObjectClass: Class = SessionSet::class.java + private fun updateBreakDuration() { + + var longestNetDuration = 0L + var maxBreakDuration = 0L + + this.sessions?.let { sessions -> + for (session in sessions) { + longestNetDuration = max(longestNetDuration, session.netDuration) + maxBreakDuration = max(session.breakDuration, maxBreakDuration) + } + } + + val maxSetBreak = endDate.time - startDate.time - longestNetDuration + this.breakDuration = min(maxBreakDuration, maxSetBreak) + } + } diff --git a/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt b/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt index e22929a7..885c54e6 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt @@ -8,58 +8,48 @@ import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.util.extensions.findById import timber.log.Timber -import kotlin.math.max 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. + * The manager is in charge of updating the concept of timeline, + * representing the time frames where the user plays. */ object SessionSetManager { var sessions: RealmResults - private val sessionsToProcess = mutableSetOf() - - var dateChange = false + private val sessionIdsToProcess = mutableSetOf() fun configure() {} // launch init + fun sessionDateChanged(session: Session) { + this.sessionIdsToProcess.add(session.id) + } + init { val realm = Realm.getDefaultInstance() this.sessions = realm.where(Session::class.java).findAllAsync() - this.sessions.addChangeListener { sessions, changeSet -> - - if (this.dateChange) { - this.dateChange = false - changeSet.insertions.forEach { index -> - sessions[index]?.let { this.sessionsToProcess.add(it) } - } - changeSet.changes.forEach { index -> - sessions[index]?.let { this.sessionsToProcess.add(it) } - } - - val sessionIds = this.sessionsToProcess.map { it.id } - realm.executeTransactionAsync { asyncRealm -> - processSessions(asyncRealm, sessionIds) - } - } - - } +// this.sessions.addChangeListener { _, _ -> +//// if (Global.LAUNCH_ASYNC_LISTENERS) { +// if (this.sessionIdsToProcess.isNotEmpty()) { +// realm.executeTransactionAsync { asyncRealm -> +// processSessions(asyncRealm) +// } +// } +//// } +// } realm.close() } -// fun updatedSession(session: Session) { -// this.sessionsToProcess.add(session) -// } + private fun processSessions(realm: Realm) { - private fun processSessions(realm: Realm, sessionIds: List) { + Timber.d("***** processSessions, process count = ${sessionIdsToProcess.size}") - for (sessionId in sessionIds) { + for (sessionId in this.sessionIdsToProcess) { realm.findById(sessionId)?.let { session -> if (session.startDate != null && session.endDate != null) { updateTimeline(session) @@ -69,14 +59,7 @@ object SessionSetManager { } } -// for (session in this.sessionsToProcess) { -// if (session.startDate != null && session.endDate != null) { -// this.updateTimeline(realm, session) -// } else if (session.sessionSet != null) { -// removeFromTimeline(realm, session) -// } -// } - this.sessionsToProcess.clear() + this.sessionIdsToProcess.clear() } /** @@ -84,8 +67,6 @@ object SessionSetManager { */ fun updateTimeline(session: Session) { - Timber.d("updateTimeline") - // if (!session.realm.isInTransaction) { // throw PAIllegalStateException("realm should be in transaction at this point") // } @@ -239,7 +220,6 @@ object SessionSetManager { // Add all orphan endedSessions sessions.forEach { s -> s.sessionSet = set - set.breakDuration = max(set.breakDuration, s.breakDuration) } set.computeStats() 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 e164b283..3d23b037 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 @@ -8,6 +8,7 @@ import android.os.Bundle import android.view.* import androidx.appcompat.widget.Toolbar import io.realm.Realm +import io.realm.RealmModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async @@ -72,10 +73,10 @@ class StatisticsFragment : FilterableFragment(), RealmAsyncListener { this.currentFilterable = FilterableType.SESSION applyFilter() - addRealmChangeListener(this, UserConfig::class.java) - addRealmChangeListener(this, ComputableResult::class.java) - addRealmChangeListener(this, Transaction::class.java) - addRealmChangeListener(this, SessionSet::class.java) +// addRealmChangeListener(this, UserConfig::class.java) +// addRealmChangeListener(this, ComputableResult::class.java) +// addRealmChangeListener(this, Transaction::class.java) +// addRealmChangeListener(this, SessionSet::class.java) } private fun initUI() { @@ -147,11 +148,13 @@ class StatisticsFragment : FilterableFragment(), RealmAsyncListener { // Business - override fun asyncListenedEntityChange(realm: Realm) { + override fun asyncListenedEntityChange(realm: Realm, clazz: Class) { + if (isAdded) { // Fixes: java.lang.IllegalStateException Fragment StatisticsFragment{9d3e5ec} not attached to a context. launchStatComputation() setTransactionFilterItemColor() } + } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt index d672139c..4b309f90 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt @@ -8,9 +8,10 @@ import io.realm.Realm import io.realm.RealmModel import io.realm.RealmResults import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.util.Global interface RealmAsyncListener { - fun asyncListenedEntityChange(realm: Realm) + fun asyncListenedEntityChange(realm: Realm, clazz: Class) } open class RealmFragment : BaseFragment() { @@ -35,14 +36,14 @@ open class RealmFragment : BaseFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { realm = Realm.getDefaultInstance() - this.observedEntities.forEach { - val realmResults = realm.where(it).findAllAsync() - realmResults.addChangeListener { t, _ -> - this.entitiesChanged(it, t) - } - - this.observedRealmResults.add(realmResults) - } +// this.observedEntities.forEach { +// val realmResults = realm.where(it).findAllAsync() +// realmResults.addChangeListener { t, _ -> +// this.entitiesChanged(it, t) +// } +// +// this.observedRealmResults.add(realmResults) +// } return super.onCreateView(inflater, container, savedInstanceState) } @@ -64,7 +65,9 @@ open class RealmFragment : BaseFragment() { val results = this.realm.where(clazz).findAllAsync() results.addChangeListener { t, _ -> // Timber.d("Realm changes: ${realmResults?.size}, $this") - this.changeListener?.asyncListenedEntityChange(t.realm) + if (Global.LAUNCH_ASYNC_LISTENERS) { + this.changeListener?.asyncListenedEntityChange(t.realm, clazz) + } } this.observedRealmResults.add(results) } @@ -83,11 +86,11 @@ open class RealmFragment : BaseFragment() { /** * A list of RealmModel classes to observe */ - open val observedEntities: List> = listOf() +// open val observedEntities: List> = listOf() /** * The method called when a change happened in any RealmResults */ - open fun entitiesChanged(clazz: Class, results: RealmResults) {} +// open fun entitiesChanged(clazz: Class, results: RealmResults) {} } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt index 25aeb8a4..bb30b148 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt @@ -144,7 +144,8 @@ abstract class AbstractReportFragment : DataManagerFragment() { options.filterId?.let { id -> rs.filter = realm.findById(id) } - realm.copyToRealmOrUpdate(rs) + realm.insertOrUpdate(rs) +// realm.copyToRealmOrUpdate(rs) } else { realm.findById(setupId)?.let { reportSetup -> reportSetup.name = name 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 c6da4f5c..663a737d 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 @@ -100,10 +100,10 @@ class CalendarFragment : RealmFragment(), StaticRowRepresentableDataSource, initData() initUI() - addRealmChangeListener(this, UserConfig::class.java) - addRealmChangeListener(this, ComputableResult::class.java) - addRealmChangeListener(this, Transaction::class.java) - addRealmChangeListener(this, SessionSet::class.java) +// addRealmChangeListener(this, UserConfig::class.java) +// addRealmChangeListener(this, ComputableResult::class.java) +// addRealmChangeListener(this, Transaction::class.java) +// addRealmChangeListener(this, SessionSet::class.java) } private var transactionFilterMenuItem: MenuItem? = null @@ -208,9 +208,6 @@ class CalendarFragment : RealmFragment(), StaticRowRepresentableDataSource, } } - override val observedEntities: List> = listOf(ComputableResult::class.java) - - // Business /** @@ -365,7 +362,7 @@ class CalendarFragment : RealmFragment(), StaticRowRepresentableDataSource, val calendar = Calendar.getInstance() calendar.time = Date().startOfMonth() - val startDate = Date() +// val startDate = Date() val requiredStats: List = listOf( @@ -504,7 +501,7 @@ class CalendarFragment : RealmFragment(), StaticRowRepresentableDataSource, if (context == null) { return } // required because of launchAsyncStatComputation - val startDate = Date() +// val startDate = Date() datesForRows.clear() rows.clear() @@ -606,11 +603,13 @@ class CalendarFragment : RealmFragment(), StaticRowRepresentableDataSource, } - override fun asyncListenedEntityChange(realm: Realm) { + override fun asyncListenedEntityChange(realm: Realm, clazz: Class) { + if (isAdded) { // Fixes: java.lang.IllegalStateException Fragment StatisticsFragment{9d3e5ec} not attached to a context. launchAsyncStatComputation() setTransactionFilterItemColor() } + } private fun showGridCalendar() { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/DataManagerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/DataManagerFragment.kt index f8e17247..34c2d64f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/DataManagerFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/DataManagerFragment.kt @@ -109,7 +109,7 @@ open class DataManagerFragment : RealmFragment() { SaveValidityStatus.VALID -> { this.getRealm().executeTransactionAsync { asyncRealm -> - asyncRealm.copyToRealmOrUpdate(savable) + asyncRealm.insertOrUpdate(savable) } onDataSaved() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt index 4cce6e5b..784d5e93 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt @@ -71,7 +71,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat if (this.model.primaryKey != null) { getRealm().executeTransactionAsync { asyncRealm -> try { - asyncRealm.copyToRealmOrUpdate(this.model.item) + asyncRealm.insertOrUpdate(this.model.item) } catch (e: Exception) { CrashLogging.log("Exception caught: row = $row, value=$value, class=${this.javaClass}") throw e 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 304cc803..f5e767f1 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 @@ -12,6 +12,7 @@ import com.android.billingclient.api.Purchase import com.google.android.material.badge.BadgeDrawable import com.google.android.material.badge.BadgeUtils import com.google.android.material.tabs.TabLayout +import io.realm.Realm import io.realm.RealmModel import io.realm.RealmResults import io.realm.Sort @@ -30,6 +31,7 @@ import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.extensions.openUrl import net.pokeranalytics.android.ui.fragment.components.FilterableFragment +import net.pokeranalytics.android.ui.fragment.components.RealmAsyncListener import net.pokeranalytics.android.ui.modules.data.EditableDataActivity import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.modules.filter.FilterActivityRequestCode @@ -47,7 +49,7 @@ import net.pokeranalytics.android.util.extensions.count import net.pokeranalytics.android.util.extensions.findById import java.util.* -class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseListener { +class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseListener, RealmAsyncListener { private enum class Tab { SESSIONS, @@ -84,14 +86,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis private var badgeDrawable: BadgeDrawable? = null - override val observedEntities: List> = - listOf(Session::class.java, Transaction::class.java, HandHistory::class.java) - - override fun entitiesChanged( - clazz: Class, - results: RealmResults - ) { - super.entitiesChanged(clazz, results) + override fun asyncListenedEntityChange(realm: Realm, clazz: Class) { when (clazz.kotlin) { Session::class -> { @@ -107,7 +102,6 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis this.handHistoryAdapter.notifyDataSetChanged() } } - } private var _binding: FragmentFeedBinding? = null @@ -142,11 +136,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis when (item.itemId) { R.id.duplicate -> { val session = this.sessionAdapter.sessionForPosition(menuPosition) - if (session != null) { - createNewSession(true, sessionId = session.id, duplicate = true) - } else { - throw PAIllegalStateException("Session not found for duplicate at position: $menuPosition") - } + createNewSession(true, sessionId = session.id, duplicate = true) } } @@ -158,6 +148,10 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis AppGuard.registerListener(this) + addRealmChangeListener(this, Session::class.java) + addRealmChangeListener(this, Transaction::class.java) + addRealmChangeListener(this, HandHistory::class.java) + initUI() initData() } @@ -482,9 +476,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis // gets the first session of the adapter - the last created - to preconfigure the HH if (this.sessionAdapter.itemCount > 0) { - this.sessionAdapter.sessionForPosition(0)?.let { session -> - HandHistoryActivity.newInstance(this, session, false) - } ?: throw PAIllegalStateException("Cannot happen") + val session = this.sessionAdapter.sessionForPosition(0) + HandHistoryActivity.newInstance(this, session, false) } else { HandHistoryActivity.newInstance(this) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedHandHistoryRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedHandHistoryRowRepresentableAdapter.kt index 45e5fc30..8ea079f7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedHandHistoryRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedHandHistoryRowRepresentableAdapter.kt @@ -137,8 +137,6 @@ class FeedHandHistoryRowRepresentableAdapter( this.sortedHeaders = this.headersPositions.toSortedMap() -// Timber.d("]]] this.sortedHeaders = ${this.sortedHeaders}") - } /** 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 f4ef5479..4dfcb5ec 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 @@ -100,7 +100,7 @@ class FeedSessionRowRepresentableAdapter( BindableHolder { fun bind(title: String) { // Title - itemView.findViewById(net.pokeranalytics.android.R.id.title)?.let { + itemView.findViewById(R.id.title)?.let { it.text = title } } @@ -144,7 +144,7 @@ class FeedSessionRowRepresentableAdapter( // If the header has no date, it's a pending session return if (sortedHeaders[position] == null) { - context.getString(net.pokeranalytics.android.R.string.pending) + context.getString(R.string.pending) } else { // Else, return the formatted date sortedHeaders[position]?.getMonthAndYear() ?: throw PAIllegalStateException("Null date should not happen there") @@ -153,14 +153,14 @@ class FeedSessionRowRepresentableAdapter( throw PAIllegalStateException("Any position should always have a header, position = $position") } - fun sessionForPosition(position: Int): Session? { + fun sessionForPosition(position: Int): Session { return this.getSessionForPosition(position) } /** * Get real index */ - private fun getSessionForPosition(position: Int): Session? { + private fun getSessionForPosition(position: Int): Session { // Row position var headersBefore = 0 diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt index 1572906e..9e247d25 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt @@ -160,8 +160,6 @@ class FeedTransactionRowRepresentableAdapter( */ private fun checkHeaderCondition(currentCalendar: Calendar, previousYear: Int, previousMonth: Int): Boolean { return currentCalendar.get(Calendar.YEAR) == previousYear && currentCalendar.get(Calendar.MONTH) < previousMonth || (currentCalendar.get(Calendar.YEAR) < previousYear) - } - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/NewDataMenuActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/NewDataMenuActivity.kt index fa2cf02e..4e1db8ec 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/NewDataMenuActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/NewDataMenuActivity.kt @@ -9,10 +9,7 @@ import android.os.Build import android.os.Bundle import android.view.View import android.view.ViewAnimationUtils -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import net.pokeranalytics.android.databinding.ActivityNewDataBinding import net.pokeranalytics.android.ui.activity.components.BaseActivity import net.pokeranalytics.android.ui.extensions.px @@ -105,7 +102,7 @@ class NewDataMenuActivity : BaseActivity() { val intent = Intent() intent.putExtra(IntentKey.CHOICE.keyName, choice) setResult(RESULT_OK, intent) - GlobalScope.launch(Dispatchers.Main) { + CoroutineScope(Dispatchers.Main).launch { delay(200) hideMenu() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt index 30765b0d..3c5a696c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt @@ -219,7 +219,7 @@ open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { getRealm().executeTransactionAsync { asyncRealm -> filter.name = filter.query.getName(requireContext()) - asyncRealm.copyToRealmOrUpdate(filter) + asyncRealm.insertOrUpdate(filter) } finishActivityWithResult(filter.id) @@ -235,7 +235,7 @@ open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { val filterId = filterCopy?.id ?: "" getRealm().executeTransactionAsync { realm -> filterCopy?.let { - realm.copyToRealmOrUpdate(it) + realm.insertOrUpdate(it) } } finishActivityWithResult(filterId) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersListFragment.kt index 9ae5990a..93c00b8f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersListFragment.kt @@ -18,7 +18,7 @@ open class FiltersListFragment : DataListFragment() { row.updateValue(value, row) getRealm().executeTransactionAsync { asyncRealm -> - asyncRealm.copyToRealmOrUpdate(row) + asyncRealm.insertOrUpdate(row) } val index = this.model.items.indexOf(row) this.dataListAdapter.notifyItemChanged(index) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/EditorViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/EditorViewModel.kt index b131f347..3c502ac9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/EditorViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/EditorViewModel.kt @@ -639,7 +639,7 @@ class EditorViewModel : ViewModel(), RowRepresentableDataSource, CardCentralizer realm.executeTransactionAsync { asyncRealm -> this.handHistory.defineWinnerPositions() - asyncRealm.copyToRealmOrUpdate(this.handHistory) + asyncRealm.insertOrUpdate(this.handHistory) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt index e5e6980f..5f2859de 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt @@ -316,7 +316,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr session.preCompute() for (customField in this.model.customFields) { - realm.copyToRealmOrUpdate(customField) + realm.insertOrUpdate(customField) } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourFragment.kt index eec6a424..b61c0735 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourFragment.kt @@ -67,7 +67,7 @@ class DealtHandsPerHourFragment : RealmFragment() { this.onlineValue.text.toString().toIntOrNull()?.let { onlineDealtHandsPerHour -> userConfig.onlineDealtHandsPerHour = onlineDealtHandsPerHour } - realm.copyToRealmOrUpdate(userConfig) + realm.insertOrUpdate(userConfig) } // val userConfig = UserConfig.getConfiguration(realm) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/TransactionFilterFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/TransactionFilterFragment.kt index a0511415..7a322ef9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/TransactionFilterFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/TransactionFilterFragment.kt @@ -100,7 +100,7 @@ class TransactionFilterFragment : RealmFragment(), StaticRowRepresentableDataSou getRealm().executeTransactionAsync { asyncRealm -> UserConfig.getConfiguration(asyncRealm) { userConfig -> userConfig.setTransactionTypeIds(this.model.selectedTransactionTypes) - asyncRealm.copyToRealmOrUpdate(userConfig) + asyncRealm.insertOrUpdate(userConfig) } } this.activity?.finish() diff --git a/app/src/main/java/net/pokeranalytics/android/util/Global.kt b/app/src/main/java/net/pokeranalytics/android/util/Global.kt index 400362d5..b062739e 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Global.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Global.kt @@ -5,3 +5,9 @@ const val RANDOM_PLAYER: String = "☺︎" const val FFMPEG_DESCRIPTOR_FILE = "descriptor.txt" const val BLIND_SEPARATOR: String = "/" const val UUID_SEPARATOR: String = "," + +class Global { + companion object { + const val LAUNCH_ASYNC_LISTENERS = true + } +} diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt index 0deca784..913cdd13 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt @@ -1,7 +1,6 @@ package net.pokeranalytics.android.util.csv import io.realm.Realm -import io.realm.kotlin.where import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.TableSize