From 8f7e25ee6b58920450bb9e327ac3b5d197368a76 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 11 Jul 2022 16:29:29 +0200 Subject: [PATCH] Stakes filter implementation --- .../filter/BlindFilterInstrumentedTest.kt | 64 ++++++++----------- .../pokeranalytics/android/model/Criteria.kt | 2 +- .../pokeranalytics/android/model/Stakes.kt | 6 ++ .../android/model/filter/QueryCondition.kt | 10 ++- .../android/model/interfaces/StakesHolder.kt | 53 +++++++++++++++ .../android/model/realm/Session.kt | 42 +++++------- .../bottomsheet/BottomSheetStakesFragment.kt | 7 +- .../ui/modules/session/SessionFragment.kt | 2 +- .../ui/viewmodel/BottomSheetViewModel.kt | 7 ++ 9 files changed, 121 insertions(+), 72 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 66ac9ec0..44026953 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 @@ -28,22 +28,19 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { b2.currency = currency val s1 = Session.testInstance(100.0, false, Date(), 1, b1) - s1.cgBigBlind = 1.0 - s1.cgSmallBlind = 0.5 + s1.cgBlinds = "0.5/1" val s2 = Session.testInstance(100.0, false, Date(), 1, b1) - s2.cgBigBlind = 1.0 - s2.cgSmallBlind = 0.5 + s2.cgBlinds = "0.5/1" val s3 = Session.testInstance(100.0, false, Date(), 1, b1) - s3.cgBigBlind = 2.0 - s3.cgSmallBlind = 1.0 + s3.cgBlinds = "1/2" realm.commitTransaction() - val filter = QueryCondition.AnyBlind() + val filter = QueryCondition.AnyStake() - val blind = QueryCondition.AnyBlind().apply { + val blind = QueryCondition.AnyStake().apply { listOfValues = arrayListOf(s1.blinds!!) } @@ -74,26 +71,23 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { b2.currency = currency val s1 = Session.testInstance(100.0, false, Date(), 1, b1) - s1.cgBigBlind = 1.0 - s1.cgSmallBlind = 0.5 + s1.cgBlinds = "0.5/1" val s2 = Session.testInstance(100.0, false, Date(), 1, b1) - s2.cgBigBlind = 1.0 - s2.cgSmallBlind = 0.5 + s2.cgBlinds = "0.5/1" val s3 = Session.testInstance(100.0, false, Date(), 1, b1) - s3.cgBigBlind = 2.0 - s3.cgSmallBlind = 1.0 + s3.cgBlinds = "1/2" realm.commitTransaction() - val filter = QueryCondition.AnyBlind() + val filter = QueryCondition.AnyStake() - val blind1 = QueryCondition.AnyBlind().apply { + val blind1 = QueryCondition.AnyStake().apply { listOfValues = arrayListOf(s1.blinds!!) } - val blind2 = QueryCondition.AnyBlind().apply { + val blind2 = QueryCondition.AnyStake().apply { listOfValues = arrayListOf(s2.blinds!!) } @@ -122,24 +116,20 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { b2.currency = currency val s1 = Session.testInstance(100.0, false, Date(), 1, b1) - - s1.cgBigBlind = 1.0 - s1.cgSmallBlind = 0.5 + s1.cgBlinds = "0.5/1" val s2 = Session.testInstance(100.0, false, Date(), 1, b1) - s2.cgBigBlind = 1.0 - s2.cgSmallBlind = 0.5 + s2.cgBlinds = "0.5/1" val s3 = Session.testInstance(100.0, false, Date(), 1, b2) - s3.cgBigBlind = 2.0 - s3.cgSmallBlind = 1.0 + s3.cgBlinds = "1/2" realm.commitTransaction() - val filter = QueryCondition.AnyBlind() + val filter = QueryCondition.AnyStake() - val blind = QueryCondition.AnyBlind().apply { + val blind = QueryCondition.AnyStake().apply { listOfValues = arrayListOf(s3.blinds!!) } @@ -167,31 +157,27 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { b2.currency = currency val s1 = Session.testInstance(100.0, false, Date(), 1, b1) - s1.cgBigBlind = 1.0 - s1.cgSmallBlind = 0.5 + s1.cgBlinds = "0.5/1" val s2 = Session.testInstance(100.0, false, Date(), 1, b1) - s2.cgBigBlind = 2.0 - s2.cgSmallBlind = 1.0 + s2.cgBlinds = "0.5/1" val s3 = Session.testInstance(100.0, false, Date(), 1, b2) - s3.cgBigBlind = 2.0 - s3.cgSmallBlind = 1.0 + s3.cgBlinds = "1/2" realm.commitTransaction() + val filter = QueryCondition.AnyStake() - val filter = QueryCondition.AnyBlind() - - val blind1 = QueryCondition.AnyBlind().apply { - listOfValues = arrayListOf(s1.blinds!!) + val stake1 = QueryCondition.AnyStake().apply { + listOfValues = arrayListOf(s1.cgStakes!!) } - val blind2 = QueryCondition.AnyBlind().apply { - listOfValues = arrayListOf(s2.blinds!!) + val stake2 = QueryCondition.AnyStake().apply { + listOfValues = arrayListOf(s2.cgStakes!!) } - val filterElement = FilterCondition(arrayListOf(blind1, blind2), FilterSectionRow.Blind) + val filterElement = FilterCondition(arrayListOf(stake1, stake2), FilterSectionRow.Blind) filter.updateValueBy(filterElement) val sessions = Filter.queryOn(realm, Query(filter)) diff --git a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt index 77da5db3..a7154c8e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt @@ -236,7 +236,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row realm.close() years } - is Blinds -> comparison() + is Blinds -> comparison() is ListCustomFields -> comparison() is ValueCustomFields -> { val realm = Realm.getDefaultInstance() diff --git a/app/src/main/java/net/pokeranalytics/android/model/Stakes.kt b/app/src/main/java/net/pokeranalytics/android/model/Stakes.kt index 5f887da5..8dc72a94 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Stakes.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Stakes.kt @@ -2,6 +2,12 @@ package net.pokeranalytics.android.model data class Stakes(var blinds: String?, var ante: Double?) { + companion object { + + } + + + } \ No newline at end of file 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 27316d15..aa5b1d61 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 @@ -14,6 +14,7 @@ import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.NameManageable +import net.pokeranalytics.android.model.interfaces.StakesHolder import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.view.RowRepresentable @@ -458,9 +459,14 @@ sealed class QueryCondition : RowRepresentable { } } - class AnyBlind : ListOfString() { + class AnyStake : ListOfString() { + + override fun labelForValue(value: String, context: Context): String { + return StakesHolder.readableStakes(value) + } + override fun entityName(context: Context): String { - return context.getString(R.string.blinds) + return context.getString(R.string.stakes) } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/StakesHolder.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/StakesHolder.kt index 14592547..5251653a 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/StakesHolder.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/StakesHolder.kt @@ -2,10 +2,13 @@ package net.pokeranalytics.android.model.interfaces import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.util.BLIND_SEPARATOR +import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.extensions.formatted +import net.pokeranalytics.android.util.extensions.toCurrency import java.text.NumberFormat import java.text.ParseException +import java.util.* interface StakesHolder { @@ -16,6 +19,56 @@ interface StakesHolder { private const val cbBlinds = "B=" private const val cbCode = "C=" + fun readableStakes(value: String): String { + + var ante: Double? = null; var blinds: String? = null; var currencyCode: String? = null + + val parameters = value.split(cbSeparator) + parameters.forEach { param -> + when { + param.contains(cbAnte) -> ante = param.removePrefix(cbAnte).let { NumberFormat.getInstance().parse(it)?.toDouble() } + param.contains(cbBlinds) -> blinds = param.removePrefix(cbBlinds) + param.contains(cbCode) -> currencyCode = param.removePrefix(cbCode) + } + } + + val currency = currencyCode?.let { Currency.getInstance(it) } + ?: run { UserDefaults.currency } + + val formattedBlinds = formattedBlinds(blinds, currency) + val formattedAnte = formattedAnte(ante, currency) + return formattedStakes(formattedBlinds, formattedAnte) + + } + + private fun formattedStakes(formattedBlinds: String?, formattedAnte: String?): String { + val components = arrayListOf() + formattedBlinds?.let { components.add(it) } + formattedAnte?.let { components.add("($it)") } + + return if (components.isNotEmpty()) { + components.joinToString(" ") + } else { + NULL_TEXT + } + } + + private fun formattedBlinds(blinds: String?, currency: Currency): String? { + blinds?.let { + val placeholder = 1.0 + val regex = Regex("-?\\d+(\\.\\d+)?") + return placeholder.toCurrency(currency).replace(regex, blinds) + } + return null + } + + private fun formattedAnte(antes: Double?, currency: Currency): String? { + antes?.let { + return it.toCurrency(currency) + } + return null + } + } val ante: Double? 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 b8fb7fd4..51cb2fde 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 @@ -100,7 +100,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim AnyLimit::class.java -> "limit" AnyTableSize::class.java -> "tableSize" AnyTournamentType::class.java -> "tournamentType" - AnyBlind::class.java -> "blinds" + AnyStake::class.java -> "cgStakes" NumberOfTable::class.java -> "numberOfTables" NetAmountWon::class.java, NetAmountLost::class.java -> "computableResults.ratedNet" NumberOfRebuy::class.java -> "result.numberOfRebuy" @@ -666,35 +666,23 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim } fun getFormattedStakes(): String { - val components = arrayListOf() - this.formattedBlinds?.let { components.add(it) } - this.formattedAnte?.let { components.add("($it)") } - return if (components.isNotEmpty()) { - components.joinToString(" ") - } else { - NULL_TEXT - } - } + this.cgStakes?.let { return StakesHolder.readableStakes(it) } - private val formattedBlinds: String? - get() { - this.cgBlinds?.let { blinds -> - val placeholder = 1.0 - val regex = Regex("-?\\d+(\\.\\d+)?") - return placeholder.toCurrency(this.currency).replace(regex, blinds) - } - return null - } - - private val formattedAnte: String? - get() { - this.cgAnte?.let { ante -> - return ante.toCurrency(this.currency) - } - return null - } + return NULL_TEXT +// +// +// val components = arrayListOf() +// this.formattedBlinds?.let { components.add(it) } +// this.formattedAnte?.let { components.add("($it)") } +// +// return if (components.isNotEmpty()) { +// components.joinToString(" ") +// } else { +// NULL_TEXT +// } + } // fun formatBlinds() { // blinds = null diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStakesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStakesFragment.kt index 0ef7e891..6bc986a6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStakesFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStakesFragment.kt @@ -12,6 +12,7 @@ import androidx.core.widget.addTextChangedListener import net.pokeranalytics.android.databinding.BottomSheetStakesBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException +import java.text.NumberFormat class BottomSheetStakesFragment : BottomSheetFragment() { @@ -134,8 +135,10 @@ class BottomSheetStakesFragment : BottomSheetFragment() { binding.blindsEditText.setText(this.model.secondStringValue) } - binding.anteEditText.addTextChangedListener { - this.model.stringValue = it?.toString() + binding.anteEditText.addTextChangedListener { text -> + text?.let { + this.model.ante = NumberFormat.getInstance().parse(it.toString())?.toDouble() + } } binding.blindsEditText.addTextChangedListener { 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 bd0af066..701f76fe 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 @@ -580,7 +580,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr SessionPropertiesRow.STAKES -> row.editingDescriptors( mapOf( "blinds" to session.cgBlinds, - "ante" to session.cgAnte?.round() + "ante" to session.cgAnte ) ) SessionPropertiesRow.BUY_IN -> row.editingDescriptors( diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/BottomSheetViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/BottomSheetViewModel.kt index c019e8e0..c98b5ed3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/BottomSheetViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/BottomSheetViewModel.kt @@ -6,6 +6,7 @@ import io.realm.RealmList import io.realm.RealmResults import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException +import net.pokeranalytics.android.model.Stakes import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.view.RowRepresentable @@ -93,6 +94,11 @@ class BottomSheetViewModel(var row: RowRepresentable) : ViewModel() { var limit: Int? = 0 val someValues = ArrayList() + /** + * Stakes + */ + var ante: Double? = null + fun load() { when(this.row.bottomSheetType) { @@ -211,6 +217,7 @@ class BottomSheetViewModel(var row: RowRepresentable) : ViewModel() { BottomSheetType.DOUBLE_LIST, BottomSheetType.LIST_GAME -> this.someValues BottomSheetType.LIST_STATIC -> this.selectedRows.firstOrNull() BottomSheetType.SUM -> this.doubleValue + BottomSheetType.CASH_GAME_STAKES -> Stakes(this.secondStringValue, this.ante) else -> null } }