From 2782ad103b38ab0bb42110b0d0fbdc96ceaad9de Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 12 Apr 2019 13:02:33 +0200 Subject: [PATCH] refactor currency usage --- .../filter/BlindFilterInstrumentedTest.kt | 12 ++-- .../pokeranalytics/android/calculus/Stat.kt | 8 +-- .../android/model/realm/FilterCondition.kt | 2 +- .../android/model/realm/Session.kt | 67 ++++++++++--------- .../android/model/utils/Seed.kt | 4 +- .../ui/fragment/BankrollDataFragment.kt | 8 +-- .../android/ui/fragment/SessionFragment.kt | 5 +- .../android/ui/fragment/SettingsFragment.kt | 12 +++- .../android/ui/view/SessionRowView.kt | 7 +- .../view/rowrepresentable/FilterElementRow.kt | 10 ++- .../view/rowrepresentable/FilterSectionRow.kt | 4 +- .../android/util/CurrencyUtils.kt | 64 ------------------ .../android/util/Preferences.kt | 46 ++++++++----- .../util/extensions/NumbersExtension.kt | 11 ++- 14 files changed, 113 insertions(+), 147 deletions(-) delete mode 100644 app/src/main/java/net/pokeranalytics/android/util/CurrencyUtils.kt diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt index 279b368d..9ace6e81 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt @@ -43,7 +43,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { val filter = QueryCondition.BLIND - val blind = FilterElementRow.Blind(s1.stake!!) + val blind = FilterElementRow.Blind(s1.blinds!!, true) blind.filterSectionRow = FilterSectionRow.BLIND val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) filter.updateValueMap(filterElement) @@ -87,8 +87,8 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { val filter = QueryCondition.BLIND - val blind1 = FilterElementRow.Blind(s1.stake!!) - val blind2 = FilterElementRow.Blind(s2.stake!!) + val blind1 = FilterElementRow.Blind(s1.blinds!!, true) + val blind2 = FilterElementRow.Blind(s2.blinds!!, true) blind1.filterSectionRow = FilterSectionRow.BLIND blind2.filterSectionRow = FilterSectionRow.BLIND @@ -133,7 +133,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { val filter = QueryCondition.BLIND - val blind = FilterElementRow.Blind(s3.stake!!, "$") + val blind = FilterElementRow.Blind(s3.blinds!!, false) blind.filterSectionRow = FilterSectionRow.BLIND val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) @@ -176,10 +176,10 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { val filter = QueryCondition.BLIND - val blind1 = FilterElementRow.Blind(s1.stake!!) + val blind1 = FilterElementRow.Blind(s1.blinds!!, false) blind1.filterSectionRow = FilterSectionRow.BLIND - val blind2 = FilterElementRow.Blind(s2.stake!!) + val blind2 = FilterElementRow.Blind(s2.blinds!!, false) blind2.filterSectionRow = FilterSectionRow.BLIND val filterElement = FilterCondition(filterElementRows = arrayListOf(blind1, blind2)) filter.updateValueMap(filterElement) 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 1b111ecf..09335cbe 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -7,10 +7,10 @@ import net.pokeranalytics.android.exceptions.FormattingException import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -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 net.pokeranalytics.android.util.extensions.toCurrency import java.util.* class StatFormattingException(message: String) : Exception(message) { @@ -132,9 +132,8 @@ enum class Stat(var underlyingClass: Class? = null) : RowRepresentabl when (this) { // Amounts + red/green Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE -> { - val numberFormat = CurrencyUtils.getCurrencyFormatter(context, currency) val color = if (value >= this.threshold) R.color.green else R.color.red - return TextFormat(numberFormat.format(value), color) + return TextFormat(value.toCurrency(currency), color) } // Red/green numericValues Stat.HOURLY_RATE_BB, Stat.AVERAGE_NET_BB, Stat.NET_BB_PER_100_HANDS -> { @@ -154,8 +153,7 @@ enum class Stat(var underlyingClass: Class? = null) : RowRepresentabl } // white amountsr Stat.AVERAGE_BUYIN, Stat.STANDARD_DEVIATION, Stat.STANDARD_DEVIATION_HOURLY, Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> { - val numberFormat = CurrencyUtils.getCurrencyFormatter(context, currency) - return TextFormat(numberFormat.format(value)) + return TextFormat(value.toCurrency(currency)) } else -> throw FormattingException("Stat formatting of ${this.name} not handled") } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt index 388f2b38..52851300 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt @@ -32,7 +32,7 @@ open class FilterCondition() : RealmObject() { } this.booleanValues = RealmList().apply { this.addAll(filterElementRows.map { - ((it as Blind).currencySymbol == null) + (it as Blind).hasDefaultCurrency }) } } 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 a9be28a6..dd126acd 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 @@ -35,9 +35,8 @@ 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.Preferences +import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.extensions.* import java.util.* import java.util.Currency @@ -220,7 +219,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat var cgSmallBlind: Double? = null set(value) { field = value - computeStakeAsString() + formatBlinds() } // The big blind value @@ -228,10 +227,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat set(value) { field = value this.computeStats() - computeStakeAsString() + formatBlinds() } - var stake: String? = null + var blinds: String? = null private set // Tournament @@ -252,7 +251,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat var tournamentFeatures: RealmList = RealmList() fun bankrollHasBeenUpdated() { - computeStakeAsString() + formatBlinds() } /** @@ -492,13 +491,19 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return NULL_TEXT } - /** - * Return the formatted blinds - */ - fun getCurrencyFormattedStake(context:Context) : String { - val currencySymbol = currencySymbol ?: Preferences.getDefaultCurrency(context).symbol - return "$currencySymbol $stake" - } + val hasDefaultCurrency: Boolean + get() { + return bankroll?.currency?.code == null + } + + val currency : Currency + get() { + return bankroll?.currency?.code?.let { + Currency.getInstance(it) + } ?: run { + UserDefaults.currency + } + } /** * Return the game title @@ -517,20 +522,16 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return if (gameTitle.isNotBlank()) gameTitle else NULL_TEXT } - val currencySymbol : String? - get() { - bankroll?.currency?.code?.let { - return Currency.getInstance(it).symbol - } - return null - } + fun getFormattedBlinds(): String { + return blinds ?: NULL_TEXT + } - private fun computeStakeAsString() { - stake = null + private fun formatBlinds() { + blinds = null if (cgBigBlind == null) return cgBigBlind?.let { bb -> val sb = cgSmallBlind ?: bb / 2.0 - stake = "${sb.formatted()}/${bb.round()}" + blinds = "${currency.symbol} ${sb.formatted()}/${bb.round()}" } } @@ -584,7 +585,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, title = getFormattedDuration(), - computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, CurrencyUtils.getCurrency(bankroll)) + computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency) ) ) rows.add(SeparatorRowRepresentable()) @@ -594,7 +595,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, resId = R.string.pause, - computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, CurrencyUtils.getCurrency(bankroll)) + computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency) ) ) rows.add(SeparatorRowRepresentable()) @@ -604,14 +605,14 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, title = getFormattedDuration(), - computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, CurrencyUtils.getCurrency(bankroll)) + computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency) ) ) rows.add( CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT, resId = R.string.hour_rate_without_pauses, - computedStat = ComputedStat(Stat.HOURLY_RATE, this.hourlyRate, CurrencyUtils.getCurrency(bankroll)) + computedStat = ComputedStat(Stat.HOURLY_RATE, this.hourlyRate, currency) ) ) @@ -650,20 +651,20 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat override fun stringForRow(row: RowRepresentable, context: Context): String { return when (row) { SessionRow.BANKROLL -> bankroll?.name ?: NULL_TEXT - SessionRow.BLINDS -> getCurrencyFormattedStake(context) + SessionRow.BLINDS -> getFormattedBlinds() SessionRow.BREAK_TIME -> if (this.breakDuration > 0.0) this.breakDuration.toMinutes() else 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.BUY_IN -> this.result?.buyin?.toCurrency(currency) ?: NULL_TEXT + SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> this.result?.cashout?.toCurrency(currency) ?: NULL_TEXT SessionRow.COMMENT -> if (this.comment.isNotEmpty()) this.comment else NULL_TEXT SessionRow.END_DATE -> this.endDate?.shortDateTime() ?: NULL_TEXT SessionRow.GAME -> getFormattedGame() - SessionRow.INITIAL_BUY_IN -> tournamentEntryFee?.toCurrency(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT + SessionRow.INITIAL_BUY_IN -> tournamentEntryFee?.toCurrency(currency) ?: 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(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT + SessionRow.TIPS -> result?.tips?.toCurrency(currency) ?: NULL_TEXT SessionRow.TOURNAMENT_TYPE -> this.tournamentType?.let { TournamentType.values()[it].localizedTitle(context) } ?: run { @@ -886,7 +887,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } value?.let { - return stat.format(it, CurrencyUtils.getCurrency(this.bankroll), context) + return stat.format(it, currency, context) } ?: run { return TextFormat(NULL_TEXT) } diff --git a/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt b/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt index 9dbe8458..2bc66fc3 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt @@ -8,7 +8,7 @@ import net.pokeranalytics.android.model.realm.Currency import net.pokeranalytics.android.model.realm.TournamentFeature import java.util.* import net.pokeranalytics.android.model.realm.Game -import net.pokeranalytics.android.util.CurrencyUtils +import net.pokeranalytics.android.util.UserDefaults class Seed(var context:Context) : Realm.Transaction { @@ -31,7 +31,7 @@ class Seed(var context:Context) : Realm.Transaction { private fun createDefaultCurrencyAndBankroll(realm: Realm) { // Currency - val localeCurrency = CurrencyUtils.getLocaleCurrency() + val localeCurrency = UserDefaults.getLocaleCurrency() val defaultCurrency = Currency() defaultCurrency.code = localeCurrency.currencyCode realm.insertOrUpdate(defaultCurrency) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt index 586888cb..1f02d4ec 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt @@ -17,9 +17,9 @@ import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollRow import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow -import net.pokeranalytics.android.util.CurrencyUtils import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.Preferences +import net.pokeranalytics.android.util.extensions.toRate import retrofit2.Call import retrofit2.Response import java.util.* @@ -96,9 +96,9 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS } BankrollRow.RATE -> { this.bankroll.currency?.rate?.let { rate -> - CurrencyUtils.getCurrencyRateFormatter().format(rate) + rate.toRate() } ?: run { - CurrencyUtils.getCurrencyRateFormatter().format(1.0) + 1.0.toRate() } } else -> super.stringForRow(row) @@ -119,7 +119,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS BankrollRow.RATE -> { this.bankroll.currency?.rate?.let { rate -> - row.editingDescriptors(mapOf("defaultValue" to CurrencyUtils.getCurrencyRateFormatter().format(rate))) + row.editingDescriptors(mapOf("defaultValue" to rate.toRate())) } ?: run { row.editingDescriptors(mapOf()) } 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 a0f6893a..2bf70668 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 @@ -28,7 +28,6 @@ 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.* @@ -105,9 +104,9 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate { } SessionRow.BANKROLL -> { - BottomSheetFragment.create(fragmentManager, row, this, data, false, CurrencyUtils.getCurrency(currentSession.bankroll)) + BottomSheetFragment.create(fragmentManager, row, this, data, false, currentSession.currency) } - else -> BottomSheetFragment.create(fragmentManager, row, this, data, currentCurrency = CurrencyUtils.getCurrency(currentSession.bankroll)) + else -> BottomSheetFragment.create(fragmentManager, row, this, data, currentCurrency = currentSession.currency) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index 8b6a3802..b276e9d9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -7,9 +7,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager +import io.realm.Realm import kotlinx.android.synthetic.main.fragment_settings.* import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.ui.activity.CurrenciesActivity import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.GDPRActivity @@ -22,6 +24,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.URL +import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.extensions.openContactMail import net.pokeranalytics.android.util.extensions.openPlayStorePage import net.pokeranalytics.android.util.extensions.openUrl @@ -56,7 +59,7 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta override fun stringForRow(row: RowRepresentable): String { return when (row) { SettingRow.VERSION -> BuildConfig.VERSION_NAME + if (BuildConfig.DEBUG) " (${BuildConfig.VERSION_CODE}) DEBUG" else "" - SettingRow.CURRENCY -> Currency.getInstance(Preferences.getCurrencyLocale(this.parentActivity)).symbol + SettingRow.CURRENCY -> UserDefaults.currency.symbol else -> "" } } @@ -77,6 +80,13 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta if (requestCode == SettingsFragment.REQUEST_CODE_CURRENCY && resultCode == Activity.RESULT_OK) { data?.let { Preferences.setCurrencyCode(data.getStringExtra(CurrenciesFragment.INTENT_CURRENCY_CODE), requireContext()) + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + it.where(Bankroll::class.java).isNull("currency.code").findAll().forEach { bankroll -> + bankroll.currencyCodeHasBeenUpdated() + } + } + realm.close() settingsAdapterRow.refreshRow(SettingRow.CURRENCY) } } 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 b43a0403..e44f7f64 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 @@ -15,7 +15,6 @@ import net.pokeranalytics.android.model.TournamentType 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 @@ -68,7 +67,7 @@ class SessionRowView : FrameLayout { if (session.isTournament()) { session.tournamentEntryFee?.let { - parameters.add(it.toCurrency(CurrencyUtils.getCurrency(session.bankroll))) + parameters.add(it.toCurrency(session.currency)) } session.tournamentName?.let { @@ -85,7 +84,7 @@ class SessionRowView : FrameLayout { } } else { if (session.cgSmallBlind != null && session.cgBigBlind != null) { - parameters.add(session.getCurrencyFormattedStake(this.context)) + parameters.add(session.getFormattedBlinds()) } session.game?.let { parameters.add(session.getFormattedGame()) @@ -149,7 +148,7 @@ class SessionRowView : FrameLayout { rowHistorySession.infoTitle.isVisible = false val result = session.result?.net ?: 0.0 - val formattedStat = ComputedStat(Stat.NETRESULT, result, currency = CurrencyUtils.getCurrency(session.bankroll)).format(context) + val formattedStat = ComputedStat(Stat.NETRESULT, result, currency = session.currency).format(context) rowHistorySession.gameResult.setTextColor(formattedStat.getColor(context)) rowHistorySession.gameResult.text = formattedStat.text } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index da69af74..747a2db6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -12,6 +12,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.Preferences +import net.pokeranalytics.android.util.UserDefaults import java.text.DateFormatSymbols import java.util.* @@ -102,7 +103,7 @@ sealed class FilterElementRow : RowRepresentable { data class Month(val month: Int) : SingleValueFilterElementRow(month) data class Day(val day: Int) : SingleValueFilterElementRow(day) - data class Blind(val blind : String, val currencySymbol:String? = null) : StringFilterElementRow(blind) + data class Blind(val blind: String, val hasDefaultCurrency: Boolean) : StringFilterElementRow(blind) //TODO: Refactor? data class PastDays(var lastDays: Int = 0) : SingleValueFilterElementRow(lastDays) { @@ -298,16 +299,13 @@ sealed class FilterElementRow : RowRepresentable { } is DataFilterElementRow -> this.name is StaticDataFilterElementRow -> this.name - else -> super.getDisplayName() + is Blind -> this.blind + else -> super.getDisplayName() } } override fun localizedTitle(context: Context): String { return when (this) { - is Blind -> { - val currencySymbol = currencySymbol ?: Preferences.getDefaultCurrency(context).symbol - "$currencySymbol $blind" - } is StaticDataFilterElementRow -> this.getDataLocalizedTitle(context) else -> super.localizedTitle(context) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt index 1f5e71e8..f64bc0ba 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt @@ -164,8 +164,8 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { val blinds = arrayListOf() val realm = Realm.getDefaultInstance() realm.where().distinct("blind", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { - it.stake?.let { stake -> - blinds.add(Blind(stake, it.currencySymbol)) + it.blinds?.let { stake -> + blinds.add(Blind(stake, it.hasDefaultCurrency)) } } realm.close() diff --git a/app/src/main/java/net/pokeranalytics/android/util/CurrencyUtils.kt b/app/src/main/java/net/pokeranalytics/android/util/CurrencyUtils.kt deleted file mode 100644 index 2aa76778..00000000 --- a/app/src/main/java/net/pokeranalytics/android/util/CurrencyUtils.kt +++ /dev/null @@ -1,64 +0,0 @@ -package net.pokeranalytics.android.util - -import android.content.Context -import net.pokeranalytics.android.model.realm.Bankroll -import java.text.NumberFormat -import java.util.* - -class CurrencyUtils { - - companion object { - - /** - * return the currency associated with this bankroll - */ - fun getCurrency(bankroll: Bankroll? = null) : Currency { - val currencyCode = bankroll?.currency?.code ?: CurrencyUtils.getLocaleCurrency().currencyCode - return Currency.getInstance(currencyCode) - } - - /** - * Get a currency formatter - */ - fun getCurrencyFormatter(context: Context, currency: Currency? = null) : NumberFormat { - val currencyFormatter = NumberFormat.getCurrencyInstance(Preferences.getCurrencyLocale(context)) - currency?.let { - currencyFormatter.currency = it - } - currencyFormatter.minimumFractionDigits = 0 - currencyFormatter.maximumFractionDigits = 2 - return currencyFormatter - } - - /** - * Get a currency rate formatter - */ - fun getCurrencyRateFormatter() : NumberFormat { - val currencyFormatter = NumberFormat.getInstance() - currencyFormatter.minimumFractionDigits = 0 - currencyFormatter.maximumFractionDigits = 6 - return currencyFormatter - } - - /** - * Return the locale currency, or en_US if there - */ - fun getLocaleCurrency() : Currency { - return try { - Currency.getInstance(Locale.getDefault()) - } catch (ex: Exception) { - when (Locale.getDefault().language) { - "en" -> Currency.getInstance(Locale("en", "US")) - "fr" -> Currency.getInstance(Locale("fr", "FR")) - "es" -> Currency.getInstance(Locale("es", "ES")) - "de" -> Currency.getInstance(Locale("de", "DE")) - "ja" -> Currency.getInstance(Locale("ja", "JP")) - "zh" -> Currency.getInstance(Locale("zh", "CN")) - else -> Currency.getInstance(Locale("en", "US")) - } - } - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt index d3dbfc4f..13a13beb 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -16,8 +16,6 @@ class Preferences { companion object { - private var currencyLocale : Locale? = null - fun setString(key: Keys, value: String, context: Context) { val preferences = PreferenceManager.getDefaultSharedPreferences(context) val editor = preferences.edit() @@ -44,8 +42,7 @@ class Preferences { fun setCurrencyCode(currencyCode: String, context: Context) { setString(Keys.CURRENCY_CODE, currencyCode, context) - currencyLocale = null - UserDefaults.currency = getDefaultCurrency(context) + UserDefaults.setCurrencyValues(context) } private fun getCurrencyCode(context: Context) : String? { @@ -53,10 +50,6 @@ class Preferences { } fun getCurrencyLocale(context : Context) : Locale? { - currencyLocale?. let { - return it - } - getCurrencyCode(context)?.let { currencyCode -> Locale.getAvailableLocales().filter{ try { @@ -65,19 +58,17 @@ class Preferences { false } }.first().let { - currencyLocale = it return it } } return null } - fun getDefaultCurrency(context: Context) : Currency { - return getCurrencyLocale(context)?.let { - Currency.getInstance(it) - } ?: run { - CurrencyUtils.getLocaleCurrency() + fun getDefaultCurrency(context: Context) : Currency? { + getCurrencyLocale(context)?.let { + return Currency.getInstance(it) } + return null } fun setStopShowingDisclaimer(context: Context) { @@ -94,11 +85,36 @@ class Preferences { class UserDefaults private constructor(context: Context) { init { - currency = Preferences.getDefaultCurrency(context) + setCurrencyValues(context) } companion object : SingletonHolder(::UserDefaults) { lateinit var currency : Currency + lateinit var currencyLocale : Locale + + fun setCurrencyValues(context: Context) { + currency = Preferences.getDefaultCurrency(context) ?: getLocaleCurrency() + currencyLocale = Preferences.getCurrencyLocale(context) ?: Locale.getDefault() + } + + /** + * Return the locale currency, or en_US if there + */ + fun getLocaleCurrency() : Currency { + return try { + Currency.getInstance(Locale.getDefault()) + } catch (ex: Exception) { + when (Locale.getDefault().language) { + "en" -> Currency.getInstance(Locale("en", "US")) + "fr" -> Currency.getInstance(Locale("fr", "FR")) + "es" -> Currency.getInstance(Locale("es", "ES")) + "de" -> Currency.getInstance(Locale("de", "DE")) + "ja" -> Currency.getInstance(Locale("ja", "JP")) + "zh" -> Currency.getInstance(Locale("zh", "CN")) + else -> Currency.getInstance(Locale("en", "US")) + } + } + } } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt index 88330925..5ee1d3cd 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt @@ -2,6 +2,7 @@ package net.pokeranalytics.android.util.extensions import android.content.Context import net.pokeranalytics.android.R +import net.pokeranalytics.android.util.UserDefaults import java.text.DecimalFormat import java.text.NumberFormat import java.util.* @@ -23,7 +24,7 @@ fun Double.formatted(): String { fun Double.toCurrency(currency: Currency? = null): String { - val currencyFormatter = NumberFormat.getCurrencyInstance() + val currencyFormatter = NumberFormat.getCurrencyInstance(UserDefaults.currencyLocale) currency?.let { currencyFormatter.currency = currency } @@ -33,6 +34,14 @@ fun Double.toCurrency(currency: Currency? = null): String { return currencyFormatter.format(this) } + +fun Double.toRate(): String { + val currencyFormatter = NumberFormat.getInstance() + currencyFormatter.minimumFractionDigits = 0 + currencyFormatter.maximumFractionDigits = 6 + return currencyFormatter.format(this) +} + fun Double.formattedHourlyDuration() : String { return (this * 1000 * 3600).toLong().toMinutes() }