From 2554eddb62d929118628473555da2399bc49c55d Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 16 May 2019 17:07:29 +0200 Subject: [PATCH] Add custom fields for Session --- .../android/model/realm/Session.kt | 219 ++++++++++++------ .../components/DeletableItemFragment.kt | 13 +- .../BottomSheetStaticListFragment.kt | 3 +- 3 files changed, 155 insertions(+), 80 deletions(-) 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 56d5b759..b1644a88 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 @@ -39,6 +39,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.extensions.* +import timber.log.Timber import java.text.DateFormat import java.util.* import java.util.Currency @@ -67,34 +68,34 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return realm.copyToRealm(session) } - fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? { - return when (queryCondition) { + fun fieldNameForQueryType(queryCondition: Class): String? { + return when (queryCondition) { IsLive::class.java, IsOnline::class.java -> "bankroll.live" IsCash::class.java, IsTournament::class.java -> "type" AnyBankroll::class.java -> "bankroll.id" - AnyGame::class.java -> "game.id" - AnyTournamentName::class.java -> "tournamentName.id" - AnyTournamentFeature::class.java, AllTournamentFeature::class.java -> "tournamentFeatures.id" - AnyLocation::class.java -> "location.id" - AnyLimit::class.java -> "limit" - AnyTableSize::class.java -> "tableSize" - AnyTournamentType::class.java -> "tournamentType" - AnyBlind::class.java -> "blinds" - NumberOfTable::class.java -> "numberOfTable" - NetAmountWon::class.java, NetAmountLost::class.java -> "computableResults.ratedNet" - NumberOfRebuy::class.java -> "result.numberOfRebuy" - TournamentNumberOfPlayer::class.java -> "result.tournamentNumberOfPlayers" - TournamentFinalPosition::class.java -> "result.tournamentFinalPosition" - TournamentFee::class.java -> "tournamentEntryFee" - StartedFromDate::class.java, StartedToDate::class.java -> "startDate" - EndedFromDate::class.java, EndedToDate::class.java -> "endDate" - AnyDayOfWeek::class.java, IsWeekEnd::class.java, IsWeekDay::class.java -> "dayOfWeek" - AnyMonthOfYear::class.java -> "month" - AnyYear::class.java -> "year" + AnyGame::class.java -> "game.id" + AnyTournamentName::class.java -> "tournamentName.id" + AnyTournamentFeature::class.java, AllTournamentFeature::class.java -> "tournamentFeatures.id" + AnyLocation::class.java -> "location.id" + AnyLimit::class.java -> "limit" + AnyTableSize::class.java -> "tableSize" + AnyTournamentType::class.java -> "tournamentType" + AnyBlind::class.java -> "blinds" + NumberOfTable::class.java -> "numberOfTable" + NetAmountWon::class.java, NetAmountLost::class.java -> "computableResults.ratedNet" + NumberOfRebuy::class.java -> "result.numberOfRebuy" + TournamentNumberOfPlayer::class.java -> "result.tournamentNumberOfPlayers" + TournamentFinalPosition::class.java -> "result.tournamentFinalPosition" + TournamentFee::class.java -> "tournamentEntryFee" + StartedFromDate::class.java, StartedToDate::class.java -> "startDate" + EndedFromDate::class.java, EndedToDate::class.java -> "endDate" + AnyDayOfWeek::class.java, IsWeekEnd::class.java, IsWeekDay::class.java -> "dayOfWeek" + AnyMonthOfYear::class.java -> "month" + AnyYear::class.java -> "year" IsToday::class.java, WasYesterday::class.java, WasTodayAndYesterday::class.java, DuringThisYear::class.java, DuringThisMonth::class.java, DuringThisWeek::class.java -> "startDate" - StartedFromTime::class.java -> "startDateHourMinuteComponent" - EndedToTime::class.java -> "endDateHourMinuteComponent" - Duration::class.java -> "netDuration" + StartedFromTime::class.java -> "startDateHourMinuteComponent" + EndedToTime::class.java -> "endDateHourMinuteComponent" + Duration::class.java -> "netDuration" else -> null } } @@ -125,25 +126,25 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat override var year: Int? = null override var dayOfMonth: Int? = null - private var startDateHourMinuteComponent: Double? = null - get() { - if (field == null && startDate != null) { - val cal = Calendar.getInstance() - cal.time = startDate - field = cal.hourMinute() - } - return field - } - - private var endDateHourMinuteComponent: Double? = null - get() { - if (field == null && endDate != null) { - val cal = Calendar.getInstance() - cal.time = endDate - field = cal.hourMinute() - } - return field - } + private var startDateHourMinuteComponent: Double? = null + get() { + if (field == null && startDate != null) { + val cal = Calendar.getInstance() + cal.time = startDate + field = cal.hourMinute() + } + return field + } + + private var endDateHourMinuteComponent: Double? = null + get() { + if (field == null && endDate != null) { + val cal = Calendar.getInstance() + cal.time = endDate + field = cal.hourMinute() + } + return field + } /** * The start date of the session @@ -151,13 +152,13 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat var startDate: Date? = null set(value) { field = value - if (field == null) { - startDateHourMinuteComponent = null - } else { - val cal = Calendar.getInstance() - cal.time = field - startDateHourMinuteComponent = cal.hourMinute() - } + if (field == null) { + startDateHourMinuteComponent = null + } else { + val cal = Calendar.getInstance() + cal.time = field + startDateHourMinuteComponent = cal.hourMinute() + } this.updateTimeParameter(field) this.computeNetDuration() @@ -176,15 +177,15 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat var endDate: Date? = null set(value) { field = value - if (field == null) { - endDateHourMinuteComponent = null - } else { - val cal = Calendar.getInstance() - cal.time = field - endDateHourMinuteComponent = cal.hourMinute() - } - - this.computeNetDuration() + if (field == null) { + endDateHourMinuteComponent = null + } else { + val cal = Calendar.getInstance() + cal.time = field + endDateHourMinuteComponent = cal.hourMinute() + } + + this.computeNetDuration() this.dateChanged() this.defineDefaultTournamentBuyinIfNecessary() this.computeStats() @@ -266,7 +267,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat field = value this.computeStats() formatBlinds() - this.result?.computeNumberOfRebuy() + this.result?.computeNumberOfRebuy() } var blinds: String? = null @@ -276,10 +277,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // The entry fee of the tournament var tournamentEntryFee: Double? = null - set(value) { - field = value - this.result?.computeNumberOfRebuy() - } + set(value) { + field = value + this.result?.computeNumberOfRebuy() + } // The total number of players who participated in the tournament var tournamentNumberOfPlayers: Int? = null @@ -293,6 +294,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // The features of the tournament, like Knockout, Shootout, Turbo... var tournamentFeatures: RealmList = RealmList() + // The custom fields values + var customFieldEntries: RealmList = RealmList() + fun bankrollHasBeenUpdated() { formatBlinds() } @@ -574,7 +578,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return blinds ?: NULL_TEXT } - fun formatBlinds() { + fun formatBlinds() { blinds = null if (cgBigBlind == null) return cgBigBlind?.let { bb -> @@ -589,9 +593,11 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat * Delete the object from realm */ fun delete() { - realm.executeTransaction { - cleanup() - deleteFromRealm() + if (isValid) { + realm.executeTransaction { + cleanup() + deleteFromRealm() + } } } @@ -613,6 +619,16 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat @Ignore override val viewType: Int = RowViewType.ROW_SESSION.ordinal + // Override to surcharge custom field viewType + override fun viewTypeForPosition(position: Int): Int { + rowRepresentationForCurrentState[position].let { + if (it is CustomField) { + return RowViewType.TITLE_VALUE.ordinal + } + } + return super.viewTypeForPosition(position) + } + override fun getDisplayName(context: Context): String { return "Session ${this.creationDate}" } @@ -678,6 +694,13 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // Rows rows.addAll(SessionRow.getRows(this)) + + // Add custom fields + realm?.let { + rows.add(SeparatorRow()) + rows.addAll(LiveData.CUSTOM_FIELD.itemsArray(it) as ArrayList) + } + return rows } @@ -711,10 +734,12 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat SessionRow.START_DATE -> this.startDate?.shortDateTime() ?: NULL_TEXT SessionRow.TABLE_SIZE -> this.tableSize?.let { TableSize(it).localizedTitle(context) } ?: NULL_TEXT SessionRow.TIPS -> result?.tips?.toCurrency(currency) ?: NULL_TEXT - SessionRow.TOURNAMENT_TYPE -> this.tournamentType?.let { - TournamentType.values()[it].localizedTitle(context) - } ?: run { - NULL_TEXT + SessionRow.TOURNAMENT_TYPE -> { + this.tournamentType?.let { + TournamentType.values()[it].localizedTitle(context) + } ?: run { + NULL_TEXT + } } SessionRow.TOURNAMENT_FEATURE -> { if (tournamentFeatures.size > 2) { @@ -730,6 +755,12 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } } SessionRow.TOURNAMENT_NAME -> tournamentName?.name ?: NULL_TEXT + is CustomField -> { + customFieldEntries.find { it.customField?.id == row.id }?.let { customFieldEntry -> + return customFieldEntry.getFormattedValue(currency) + } + return NULL_TEXT + } else -> throw UnmanagedRowRepresentableException("Unmanaged row = ${row}") } } @@ -837,6 +868,19 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat "tips" to result?.tips ) ) + is CustomField -> { + row.editingDescriptors( + when (row.type) { + CustomField.Type.LIST.uniqueIdentifier -> mapOf( + "defaultValue" to customFieldEntries.find { it.customField?.id == row.id }?.value, + "data" to row.entries + ) + else -> mapOf( + "defaultValue" to customFieldEntries.find { it.customField?.id == row.id }?.value + ) + } + ) + } else -> null } } @@ -946,7 +990,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat result = localResult } SessionRow.TOURNAMENT_NAME -> tournamentName = value as TournamentName? - SessionRow.TOURNAMENT_TYPE -> tournamentType = value as Int? + SessionRow.TOURNAMENT_TYPE -> tournamentType = (value as TournamentType?)?.ordinal SessionRow.TOURNAMENT_FEATURE -> { value?.let { @@ -956,6 +1000,33 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat tournamentFeatures.removeAll(this.tournamentFeatures) } } + + is CustomField -> { + customFieldEntries.filter { it.customField?.id == row.id }.let { + customFieldEntries.removeAll(it) + } + when (row.type) { + CustomField.Type.AMOUNT.uniqueIdentifier, + CustomField.Type.NUMBER.uniqueIdentifier -> { + Timber.d("AMOUNT or NUMBER: ${value}") + if (value != null) { + val customFieldEntry = CustomFieldEntry() + customFieldEntry.customField = row + customFieldEntry.value = value.toString() + Timber.d("customFieldEntry: ${customFieldEntry.id}") + Timber.d("customFieldEntry: ${customFieldEntry.customField}") + Timber.d("customFieldEntry: ${customFieldEntry.value}") + customFieldEntries.add(customFieldEntry) + } + Timber.d("customFieldEntries: ${customFieldEntries.size}") + } + CustomField.Type.LIST.uniqueIdentifier -> { + if (value != null && value is CustomFieldEntry) { + customFieldEntries.add(value) + } + } + } + } } } @@ -1013,7 +1084,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat style: GraphFragment.Style, groupName: String, context: Context - ) : LegendContent { + ): LegendContent { when (style) { GraphFragment.Style.MULTILINE -> { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt index f824b3d1..29c89ad5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt @@ -18,6 +18,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter open class DeletableItemFragment : RealmFragment() { private var deletedItem: RealmObject? = null + private var itemHasBeenReInserted: Boolean = false private var lastDeletedItemPosition: Int = 0 private var dataListAdapter: RowRepresentableAdapter? = null private var coordinatorLayout: CoordinatorLayout? = null @@ -63,6 +64,7 @@ open class DeletableItemFragment : RealmFragment() { getRealm().executeTransaction { itemToDelete.deleteFromRealm() } + itemHasBeenReInserted = false updateUIAfterDeletion(itemPosition) showUndoSnackBar() } else { @@ -85,10 +87,13 @@ open class DeletableItemFragment : RealmFragment() { this.coordinatorLayout?.let { view -> snackBar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE) snackBar?.setAction(R.string.cancel) { - getRealm().executeTransaction { realm -> - deletedItem?.let { - val item = realm.copyToRealmOrUpdate(it) - updateUIAfterUndoDeletion(item) + if (!itemHasBeenReInserted) { + itemHasBeenReInserted = true + getRealm().executeTransaction { realm -> + deletedItem?.let { + val item = realm.copyToRealmOrUpdate(it) + updateUIAfterUndoDeletion(item) + } } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt index a60f51f0..7af3f1da 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt @@ -8,7 +8,6 @@ import kotlinx.android.synthetic.main.bottom_sheet_list.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException -import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -36,7 +35,7 @@ class BottomSheetStaticListFragment : BottomSheetFragment(), StaticRowRepresenta } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - this.delegate.onRowValueChanged((row as TournamentType).ordinal, this.row) + this.delegate.onRowValueChanged(row, this.row) dismiss() super.onRowSelected(position, row, fromAction) }