Stakes filter implementation

blinds
Laurent 3 years ago
parent 687423fb3e
commit 8f7e25ee6b
  1. 64
      app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt
  2. 2
      app/src/main/java/net/pokeranalytics/android/model/Criteria.kt
  3. 6
      app/src/main/java/net/pokeranalytics/android/model/Stakes.kt
  4. 10
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  5. 53
      app/src/main/java/net/pokeranalytics/android/model/interfaces/StakesHolder.kt
  6. 42
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  7. 7
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStakesFragment.kt
  8. 2
      app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt
  9. 7
      app/src/main/java/net/pokeranalytics/android/ui/viewmodel/BottomSheetViewModel.kt

@ -28,22 +28,19 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
b2.currency = currency b2.currency = currency
val s1 = Session.testInstance(100.0, false, Date(), 1, b1) val s1 = Session.testInstance(100.0, false, Date(), 1, b1)
s1.cgBigBlind = 1.0 s1.cgBlinds = "0.5/1"
s1.cgSmallBlind = 0.5
val s2 = Session.testInstance(100.0, false, Date(), 1, b1) val s2 = Session.testInstance(100.0, false, Date(), 1, b1)
s2.cgBigBlind = 1.0 s2.cgBlinds = "0.5/1"
s2.cgSmallBlind = 0.5
val s3 = Session.testInstance(100.0, false, Date(), 1, b1) val s3 = Session.testInstance(100.0, false, Date(), 1, b1)
s3.cgBigBlind = 2.0 s3.cgBlinds = "1/2"
s3.cgSmallBlind = 1.0
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.AnyBlind() val filter = QueryCondition.AnyStake()
val blind = QueryCondition.AnyBlind().apply { val blind = QueryCondition.AnyStake().apply {
listOfValues = arrayListOf(s1.blinds!!) listOfValues = arrayListOf(s1.blinds!!)
} }
@ -74,26 +71,23 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
b2.currency = currency b2.currency = currency
val s1 = Session.testInstance(100.0, false, Date(), 1, b1) val s1 = Session.testInstance(100.0, false, Date(), 1, b1)
s1.cgBigBlind = 1.0 s1.cgBlinds = "0.5/1"
s1.cgSmallBlind = 0.5
val s2 = Session.testInstance(100.0, false, Date(), 1, b1) val s2 = Session.testInstance(100.0, false, Date(), 1, b1)
s2.cgBigBlind = 1.0 s2.cgBlinds = "0.5/1"
s2.cgSmallBlind = 0.5
val s3 = Session.testInstance(100.0, false, Date(), 1, b1) val s3 = Session.testInstance(100.0, false, Date(), 1, b1)
s3.cgBigBlind = 2.0 s3.cgBlinds = "1/2"
s3.cgSmallBlind = 1.0
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.AnyBlind() val filter = QueryCondition.AnyStake()
val blind1 = QueryCondition.AnyBlind().apply { val blind1 = QueryCondition.AnyStake().apply {
listOfValues = arrayListOf(s1.blinds!!) listOfValues = arrayListOf(s1.blinds!!)
} }
val blind2 = QueryCondition.AnyBlind().apply { val blind2 = QueryCondition.AnyStake().apply {
listOfValues = arrayListOf(s2.blinds!!) listOfValues = arrayListOf(s2.blinds!!)
} }
@ -122,24 +116,20 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
b2.currency = currency b2.currency = currency
val s1 = Session.testInstance(100.0, false, Date(), 1, b1) val s1 = Session.testInstance(100.0, false, Date(), 1, b1)
s1.cgBlinds = "0.5/1"
s1.cgBigBlind = 1.0
s1.cgSmallBlind = 0.5
val s2 = Session.testInstance(100.0, false, Date(), 1, b1) val s2 = Session.testInstance(100.0, false, Date(), 1, b1)
s2.cgBigBlind = 1.0 s2.cgBlinds = "0.5/1"
s2.cgSmallBlind = 0.5
val s3 = Session.testInstance(100.0, false, Date(), 1, b2) val s3 = Session.testInstance(100.0, false, Date(), 1, b2)
s3.cgBigBlind = 2.0 s3.cgBlinds = "1/2"
s3.cgSmallBlind = 1.0
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.AnyBlind() val filter = QueryCondition.AnyStake()
val blind = QueryCondition.AnyBlind().apply { val blind = QueryCondition.AnyStake().apply {
listOfValues = arrayListOf(s3.blinds!!) listOfValues = arrayListOf(s3.blinds!!)
} }
@ -167,31 +157,27 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
b2.currency = currency b2.currency = currency
val s1 = Session.testInstance(100.0, false, Date(), 1, b1) val s1 = Session.testInstance(100.0, false, Date(), 1, b1)
s1.cgBigBlind = 1.0 s1.cgBlinds = "0.5/1"
s1.cgSmallBlind = 0.5
val s2 = Session.testInstance(100.0, false, Date(), 1, b1) val s2 = Session.testInstance(100.0, false, Date(), 1, b1)
s2.cgBigBlind = 2.0 s2.cgBlinds = "0.5/1"
s2.cgSmallBlind = 1.0
val s3 = Session.testInstance(100.0, false, Date(), 1, b2) val s3 = Session.testInstance(100.0, false, Date(), 1, b2)
s3.cgBigBlind = 2.0 s3.cgBlinds = "1/2"
s3.cgSmallBlind = 1.0
realm.commitTransaction() realm.commitTransaction()
val filter = QueryCondition.AnyStake()
val filter = QueryCondition.AnyBlind() val stake1 = QueryCondition.AnyStake().apply {
listOfValues = arrayListOf(s1.cgStakes!!)
val blind1 = QueryCondition.AnyBlind().apply {
listOfValues = arrayListOf(s1.blinds!!)
} }
val blind2 = QueryCondition.AnyBlind().apply { val stake2 = QueryCondition.AnyStake().apply {
listOfValues = arrayListOf(s2.blinds!!) listOfValues = arrayListOf(s2.cgStakes!!)
} }
val filterElement = FilterCondition(arrayListOf(blind1, blind2), FilterSectionRow.Blind) val filterElement = FilterCondition(arrayListOf(stake1, stake2), FilterSectionRow.Blind)
filter.updateValueBy(filterElement) filter.updateValueBy(filterElement)
val sessions = Filter.queryOn<Session>(realm, Query(filter)) val sessions = Filter.queryOn<Session>(realm, Query(filter))

