From 004093a170347c49359d791a0de87c1e9045d21d Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 18 Mar 2019 15:21:52 +0100 Subject: [PATCH] Improve currency mamangement for sessions and stats --- .../pokeranalytics/android/calculus/Stat.kt | 21 +++++----------- .../android/model/realm/Session.kt | 24 +++++++++++-------- .../android/ui/fragment/SessionFragment.kt | 5 ++-- .../bottomsheet/BottomSheetFragment.kt | 7 ++++-- .../BottomSheetMultiSelectionFragment.kt | 15 ------------ .../bottomsheet/BottomSheetSumFragment.kt | 6 ++--- .../android/ui/view/SessionRowView.kt | 5 ++-- 7 files changed, 34 insertions(+), 49 deletions(-) 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 31b94ec1..7765025e 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -5,10 +5,11 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.FormattingException import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.util.FormatUtils +import net.pokeranalytics.android.util.CurrencyUtils import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.formatted import net.pokeranalytics.android.util.extensions.formattedHourlyDuration +import java.util.* /** * An enum representing all the types of Session statistics @@ -99,7 +100,7 @@ enum class Stat : RowRepresentable { /** * ComputedStat contains a [stat] and their associated [value] */ -class ComputedStat(stat: Stat, value: Double) { +class ComputedStat(var stat: Stat, var value: Double, var currency: Currency? = null) { constructor(stat: Stat, value: Double, previousValue: Double?) : this(stat, value) { if (previousValue != null) { @@ -107,16 +108,6 @@ class ComputedStat(stat: Stat, value: Double) { } } - /** - * The statistic type - */ - var stat: Stat = stat - - /** - * The stat value - */ - var value: Double = value - /** * The variation of the stat */ @@ -135,7 +126,7 @@ class ComputedStat(stat: Stat, value: Double) { // Amounts + red/green Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, Stat.AVERAGE_NET_BB -> { - val numberFormat= FormatUtils.getCurrencyFormatter(context) + val numberFormat= CurrencyUtils.getCurrencyFormatter(context, currency) val color = if (this.value >= this.stat.threshold) R.color.green else R.color.red return TextFormat(numberFormat.format(this.value), color) } // white integers @@ -148,10 +139,10 @@ class ComputedStat(stat: Stat, value: Double) { Stat.WIN_RATIO, Stat.ROI -> { val color = if (value * 100 >= this.stat.threshold) R.color.green else R.color.red return TextFormat("${(value * 100).formatted()}%", color) - } // white amounts + } // white amountsr Stat.AVERAGE_BUYIN, Stat.STANDARD_DEVIATION, Stat.STANDARD_DEVIATION_HOURLY, Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> { - val numberFormat= FormatUtils.getCurrencyFormatter(context) + val numberFormat= CurrencyUtils.getCurrencyFormatter(context, currency) return TextFormat(numberFormat.format(this.value)) } else -> throw FormattingException("Stat formatting of ${this.stat.name} not handled") 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 2f19b5bf..71a7b45a 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 @@ -28,6 +28,7 @@ import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow +import net.pokeranalytics.android.util.CurrencyUtils import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.* import java.util.* @@ -484,7 +485,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, title = getFormattedDuration(), - computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0) + computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, CurrencyUtils.getCurrency(bankroll)) ) ) rows.add(SeparatorRowRepresentable()) @@ -494,7 +495,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, resId = R.string.pause, - computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0) + computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, CurrencyUtils.getCurrency(bankroll)) ) ) rows.add(SeparatorRowRepresentable()) @@ -504,14 +505,14 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, title = getFormattedDuration(), - computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0) + computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, CurrencyUtils.getCurrency(bankroll)) ) ) rows.add( CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT, resId = R.string.hour_rate_without_pauses, - computedStat = ComputedStat(Stat.HOURLY_RATE, this.hourlyRate) + computedStat = ComputedStat(Stat.HOURLY_RATE, this.hourlyRate, CurrencyUtils.getCurrency(bankroll)) ) ) @@ -520,7 +521,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource CustomizableRowRepresentable( RowViewType.HEADER_TITLE_VALUE, resId = R.string.bankroll_variation, - computedStat = ComputedStat(Stat.HOURLY_RATE, 0.0) + computedStat = ComputedStat(Stat.HOURLY_RATE, 0.0, CurrencyUtils.getCurrency(bankroll)) ) ) } @@ -553,18 +554,18 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource SessionRow.BANKROLL -> bankroll?.name ?: NULL_TEXT SessionRow.BLINDS -> getBlinds() SessionRow.BREAK_TIME -> if (this.breakDuration > 0.0) this.breakDuration.toMinutes() else NULL_TEXT - SessionRow.BUY_IN -> this.result?.buyin?.toCurrency() ?: NULL_TEXT - SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> this.result?.cashout?.toCurrency() ?: NULL_TEXT + SessionRow.BUY_IN -> this.result?.buyin?.toCurrency(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT + SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> this.result?.cashout?.toCurrency(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT SessionRow.COMMENT -> if (this.comment.isNotEmpty()) this.comment else NULL_TEXT SessionRow.END_DATE -> this.endDate?.shortDateTime() ?: NULL_TEXT SessionRow.GAME -> getGameTitle() - SessionRow.INITIAL_BUY_IN -> tournamentEntryFee?.toCurrency() ?: NULL_TEXT + SessionRow.INITIAL_BUY_IN -> tournamentEntryFee?.toCurrency(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT SessionRow.LOCATION -> location?.name ?: NULL_TEXT SessionRow.PLAYERS -> tournamentNumberOfPlayers?.toString() ?: NULL_TEXT SessionRow.POSITION -> result?.tournamentFinalPosition?.toString() ?: NULL_TEXT 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() ?: NULL_TEXT + SessionRow.TIPS -> result?.tips?.toCurrency(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT SessionRow.TOURNAMENT_TYPE -> this.tournamentType?.let { TournamentType.values()[it].localizedTitle(context) } ?: run { @@ -575,10 +576,12 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource "${tournamentFeatures.subList(0,2).joinToString { it.name }}, ..." - } else { + } else if (tournamentFeatures.size > 0) { tournamentFeatures.joinToString { it.name } + } else { + NULL_TEXT } } SessionRow.TOURNAMENT_NAME -> tournamentName?.name ?: NULL_TEXT @@ -681,6 +684,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource val localResult = if (result != null) result as Result else realm.createObject(Result::class.java) localResult.buyin = value as Double? result = localResult + this.updateRowRepresentation() } SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> { val localResult = if (result != null) result as Result else realm.createObject(Result::class.java) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index 60e39b00..a067ea5c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -26,6 +26,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableDiffCallback import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow +import net.pokeranalytics.android.util.CurrencyUtils import java.util.* @@ -99,9 +100,9 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate { currentSession.startDate ) SessionRow.BANKROLL -> { - BottomSheetFragment.create(fragmentManager, row, this, data, false) + BottomSheetFragment.create(fragmentManager, row, this, data, false, CurrencyUtils.getCurrency(currentSession.bankroll)) } - else -> BottomSheetFragment.create(fragmentManager, row, this, data) + else -> BottomSheetFragment.create(fragmentManager, row, this, data, currentCurrency = CurrencyUtils.getCurrency(currentSession.bankroll)) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt index d177f966..82d5060e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt @@ -22,11 +22,13 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow +import java.util.* open class BottomSheetFragment : BottomSheetDialogFragment() { lateinit var row: RowRepresentable lateinit var delegate: RowRepresentableDelegate + var currentCurrency: Currency? = null private var isClearable: Boolean = true private var rowRepresentableEditDescriptors: ArrayList? = null @@ -40,7 +42,8 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { row: RowRepresentable, delegate: RowRepresentableDelegate, rowRepresentableEditDescriptors: ArrayList?, - isClearable: Boolean? = true + isClearable: Boolean? = true, + currentCurrency: Currency? = null ): BottomSheetFragment { val bottomSheetFragment = row.bottomSheetType.newInstance() bottomSheetFragment.show(fragmentManager, "bottomSheet") @@ -48,7 +51,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { bottomSheetFragment.delegate = delegate bottomSheetFragment.rowRepresentableEditDescriptors = rowRepresentableEditDescriptors bottomSheetFragment.isClearable = isClearable ?: true - + bottomSheetFragment.currentCurrency = currentCurrency return bottomSheetFragment } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt index 413d8f82..42872569 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt @@ -2,18 +2,14 @@ package net.pokeranalytics.android.ui.fragment.components.bottomsheet import android.app.Activity import android.content.Intent -import android.os.Bundle -import android.view.View import io.realm.RealmList import io.realm.RealmObject -import io.realm.RealmResults import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -import timber.log.Timber /** * Manage multiple items selection in a bottom sheet list @@ -38,7 +34,6 @@ open class BottomSheetMultiSelectionFragment : BottomSheetListFragment() { } } - //TODO: Set the correct values override fun getValue(): Any? { return selectedRows } @@ -50,16 +45,6 @@ open class BottomSheetMultiSelectionFragment : BottomSheetListFragment() { selectedRows.add(row) } dataAdapter.refreshRow(row) - - /* - realmData?.let { - val selectedData = it[position] - selectedData?.let {data -> - this.delegate.onRowValueChanged(data, this.row) - dismiss() - } - } - */ } override fun isSelected(row: RowRepresentable): Boolean { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt index 8153eb8f..58f1ff3e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt @@ -63,7 +63,7 @@ class BottomSheetSumFragment : BottomSheetFragment() { 0.0 } - currentValue.text = currentDefaultValue.toCurrency() + currentValue.text = currentDefaultValue.toCurrency(currentCurrency) // First value val defaultValue1 = try { @@ -72,7 +72,7 @@ class BottomSheetSumFragment : BottomSheetFragment() { 0.0 } - button1.text = "+ ${defaultValue1.toCurrency()}" + button1.text = "+ ${defaultValue1.toCurrency(currentCurrency)}" button1.visibility = if (defaultValue1 > 0) View.VISIBLE else View.GONE button1.setOnClickListener { this.delegate.onRowValueChanged(currentDefaultValue + defaultValue1, row) @@ -86,7 +86,7 @@ class BottomSheetSumFragment : BottomSheetFragment() { 0.0 } - button2.text = "+ ${defaultValue2.toCurrency()}" + button2.text = "+ ${defaultValue2.toCurrency(currentCurrency)}" button2.visibility = if (defaultValue2 > 0) View.VISIBLE else View.GONE button2.setOnClickListener { this.delegate.onRowValueChanged(currentDefaultValue + defaultValue2, row) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt index 90b3df10..8e79ca03 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt @@ -14,6 +14,7 @@ import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.util.CurrencyUtils import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getShortDayName import net.pokeranalytics.android.util.extensions.shortTime @@ -65,7 +66,7 @@ class SessionRowView : FrameLayout { var title = "" if (session.isTournament()) { if (session.tournamentEntryFee != null) { - title += session.tournamentEntryFee?.toCurrency() + title += session.tournamentEntryFee?.toCurrency(CurrencyUtils.getCurrency(session.bankroll)) } session.game?.let { title += (if (title.isNotEmpty()) " " else "") + session.getGameTitle() @@ -140,7 +141,7 @@ class SessionRowView : FrameLayout { rowHistorySession.infoTitle.isVisible = false val result = session.result?.net ?: 0.0 - val formattedStat = ComputedStat(Stat.NETRESULT, result).format(context) + val formattedStat = ComputedStat(Stat.NETRESULT, result, currency = CurrencyUtils.getCurrency(session.bankroll)).format(context) rowHistorySession.gameResult.setTextColor(formattedStat.getColor(context)) rowHistorySession.gameResult.text = formattedStat.text }