From 0cea6586a3e37e064be96e2d2f5cdc67f0e04346 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 8 Jun 2022 18:10:40 +0200 Subject: [PATCH 01/26] bumps to 5.4.9 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d933b091..8da8b80f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,8 +35,8 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 30 - versionCode 132 - versionName "5.4.8" + versionCode 133 + versionName "5.4.9" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } From 6783e4a26fc2dc15b1e0246fa15f5a9a6a6b6f64 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 8 Jun 2022 18:10:51 +0200 Subject: [PATCH 02/26] Fixes focus issue --- .../bottomsheet/BottomSheetEditTextMultiLinesFragment.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt index d2feae29..06680c6c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt @@ -15,7 +15,7 @@ class BottomSheetEditTextMultiLinesFragment : BottomSheetFragment() { private var _binding: BottomSheetEditTextMultiLinesBinding? = null private val binding get() = _binding!! - override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View? { + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { _binding = BottomSheetEditTextMultiLinesBinding.inflate(inflater, container, true) return binding.root } @@ -32,7 +32,12 @@ class BottomSheetEditTextMultiLinesFragment : BottomSheetFragment() { override fun onStart() { super.onStart() - binding.editText.requestFocus() + + val data = getDescriptors() ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (data[0].defaultValue.toString().isEmpty()) { + binding.editText.requestFocus() + } + } /** From d095a8c5af1638ae5616a78791de9e75810cf079 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 8 Jun 2022 18:11:06 +0200 Subject: [PATCH 03/26] Fixes import issues --- .../android/util/csv/CSVImporter.kt | 3 ++ .../android/util/csv/PACSVDescriptor.kt | 27 ++++++++++++++- .../android/util/csv/ProductCSVDescriptors.kt | 34 +++++++++++++++++++ .../android/util/csv/SessionField.kt | 10 ++++++ 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt index 86dcaba6..38998792 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt @@ -3,6 +3,8 @@ package net.pokeranalytics.android.util.csv import android.os.Handler import android.os.Looper import io.realm.Realm +import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.util.extensions.count import org.apache.commons.csv.CSVFormat import org.apache.commons.csv.CSVParser import org.apache.commons.csv.CSVRecord @@ -112,6 +114,7 @@ open class CSVImporter(istream: InputStream) { if (this.currentDescriptor == null) { // find descriptor this.currentDescriptor = this.findDescriptor(record) + this.currentDescriptor?.hasMatched(realm, record) if (this.currentDescriptor == null) { diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt index 690f8a41..168460d6 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt @@ -8,6 +8,7 @@ import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.utils.DataUtils +import net.pokeranalytics.android.util.extensions.count import net.pokeranalytics.android.util.extensions.getOrCreate import net.pokeranalytics.android.util.extensions.setHourMinutes import org.apache.commons.csv.CSVRecord @@ -22,6 +23,14 @@ abstract class PACSVDescriptor(source: DataSource, vararg elements: CSVField) : DataCSVDescriptor(source, *elements) { + var noSessionImport: Boolean = false + + init { + val realm = Realm.getDefaultInstance() + this.noSessionImport = realm.count(Session::class.java) == 0L + realm.close() + } + private var sameDaySessionCount: Int = 0 private var currentDay: String = "" private var startInSeconds: Double = 20 * 3600.0 @@ -177,6 +186,22 @@ abstract class PACSVDescriptor(source: DataSource, session.cgBigBlind = bb } else {} } + is SessionField.Blinds -> { + val blinds = value.split("/") + when (blinds.size) { + 0 -> {} + 1 -> { + session.cgBigBlind = field.parse(blinds.first()) + } + else -> { + session.cgSmallBlind = field.parse(blinds[blinds.size - 2]) + session.cgBigBlind = field.parse(blinds.last()) + } + } + } + is SessionField.Ante -> { + // unmanaged atm + } is SessionField.TableSize -> session.tableSize = TableSize.valueForLabel(value) is SessionField.TournamentPosition -> session.result?.tournamentFinalPosition = field.parse(value) @@ -242,7 +267,7 @@ abstract class PACSVDescriptor(source: DataSource, if (startDate != null && endDate != null && net != null) { // valid session // session already in realm, we'd love not put it in Realm before doing the check val count = DataUtils.sessionCount(realm, startDate!!, endDate!!, net) - if (count == 0) { + if (this.noSessionImport || count == 0) { val managedSession = realm.copyToRealm(session) managedSession.startDate = startDate diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt index a6a563ff..137d840c 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt @@ -17,6 +17,7 @@ class ProductCSVDescriptors { runGoodCashGames, runGoodTournaments, pokerAnalyticsiOS, + pokerAnalytics6iOS, pokerAnalyticsAndroid, pokerAnalyticsAndroidTransactions ) @@ -190,6 +191,39 @@ class ProductCSVDescriptors { ) } + private val pokerAnalytics6iOS: SessionCSVDescriptor + get() { + return SessionCSVDescriptor( + DataSource.POKER_ANALYTICS, + true, + SessionField.Start("Start Date", dateFormat = "MM/dd/yy HH:mm:ss"), + SessionField.End("End Date", dateFormat = "MM/dd/yy HH:mm:ss"), + SessionField.Break("Break", Calendar.SECOND), + SessionField.SessionType("Type"), + SessionField.Live("Live"), + SessionField.NumberOfTables("Tables"), + SessionField.Buyin("Buyin"), + SessionField.CashedOut("Cashed Out"), + SessionField.NetResult("Online Net"), + SessionField.Tips("Tips"), + SessionField.LimitType("Limit"), + SessionField.Game("Game"), + SessionField.TableSize("Table Size"), + SessionField.Location("Location"), + SessionField.Bankroll("Bankroll"), + SessionField.CurrencyCode("Currency Code"), + SessionField.CurrencyRate("Currency Rate"), + SessionField.Blinds("Blinds"), + SessionField.Ante("Ante"), + SessionField.TournamentTypeName("Tournament Type"), + SessionField.TournamentEntryFee("Entry fee"), + SessionField.TournamentNumberOfPlayers("Number of players"), + SessionField.TournamentPrizePool("Prize Pool"), + SessionField.TournamentPosition("Position"), + SessionField.Comment("Comment") + ) + } + val pokerAnalyticsAndroidTransactions: TransactionCSVDescriptor get() { return TransactionCSVDescriptor( diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt index f1df37d2..36061b7b 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt @@ -192,6 +192,16 @@ sealed class SessionField { override var callback: ((String) -> Double?)? = null ) : NumberCSVField + data class Blinds( + override var header: String, + override var callback: ((String) -> Double?)? = null + ) : NumberCSVField + + data class Ante( + override var header: String, + override var callback: ((String) -> Double?)? = null + ) : NumberCSVField + data class TournamentPosition( override var header: String, override var callback: ((String) -> Int?)? = null From b20bb4815de6a4b9927fbfef27accbe9b35e116e Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 22 Jun 2022 11:49:55 +0200 Subject: [PATCH 04/26] Complex blinds first commit --- app/build.gradle | 4 +- .../android/PokerAnalyticsApplication.kt | 2 +- .../pokeranalytics/android/model/Criteria.kt | 5 +- .../pokeranalytics/android/model/Stakes.kt | 7 + .../model/extensions/SessionExtensions.kt | 2 +- .../android/model/migrations/Patcher.kt | 17 +- .../migrations/PokerAnalyticsMigration.kt | 13 ++ .../android/model/realm/Session.kt | 191 ++++++++++++++---- .../model/utils/FavoriteSessionFinder.kt | 2 +- .../BottomSheetDoubleEditTextFragment.kt | 4 +- .../BottomSheetEditTextFragment.kt | 2 +- .../bottomsheet/BottomSheetFragment.kt | 1 + .../bottomsheet/BottomSheetListFragment.kt | 2 +- .../BottomSheetListGameFragment.kt | 2 +- .../BottomSheetNumericTextFragment.kt | 2 +- .../bottomsheet/BottomSheetStakesFragment.kt | 108 ++++++++++ .../BottomSheetStaticListFragment.kt | 2 +- .../bottomsheet/BottomSheetSumFragment.kt | 2 +- .../BottomSheetTableSizeGridFragment.kt | 4 +- .../components/bottomsheet/BottomSheetType.kt | 5 +- .../ui/modules/session/SessionFragment.kt | 6 +- .../ui/view/keyboard/StakesKeyboardView.kt | 79 ++++++++ .../ui/view/rows/SessionPropertiesRow.kt | 23 +-- .../ui/viewmodel/BottomSheetViewModel.kt | 2 +- .../net/pokeranalytics/android/util/Global.kt | 3 +- .../android/util/Preferences.kt | 6 +- .../main/res/layout/activity_color_picker.xml | 1 - .../main/res/layout/bottom_sheet_stakes.xml | 66 ++++++ .../main/res/layout/view_keyboard_stakes.xml | 116 +++++++++++ 29 files changed, 591 insertions(+), 88 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/model/Stakes.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStakesFragment.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/keyboard/StakesKeyboardView.kt create mode 100644 app/src/main/res/layout/bottom_sheet_stakes.xml create mode 100644 app/src/main/res/layout/view_keyboard_stakes.xml diff --git a/app/build.gradle b/app/build.gradle index 8da8b80f..13d23b8f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,8 +35,8 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 30 - versionCode 133 - versionName "5.4.9" + versionCode 134 + versionName "5.4.10" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index cdf31714..5c138a88 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -47,7 +47,7 @@ class PokerAnalyticsApplication : Application() { Realm.init(this) val realmConfiguration = RealmConfiguration.Builder() .name(Realm.DEFAULT_REALM_NAME) - .schemaVersion(11) + .schemaVersion(12) .allowWritesOnUiThread(true) .migration(PokerAnalyticsMigration()) .initialData(Seed(this)) 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 8105820a..77da5db3 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt @@ -108,7 +108,6 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row return objects.map { Query(it) } } - QueryCondition.distinct()?.let { val values = it.mapNotNull { session -> when (this) { @@ -124,8 +123,8 @@ sealed class Criteria(override var uniqueIdentifier: Int) : IntIdentifiable, Row is TournamentFees -> if (session.tournamentEntryFee is S) { session.tournamentEntryFee as S } else throw PokerAnalyticsException.QueryValueMapUnexpectedValue - is Blinds -> if (session.blinds is S) { - session.blinds as S + is Blinds -> if (session.cgStakes is S) { + session.cgStakes as S } else throw PokerAnalyticsException.QueryValueMapUnexpectedValue else -> null } diff --git a/app/src/main/java/net/pokeranalytics/android/model/Stakes.kt b/app/src/main/java/net/pokeranalytics/android/model/Stakes.kt new file mode 100644 index 00000000..5f887da5 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/Stakes.kt @@ -0,0 +1,7 @@ +package net.pokeranalytics.android.model + +data class Stakes(var blinds: String?, var ante: Double?) { + + + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt index 487da82f..7910ee35 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt @@ -76,7 +76,7 @@ fun Session.getFormattedGameType(context: Context): String { } } else { if (cgSmallBlind != null && cgBigBlind != null) { - parameters.add(getFormattedBlinds()) + parameters.add(getFormattedStakes()) } game?.let { parameters.add(getFormattedGame()) diff --git a/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt b/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt index 5cf14b5a..b1917b33 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt @@ -7,7 +7,9 @@ import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.utils.Seed import net.pokeranalytics.android.model.utils.SessionSetManager +import net.pokeranalytics.android.util.BLIND_SEPARATOR import net.pokeranalytics.android.util.Preferences +import java.text.NumberFormat class Patcher { @@ -32,8 +34,8 @@ class Patcher { Preferences.executeOnce(Preferences.Keys.PATCH_TRANSACTION_TYPES_NAMES, context) { patchDefaultTransactionTypes(context) } - Preferences.executeOnce(Preferences.Keys.PATCH_BLINDS_FORMAT, context) { - patchBlindFormat() + Preferences.executeOnce(Preferences.Keys.PATCH_STAKES, context) { + patchStakes() } Preferences.executeOnce(Preferences.Keys.ADD_NEW_TRANSACTION_TYPES, context) { @@ -95,7 +97,8 @@ class Patcher { it.computeStats() } sessions.forEach { - it.formatBlinds() + it.generateStakes() + it.defineHighestBet() } results.forEach { it.computeNumberOfRebuy() @@ -120,12 +123,16 @@ class Patcher { realm.close() } - private fun patchBlindFormat() { + private fun patchStakes() { val realm = Realm.getDefaultInstance() realm.executeTransaction { val sessions = realm.where(Session::class.java).findAll() sessions.forEach { session -> - session.formatBlinds() + val blinds = arrayListOf(session.cgSmallBlind, session.cgBigBlind).filterNotNull() + val blindsFormatted = blinds.map { NumberFormat.getInstance().format(it) } + if (blindsFormatted.isNotEmpty()) { + session.cgBlinds = blindsFormatted.joinToString(BLIND_SEPARATOR) + } } } realm.close() diff --git a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt index 6644d5e9..4e07160e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt @@ -252,6 +252,19 @@ class PokerAnalyticsMigration : RealmMigration { currentVersion++ } + // Migrate to version 12 + if (currentVersion == 11) { + schema.get("Session")?.addField("cgAnte", Double::class.java) + ?.setNullable("cgAnte", true) + schema.get("Session")?.addField("cgBiggestBet", Double::class.java) + ?.setNullable("cgBiggestBet", true) + schema.get("Session")?.addField("cgStakes", String::class.java) + schema.get("Session")?.addField("cgBlinds", String::class.java) + schema.get("Session")?.removeField("blinds") + + currentVersion++ + } + } override fun equals(other: Any?): Boolean { 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 000052c1..fdbcc5b2 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 @@ -16,6 +16,7 @@ import net.pokeranalytics.android.calculus.StatFormattingException import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.Limit +import net.pokeranalytics.android.model.Stakes import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState @@ -26,17 +27,16 @@ import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition.* import net.pokeranalytics.android.model.interfaces.* import net.pokeranalytics.android.model.realm.handhistory.HandHistory -import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.model.utils.SessionSetManager import net.pokeranalytics.android.ui.adapter.UnmanagedRowRepresentableException import net.pokeranalytics.android.ui.graph.Graph import net.pokeranalytics.android.ui.view.* import net.pokeranalytics.android.ui.view.rows.SessionPropertiesRow -import net.pokeranalytics.android.util.NULL_TEXT -import net.pokeranalytics.android.util.TextFormat -import net.pokeranalytics.android.util.UserDefaults +import net.pokeranalytics.android.util.* import net.pokeranalytics.android.util.extensions.* import java.text.DateFormat +import java.text.NumberFormat +import java.text.ParseException import java.util.* import java.util.Currency @@ -64,6 +64,11 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim companion object { + private val cbSeparator = ";" + private val cbAnte = "A=" + private val cbBlinds = "B=" + private val cbCode = "C=" + fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null, managed: Boolean = true): Session { val session = Session() session.result = Result() @@ -264,7 +269,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim override var bankroll: Bankroll? = null set(value) { field = value - this.formatBlinds() + this.generateStakes() this.computeStats() // this.updateRowRepresentation() } @@ -300,20 +305,44 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim var cgSmallBlind: Double? = null set(value) { field = value - formatBlinds() +// formatBlinds() } // The big blind value var cgBigBlind: Double? = null set(value) { field = value +// formatBlinds() + this.computeStats() + this.result?.computeNumberOfRebuy() + } + +// var blinds: String? = null +// private set + + var cgAnte: Double? = null + set(value) { + field = value + this.generateStakes() + this.defineHighestBet() + this.computeStats() + this.result?.computeNumberOfRebuy() + } + + var cgBlinds: String? = null + set(value) { + field = value + this.generateStakes() + this.defineHighestBet() this.computeStats() - formatBlinds() this.result?.computeNumberOfRebuy() } - var blinds: String? = null - private set + var cgBiggestBet: Double? = null + + var cgStakes: String? = null + + // Tournament @@ -347,7 +376,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim } fun bankrollHasBeenUpdated() { - formatBlinds() + this.generateStakes() } /** @@ -639,24 +668,53 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim return if (gameTitle.isNotBlank()) gameTitle else NULL_TEXT } - fun getFormattedBlinds(): String { - return blinds ?: NULL_TEXT - } + fun getFormattedStakes(): String { + + val components = arrayListOf() + this.formattedBlinds?.let { components.add(it) } + this.formattedAnte?.let { components.add("($it)") } - fun formatBlinds() { - blinds = null - if (cgBigBlind == null) return - cgBigBlind?.let { bb -> - val sb = cgSmallBlind ?: bb / 2.0 - val preFormattedBlinds = "${sb.formatted}/${bb.round()}" - println("<<<<<< bb.toCurrency(currency) : ${bb.toCurrency(currency)}") - println("<<<<<< preFormattedBlinds : $preFormattedBlinds") - val regex = Regex("-?\\d+(\\.\\d+)?") - blinds = bb.toCurrency(currency).replace(regex, preFormattedBlinds) - println("<<<<<< blinds = $blinds") + return if (components.isNotEmpty()) { + components.joinToString(" ") + } else { + NULL_TEXT } + } + 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 + } + + +// fun formatBlinds() { +// blinds = null +// if (cgBigBlind == null) return +// cgBigBlind?.let { bb -> +// val sb = cgSmallBlind ?: bb / 2.0 +// val preFormattedBlinds = "${sb.formatted}/${bb.round()}" +// println("<<<<<< bb.toCurrency(currency) : ${bb.toCurrency(currency)}") +// println("<<<<<< preFormattedBlinds : $preFormattedBlinds") +// val regex = Regex("-?\\d+(\\.\\d+)?") +// blinds = bb.toCurrency(currency).replace(regex, preFormattedBlinds) +// println("<<<<<< blinds = $blinds") +// } +// } + // LifeCycle /** @@ -719,24 +777,28 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim when (row) { SessionPropertiesRow.BANKROLL -> bankroll = value as Bankroll? - SessionPropertiesRow.BLINDS -> if (value is ArrayList<*>) { - cgSmallBlind = try { - (value[0] as String? ?: "0").toDouble() - } catch (e: Exception) { - null - } - - cgBigBlind = try { - (value[1] as String? ?: "0").toDouble() - } catch (e: Exception) { - null - } - - cgBigBlind?.let { - if (cgSmallBlind == null || cgSmallBlind == 0.0) { - cgSmallBlind = it / 2.0 - } - } + SessionPropertiesRow.STAKES -> if (value is Stakes) { + + this.cgAnte = value.ante + this.cgBlinds = value.blinds + +// cgSmallBlind = try { +// (value[0] as String? ?: "0").toDouble() +// } catch (e: Exception) { +// null +// } +// +// cgBigBlind = try { +// (value[1] as String? ?: "0").toDouble() +// } catch (e: Exception) { +// null +// } +// +// cgBigBlind?.let { +// if (cgSmallBlind == null || cgSmallBlind == 0.0) { +// cgSmallBlind = it / 2.0 +// } +// } } else if (value == null) { cgSmallBlind = null cgBigBlind = null @@ -957,7 +1019,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim return when (row) { SessionPropertiesRow.BANKROLL -> bankroll?.name ?: NULL_TEXT - SessionPropertiesRow.BLINDS -> getFormattedBlinds() + SessionPropertiesRow.STAKES -> getFormattedStakes() SessionPropertiesRow.BREAK_TIME -> if (this.breakDuration > 0.0) this.breakDuration.toMinutes() else NULL_TEXT SessionPropertiesRow.BUY_IN -> this.result?.buyin?.toCurrency(currency) ?: NULL_TEXT SessionPropertiesRow.CASHED_OUT, SessionPropertiesRow.PRIZE -> this.result?.cashout?.toCurrency(currency) ?: NULL_TEXT @@ -1019,4 +1081,47 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim this.result?.netResult = null } + /// Stakes + + fun generateStakes() { + + if (this.cgAnte == null && this.cgAnte == null) { + this.cgStakes = null + return + } + + val components = arrayListOf() + + this.cgBlinds?.let { components.add("${cbBlinds}${it}") } + this.cgAnte?.let { components.add("${cbAnte}${it.formatted}") } + + val code = this.bankroll?.currency?.code ?: UserDefaults.currency.currencyCode + components.add("${cbCode}${code}") + + this.cgStakes = components.joinToString(cbSeparator) + } + + fun defineHighestBet() { + val bets = arrayListOf() + this.cgAnte?.let { bets.add(it) } + bets.addAll(this.blindValues) + this.cgBiggestBet = bets.maxOrNull() + } + + private val blindValues: List + get() { + this.cgBlinds?.let { blinds -> + val blindsSplit = blinds.split(BLIND_SEPARATOR) + return blindsSplit.mapNotNull { + try { + NumberFormat.getInstance().parse(it)?.toDouble() + } catch (e: ParseException) { + null + } + } + } + return listOf() + } + + } diff --git a/app/src/main/java/net/pokeranalytics/android/model/utils/FavoriteSessionFinder.kt b/app/src/main/java/net/pokeranalytics/android/model/utils/FavoriteSessionFinder.kt index ff122db3..1e1f33eb 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/utils/FavoriteSessionFinder.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/utils/FavoriteSessionFinder.kt @@ -39,7 +39,7 @@ private fun Session.significantFields(): List { Session.Type.CASH_GAME.ordinal -> { return listOf( SessionPropertiesRow.GAME, - SessionPropertiesRow.BLINDS, + SessionPropertiesRow.STAKES, SessionPropertiesRow.BANKROLL, SessionPropertiesRow.TABLE_SIZE ) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt index 7e6c3c01..e183e4a2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt @@ -12,12 +12,12 @@ import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorExcep import net.pokeranalytics.android.util.extensions.round -class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { +open class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { private var _binding: BottomSheetDoubleEditTextBinding? = null private val binding get() = _binding!! - override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View? { + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { _binding = BottomSheetDoubleEditTextBinding.inflate(inflater, container, true) return binding.root } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt index 0171848b..e6048a32 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt @@ -16,7 +16,7 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { private var _binding: BottomSheetEditTextBinding? = null private val binding get() = _binding!! - override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View? { + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { _binding = BottomSheetEditTextBinding.inflate(inflater, container, true) return binding.root } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt index 5c3bac02..9ea6b621 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt @@ -86,6 +86,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { BottomSheetType.DOUBLE_EDIT_TEXT -> BottomSheetDoubleEditTextFragment() BottomSheetType.NUMERIC_TEXT -> BottomSheetNumericTextFragment() BottomSheetType.SUM -> BottomSheetSumFragment() + BottomSheetType.CASH_GAME_STAKES -> BottomSheetStakesFragment() } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt index 3014d3c4..6f955154 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt @@ -18,7 +18,7 @@ open class BottomSheetListFragment : BottomSheetFragment(), LiveRowRepresentable private var _binding: BottomSheetListBinding? = null private val binding get() = _binding!! - override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View? { + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { _binding = BottomSheetListBinding.inflate(inflater, container, true) return binding.root } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt index 0cd9444d..edf77cd6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt @@ -22,7 +22,7 @@ class BottomSheetListGameFragment : BottomSheetListFragment() { private var _binding: BottomSheetGameListBinding? = null private val binding get() = _binding!! - override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View? { + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { _binding = BottomSheetGameListBinding.inflate(inflater, container, true) return binding.root } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt index be187f9d..61fc3da9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt @@ -17,7 +17,7 @@ class BottomSheetNumericTextFragment : BottomSheetFragment() { private var _binding: BottomSheetEditTextBinding? = null private val binding get() = _binding!! - override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View? { + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { _binding = BottomSheetEditTextBinding.inflate(inflater, container, true) return binding.root } 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 new file mode 100644 index 00000000..510a43dd --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStakesFragment.kt @@ -0,0 +1,108 @@ +package net.pokeranalytics.android.ui.fragment.components.bottomsheet + +import android.os.Bundle +import android.text.InputType +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.inputmethod.EditorInfo +import androidx.core.widget.addTextChangedListener +import net.pokeranalytics.android.databinding.BottomSheetStakesBinding +import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException + +class BottomSheetStakesFragment : BottomSheetFragment() { + + private var _binding: BottomSheetStakesBinding? = null + private val binding get() = _binding!! + + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { + _binding = BottomSheetStakesBinding.inflate(inflater, container, true) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + initUI() + } + + override fun onStart() { + super.onStart() +// binding.editText2.requestFocus() + } + + /** + * Init data + */ + private fun initData() { +// this.viewModel.isEditingBlinds = this.viewModel.row == SessionRow.BLINDS + } + + /** + * Init UI + */ + private fun initUI() { + + val data = getDescriptors()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (data.size != 2) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + + data[0].hintResId?.let { binding.editText.hint = getString(it) } + binding.editText.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES + data[1].hintResId?.let { binding.editText2.hint = getString(it) } + +// binding.editText2.setRawInputType(InputType.TYPE_CLASS_TEXT) //= InputType.TYPE_NULL // data[1].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES +// binding.editText2.inputType = InputType.TYPE_NULL + binding.editText2.setTextIsSelectable(true) + + binding.editText2.onCreateInputConnection(EditorInfo())?.let { + binding.stakesKeyboard.inputConnection = it + } ?: throw PAIllegalStateException("No connection for editText") + + if (this.model.valueAsHint) { + + this.model.stringValue?.let { + if (it.isNotBlank()) { + binding.editText.hint = it + } + } + this.model.secondStringValue?.let { + if (it.isNotBlank()) { + binding.editText2.hint = it + } + } +// if (this.viewModel.stringValue?.isNotBlank()) { editText.hint = values[0] } +// if (values[1].isNotBlank()) { editText2.hint = values[1] } + } else { + binding.editText.setText(this.model.stringValue) + binding.editText2.setText(this.model.secondStringValue) + } + + binding.editText.addTextChangedListener { + this.model.stringValue = it?.toString() + } + + binding.editText2.addTextChangedListener { + this.model.secondStringValue = it?.toString() + } + + binding.editText2.setOnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_DONE) { + this.onRowValueChanged() +// this.delegate.onRowValueChanged(values, row) + dismiss() + true + } else { + false + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt index 82d9063f..2f3385d4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt @@ -17,7 +17,7 @@ class BottomSheetStaticListFragment : BottomSheetFragment(), StaticRowRepresenta private var _binding: BottomSheetListBinding? = null private val binding get() = _binding!! - override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View? { + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { _binding = BottomSheetListBinding.inflate(inflater, container, true) return binding.root } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt index 91f84b80..7a29177b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt @@ -19,7 +19,7 @@ class BottomSheetSumFragment : BottomSheetFragment() { private var _binding: BottomSheetSumBinding? = null private val binding get() = _binding!! - override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View? { + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { _binding = BottomSheetSumBinding.inflate(inflater, container, true) return binding.root } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt index 3fdcc235..98deffc3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt @@ -19,7 +19,7 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowReprese private var _binding: BottomSheetGridBinding? = null private val binding get() = _binding!! - override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View? { + override fun inflateContentView(inflater: LayoutInflater, container: ViewGroup): View { _binding = BottomSheetGridBinding.inflate(inflater, container, true) return binding.root } @@ -61,7 +61,7 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowReprese } } - override fun adapterRows(): List? { + override fun adapterRows(): List { return TableSize.all(this.model.alternativeLabels) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetType.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetType.kt index 9bcb2f54..fc046588 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetType.kt @@ -12,7 +12,8 @@ enum class BottomSheetType { EDIT_TEXT_MULTI_LINES, DOUBLE_EDIT_TEXT, NUMERIC_TEXT, - SUM; + SUM, + CASH_GAME_STAKES; val validationRequired: Boolean get() = when (this) { @@ -25,7 +26,7 @@ enum class BottomSheetType { val addRequired: Boolean get() = when (this) { - EDIT_TEXT, NUMERIC_TEXT, DOUBLE_EDIT_TEXT, EDIT_TEXT_MULTI_LINES, GRID, LIST_STATIC, SUM -> false + EDIT_TEXT, NUMERIC_TEXT, DOUBLE_EDIT_TEXT, EDIT_TEXT_MULTI_LINES, GRID, LIST_STATIC, SUM, CASH_GAME_STAKES -> false else -> true } } \ No newline at end of file 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 bc317e07..432d6f15 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 @@ -577,10 +577,10 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr "defaultValue" to session.tableSize ) ) - SessionPropertiesRow.BLINDS -> row.editingDescriptors( + SessionPropertiesRow.STAKES -> row.editingDescriptors( mapOf( - "sb" to session.cgSmallBlind?.round(), - "bb" to session.cgBigBlind?.round() + "blinds" to session.cgBlinds, + "ante" to session.cgAnte?.round() ) ) SessionPropertiesRow.BUY_IN -> row.editingDescriptors( diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/keyboard/StakesKeyboardView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/keyboard/StakesKeyboardView.kt new file mode 100644 index 00000000..2d264cf6 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/keyboard/StakesKeyboardView.kt @@ -0,0 +1,79 @@ +package net.pokeranalytics.android.ui.view.keyboard + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.inputmethod.InputConnection +import android.widget.FrameLayout +import androidx.appcompat.widget.LinearLayoutCompat +import kotlinx.android.synthetic.main.view_keyboard_stakes.view.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.util.BLIND_SEPARATOR + +class StakesKeyboardView : LinearLayoutCompat { + + var inputConnection: InputConnection? = null + + /** + * Constructors + */ + constructor(context: Context) : super(context) { +// init() + } + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + init(context, attrs) + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + init(context, attrs) + } + + private fun init(context: Context, attrs: AttributeSet?) { + val layoutInflater = LayoutInflater.from(context) + val view = layoutInflater.inflate(R.layout.view_keyboard_stakes, this, false) + + view.value_0.text = "0" + view.value_1.text = "1" + view.value_2.text = "2" + view.value_3.text = "3" + view.value_4.text = "4" + view.value_5.text = "5" + view.value_6.text = "6" + view.value_7.text = "7" + view.value_8.text = "8" + view.value_9.text = "9" + view.value_back.text = "⌫" + view.value_separator.text = "/" + + view.value_0.setOnClickListener { this.commitText("0") } + view.value_1.setOnClickListener { this.commitText("1") } + view.value_2.setOnClickListener { this.commitText("2") } + view.value_3.setOnClickListener { this.commitText("3") } + view.value_4.setOnClickListener { this.commitText("4") } + view.value_5.setOnClickListener { this.commitText("5") } + view.value_6.setOnClickListener { this.commitText("6") } + view.value_7.setOnClickListener { this.commitText("7") } + view.value_8.setOnClickListener { this.commitText("8") } + view.value_9.setOnClickListener { this.commitText("9") } + view.value_separator.setOnClickListener { this.commitText(BLIND_SEPARATOR) } + view.value_back.setOnClickListener { this.deleteText() } + + val layoutParams = FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + addView(view, layoutParams) + + } + + private fun commitText(string: String) { + this.inputConnection?.commitText(string, 1) ?: throw PAIllegalStateException("No input connection") + } + + private fun deleteText() { + this.inputConnection?.deleteSurroundingText(1, 0) ?: throw PAIllegalStateException("No input connection") + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SessionPropertiesRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SessionPropertiesRow.kt index c945c930..0a39e752 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SessionPropertiesRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SessionPropertiesRow.kt @@ -28,7 +28,7 @@ enum class SessionPropertiesRow : RowRepresentable { TIPS, GAME, - BLINDS, + STAKES, LOCATION, BANKROLL, TABLE_SIZE, @@ -104,7 +104,7 @@ enum class SessionPropertiesRow : RowRepresentable { Session.Type.CASH_GAME.ordinal -> { when (state) { SessionState.PENDING, SessionState.PLANNED -> { - return arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE) + return arrayListOf(GAME, STAKES, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE) } SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { @@ -134,7 +134,7 @@ enum class SessionPropertiesRow : RowRepresentable { fields.add(SeparatorRow()) fields.addAll(listOf( GAME, - BLINDS, + STAKES, LOCATION, BANKROLL, TABLE_SIZE, @@ -168,7 +168,7 @@ enum class SessionPropertiesRow : RowRepresentable { BUY_IN -> R.string.buyin TIPS -> R.string.tips GAME -> R.string.game - BLINDS -> R.string.blinds + STAKES -> R.string.stakes LOCATION -> R.string.location BANKROLL -> R.string.bankroll TABLE_SIZE -> R.string.table_size @@ -188,7 +188,7 @@ enum class SessionPropertiesRow : RowRepresentable { get() { return when (this) { NET_RESULT, PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS, - GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, + GAME, STAKES, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, TOURNAMENT_TYPE, TOURNAMENT_NAME, TOURNAMENT_FEATURE, HANDS, START_DATE, END_DATE, BREAK_TIME, HANDS_COUNT -> RowViewType.TITLE_VALUE.ordinal } @@ -200,7 +200,7 @@ enum class SessionPropertiesRow : RowRepresentable { NET_RESULT, CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE, HANDS_COUNT -> BottomSheetType.NUMERIC_TEXT BUY_IN, TIPS -> BottomSheetType.SUM - BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT + STAKES -> BottomSheetType.CASH_GAME_STAKES GAME -> BottomSheetType.LIST_GAME TOURNAMENT_TYPE -> BottomSheetType.LIST_STATIC LOCATION, BANKROLL, TOURNAMENT_NAME -> BottomSheetType.LIST @@ -214,17 +214,16 @@ enum class SessionPropertiesRow : RowRepresentable { override fun editingDescriptors(map: Map): ArrayList? { return when (this) { - BLINDS -> { - val sb: String? by map - val bb: String? by map + STAKES -> { + val ante: Double? by map + val blinds: String? by map arrayListOf( RowRepresentableEditDescriptor( - sb, R.string.smallblind, InputType.TYPE_CLASS_NUMBER + ante, R.string.ante, InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL ), RowRepresentableEditDescriptor( - bb, R.string.bigblind, InputType.TYPE_CLASS_NUMBER - or InputType.TYPE_NUMBER_FLAG_DECIMAL + blinds, R.string.blinds, InputType.TYPE_CLASS_TEXT ) ) } 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 10f0fb20..c019e8e0 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 @@ -102,7 +102,7 @@ class BottomSheetViewModel(var row: RowRepresentable) : ViewModel() { throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } - this.isEditingBlinds = this.row == SessionPropertiesRow.BLINDS + this.isEditingBlinds = this.row == SessionPropertiesRow.STAKES this.stringValue = descriptors[0].defaultValue as? String this.secondStringValue = descriptors[1].defaultValue as? String diff --git a/app/src/main/java/net/pokeranalytics/android/util/Global.kt b/app/src/main/java/net/pokeranalytics/android/util/Global.kt index 19d486bb..85ffc3b2 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Global.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Global.kt @@ -2,4 +2,5 @@ package net.pokeranalytics.android.util const val NULL_TEXT: String = "--" const val RANDOM_PLAYER: String = "☺︎" -const val FFMPEG_DESCRIPTOR_FILE = "descriptor.txt" \ No newline at end of file +const val FFMPEG_DESCRIPTOR_FILE = "descriptor.txt" +const val BLIND_SEPARATOR: String = "/" 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 54a4bac4..626beca5 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -32,7 +32,7 @@ class Preferences { PATCH_BREAK("patchBreaks"), PATCH_SESSION_SETS("patchSessionSet"), PATCH_TRANSACTION_TYPES_NAMES("patchTransactionTypesNames"), - PATCH_BLINDS_FORMAT("patchBlindFormat"), +// PATCH_BLINDS_FORMAT("patchBlindFormat"), PATCH_COMPUTABLE_RESULTS("patchPositiveSessions"), SHOW_STOP_NOTIFICATIONS("showStopNotifications"), ADD_NEW_TRANSACTION_TYPES("addNewTransactionTypes"), @@ -42,7 +42,9 @@ class Preferences { LATEST_BLOG_POST_ID_DISPLAYED("latestBlogPostIdDisplayed"), LAST_BLOG_TIPS_RETRIEVAL("lastBlogTipsRetrieval"), SHOW_BLOG_TIPS("showBlogTips"), - LAST_REVIEW_REQUEST_DATE("lastReviewRequestDate") + LAST_REVIEW_REQUEST_DATE("lastReviewRequestDate"), + PATCH_STAKES("patchStakes"), + } enum class FeedMessage { diff --git a/app/src/main/res/layout/activity_color_picker.xml b/app/src/main/res/layout/activity_color_picker.xml index e2942fff..a90a7cfc 100644 --- a/app/src/main/res/layout/activity_color_picker.xml +++ b/app/src/main/res/layout/activity_color_picker.xml @@ -87,7 +87,6 @@ app:layout_constraintStart_toEndOf="@+id/color5" app:layout_constraintTop_toBottomOf="@+id/color2" /> - + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_keyboard_stakes.xml b/app/src/main/res/layout/view_keyboard_stakes.xml new file mode 100644 index 00000000..29055e4f --- /dev/null +++ b/app/src/main/res/layout/view_keyboard_stakes.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2b64b712ca20783c01a895957bb330dbd1abff72 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 22 Jun 2022 13:26:09 +0200 Subject: [PATCH 05/26] Change color of background --- app/src/main/res/layout/activity_new_data.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_new_data.xml b/app/src/main/res/layout/activity_new_data.xml index e79cb983..13e5b499 100644 --- a/app/src/main/res/layout/activity_new_data.xml +++ b/app/src/main/res/layout/activity_new_data.xml @@ -13,7 +13,7 @@ android:layout_gravity="center" android:layout_marginEnd="16dp" android:layout_marginBottom="72dp" - android:background="@color/kaki_darker" + android:background="@color/kaki_darkest" android:elevation="4dp" android:orientation="vertical" android:visibility="invisible" From 546e7a57777f50123dccf7662f8553683c9d10ed Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 22 Jun 2022 13:26:33 +0200 Subject: [PATCH 06/26] Fixes stakes formatting --- .../pokeranalytics/android/model/realm/Session.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) 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 fdbcc5b2..454ee931 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 @@ -669,7 +669,6 @@ 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)") } @@ -679,7 +678,6 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim } else { NULL_TEXT } - } private val formattedBlinds: String? @@ -693,12 +691,12 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim } private val formattedAnte: String? - get() { - this.cgAnte?.let { ante -> - return ante.toCurrency(this.currency) - } - return null - } + get() { + this.cgAnte?.let { ante -> + return ante.toCurrency(this.currency) + } + return null + } // fun formatBlinds() { From f48683d6834d012353af926dadc4abfe6e75504b Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 24 Jun 2022 14:39:56 +0200 Subject: [PATCH 07/26] Complext blinds for hand histories --- app/src/main/AndroidManifest.xml | 2 +- .../model/extensions/SessionExtensions.kt | 2 +- .../android/model/handhistory/HandSetup.kt | 52 ++++---- .../android/model/interfaces/StakesHolder.kt | 71 ++++++++++ .../android/model/migrations/Patcher.kt | 2 +- .../migrations/PokerAnalyticsMigration.kt | 28 +++- .../android/model/realm/ComputableResult.kt | 2 +- .../android/model/realm/Result.kt | 2 +- .../android/model/realm/Session.kt | 121 +++++++++++------- .../model/realm/handhistory/HandHistory.kt | 106 ++++++++++----- .../model/utils/FavoriteSessionFinder.kt | 4 +- .../android/ui/fragment/SettingsFragment.kt | 2 +- .../bottomsheet/BottomSheetStakesFragment.kt | 32 +++-- .../handhistory/editor/EditorAdapter.kt | 3 +- .../modules/handhistory/model/ActionList.kt | 4 +- .../handhistory/model/EditorViewModel.kt | 9 +- .../ui/modules/session/SessionFragment.kt | 8 +- .../android/util/FakeDataManager.kt | 10 +- .../android/util/csv/PACSVDescriptor.kt | 64 +++++---- .../android/util/csv/ProductCSVDescriptors.kt | 41 +++++- .../android/util/csv/SessionCSVDescriptor.kt | 7 +- .../main/res/layout/bottom_sheet_stakes.xml | 1 - 22 files changed, 395 insertions(+), 178 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/model/interfaces/StakesHolder.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7e2af584..65ed5289 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -61,7 +61,7 @@ android:name="net.pokeranalytics.android.ui.modules.session.SessionActivity" android:launchMode="singleTop" android:screenOrientation="portrait" - android:windowSoftInputMode="adjustNothing" /> + android:windowSoftInputMode="stateAlwaysHidden|adjustNothing" /> + get() { + this.blinds?.let { blinds -> + val blindsSplit = blinds.split(BLIND_SEPARATOR) + return blindsSplit.mapNotNull { + try { + NumberFormat.getInstance().parse(it)?.toDouble() + } catch (e: ParseException) { + null + } + } + } + return listOf() + } + + fun generateStakes() { + + if (this.ante == null && this.ante == null) { + setHolderStakes(null) + return + } + + val components = arrayListOf() + + this.blinds?.let { components.add("${cbBlinds}${it}") } + this.ante?.let { components.add("${cbAnte}${it.formatted}") } + + val code = this.bankroll?.currency?.code ?: UserDefaults.currency.currencyCode + components.add("${cbCode}${code}") + + setHolderStakes(components.joinToString(cbSeparator)) + } + + fun defineHighestBet() { + val bets = arrayListOf() + this.ante?.let { bets.add(it) } + bets.addAll(this.blindValues) + setHolderBiggestBet(bets.maxOrNull()) + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt b/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt index b1917b33..ade36d37 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt @@ -128,7 +128,7 @@ class Patcher { realm.executeTransaction { val sessions = realm.where(Session::class.java).findAll() sessions.forEach { session -> - val blinds = arrayListOf(session.cgSmallBlind, session.cgBigBlind).filterNotNull() + val blinds = arrayListOf(session.cgOldSmallBlind, session.cgOldBigBlind).filterNotNull() val blindsFormatted = blinds.map { NumberFormat.getInstance().format(it) } if (blindsFormatted.isNotEmpty()) { session.cgBlinds = blindsFormatted.joinToString(BLIND_SEPARATOR) diff --git a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt index 4e07160e..2876d457 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt @@ -254,13 +254,27 @@ class PokerAnalyticsMigration : RealmMigration { // Migrate to version 12 if (currentVersion == 11) { - schema.get("Session")?.addField("cgAnte", Double::class.java) - ?.setNullable("cgAnte", true) - schema.get("Session")?.addField("cgBiggestBet", Double::class.java) - ?.setNullable("cgBiggestBet", true) - schema.get("Session")?.addField("cgStakes", String::class.java) - schema.get("Session")?.addField("cgBlinds", String::class.java) - schema.get("Session")?.removeField("blinds") + + schema.get("Session")?.let { ss -> + + ss.addField("cgAnte", Double::class.java) + ?.setNullable("cgAnte", true) + ss.addField("cgBiggestBet", Double::class.java) + ?.setNullable("cgBiggestBet", true) + ss.addField("cgStakes", String::class.java) + ss.addField("cgBlinds", String::class.java) + ss.removeField("blinds") + + ss.renameField("cgSmallBlind", "cgOldSmallBlind") + ss.renameField("cgBigBlind", "cgOldBigBlind") + } + + schema.get("HandHistory")?.let { hs -> + hs.addField("cgStakes", String::class.java) + hs.addField("cgBlinds", String::class.java) + hs.renameField("smallBlind", "oldSmallBlind") + hs.renameField("bigBlind", "oldBigBlind") + } currentVersion++ } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt index 40ba08b5..28a6be15 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt @@ -36,7 +36,7 @@ open class ComputableResult : RealmObject(), Filterable { } this.bbNet = session.bbNet - this.hasBigBlind = if (session.cgBigBlind != null) 1 else 0 + this.hasBigBlind = if (session.cgBiggestBet != null) 1 else 0 this.estimatedHands = session.estimatedHands this.bbPer100Hands = session.bbNet / (session.numberOfHandsPerHour * session.hourlyDuration) * 100 diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt index bad54e3e..ce63e633 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt @@ -150,7 +150,7 @@ open class Result : RealmObject(), Filterable { fun computeNumberOfRebuy() { this.session?.let { if (it.isCashGame()) { - it.cgBigBlind?.let { bb -> + it.cgBiggestBet?.let { bb -> if (bb > 0.0) { this.numberOfRebuy = (this.buyin ?: 0.0) / (bb * 100.0) } else { 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 454ee931..b8fb7fd4 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 @@ -32,18 +32,22 @@ import net.pokeranalytics.android.ui.adapter.UnmanagedRowRepresentableException import net.pokeranalytics.android.ui.graph.Graph import net.pokeranalytics.android.ui.view.* import net.pokeranalytics.android.ui.view.rows.SessionPropertiesRow -import net.pokeranalytics.android.util.* -import net.pokeranalytics.android.util.extensions.* +import net.pokeranalytics.android.util.CrashLogging +import net.pokeranalytics.android.util.NULL_TEXT +import net.pokeranalytics.android.util.TextFormat +import net.pokeranalytics.android.util.UserDefaults +import net.pokeranalytics.android.util.extensions.hourMinute +import net.pokeranalytics.android.util.extensions.shortDateTime +import net.pokeranalytics.android.util.extensions.toCurrency +import net.pokeranalytics.android.util.extensions.toMinutes import java.text.DateFormat -import java.text.NumberFormat -import java.text.ParseException import java.util.* import java.util.Currency typealias BB = Double open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Timed, - TimeFilterable, Filterable, DatedBankrollGraphEntry { + TimeFilterable, Filterable, DatedBankrollGraphEntry, StakesHolder { enum class Type(val value: String) { CASH_GAME("Cash Game"), @@ -64,11 +68,6 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim companion object { - private val cbSeparator = ";" - private val cbAnte = "A=" - private val cbBlinds = "B=" - private val cbCode = "C=" - fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null, managed: Boolean = true): Session { val session = Session() session.result = Result() @@ -302,17 +301,15 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim // Cash Game // The small blind value - var cgSmallBlind: Double? = null + var cgOldSmallBlind: Double? = null set(value) { field = value -// formatBlinds() } // The big blind value - var cgBigBlind: Double? = null + var cgOldBigBlind: Double? = null set(value) { field = value -// formatBlinds() this.computeStats() this.result?.computeNumberOfRebuy() } @@ -427,7 +424,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim */ val bbNet: BB get() { - val bb = this.cgBigBlind + val bb = this.cgBiggestBet val result = this.result return if (bb != null && result != null) { result.net / bb @@ -752,8 +749,8 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim copy.game = this.game copy.limit = this.limit - copy.cgSmallBlind = this.cgSmallBlind - copy.cgBigBlind = this.cgBigBlind + copy.cgBiggestBet = this.cgBiggestBet + copy.cgAnte = this.cgAnte copy.tournamentEntryFee = this.tournamentEntryFee copy.tournamentFeatures = this.tournamentFeatures copy.tournamentName = this.tournamentName @@ -798,8 +795,8 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim // } // } } else if (value == null) { - cgSmallBlind = null - cgBigBlind = null + this.cgBiggestBet = null + this.cgAnte = null } SessionPropertiesRow.BREAK_TIME -> { this.breakDuration = (value as Double? ?: 0.0).toLong() * 60 * 1000 @@ -1081,45 +1078,71 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim /// Stakes - fun generateStakes() { +// fun generateStakes() { +// +// if (this.cgAnte == null && this.cgAnte == null) { +// this.cgStakes = null +// return +// } +// +// val components = arrayListOf() +// +// this.cgBlinds?.let { components.add("${cbBlinds}${it}") } +// this.cgAnte?.let { components.add("${cbAnte}${it.formatted}") } +// +// val code = this.bankroll?.currency?.code ?: UserDefaults.currency.currencyCode +// components.add("${cbCode}${code}") +// +// this.cgStakes = components.joinToString(cbSeparator) +// } +// +// fun defineHighestBet() { +// val bets = arrayListOf() +// this.cgAnte?.let { bets.add(it) } +// bets.addAll(this.blindValues) +// this.cgBiggestBet = bets.maxOrNull() +// } - if (this.cgAnte == null && this.cgAnte == null) { - this.cgStakes = null - return - } + /// StakesHolder - val components = arrayListOf() + override val ante: Double? + get() { return this.cgAnte } + + override val blinds: String? + get() { return this.cgBlinds } - this.cgBlinds?.let { components.add("${cbBlinds}${it}") } - this.cgAnte?.let { components.add("${cbAnte}${it.formatted}") } + override val biggestBet: Double? + get() { return this.cgBiggestBet } - val code = this.bankroll?.currency?.code ?: UserDefaults.currency.currencyCode - components.add("${cbCode}${code}") + override val stakes: String? + get() { return this.cgStakes } - this.cgStakes = components.joinToString(cbSeparator) +// override val bankroll: Bankroll? +// get() { return this.bankroll } + + override fun setHolderStakes(stakes: String?) { + this.cgStakes = stakes } - fun defineHighestBet() { - val bets = arrayListOf() - this.cgAnte?.let { bets.add(it) } - bets.addAll(this.blindValues) - this.cgBiggestBet = bets.maxOrNull() + override fun setHolderBiggestBet(biggestBet: Double?) { + this.cgBiggestBet = biggestBet } - private val blindValues: List - get() { - this.cgBlinds?.let { blinds -> - val blindsSplit = blinds.split(BLIND_SEPARATOR) - return blindsSplit.mapNotNull { - try { - NumberFormat.getInstance().parse(it)?.toDouble() - } catch (e: ParseException) { - null - } - } - } - return listOf() - } +// +// private val blindValues: List +// get() { +// this.cgBlinds?.let { blinds -> +// val blindsSplit = blinds.split(BLIND_SEPARATOR) +// return blindsSplit.mapNotNull { +// try { +// NumberFormat.getInstance().parse(it)?.toDouble() +// } catch (e: ParseException) { +// null +// } +// } +// } +// return listOf() +// } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt index 9b8549d9..e751143f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt @@ -15,10 +15,8 @@ import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.handhistory.HandSetup import net.pokeranalytics.android.model.handhistory.Position import net.pokeranalytics.android.model.handhistory.Street -import net.pokeranalytics.android.model.interfaces.Deletable -import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus -import net.pokeranalytics.android.model.interfaces.Identifiable -import net.pokeranalytics.android.model.interfaces.TimeFilterable +import net.pokeranalytics.android.model.interfaces.* +import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.modules.handhistory.evaluator.EvaluatorBridge import net.pokeranalytics.android.ui.modules.handhistory.model.ActionReadRow @@ -35,7 +33,7 @@ import kotlin.math.max data class PositionAmount(var position: Int, var amount: Double, var isAllin: Boolean) open class HandHistory : RealmObject(), Deletable, RowRepresentable, Filterable, TimeFilterable, - CardHolder, Comparator { + CardHolder, Comparator, StakesHolder { @PrimaryKey override var id = UUID.randomUUID().toString() @@ -64,34 +62,67 @@ open class HandHistory : RealmObject(), Deletable, RowRepresentable, Filterable, /*** * The small blind */ - var smallBlind: Double? = null + var oldSmallBlind: Double? = null set(value) { field = value - if (this.bigBlind == null && value != null) { - this.bigBlind = value * 2 - } +// if (this.bigBlind == null && value != null) { +// this.bigBlind = value * 2 +// } } /*** * The big blind */ - var bigBlind: Double? = null + var oldBigBlind: Double? = null set(value) { field = value - if (this.smallBlind == null && value != null) { - this.smallBlind = value / 2 - } +// if (this.smallBlind == null && value != null) { +// this.smallBlind = value / 2 +// } } + /*** + * Big blind ante + */ + var bigBlindAnte: Boolean = false + /*** * The ante */ - var ante: Double = 0.0 + override var ante: Double? = 0.0 + set(value) { + field = value + this.generateStakes() + this.defineHighestBet() + } /*** - * Big blind ante + * The blinds */ - var bigBlindAnte: Boolean = false + override var blinds: String? = null + set(value) { + field = value + this.generateStakes() + this.defineHighestBet() + } + + override var biggestBet: Double? = null + + /*** + * The coded stakes + */ + override var stakes: String? = null + + override val bankroll: Bankroll? + get() { return this.session?.bankroll } + + override fun setHolderStakes(stakes: String?) { + this.stakes = stakes + } + + override fun setHolderBiggestBet(biggestBet: Double?) { + this.biggestBet = biggestBet + } /*** * Number of players in the hand @@ -164,8 +195,8 @@ open class HandHistory : RealmObject(), Deletable, RowRepresentable, Filterable, this.playerSetups.removeAll(this.playerSetups) handSetup.tableSize?.let { this.numberOfPlayers = it } - handSetup.smallBlind?.let { this.smallBlind = it } - handSetup.bigBlind?.let { this.bigBlind = it } + handSetup.ante?.let { this.ante = it } + handSetup.blinds?.let { this.blinds = it } this.session = handSetup.session this.date = this.session?.handHistoryAutomaticDate ?: Date() @@ -180,8 +211,17 @@ open class HandHistory : RealmObject(), Deletable, RowRepresentable, Filterable, this.actions.clear() - this.addAction(0, Action.Type.POST_SB, this.smallBlind) - this.addAction(1, Action.Type.POST_BB, this.bigBlind) + this.blindValues.forEachIndexed { index, blind -> + val action = when(index) { + 0 -> Action.Type.POST_SB + 1 -> Action.Type.POST_BB + else -> Action.Type.STRADDLE + } + this.addAction(index, action, blind) + } + +// this.addAction(0, Action.Type.POST_SB, this.smallBlind) +// this.addAction(1, Action.Type.POST_BB, this.bigBlind) // var lastStraddler: Int? = null @@ -237,9 +277,9 @@ open class HandHistory : RealmObject(), Deletable, RowRepresentable, Filterable, val anteSum: Double get() { return if (bigBlindAnte) { - this.bigBlind ?: 0.0 + this.biggestBet ?: 0.0 } else { - this.ante * this.numberOfPlayers + (this.ante ?: 0.0) * this.numberOfPlayers } } @@ -303,14 +343,20 @@ open class HandHistory : RealmObject(), Deletable, RowRepresentable, Filterable, val players = "${this.numberOfPlayers} ${context.getString(R.string.players)}" val firstLineComponents = mutableListOf(this.date.fullDate(), players) - this.smallBlind?.let { sb -> - this.bigBlind?.let { bb -> - firstLineComponents.add("${sb.formatted}/${bb.formatted}") + this.blinds?.let { firstLineComponents.add(it) } + +// this.smallBlind?.let { sb -> +// this.bigBlind?.let { bb -> +// firstLineComponents.add("${sb.formatted}/${bb.formatted}") +// } +// } + + this.ante?.let { + if (it > 0.0) { + firstLineComponents.add("ante ${this.ante}") } } - if (this.ante > 0.0) { - firstLineComponents.add("ante ${this.ante}") - } + string = string.plus(firstLineComponents.joinToString(" - ")) string = string.addLineReturn(2) @@ -373,12 +419,12 @@ open class HandHistory : RealmObject(), Deletable, RowRepresentable, Filterable, fun anteForPosition(position: Position): Double { return if (this.bigBlindAnte) { if (position == Position.BB) { - this.bigBlind ?: 0.0 + this.biggestBet ?: 0.0 } else { 0.0 } } else { - this.ante + this.ante ?: 0.0 } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/utils/FavoriteSessionFinder.kt b/app/src/main/java/net/pokeranalytics/android/model/utils/FavoriteSessionFinder.kt index 1e1f33eb..fe40b2bb 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/utils/FavoriteSessionFinder.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/utils/FavoriteSessionFinder.kt @@ -86,8 +86,8 @@ class FavoriteSessionFinder { when (session.type) { Session.Type.CASH_GAME.ordinal -> { - session.cgSmallBlind = fav.cgSmallBlind - session.cgBigBlind = fav.cgBigBlind + session.cgAnte = fav.cgAnte + session.cgBlinds = fav.cgBlinds } Session.Type.TOURNAMENT.ordinal -> { session.tournamentEntryFee = fav.tournamentEntryFee 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 ceee25aa..19bdad1d 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 @@ -292,7 +292,7 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep private fun sessionsCSVExport() { val sessions = getRealm().where(Session::class.java).findAll().sort("startDate") - val csv = ProductCSVDescriptors.pokerAnalyticsAndroid.toCSV(sessions) + val csv = ProductCSVDescriptors.pokerAnalyticsAndroidSessions.toCSV(sessions) this.shareCSV(csv, "Sessions") } 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 510a43dd..bdb8c266 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 @@ -34,7 +34,12 @@ class BottomSheetStakesFragment : BottomSheetFragment() { override fun onStart() { super.onStart() -// binding.editText2.requestFocus() + +// binding.editText2.setTextIsSelectable(true) +// binding.editText2.isFocusableInTouchMode = false + + binding.editText2.requestFocus() + } /** @@ -60,7 +65,12 @@ class BottomSheetStakesFragment : BottomSheetFragment() { // binding.editText2.setRawInputType(InputType.TYPE_CLASS_TEXT) //= InputType.TYPE_NULL // data[1].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES // binding.editText2.inputType = InputType.TYPE_NULL +// binding.editText2.setTextIsSelectable(false) +// editText.setTextIsSelectable(true) + + binding.editText2.setRawInputType(InputType.TYPE_CLASS_TEXT) binding.editText2.setTextIsSelectable(true) + binding.editText2.showSoftInputOnFocus = false binding.editText2.onCreateInputConnection(EditorInfo())?.let { binding.stakesKeyboard.inputConnection = it @@ -93,16 +103,16 @@ class BottomSheetStakesFragment : BottomSheetFragment() { this.model.secondStringValue = it?.toString() } - binding.editText2.setOnEditorActionListener { _, actionId, _ -> - if (actionId == EditorInfo.IME_ACTION_DONE) { - this.onRowValueChanged() -// this.delegate.onRowValueChanged(values, row) - dismiss() - true - } else { - false - } - } +// binding.editText2.setOnEditorActionListener { _, actionId, _ -> +// if (actionId == EditorInfo.IME_ACTION_DONE) { +// this.onRowValueChanged() +//// this.delegate.onRowValueChanged(values, row) +// dismiss() +// true +// } else { +// false +// } +// } } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorAdapter.kt index b0f6ec9d..8232aedf 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorAdapter.kt @@ -192,7 +192,8 @@ class EditorAdapter( "Edit Text not found for tag: $tag, class: $this" ) - // hides soft input view + // hides soft input view, + // 22/06/22: does not seem useful as - I believe - manifest activity has android:windowSoftInputMode="stateAlwaysHidden" editText.setTextIsSelectable(true) // Enabled diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/ActionList.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/ActionList.kt index e92454c7..cae80b2a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/ActionList.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/ActionList.kt @@ -536,9 +536,9 @@ class ActionList(var listener: ActionListListener? = null) : ArrayList this.handHistory.smallBlind = amount + Action.Type.POST_SB -> this.handHistory.oldSmallBlind = amount Action.Type.POST_BB -> { - this.handHistory.bigBlind = amount + this.handHistory.oldBigBlind = amount if (this.handHistory.bigBlindAnte) { this.updateBigBlindRemainingStack() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/EditorViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/EditorViewModel.kt index 8cba02d5..02a39844 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/EditorViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/EditorViewModel.kt @@ -30,7 +30,6 @@ import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.formatted import timber.log.Timber -import java.lang.Exception import java.text.DecimalFormat import java.text.ParseException import kotlin.coroutines.CoroutineContext @@ -261,8 +260,10 @@ class EditorViewModel : ViewModel(), RowRepresentableDataSource, CardCentralizer rows.add(CustomizableRowRepresentable(customViewType = HandRowType.HEADER, resId = R.string.settings, value = "")) rows.add(HandRowType.PLAYER_NUMBER) - if (this.handHistory.ante > 0) { - rows.add(HandRowType.ANTE) + this.handHistory.ante?.let { + if (it > 0) { + rows.add(HandRowType.ANTE) + } } if (this.handHistory.bigBlindAnte) { @@ -796,7 +797,7 @@ class EditorViewModel : ViewModel(), RowRepresentableDataSource, CardCentralizer val string = when (row) { HandRowType.PLAYER_NUMBER -> this.handHistory.numberOfPlayers.toString() HandRowType.COMMENT -> this.handHistory.comment ?: context.getString(R.string.comment) - HandRowType.ANTE -> this.handHistory.ante.formatted + HandRowType.ANTE -> this.handHistory.ante?.formatted HandRowType.BIG_BLIND_ANTE_READ -> context.getString(R.string.yes) // HandRowType.HERO_POSITION -> context.getString(R.string.set_hero_position) // HandRowType.PLAYER_POSITION -> context.getString(R.string.set_position_details) 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 432d6f15..bd0af066 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 @@ -26,7 +26,6 @@ import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.extensions.scheduleStopNotification import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.realm.* -import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.model.utils.FavoriteSessionFinder import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -38,6 +37,7 @@ import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.modules.handhistory.HandHistoryActivity import net.pokeranalytics.android.ui.view.* import net.pokeranalytics.android.ui.view.rows.SessionPropertiesRow +import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.extensions.* import timber.log.Timber @@ -585,7 +585,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr ) SessionPropertiesRow.BUY_IN -> row.editingDescriptors( mapOf( - "bb" to session.cgBigBlind, + "bb" to session.cgBiggestBet, "fee" to session.tournamentEntryFee, "ratedBuyin" to session.result?.buyin ) @@ -628,8 +628,8 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr ) SessionPropertiesRow.TIPS -> row.editingDescriptors( mapOf( - "sb" to session.cgSmallBlind?.round(), - "bb" to session.cgBigBlind?.round(), + "sb" to session.cgBiggestBet?.round(), + "bb" to session.cgBiggestBet?.round(), "tips" to session.result?.tips ) ) diff --git a/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt b/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt index a5e94be2..c13ecc34 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt @@ -90,9 +90,13 @@ class FakeDataManager { if (isTournament) { session.tournamentEntryFee = buyin } else { - val bigBlind = arrayListOf(1.0, 2.0, 4.0).random() - session.cgBigBlind = bigBlind - session.cgSmallBlind = bigBlind / 2.0 + + session.cgAnte = arrayListOf(1.0, null).random() + session.cgBlinds = arrayListOf("1/2", "2/5/10", "2").random() + +// val bigBlind = arrayListOf(1.0, 2.0, 4.0).random() +// session.cgBigBlind = bigBlind +// session.cgSmallBlind = bigBlind / 2.0 } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt index 168460d6..dcb1b3c3 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt @@ -8,12 +8,14 @@ import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.utils.DataUtils +import net.pokeranalytics.android.util.BLIND_SEPARATOR import net.pokeranalytics.android.util.extensions.count import net.pokeranalytics.android.util.extensions.getOrCreate import net.pokeranalytics.android.util.extensions.setHourMinutes import org.apache.commons.csv.CSVRecord import timber.log.Timber import java.text.DateFormat +import java.text.NumberFormat import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -57,6 +59,9 @@ abstract class PACSVDescriptor(source: DataSource, var stackingIn: Double? = null var stackingOut: Double? = null + var sb: Double? = null + var bb: Double? = null + this.fields.forEach { field -> this.fieldMapping[field]?.let { index -> @@ -169,38 +174,40 @@ abstract class PACSVDescriptor(source: DataSource, is SessionField.Bankroll -> bankrollName = value is SessionField.LimitType -> session.limit = Limit.getInstance(value)?.ordinal is SessionField.Comment -> session.comment = value - is SessionField.Blind -> { // 1/2 - val blinds = field.parse(value) - session.cgSmallBlind = blinds?.first - session.cgBigBlind = blinds?.second + is SessionField.Blind, is SessionField.Blinds -> { // 1/2 + session.cgBlinds = value + +// val blinds = field.parse(value) +// session.cgSmallBlind = blinds?.first +// session.cgBigBlind = blinds?.second } is SessionField.SmallBlind -> { - val sb = field.parse(value) - if (sb != null && sb > 0.0) { - session.cgSmallBlind = sb - } else {} + sb = field.parse(value) +// if (sb != null && sb > 0.0) { +// session.cgSmallBlind = sb +// } else {} } is SessionField.BigBlind -> { - val bb = field.parse(value) - if (bb != null && bb > 0.0) { - session.cgBigBlind = bb - } else {} - } - is SessionField.Blinds -> { - val blinds = value.split("/") - when (blinds.size) { - 0 -> {} - 1 -> { - session.cgBigBlind = field.parse(blinds.first()) - } - else -> { - session.cgSmallBlind = field.parse(blinds[blinds.size - 2]) - session.cgBigBlind = field.parse(blinds.last()) - } - } + bb = field.parse(value) +// if (bb != null && bb > 0.0) { +// session.cgBigBlind = bb +// } else {} } +// is SessionField.Blinds -> { +// val blinds = value.split("/") +// when (blinds.size) { +// 0 -> {} +// 1 -> { +// session.cgBigBlind = field.parse(blinds.first()) +// } +// else -> { +// session.cgSmallBlind = field.parse(blinds[blinds.size - 2]) +// session.cgBigBlind = field.parse(blinds.last()) +// } +// } +// } is SessionField.Ante -> { - // unmanaged atm + session.cgAnte = field.parse(value) } is SessionField.TableSize -> session.tableSize = TableSize.valueForLabel(value) is SessionField.TournamentPosition -> session.result?.tournamentFinalPosition = @@ -256,6 +263,11 @@ abstract class PACSVDescriptor(source: DataSource, } + val blinds = arrayListOf(sb, bb).filterNotNull() + if (blinds.isNotEmpty()) { + session.cgBlinds = blinds.joinToString(BLIND_SEPARATOR) { NumberFormat.getInstance().format(it) } + } + val bankroll = Bankroll.getOrCreate(realm, bankrollName, isLive, currencyCode, currencyRate) session.bankroll = bankroll diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt index 137d840c..05bdf663 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt @@ -18,7 +18,8 @@ class ProductCSVDescriptors { runGoodTournaments, pokerAnalyticsiOS, pokerAnalytics6iOS, - pokerAnalyticsAndroid, + pokerAnalyticsAndroidSessions, + pokerAnalyticsAndroid6Sessions, pokerAnalyticsAndroidTransactions ) @@ -239,7 +240,7 @@ class ProductCSVDescriptors { ) } - val pokerAnalyticsAndroid: SessionCSVDescriptor + val pokerAnalyticsAndroidSessions: SessionCSVDescriptor get() { return SessionCSVDescriptor( DataSource.POKER_ANALYTICS, @@ -273,6 +274,42 @@ class ProductCSVDescriptors { SessionField.Comment("Comment") ) } + + + val pokerAnalyticsAndroid6Sessions: SessionCSVDescriptor + get() { + return SessionCSVDescriptor( + DataSource.POKER_ANALYTICS, + true, + SessionField.Start("Start Date", dateFormat = "MM/dd/yy HH:mm:ss"), + SessionField.End("End Date", dateFormat = "MM/dd/yy HH:mm:ss"), + SessionField.Break("Break"), + SessionField.SessionType("Type"), + SessionField.Live("Live"), + SessionField.NumberOfTables("Tables"), + SessionField.Buyin("Buyin"), + SessionField.CashedOut("Cashed Out"), + SessionField.NetResult("Online Net"), + SessionField.Tips("Tips"), + SessionField.HandsCount("Hands Count"), + SessionField.LimitType("Limit"), + SessionField.Game("Game"), + SessionField.TableSize("Table Size"), + SessionField.Location("Location"), + SessionField.Bankroll("Bankroll"), + SessionField.CurrencyCode("Currency Code"), + SessionField.CurrencyRate("Currency Rate"), + SessionField.Ante("Antes"), + SessionField.Blinds("Blinds"), + SessionField.TournamentTypeName("Tournament Type"), + SessionField.TournamentName("Tournament Name"), + SessionField.TournamentEntryFee("Entry fee"), + SessionField.TournamentNumberOfPlayers("Number of players"), + SessionField.TournamentFeatures("Tournament Features"), + SessionField.TournamentPosition("Position"), + SessionField.Comment("Comment") + ) + } } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt index 52af5f00..982e0cb5 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt @@ -7,7 +7,6 @@ import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.Session import org.apache.commons.csv.CSVRecord -import timber.log.Timber /** * A SessionCSVDescriptor is a CSVDescriptor specialized in parsing Session objects @@ -63,8 +62,10 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el is SessionField.Bankroll -> data.bankroll?.name is SessionField.CurrencyCode -> data.bankroll?.currency?.code is SessionField.CurrencyRate -> field.format(data.bankroll?.currency?.rate) - is SessionField.SmallBlind -> field.format(data.cgSmallBlind) - is SessionField.BigBlind -> field.format(data.cgBigBlind) +// is SessionField.SmallBlind -> field.format(data.cgSmallBlind) +// is SessionField.BigBlind -> field.format(data.cgBigBlind) + is SessionField.Blinds -> data.cgBlinds + is SessionField.Ante -> field.format(data.cgAnte) is SessionField.TournamentType -> field.format(data.tournamentType) is SessionField.TournamentTypeName -> { data.tournamentType?.let { tt -> diff --git a/app/src/main/res/layout/bottom_sheet_stakes.xml b/app/src/main/res/layout/bottom_sheet_stakes.xml index 3d292b64..aab40f52 100644 --- a/app/src/main/res/layout/bottom_sheet_stakes.xml +++ b/app/src/main/res/layout/bottom_sheet_stakes.xml @@ -42,7 +42,6 @@ android:layout_marginEnd="16dp" android:layout_marginBottom="16dp" android:gravity="center" - android:imeOptions="actionDone" android:lines="1" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" From 687423fb3e27ed193a0767e1a874420896ace59d Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 11 Jul 2022 15:23:23 +0200 Subject: [PATCH 08/26] Improvements --- app/src/main/AndroidManifest.xml | 3 +- .../model/realm/handhistory/HandHistory.kt | 21 ++--- .../bottomsheet/BottomSheetStakesFragment.kt | 69 +++++++++++++---- .../views/RowHandHistoryViewHolder.kt | 3 +- .../main/res/layout/bottom_sheet_stakes.xml | 17 ++-- .../main/res/layout/view_keyboard_stakes.xml | 77 ++++++++++++------- app/src/main/res/values/styles.xml | 26 +++++++ 7 files changed, 151 insertions(+), 65 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 65ed5289..4b5b215d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -60,8 +60,7 @@ + android:screenOrientation="portrait" /> - val action = when(index) { - 0 -> Action.Type.POST_SB - 1 -> Action.Type.POST_BB - else -> Action.Type.STRADDLE + val blindValues = this.blindValues + if (blindValues.isNotEmpty()) { + blindValues.forEachIndexed { index, blind -> + val action = when(index) { + 0 -> Action.Type.POST_SB + 1 -> Action.Type.POST_BB + else -> Action.Type.STRADDLE + } + this.addAction(index, action, blind) } - this.addAction(index, action, blind) + } else { + this.addAction(0, Action.Type.POST_SB, this.oldSmallBlind) + this.addAction(1, Action.Type.POST_BB, this.oldBigBlind) } -// this.addAction(0, Action.Type.POST_SB, this.smallBlind) -// this.addAction(1, Action.Type.POST_BB, this.bigBlind) - // var lastStraddler: Int? = null val positions = Position.positionsPerPlayers(this.numberOfPlayers) 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 bdb8c266..0ef7e891 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 @@ -1,16 +1,19 @@ package net.pokeranalytics.android.ui.fragment.components.bottomsheet +import android.content.Context import android.os.Bundle import android.text.InputType import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo +import android.view.inputmethod.InputMethodManager import androidx.core.widget.addTextChangedListener import net.pokeranalytics.android.databinding.BottomSheetStakesBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException + class BottomSheetStakesFragment : BottomSheetFragment() { private var _binding: BottomSheetStakesBinding? = null @@ -36,9 +39,17 @@ class BottomSheetStakesFragment : BottomSheetFragment() { super.onStart() // binding.editText2.setTextIsSelectable(true) -// binding.editText2.isFocusableInTouchMode = false - binding.editText2.requestFocus() +// binding.editText2.isFocusableInTouchMode = true +// binding.editText2.requestFocus() +// +// val mgr: InputMethodManager? = +// requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? +// mgr?.hideSoftInputFromWindow(binding.editText2.windowToken, InputMethodManager.SHOW_FORCED) + + +// binding.editText2.findFocus() + } @@ -49,6 +60,15 @@ class BottomSheetStakesFragment : BottomSheetFragment() { // this.viewModel.isEditingBlinds = this.viewModel.row == SessionRow.BLINDS } + private fun focusBlindsAndHideKeyboard() { + binding.blindsEditText.requestFocus() + + val mgr: InputMethodManager? = + requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? + mgr?.hideSoftInputFromWindow(binding.blindsEditText.windowToken, InputMethodManager.SHOW_FORCED) + + } + /** * Init UI */ @@ -59,47 +79,66 @@ class BottomSheetStakesFragment : BottomSheetFragment() { throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } - data[0].hintResId?.let { binding.editText.hint = getString(it) } - binding.editText.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES - data[1].hintResId?.let { binding.editText2.hint = getString(it) } + data[0].hintResId?.let { binding.anteEditText.hint = getString(it) } + binding.anteEditText.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES + data[1].hintResId?.let { binding.blindsEditText.hint = getString(it) } // binding.editText2.setRawInputType(InputType.TYPE_CLASS_TEXT) //= InputType.TYPE_NULL // data[1].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES // binding.editText2.inputType = InputType.TYPE_NULL // binding.editText2.setTextIsSelectable(false) // editText.setTextIsSelectable(true) - binding.editText2.setRawInputType(InputType.TYPE_CLASS_TEXT) - binding.editText2.setTextIsSelectable(true) - binding.editText2.showSoftInputOnFocus = false +// binding.editText2.isFocusableInTouchMode = false + binding.blindsEditText.setRawInputType(InputType.TYPE_CLASS_NUMBER) +// binding.editText2.setTextIsSelectable(true) + binding.blindsEditText.showSoftInputOnFocus = false + + binding.blindsEditText.setOnTouchListener { view, motionEvent -> + + this.focusBlindsAndHideKeyboard() + +// binding.editText2.requestFocus() +// +// val mgr: InputMethodManager? = +// requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? +// mgr?.hideSoftInputFromWindow(binding.editText2.windowToken, InputMethodManager.SHOW_FORCED) + + return@setOnTouchListener true - binding.editText2.onCreateInputConnection(EditorInfo())?.let { + } + +// binding.editText2.requestFocus() + + binding.blindsEditText.onCreateInputConnection(EditorInfo())?.let { binding.stakesKeyboard.inputConnection = it + + } ?: throw PAIllegalStateException("No connection for editText") if (this.model.valueAsHint) { this.model.stringValue?.let { if (it.isNotBlank()) { - binding.editText.hint = it + binding.anteEditText.hint = it } } this.model.secondStringValue?.let { if (it.isNotBlank()) { - binding.editText2.hint = it + binding.blindsEditText.hint = it } } // if (this.viewModel.stringValue?.isNotBlank()) { editText.hint = values[0] } // if (values[1].isNotBlank()) { editText2.hint = values[1] } } else { - binding.editText.setText(this.model.stringValue) - binding.editText2.setText(this.model.secondStringValue) + binding.anteEditText.setText(this.model.stringValue) + binding.blindsEditText.setText(this.model.secondStringValue) } - binding.editText.addTextChangedListener { + binding.anteEditText.addTextChangedListener { this.model.stringValue = it?.toString() } - binding.editText2.addTextChangedListener { + binding.blindsEditText.addTextChangedListener { this.model.secondStringValue = it?.toString() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt index eda969c7..b302de57 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt @@ -35,8 +35,7 @@ class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemVie val amount = itemView.findViewById(R.id.amount) amount.text = handHistory.potSizeForStreet(Street.SUMMARY).formatted - val heroWins = handHistory.heroWins - val colorId = when(heroWins) { + val colorId = when(handHistory.heroWins) { true -> R.color.green false -> R.color.red else -> R.color.kaki_light diff --git a/app/src/main/res/layout/bottom_sheet_stakes.xml b/app/src/main/res/layout/bottom_sheet_stakes.xml index aab40f52..b1324e40 100644 --- a/app/src/main/res/layout/bottom_sheet_stakes.xml +++ b/app/src/main/res/layout/bottom_sheet_stakes.xml @@ -16,7 +16,7 @@ app:layout_constraintEnd_toEndOf="parent"> + app:layout_constraintVertical_bias="0.0" + tools:text="20" /> + tools:text="10" /> + diff --git a/app/src/main/res/layout/view_keyboard_stakes.xml b/app/src/main/res/layout/view_keyboard_stakes.xml index 29055e4f..5211a608 100644 --- a/app/src/main/res/layout/view_keyboard_stakes.xml +++ b/app/src/main/res/layout/view_keyboard_stakes.xml @@ -1,42 +1,43 @@ - - - - - - @@ -48,27 +49,35 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - @@ -80,36 +89,46 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index dd114e52..5f4e55d1 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -386,6 +386,32 @@ @color/kaki_darker + + + +