@ -236,7 +236,7 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row
realm.close() realm.close()
years years
} }
is Blinds -> comparison<QueryCondition.AnyBlind, String>() is Blinds -> comparison<QueryCondition.AnyStake, String>()
is ListCustomFields -> comparison<CustomFieldEntry>() is ListCustomFields -> comparison<CustomFieldEntry>()
is ValueCustomFields -> { is ValueCustomFields -> {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()

@ -2,6 +2,12 @@ package net.pokeranalytics.android.model
data class Stakes(var blinds: String?, var ante: Double?) { data class Stakes(var blinds: String?, var ante: Double?) {
companion object {
}
} }

@ -14,6 +14,7 @@ import net.pokeranalytics.android.model.TableSize
import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.interfaces.StakesHolder
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
import net.pokeranalytics.android.ui.view.RowRepresentable 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 { override fun entityName(context: Context): String {
return context.getString(R.string.blinds) return context.getString(R.string.stakes)
} }
} }

@ -2,10 +2,13 @@ package net.pokeranalytics.android.model.interfaces
import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.util.BLIND_SEPARATOR 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.UserDefaults
import net.pokeranalytics.android.util.extensions.formatted import net.pokeranalytics.android.util.extensions.formatted
import net.pokeranalytics.android.util.extensions.toCurrency
import java.text.NumberFormat import java.text.NumberFormat
import java.text.ParseException import java.text.ParseException
import java.util.*
interface StakesHolder { interface StakesHolder {
@ -16,6 +19,56 @@ interface StakesHolder {
private const val cbBlinds = "B=" private const val cbBlinds = "B="
private const val cbCode = "C=" 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<String>()
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? val ante: Double?

@ -100,7 +100,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim
AnyLimit::class.java -> "limit" AnyLimit::class.java -> "limit"
AnyTableSize::class.java -> "tableSize" AnyTableSize::class.java -> "tableSize"
AnyTournamentType::class.java -> "tournamentType" AnyTournamentType::class.java -> "tournamentType"
AnyBlind::class.java -> "blinds" AnyStake::class.java -> "cgStakes"
NumberOfTable::class.java -> "numberOfTables" NumberOfTable::class.java -> "numberOfTables"
NetAmountWon::class.java, NetAmountLost::class.java -> "computableResults.ratedNet" NetAmountWon::class.java, NetAmountLost::class.java -> "computableResults.ratedNet"
NumberOfRebuy::class.java -> "result.numberOfRebuy" NumberOfRebuy::class.java -> "result.numberOfRebuy"
@ -666,35 +666,23 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim
} }
fun getFormattedStakes(): String { fun getFormattedStakes(): String {
val components = arrayListOf<String>()
this.formattedBlinds?.let { components.add(it) }
this.formattedAnte?.let { components.add("($it)") }
return if (components.isNotEmpty()) { this.cgStakes?.let { return StakesHolder.readableStakes(it) }
components.joinToString(" ")
} else {
NULL_TEXT
}
}
private val formattedBlinds: String? return NULL_TEXT
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
}
//
//
// val components = arrayListOf<String>()
// this.formattedBlinds?.let { components.add(it) }
// this.formattedAnte?.let { components.add("($it)") }
//
// return if (components.isNotEmpty()) {
// components.joinToString(" ")
// } else {
// NULL_TEXT
// }
}
// fun formatBlinds() { // fun formatBlinds() {
// blinds = null // blinds = null

