diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dedeb749..d534f814 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -179,7 +179,7 @@
android:screenOrientation="portrait" />
diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt
index 0b8316eb..8cad115d 100644
--- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt
+++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt
@@ -242,7 +242,7 @@ enum class Stat(override var uniqueIdentifier: Int) : IntIdentifiable, RowRepres
get() {
return when (this) {
HOURLY_DURATION, AVERAGE_HOURLY_DURATION, STANDARD_DEVIATION_BB,
- STANDARD_DEVIATION, STANDARD_DEVIATION_HOURLY,
+ STANDARD_DEVIATION, STANDARD_DEVIATION_HOURLY, HANDS_PLAYED,
STANDARD_DEVIATION_BB_PER_100_HANDS -> false
else -> true
}
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 3c884c1b..bae71be7 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
@@ -231,8 +231,15 @@ class PokerAnalyticsMigration : RealmMigration {
// Migrate to version 10
if (currentVersion == 9) {
schema.get("Session")?.addField("handsCount", Int::class.java)
+ ?.setRequired("handsCount", false)
- val configSchema = schema.create("Configuration")
+ schema.get("Session")?.transform { obj -> // otherwise we get a 0 default value
+ obj.setNull("handsCount")
+ }
+
+ val configSchema = schema.create("UserConfig")
+ configSchema.addField("id", String::class.java).setRequired("id", true)
+ configSchema.addPrimaryKey("id")
configSchema.addField("liveDealtHandsPerHour", Int::class.java)
configSchema.addField("onlineDealtHandsPerHour", Int::class.java)
diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Configuration.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Configuration.kt
deleted file mode 100644
index 6ff53f2c..00000000
--- a/app/src/main/java/net/pokeranalytics/android/model/realm/Configuration.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package net.pokeranalytics.android.model.realm
-
-import io.realm.Realm
-import io.realm.RealmObject
-
-class Configuration : RealmObject() {
-
- companion object {
-
- fun getConfiguration(realm: Realm): Configuration {
- realm.where(Configuration::class.java).findFirst()?.let {
- return it
- }
- return Configuration()
- }
-
- }
-
- var liveDealtHandsPerHour: Int = 250
-
- var onlineDealtHandsPerHour: Int = 500
-
-}
\ No newline at end of file
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 ded20ea9..547e041e 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
@@ -459,7 +459,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim
val numberOfHandsPerHour: Double
get() {
val tableSize = this.tableSize ?: 9 // 9 is the default table size if null
- val config = Configuration.getConfiguration(this.realm)
+ val config = UserConfig.getConfiguration(this.realm)
val playerHandsPerHour = if (this.isLive) config.liveDealtHandsPerHour else config.onlineDealtHandsPerHour
return playerHandsPerHour / tableSize.toDouble()
}
@@ -813,6 +813,7 @@ open class Session : RealmObject(), Savable, RowUpdatable, RowRepresentable, Tim
tournamentFeatures.removeAll(this.tournamentFeatures)
}
}
+ SessionPropertiesRow.HANDS_COUNT -> handsCount = (value as Double?)?.toInt()
is CustomField -> {
customFieldEntries.filter { it.customField?.id == row.id }.let {
customFieldEntries.removeAll(it)
diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/UserConfig.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/UserConfig.kt
new file mode 100644
index 00000000..5b95e626
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/model/realm/UserConfig.kt
@@ -0,0 +1,28 @@
+package net.pokeranalytics.android.model.realm
+
+import io.realm.Realm
+import io.realm.RealmObject
+import io.realm.annotations.PrimaryKey
+import java.util.*
+
+open class UserConfig : RealmObject() {
+
+ companion object {
+
+ fun getConfiguration(realm: Realm): UserConfig {
+ realm.where(UserConfig::class.java).findFirst()?.let { config ->
+ return config
+ }
+ return UserConfig()
+ }
+
+ }
+
+ @PrimaryKey
+ var id = UUID.randomUUID().toString()
+
+ var liveDealtHandsPerHour: Int = 250
+
+ var onlineDealtHandsPerHour: Int = 500
+
+}
\ No newline at end of file
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 86c6b4f7..ceee25aa 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
@@ -33,6 +33,7 @@ import net.pokeranalytics.android.ui.extensions.openUrl
import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.modules.bankroll.BankrollActivity
import net.pokeranalytics.android.ui.modules.datalist.DataListActivity
+import net.pokeranalytics.android.ui.modules.settings.DealtHandsPerHourActivity
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rows.SettingsRow
import net.pokeranalytics.android.util.*
@@ -174,6 +175,7 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep
SettingsRow.CONTACT_US -> parentActivity?.openContactMail(R.string.contact)
SettingsRow.BUG_REPORT -> parentActivity?.openContactMail(R.string.bug_report_subject, Realm.getDefaultInstance().path)
SettingsRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@SettingsFragment, RequestCode.CURRENCY.value)
+ SettingsRow.DEALT_HANDS_PER_HOUR -> DealtHandsPerHourActivity.newInstance(requireContext())
SettingsRow.EXPORT_CSV_SESSIONS -> this.sessionsCSVExport()
SettingsRow.EXPORT_CSV_TRANSACTIONS -> this.transactionsCSVExport()
SettingsRow.FOLLOW_US -> {
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
index d34b9a41..3085cc7a 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
@@ -20,7 +20,7 @@ import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.ComputableResult
-import net.pokeranalytics.android.model.realm.Configuration
+import net.pokeranalytics.android.model.realm.UserConfig
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.fragment.components.FilterableFragment
import net.pokeranalytics.android.ui.fragment.components.RealmAsyncListener
@@ -70,7 +70,7 @@ class StatisticsFragment : FilterableFragment(), RealmAsyncListener {
this.currentFilterable = FilterableType.SESSION
applyFilter()
- addRealmChangeListener(this, Configuration::class.java)
+ addRealmChangeListener(this, UserConfig::class.java)
addRealmChangeListener(this, ComputableResult::class.java)
}
@@ -190,7 +190,8 @@ class StatisticsFragment : FilterableFragment(), RealmAsyncListener {
Stat.AVERAGE,
Stat.NUMBER_OF_SETS,
Stat.AVERAGE_HOURLY_DURATION,
- Stat.HOURLY_DURATION
+ Stat.HOURLY_DURATION,
+ Stat.HANDS_PLAYED
)
val query = filter?.query ?: Query()
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt
index e66dbc6b..a9de0bbb 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt
@@ -41,15 +41,15 @@ open class RealmFragment : BaseFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
realm = Realm.getDefaultInstance()
-// this.observedEntities.forEach {
-// val realmResults = realm.where(it).findAll()
-//
-// realmResults.addChangeListener { t, _ ->
-// this.entitiesChanged(it, t)
-// }
-//
-// this.observedRealmResults.add(realmResults)
-// }
+ this.observedEntities.forEach {
+ val realmResults = realm.where(it).findAll()
+
+ realmResults.addChangeListener { t, _ ->
+ this.entitiesChanged(it, t)
+ }
+
+ this.observedRealmResults.add(realmResults)
+ }
return super.onCreateView(inflater, container, savedInstanceState)
}
@@ -102,7 +102,7 @@ open class RealmFragment : BaseFragment() {
/**
* A list of RealmModel classes to observe
*/
-// open val observedEntities: List> = listOf()
+ open val observedEntities: List> = listOf()
/**
* The method called when a change happened in any RealmResults
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt
index 1e40c533..68259f79 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt
@@ -19,7 +19,7 @@ import net.pokeranalytics.android.model.Criteria
import net.pokeranalytics.android.model.combined
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.ComputableResult
-import net.pokeranalytics.android.model.realm.Configuration
+import net.pokeranalytics.android.model.realm.UserConfig
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
@@ -88,7 +88,7 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable
initData()
initUI()
- addRealmChangeListener(this, Configuration::class.java)
+ addRealmChangeListener(this, UserConfig::class.java)
addRealmChangeListener(this, ComputableResult::class.java)
}
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt
index 0f17879c..ec3735a5 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt
@@ -271,7 +271,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis
}
this.view?.viewTreeObserver?.addOnGlobalLayoutListener {
- Timber.d(">>> addOnGlobalLayoutListener called")
+// Timber.d(">>> addOnGlobalLayoutListener called")
retrieveLatestBlogPosts() // attempt to retrieve blog tips on display
}
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 14e7db60..bc317e07 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
@@ -621,6 +621,11 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr
"defaultValue" to session.result?.tournamentFinalPosition
)
)
+ SessionPropertiesRow.HANDS_COUNT -> row.editingDescriptors(
+ mapOf(
+ "defaultValue" to session.handsCount
+ )
+ )
SessionPropertiesRow.TIPS -> row.editingDescriptors(
mapOf(
"sb" to session.cgSmallBlind?.round(),
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourActivity.kt
new file mode 100644
index 00000000..cc13f05a
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourActivity.kt
@@ -0,0 +1,27 @@
+package net.pokeranalytics.android.ui.modules.settings
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import net.pokeranalytics.android.R
+import net.pokeranalytics.android.ui.activity.CurrenciesActivity
+import net.pokeranalytics.android.ui.activity.components.BaseActivity
+
+class DealtHandsPerHourActivity : BaseActivity() {
+
+ companion object {
+
+ fun newInstance(context: Context) {
+ val intent = Intent(context, DealtHandsPerHourActivity::class.java)
+ context.startActivity(intent)
+
+ }
+
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_dealt_hands_config)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourFragment.kt
index 95468aaf..e313b01f 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourFragment.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/settings/DealtHandsPerHourFragment.kt
@@ -1,11 +1,89 @@
package net.pokeranalytics.android.ui.modules.settings
-import net.pokeranalytics.android.ui.fragment.components.BaseFragment
+import android.app.Activity
+import android.os.Bundle
+import android.view.*
+import android.view.inputmethod.InputMethodManager
+import kotlinx.android.synthetic.main.fragment_dealt_hands_config.*
+import net.pokeranalytics.android.R
+import net.pokeranalytics.android.databinding.FragmentDealtHandsConfigBinding
+import net.pokeranalytics.android.model.realm.ComputableResult
+import net.pokeranalytics.android.model.realm.Session
+import net.pokeranalytics.android.model.realm.UserConfig
+import net.pokeranalytics.android.ui.fragment.components.RealmFragment
-class DealtHandsPerHourFragment : BaseFragment() {
-
+class DealtHandsPerHourFragment : RealmFragment() {
+ private var _binding: FragmentDealtHandsConfigBinding? = null
+ private val binding get() = _binding!!
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ super.onCreateView(inflater, container, savedInstanceState)
+ _binding = FragmentDealtHandsConfigBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initUI()
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
+ menu.clear()
+ inflater.inflate(R.menu.toolbar_dealt_hands_per_hour, menu)
+ super.onCreateOptionsMenu(menu, inflater)
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ when (item.itemId) {
+ R.id.save -> save()
+ }
+ return true
+ }
+
+ private fun initUI() {
+
+ setDisplayHomeAsUpEnabled(true)
+
+ val userConfig = UserConfig.getConfiguration(this.getRealm())
+ this.liveValue.hint = "${userConfig.liveDealtHandsPerHour}"
+ this.onlineValue.hint = "${userConfig.onlineDealtHandsPerHour}"
+
+ }
+
+ private fun save() {
+
+ getRealm().executeTransaction { realm ->
+
+ val userConfig = UserConfig.getConfiguration(realm)
+ this.liveValue.text.toString().toIntOrNull()?.let { liveDealtHandsPerHour ->
+ userConfig.liveDealtHandsPerHour = liveDealtHandsPerHour
+ }
+ this.onlineValue.text.toString().toIntOrNull()?.let { onlineDealtHandsPerHour ->
+ userConfig.onlineDealtHandsPerHour = onlineDealtHandsPerHour
+ }
+ realm.copyToRealmOrUpdate(userConfig)
+
+ // update all precomputed hand counts
+ realm.where(ComputableResult::class.java).findAll().forEach { cr ->
+ cr.session?.let { session ->
+ cr.estimatedHands = session.estimatedHands
+ }
+ }
+ }
+
+ this.liveValue.clearFocus()
+ this.onlineValue.clearFocus()
+
+ // Hides keyboard
+ val imm: InputMethodManager =
+ requireContext().getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
+ imm.hideSoftInputFromWindow(view!!.windowToken, 0)
+ }
}
\ 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 296695f6..c945c930 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
@@ -48,9 +48,10 @@ enum class SessionPropertiesRow : RowRepresentable {
* Return the rows to display for the current session state
*/
fun getRows(session: Session, resultCaptureType: ResultCaptureType?, context: Context): List {
+ val state = session.getState()
when (session.type) {
Session.Type.TOURNAMENT.ordinal -> {
- return when (session.getState()) {
+ return when (state) {
SessionState.PENDING, SessionState.PLANNED -> {
arrayListOf(
GAME,
@@ -93,12 +94,15 @@ enum class SessionPropertiesRow : RowRepresentable {
END_DATE,
BREAK_TIME
))
+ if (state == SessionState.FINISHED) {
+ fields.add(HANDS_COUNT)
+ }
fields
}
}
}
Session.Type.CASH_GAME.ordinal -> {
- when (session.getState()) {
+ when (state) {
SessionState.PENDING, SessionState.PLANNED -> {
return arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE)
}
@@ -140,6 +144,9 @@ enum class SessionPropertiesRow : RowRepresentable {
BREAK_TIME
)
)
+ if (state == SessionState.FINISHED) {
+ fields.add(HANDS_COUNT)
+ }
return fields
}
}
@@ -274,7 +281,8 @@ enum class SessionPropertiesRow : RowRepresentable {
}
HANDS_COUNT -> {
arrayListOf(
- RowRepresentableEditDescriptor(inputType = InputType.TYPE_CLASS_NUMBER)
+ RowRepresentableEditDescriptor(inputType = InputType.TYPE_CLASS_NUMBER
+ or InputType.TYPE_NUMBER_FLAG_SIGNED)
)
}
GAME -> {
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt
index 68f127f6..bb3b264d 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt
@@ -35,6 +35,7 @@ enum class SettingsRow : RowRepresentable {
// Preferences
LANGUAGE,
CURRENCY,
+ DEALT_HANDS_PER_HOUR,
// Export
EXPORT_CSV_SESSIONS,
@@ -78,7 +79,7 @@ enum class SettingsRow : RowRepresentable {
rows.addAll(arrayListOf(FOLLOW_US, DISCORD, BLOG_TIPS, SHOULD_SHOW_BLOG_TIPS))
rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.preferences))
- rows.addAll(arrayListOf(CURRENCY))
+ rows.addAll(arrayListOf(CURRENCY, DEALT_HANDS_PER_HOUR))
rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.export))
rows.addAll(arrayListOf(EXPORT_CSV_SESSIONS, EXPORT_CSV_TRANSACTIONS))
@@ -127,6 +128,7 @@ enum class SettingsRow : RowRepresentable {
GDPR -> R.string.gdpr
POKER_RUMBLE -> R.string.poker_rumble
DISCORD -> R.string.join_discord
+ DEALT_HANDS_PER_HOUR -> R.string.dealt_hands_per_hour
else -> null
}
}
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 75b8d1e5..10f0fb20 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
@@ -24,8 +24,6 @@ class BottomSheetViewModelFactory(var row: RowRepresentable, var delegate: RowRe
class BottomSheetViewModel(var row: RowRepresentable) : ViewModel() {
-// lateinit var row: RowRepresentable
-
var currentCurrency: Currency? = null
var valueAsHint: Boolean = false
var isClearable: Boolean = true
@@ -49,7 +47,6 @@ class BottomSheetViewModel(var row: RowRepresentable) : ViewModel() {
this.limit = 0
}
-
/**
* Storage for a data that has been newly created
*/
@@ -164,7 +161,7 @@ class BottomSheetViewModel(var row: RowRepresentable) : ViewModel() {
BottomSheetType.NUMERIC_TEXT -> {
val bottomSheetData =
this.rowRepresentableEditDescriptors
- ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found")
+ ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found: $row")
bottomSheetData[0].defaultValue?.let {
this.doubleValue = it.toString().toDoubleOrNull()
}
diff --git a/app/src/main/res/layout/activity_dealt_hands_config.xml b/app/src/main/res/layout/activity_dealt_hands_config.xml
new file mode 100644
index 00000000..056fb6e0
--- /dev/null
+++ b/app/src/main/res/layout/activity_dealt_hands_config.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_dealt_hands_config.xml b/app/src/main/res/layout/fragment_dealt_hands_config.xml
index fd844d40..4716f6a0 100644
--- a/app/src/main/res/layout/fragment_dealt_hands_config.xml
+++ b/app/src/main/res/layout/fragment_dealt_hands_config.xml
@@ -1,76 +1,123 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/appBar">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/toolbar_dealt_hands_per_hour.xml b/app/src/main/res/menu/toolbar_dealt_hands_per_hour.xml
new file mode 100644
index 00000000..808e2460
--- /dev/null
+++ b/app/src/main/res/menu/toolbar_dealt_hands_per_hour.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f673ef0b..5072d042 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -814,5 +814,7 @@
ITM ratio
Hands count
estimated
+ You can change the DHPH (Dealt Hands Per Hour) values here. It corresponds to the total number of hands all players receives at a table in one hour. Example: Your local 10-max game deals 25 hands per hour, enter 10 x 25 = 250.
+ Dealt hands per hour