From 6a1249a78c1fc8cb474adb017183b87e3c202033 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 30 Nov 2022 15:28:11 +0100 Subject: [PATCH] Fixes custom field entries on async writes --- .../android/model/filter/QueryCondition.kt | 2 +- .../android/model/realm/CustomFieldEntry.kt | 10 +++-- .../android/model/realm/Session.kt | 17 +++++--- .../ui/modules/session/SessionFragment.kt | 39 +++++++++++-------- .../ui/modules/session/SessionViewModel.kt | 10 ++++- .../android/util/ListExtensions.kt | 12 ++++++ .../android/util/csv/SessionCSVDescriptor.kt | 4 +- 7 files changed, 64 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/util/ListExtensions.kt diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index e1d4b1b8..456219d7 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -723,7 +723,7 @@ sealed class QueryCondition : RowRepresentable { constructor(customFieldEntry: CustomFieldEntry) : this() { this.setObject(customFieldEntry) - this.customFieldId = customFieldEntry.customField?.id + this.customFieldId = customFieldEntry.managedCustomField?.id ?: throw PokerAnalyticsException.QueryValueMapUnexpectedValue } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt index 5c889291..7cfdc09c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt @@ -22,6 +22,7 @@ import net.pokeranalytics.android.ui.view.RowUpdatable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.toCurrency +import timber.log.Timber import java.text.NumberFormat import java.util.* import java.util.Currency @@ -46,7 +47,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable, R @LinkingObjects("entries") val customFields: RealmResults? = null - val customField: CustomField? + val managedCustomField: CustomField? get() { return this.customFields?.first() } @@ -89,7 +90,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable, R } override fun getDisplayName(context: Context): String { - return if (value.isNotEmpty()) value else NULL_TEXT + return value.ifEmpty { NULL_TEXT } } override fun editingDescriptors(map: Map): ArrayList? { @@ -136,8 +137,8 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable, R /** * Return the amount */ - fun getFormattedValue(currency: Currency? = null): String { - return when (customField?.type) { + fun getFormattedValue(parentCustomField: CustomField, currency: Currency? = null): String { + return when (parentCustomField.type) { CustomField.Type.AMOUNT.uniqueIdentifier -> { numericValue?.toCurrency(currency) ?: run { NULL_TEXT } } @@ -145,6 +146,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable, R NumberFormat.getInstance().format(this.numericValue) } else -> { + Timber.d("FORMATTED = $value") value } } 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 729b0184..09c073ee 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 @@ -851,9 +851,14 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim SessionPropertiesRow.HANDS_COUNT -> handsCount = (value as Double?)?.toInt() SessionPropertiesRow.NUMBER_OF_TABLES -> this.numberOfTables = (value as Double?)?.toInt() ?: 1 is CustomField -> { - customFieldEntries.filter { it.customField?.id == row.id }.let { - customFieldEntries.removeAll(it.toSet()) - } + + val entryIds = row.entries.map { it.id } + val entries = this.customFieldEntries.intersectBy(entryIds) { it.id } + this.customFieldEntries.removeAll(entries) + +// customFieldEntries.filter { it.customField?.id == row.id }.let { +// customFieldEntries.removeAll(it.toSet()) +// } when (row.type) { CustomField.Type.AMOUNT.uniqueIdentifier, CustomField.Type.NUMBER.uniqueIdentifier -> { @@ -1028,8 +1033,10 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim SessionPropertiesRow.HANDS_COUNT -> this.handsCountFormatted(context) SessionPropertiesRow.NUMBER_OF_TABLES -> this.numberOfTables.toString() is CustomField -> { - customFieldEntries.find { it.customField?.id == row.id }?.let { customFieldEntry -> - return customFieldEntry.getFormattedValue(currency) + val entryIds = this.customFieldEntries.map { it.id } + val entries = row.entries.intersectBy(entryIds) { it.id } + entries.firstOrNull()?.let { customFieldEntry -> + return customFieldEntry.getFormattedValue(row, currency) } return NULL_TEXT } 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 f9542b24..e5e6980f 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 @@ -279,6 +279,8 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr session.updateValue(value, row) } + Timber.d("val = ${this.currentSession.customFieldEntries}") + // try { // this.currentSession.updateValue(value, row) // getRealm().executeTransactionAsync { realm -> @@ -312,6 +314,10 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr getRealm().executeTransactionAsync { realm -> val session = realm.copyToRealmOrUpdate(this.currentSession) session.preCompute() + + for (customField in this.model.customFields) { + realm.copyToRealmOrUpdate(customField) + } } } @@ -703,15 +709,16 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr ) ) is CustomField -> { + val entry = row.entries.intersect(session.customFieldEntries).firstOrNull() row.editingDescriptors( when (row.type) { - CustomField.Type.LIST.uniqueIdentifier -> mapOf( - "defaultValue" to session.customFieldEntries.find { it.customField?.id == row.id }?.value, - "data" to row.entries - ) - else -> mapOf( - "defaultValue" to session.customFieldEntries.find { it.customField?.id == row.id }?.numericValue - ) + CustomField.Type.LIST.uniqueIdentifier -> { + mapOf( + "defaultValue" to entry?.value, + "data" to row.entries + ) + } + else -> mapOf("defaultValue" to entry?.numericValue) } ) } @@ -721,19 +728,17 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr override fun resultCaptureTypeSelected(resultCaptureType: ResultCaptureType, applyBankroll: Boolean) { - when (resultCaptureType) { - ResultCaptureType.NET_RESULT -> { - this.currentSession.clearBuyinCashedOut() - } - ResultCaptureType.BUYIN_CASHED_OUT -> { - this.currentSession.clearNetResult() + updateSessionThenSaveAsynchronously { + when (resultCaptureType) { + ResultCaptureType.NET_RESULT -> { + this.currentSession.clearBuyinCashedOut() + } + ResultCaptureType.BUYIN_CASHED_OUT -> { + this.currentSession.clearNetResult() + } } } - getRealm().executeTransactionAsync { asyncRealm -> // cleanup existing results - asyncRealm.copyToRealmOrUpdate(this.currentSession) - } - this.model.resultCaptureType = resultCaptureType if (applyBankroll) { this.currentSession.bankroll?.let { bankroll -> diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionViewModel.kt index bb05602f..dc397990 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionViewModel.kt @@ -46,6 +46,11 @@ class SessionViewModel : ViewModel() { */ var rows: List = mutableListOf() + /** + * The list of customFields + */ + var customFields: List = listOf() + fun rowForPosition(position: Int): RowRepresentable { return this.rows[position] } @@ -104,7 +109,10 @@ class SessionViewModel : ViewModel() { // Add custom fields rows.add(SeparatorRow()) - rows.addAll(realm.sorted()) + + val customFields = realm.sorted() + this.customFields = customFields.map { realm.copyFromRealm(it) } + rows.addAll(this.customFields) this.rows = rows } diff --git a/app/src/main/java/net/pokeranalytics/android/util/ListExtensions.kt b/app/src/main/java/net/pokeranalytics/android/util/ListExtensions.kt new file mode 100644 index 00000000..be834889 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/ListExtensions.kt @@ -0,0 +1,12 @@ +package net.pokeranalytics.android.util + +fun List.intersectBy(other: List, by: (T) -> (V)) : Set { + val results = mutableSetOf() + for (item in this) { + val key = by(item) + if (other.contains(key)) { + results.add(item) + } + } + return results +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt index 982e0cb5..a5036b1c 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt @@ -79,11 +79,11 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el is SessionField.TournamentPosition -> field.format(data.result?.tournamentFinalPosition) is SessionField.Comment -> data.comment is SessionField.NumberCustomField -> { - val entry = data.customFieldEntries.find { it.customField?.id == field.customField.id } + val entry = field.customField.entries.intersect(data.customFieldEntries).firstOrNull() field.format(entry?.numericValue) } is SessionField.ListCustomField -> { - val entry = data.customFieldEntries.find { it.customField?.id == field.customField.id } + val entry = field.customField.entries.intersect(data.customFieldEntries).firstOrNull() entry?.value } else -> null