@ -12,6 +12,7 @@ import androidx.core.widget.addTextChangedListener
import net.pokeranalytics.android.databinding.BottomSheetStakesBinding import net.pokeranalytics.android.databinding.BottomSheetStakesBinding
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException
import java.text.NumberFormat
class BottomSheetStakesFragment : BottomSheetFragment() { class BottomSheetStakesFragment : BottomSheetFragment() {
@ -134,8 +135,10 @@ class BottomSheetStakesFragment : BottomSheetFragment() {
binding.blindsEditText.setText(this.model.secondStringValue) binding.blindsEditText.setText(this.model.secondStringValue)
} }
binding.anteEditText.addTextChangedListener { binding.anteEditText.addTextChangedListener { text ->
this.model.stringValue = it?.toString() text?.let {
this.model.ante = NumberFormat.getInstance().parse(it.toString())?.toDouble()
}
} }
binding.blindsEditText.addTextChangedListener { binding.blindsEditText.addTextChangedListener {

@ -580,7 +580,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr
SessionPropertiesRow.STAKES -> row.editingDescriptors( SessionPropertiesRow.STAKES -> row.editingDescriptors(
mapOf( mapOf(
"blinds" to session.cgBlinds, "blinds" to session.cgBlinds,
"ante" to session.cgAnte?.round() "ante" to session.cgAnte
) )
) )
SessionPropertiesRow.BUY_IN -> row.editingDescriptors( SessionPropertiesRow.BUY_IN -> row.editingDescriptors(

@ -6,6 +6,7 @@ import io.realm.RealmList
import io.realm.RealmResults import io.realm.RealmResults
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException
import net.pokeranalytics.android.model.Stakes
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
@ -93,6 +94,11 @@ class BottomSheetViewModel(var row: RowRepresentable) : ViewModel() {
var limit: Int? = 0 var limit: Int? = 0
val someValues = ArrayList<Any?>() val someValues = ArrayList<Any?>()
/**
* Stakes
*/
var ante: Double? = null
fun load() { fun load() {
when(this.row.bottomSheetType) { when(this.row.bottomSheetType) {
@ -211,6 +217,7 @@ class BottomSheetViewModel(var row: RowRepresentable) : ViewModel() {
BottomSheetType.DOUBLE_LIST, BottomSheetType.LIST_GAME -> this.someValues BottomSheetType.DOUBLE_LIST, BottomSheetType.LIST_GAME -> this.someValues
BottomSheetType.LIST_STATIC -> this.selectedRows.firstOrNull() BottomSheetType.LIST_STATIC -> this.selectedRows.firstOrNull()
BottomSheetType.SUM -> this.doubleValue BottomSheetType.SUM -> this.doubleValue
BottomSheetType.CASH_GAME_STAKES -> Stakes(this.secondStringValue, this.ante)
else -> null else -> null
} }
} }

Loading…
Cancel
Save