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
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<Session>(realm, Query(filter))

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

@ -2,6 +2,12 @@ package net.pokeranalytics.android.model
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.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)
}
}

@ -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<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?

@ -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<String>()
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<String>()
// 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

@ -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 {

@ -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(

@ -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<Any?>()
/**
* 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
}
}

Loading…
Cancel
Save