From 5ea92f4cedf9b18f388fce855d4cd37e5ece01bd Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Thu, 11 Apr 2019 19:16:35 +0200 Subject: [PATCH] wip blind update --- .../filter/BlindFilterInstrumentedTest.kt | 16 +++--- .../android/model/filter/QueryCondition.kt | 29 +++++++++- .../android/model/realm/Currency.kt | 12 ++++ .../android/model/realm/FilterCondition.kt | 19 ++++++- .../android/model/realm/Session.kt | 56 ++++++++++++------- .../android/model/utils/Seed.kt | 16 +++++- .../android/ui/view/SessionRowView.kt | 2 +- .../view/rowrepresentable/FilterElementRow.kt | 17 +++++- .../view/rowrepresentable/FilterSectionRow.kt | 6 +- .../android/util/Preferences.kt | 2 +- 10 files changed, 135 insertions(+), 40 deletions(-) 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 c4cf68aa..99f8e6e2 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 @@ -21,7 +21,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.beginTransaction() val currency = realm.createObject(net.pokeranalytics.android.model.realm.Currency::class.java, "1") - currency.code = "AUD" + currency.code = "USD" val b1 = realm.createObject(Bankroll::class.java, "1") val b2 = realm.createObject(Bankroll::class.java, "2") @@ -43,7 +43,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { val filter = QueryCondition.STAKE - val blind = FilterElementRow.Stake(s1.getBlinds()) + val blind = FilterElementRow.Stake(s1.stake!!) blind.filterSectionRow = FilterSectionRow.STAKE val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) filter.updateValueMap(filterElement) @@ -87,8 +87,8 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { val filter = QueryCondition.STAKE - val blind1 = FilterElementRow.Stake(s1.getBlinds()) - val blind2 = FilterElementRow.Stake(s2.getBlinds()) + val blind1 = FilterElementRow.Stake(s1.stake!!) + val blind2 = FilterElementRow.Stake(s2.stake!!) blind1.filterSectionRow = FilterSectionRow.STAKE blind2.filterSectionRow = FilterSectionRow.STAKE @@ -110,7 +110,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.beginTransaction() val currency = realm.createObject(net.pokeranalytics.android.model.realm.Currency::class.java, "1") - currency.code = "AUD" + currency.code = "USD" val b1 = realm.createObject(Bankroll::class.java, "1") val b2 = realm.createObject(Bankroll::class.java, "2") @@ -132,7 +132,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { val filter = QueryCondition.STAKE - val blind = FilterElementRow.Stake(s3.getBlinds()) + val blind = FilterElementRow.Stake(s3.stake!!, "$") blind.filterSectionRow = FilterSectionRow.STAKE val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) @@ -175,10 +175,10 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { val filter = QueryCondition.STAKE - val blind1 = FilterElementRow.Stake(s1.getBlinds()) + val blind1 = FilterElementRow.Stake(s1.stake!!) blind1.filterSectionRow = FilterSectionRow.STAKE - val blind2 = FilterElementRow.Stake(s2.getBlinds()) + val blind2 = FilterElementRow.Stake(s2.stake!!) blind2.filterSectionRow = FilterSectionRow.STAKE val filterElement = FilterCondition(filterElementRows = arrayListOf(blind1, blind2)) filter.updateValueMap(filterElement) 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 53ff2a7f..bc8c118b 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 @@ -109,7 +109,7 @@ enum class QueryCondition(var operator: Operator? = null) { return when (this) { BANKROLL, GAME, LOCATION, ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES, TOURNAMENT_NAME -> arrayOf("ids") LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> arrayOf("values") - STAKE -> arrayOf("stakes") + STAKE -> arrayOf("stakes", "hasDefaultCurrency") STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> arrayOf("date") DAY_OF_WEEK -> arrayOf("dayOfWeek") MONTH -> arrayOf("month") @@ -158,7 +158,28 @@ enum class QueryCondition(var operator: Operator? = null) { } STAKE -> { val stakes: Array by valueMap - realmQuery.`in`(fieldName, stakes) + val hasDefaultCurrency: Array by valueMap + //realmQuery.`in`(fieldName, stakes) + stakes.forEachIndexed { index, s -> + val isUsingDefaultCurrency = hasDefaultCurrency[index] + realmQuery.beginGroup() + if (isUsingDefaultCurrency) { + realmQuery.endsWith(fieldName, s) + .and() + .beginGroup() + .isNull("bankroll") + .or() + .isNull("bankroll.currency") + .or() + .isNull("bankroll.currency.code") + .endGroup() + } else { + realmQuery.equalTo(fieldName, s) + } + .endGroup() + .or() + } + realmQuery } BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { val ids: Array by valueMap @@ -265,7 +286,9 @@ enum class QueryCondition(var operator: Operator? = null) { valueMap = mapOf("values" to filterCondition.values) } STAKE -> { - valueMap = mapOf("stakes" to filterCondition.stakes) + valueMap = mapOf( + "stakes" to filterCondition.stakes, + "hasDefaultCurrency" to filterCondition.hasDefaultCurrency) } STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> { valueMap = mapOf("date" to filterCondition.date) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt index 39463454..a0dcfdfb 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt @@ -5,10 +5,22 @@ import io.realm.RealmResults import io.realm.annotations.Ignore import io.realm.annotations.LinkingObjects import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.util.Preferences import java.util.* open class Currency : RealmObject() { + companion object { + val localeCurrency: java.util.Currency + get() { + return try { + java.util.Currency.getInstance(Locale.getDefault()) + } catch (e: Exception) { + java.util.Currency.getInstance(Locale("en", "US")) + } + } + } + @Ignore val DEFAULTRATE: Double = 1.0 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 aa7e6b01..6742969c 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 @@ -23,6 +23,19 @@ open class FilterCondition() : RealmObject() { is DateFilterElementRow -> { this.dateValue = row.dateValue } + is Stake -> { + //TODO refactor raz + this.stringValues = RealmList().apply { + this.addAll(filterElementRows.map { + (it as Stake).stake + }) + } + this.booleanValues = RealmList().apply { + this.addAll(filterElementRows.map { + ((it as Stake).currencySymbol == null) + }) + } + } is StringFilterElementRow -> { this.stringValues = RealmList().apply { this.addAll(filterElementRows.map { @@ -52,6 +65,7 @@ open class FilterCondition() : RealmObject() { private var numericValues: RealmList? = null private var dateValue: Date? = null private var stringValues: RealmList? = null + private var booleanValues: RealmList? = null val ids: Array get() = stringValues?.toTypedArray() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing @@ -59,7 +73,10 @@ open class FilterCondition() : RealmObject() { val stakes: Array get() = stringValues?.toTypedArray() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing - val date: Date + val hasDefaultCurrency: Array + get() = booleanValues?.toTypedArray() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing + + val date: Date get() = dateValue ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing 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 12125fac..c18eb1d2 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 @@ -37,6 +37,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRowRepresent 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.extensions.* import java.util.* import java.util.Currency @@ -219,7 +220,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat var cgSmallBlind: Double? = null set(value) { field = value - this.stake = getBlinds() + computeStakeAsString() } // The big blind value @@ -227,16 +228,11 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat set(value) { field = value this.computeStats() - this.stake = getBlinds() + computeStakeAsString() } - private var stake: String? = null - get() { - if (field == null) { - field = getBlinds() - } - return field - } + var stake: String? = null + private set // Tournament @@ -256,7 +252,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat var tournamentFeatures: RealmList = RealmList() fun bankrollHasBeenUpdated() { - this.stake = getBlinds() + computeStakeAsString() } /** @@ -496,14 +492,19 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return NULL_TEXT } - /** - * Return the formatted blinds - */ - fun getBlinds(): String { - val currencyCode = bankroll?.currency?.code ?: Currency.getInstance(Locale.getDefault()).currencyCode - val currencySymbol = Currency.getInstance(currencyCode).symbol - return if (cgSmallBlind == null) NULL_TEXT else "$currencySymbol ${cgSmallBlind?.formatted()}/${cgBigBlind?.round()}" - } + /** + * Return the formatted blinds + */ + fun getCurrencyFormattedStake(context:Context) : String { + val currency : Currency = Preferences.getCurrencyLocale(context)?.let { + Currency.getInstance(it) + } ?: run { + net.pokeranalytics.android.model.realm.Currency.localeCurrency + } + + val currencySymbol = currencySymbol ?: currency.symbol + return "$currencySymbol $stake" + } /** * Return the game title @@ -522,6 +523,23 @@ 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 + } + + private fun computeStakeAsString() { + stake = null + if (cgBigBlind == null) return + cgBigBlind?.let { bb -> + val sb = cgSmallBlind ?: bb / 2.0 + stake = "${sb.formatted()}/${bb.round()}" + } + } + // LifeCycle /** @@ -638,7 +656,7 @@ 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 -> getBlinds() + SessionRow.BLINDS -> getCurrencyFormattedStake(context) 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 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 2604de61..274dbde6 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 @@ -6,9 +6,10 @@ import io.realm.kotlin.where import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.Currency -import net.pokeranalytics.android.util.Preferences import java.util.* + + class Seed(var context:Context) : Realm.Transaction { override fun execute(realm: Realm) { @@ -26,16 +27,25 @@ class Seed(var context:Context) : Realm.Transaction { } } + val localeCurrency: java.util.Currency + get() { + return try { + java.util.Currency.getInstance(Locale.getDefault()) + } catch (e: Exception) { + java.util.Currency.getInstance(Locale("en", "US")) + } + } + private fun createDefaultCurrencyAndBankroll(realm: Realm) { // Currency - val localeCurrency = java.util.Currency.getInstance(Locale.getDefault()) + val localeCurrency = localeCurrency val defaultCurrency = Currency() defaultCurrency.code = localeCurrency.currencyCode realm.insertOrUpdate(defaultCurrency) // Bankroll val bankroll = Bankroll() - bankroll.name = context.resources.getString(R.string.live) + bankroll.name = context.resources.getString(net.pokeranalytics.android.R.string.live) bankroll.live = true bankroll.currency = realm.where().equalTo("code", localeCurrency.currencyCode).findFirst() realm.insertOrUpdate(bankroll) 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 6cef22f9..b43a0403 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 @@ -85,7 +85,7 @@ class SessionRowView : FrameLayout { } } else { if (session.cgSmallBlind != null && session.cgBigBlind != null) { - parameters.add(session.getBlinds()) + parameters.add(session.getCurrencyFormattedStake(this.context)) } session.game?.let { parameters.add(session.getFormattedGame()) 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 8c39c4ec..1c715ed8 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 @@ -13,6 +13,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType import java.text.DateFormatSymbols import java.util.* +import java.util.prefs.Preferences sealed class FilterElementRow : RowRepresentable { @@ -97,7 +98,7 @@ sealed class FilterElementRow : RowRepresentable { data class Month(val month: Int) : SingleValueFilterElementRow(month) data class Day(val day: Int) : SingleValueFilterElementRow(day) - data class Stake(val stake : String) : StringFilterElementRow(stake) + data class Stake(val stake : String, val currencySymbol:String? = null) : StringFilterElementRow(stake) //TODO: Refactor? data class PastDays(var lastDays: Int = 0) : SingleValueFilterElementRow(lastDays) { @@ -292,13 +293,25 @@ sealed class FilterElementRow : RowRepresentable { } is DataFilterElementRow -> this.name is StaticDataFilterElementRow -> this.name - is Stake -> this.stake else -> super.getDisplayName() } } override fun localizedTitle(context: Context): String { return when (this) { + is Stake -> { + currencySymbol?.let { + "$it $stake" + } + + val currency : Currency = net.pokeranalytics.android.util.Preferences.getCurrencyLocale(context)?.let { + Currency.getInstance(it) + } ?: run { + net.pokeranalytics.android.model.realm.Currency.localeCurrency + } + val currencySymbol = currencySymbol ?: currency.symbol + "$currencySymbol $stake" + } 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 918d8db2..d3542e8b 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 @@ -150,8 +150,10 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { STAKE -> { val stakes = arrayListOf() val realm = Realm.getDefaultInstance() - realm.where().distinct("stake").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { - stakes.add(Stake(it.getBlinds())) + realm.where().distinct("stake", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { + it.stake?.let { stake -> + stakes.add(Stake(stake, it.currencySymbol)) + } } realm.close() stakes 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 adfe3790..c52bdb52 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -51,7 +51,7 @@ class Preferences { return Preferences.getString(Keys.CURRENCY_CODE, context) } - fun getCurrencyLocale(context : Context) : Locale { + fun getCurrencyLocale(context : Context) : Locale? { currencyLocale?. let { return it