From ae0d8d3e4062332eb622f795f2c42571c0303387 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 10:08:42 +0200 Subject: [PATCH 01/15] version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a8146d59..d8bf7d72 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,7 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 28 - versionCode 11 + versionCode 12 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } From 5125926f82b5164af90d3d7990f2839207c40925 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 11:22:14 +0200 Subject: [PATCH 02/15] Fixes crash when setting empty value on net result --- .../android/model/realm/Session.kt | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 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 486aca1b..0cc949d8 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 @@ -759,7 +759,13 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } SessionRow.BUY_IN -> { val localResult = if (this.result != null) this.result as Result else realm.createObject(Result::class.java) - localResult.buyin = value as Double? + + if (value == null) { + localResult.buyin = null + } else { + localResult.buyin = (value as String).toDouble() + } + this.result = localResult this.updateRowRepresentation() } @@ -776,7 +782,13 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } SessionRow.NET_RESULT -> { this.result?.let { result -> - result.netResult = (value as String).toDouble() + + if (value == null) { + result.netResult = null + } else { + result.netResult = (value as String).toDouble() + } + } } SessionRow.COMMENT -> comment = value as String? ?: "" @@ -819,7 +831,12 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat SessionRow.TABLE_SIZE -> tableSize = value as Int? SessionRow.TIPS -> { val localResult = if (result != null) result as Result else realm.createObject(Result::class.java) - localResult.tips = value as Double? + if (value == null) { + localResult.tips = null + } else { + localResult.tips = (value as String).toDouble() + } + result = localResult } SessionRow.TOURNAMENT_NAME -> tournamentName = value as TournamentName? From f7180e8325c92aa73171537ddab2059d35f39b90 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 14:19:10 +0200 Subject: [PATCH 03/15] Fixing migration missing field --- .../android/model/migrations/PokerAnalyticsMigration.kt | 1 + 1 file changed, 1 insertion(+) 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 4588fd95..39f185d1 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 @@ -41,6 +41,7 @@ class PokerAnalyticsMigration : RealmMigration { it.renameField("filterElements", "filterConditions") } schema.get("SessionSet")?.let { + it.addField("id", String::class.java).setRequired("id", true) it.addPrimaryKey("id") } currentVersion++ From a951a91865f37325c64ba64901968e15b6018a94 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 14:19:29 +0200 Subject: [PATCH 04/15] bumping version code to 13 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d8bf7d72..c7169b95 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,7 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 28 - versionCode 12 + versionCode 13 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } From 50feb6dc80dbbef9bd052ba1613652b2709a470d Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 17:20:28 +0200 Subject: [PATCH 05/15] Fixes crash when rate is null --- .../android/ui/fragment/BankrollDataFragment.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt index 586888cb..14283c47 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt @@ -117,12 +117,9 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS return when (row) { SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.bankroll.name)) BankrollRow.RATE -> { - - this.bankroll.currency?.rate?.let { rate -> - row.editingDescriptors(mapOf("defaultValue" to CurrencyUtils.getCurrencyRateFormatter().format(rate))) - } ?: run { - row.editingDescriptors(mapOf()) - } + val rate = this.bankroll.currency?.rate ?: 1.0 + val rateFormatted = CurrencyUtils.getCurrencyRateFormatter().format(rate) + row.editingDescriptors(mapOf("defaultValue" to rateFormatted)) } else -> null } From 0eba63f112131995f619e4367e05cf9f9989e8d4 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 18:02:24 +0200 Subject: [PATCH 06/15] Harmonizing number capture and management + fixing crashes --- .../android/model/realm/Result.kt | 17 ++- .../android/model/realm/Session.kt | 42 ++---- .../BottomSheetNumericTextFragment.kt | 80 +++++++++++ .../components/bottomsheet/BottomSheetType.kt | 3 +- .../ui/view/rowrepresentable/SessionRow.kt | 130 ++++++++++++------ 5 files changed, 191 insertions(+), 81 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt 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 1a3ecdb5..e0641348 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 @@ -80,13 +80,16 @@ open class Result : RealmObject() { private fun computeNet() { val transactionsSum = transactions.sumByDouble { it.amount } - this.netResult?.let { - this.net = it + transactionsSum - } ?: run { - val buyin = this.buyin ?: 0.0 - val cashOut = this.cashout ?: 0.0 - this.net = cashOut - buyin + transactionsSum - } + + val isLive = this.session?.bankroll?.live ?: true + if (isLive) { + val buyin = this.buyin ?: 0.0 + val cashOut = this.cashout ?: 0.0 + this.net = cashOut - buyin + transactionsSum + } else { + val netResult = this.netResult ?: 0.0 + this.net = netResult + transactionsSum + } // Precompute results this.session?.computeStats() 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 0cc949d8..0244b20e 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 @@ -627,7 +627,8 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat SessionRow.BLINDS -> getBlinds() SessionRow.BREAK_TIME -> if (this.breakDuration > 0.0) this.breakDuration.toMinutes() else NULL_TEXT SessionRow.BUY_IN -> this.result?.buyin?.toCurrency(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT - SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> this.result?.cashout?.toCurrency(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT + SessionRow.CASHED_OUT, SessionRow.PRIZE -> this.result?.cashout?.toCurrency(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT + SessionRow.NET_RESULT -> this.result?.netResult?.toCurrency(CurrencyUtils.getCurrency(bankroll)) ?: NULL_TEXT SessionRow.COMMENT -> if (this.comment.isNotEmpty()) this.comment else NULL_TEXT SessionRow.END_DATE -> this.endDate?.shortDateTime() ?: NULL_TEXT SessionRow.GAME -> getFormattedGame() @@ -664,7 +665,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat override fun actionIconForRow(row: RowRepresentable): Int? { return when (row) { SessionRow.START_DATE, SessionRow.END_DATE -> { - net.pokeranalytics.android.R.drawable.ic_close + R.drawable.ic_close } else -> null } @@ -699,14 +700,14 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat SessionRow.BUY_IN -> row.editingDescriptors(mapOf( "bb" to cgBigBlind, "fee" to this.tournamentEntryFee, - "ratedBuyin" to ratedBuyin + "ratedBuyin" to result?.buyin )) SessionRow.BREAK_TIME -> row.editingDescriptors(mapOf()) SessionRow.CASHED_OUT, SessionRow.PRIZE -> row.editingDescriptors(mapOf( - "defaultValue" to result?.cashout?.round() + "defaultValue" to result?.cashout )) SessionRow.NET_RESULT -> row.editingDescriptors(mapOf( - "defaultValue" to result?.netResult?.round() + "defaultValue" to result?.netResult )) SessionRow.COMMENT -> row.editingDescriptors(mapOf( "defaultValue" to this.comment)) @@ -759,43 +760,26 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } SessionRow.BUY_IN -> { val localResult = if (this.result != null) this.result as Result else realm.createObject(Result::class.java) - - if (value == null) { - localResult.buyin = null - } else { - localResult.buyin = (value as String).toDouble() - } - + localResult.buyin = value as Double? this.result = localResult this.updateRowRepresentation() } SessionRow.CASHED_OUT, SessionRow.PRIZE -> { val localResult = if (this.result != null) this.result as Result else realm.createObject(Result::class.java) - if (value == null) { - localResult.cashout = null - } else { - localResult.cashout = (value as String).toDouble() - } + localResult.cashout = value as Double? this.result = localResult } SessionRow.NET_RESULT -> { this.result?.let { result -> - - if (value == null) { - result.netResult = null - } else { - result.netResult = (value as String).toDouble() - } - + result.netResult = value as Double? } } SessionRow.COMMENT -> comment = value as String? ?: "" SessionRow.END_DATE -> if (value is Date?) { this.endDate = value - } SessionRow.GAME -> { if (value is ArrayList<*>) { @@ -814,7 +798,6 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } else if (value == null) { limit = null game = null - } } SessionRow.INITIAL_BUY_IN -> tournamentEntryFee = if (value == null) null else (value as String).toDouble() @@ -831,12 +814,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat SessionRow.TABLE_SIZE -> tableSize = value as Int? SessionRow.TIPS -> { val localResult = if (result != null) result as Result else realm.createObject(Result::class.java) - if (value == null) { - localResult.tips = null - } else { - localResult.tips = (value as String).toDouble() - } - + localResult.tips = value as Double? result = localResult } SessionRow.TOURNAMENT_NAME -> tournamentName = value as TournamentName? 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 new file mode 100644 index 00000000..8e953d6c --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt @@ -0,0 +1,80 @@ +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.inputmethod.EditorInfo +import androidx.core.widget.addTextChangedListener +import kotlinx.android.synthetic.main.bottom_sheet_edit_text.* +import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException +import java.text.NumberFormat + + +class BottomSheetNumericTextFragment : BottomSheetFragment() { + + private var value: Double? = null + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + initUI() + } + + override fun onStart() { + super.onStart() + editText1.requestFocus() + } + + override fun getValue(): Any? { + return this.value + } + + /** + * Init data + */ + private fun initData() { + } + + /** + * Init UI + */ + private fun initUI() { + val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (data.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + + LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_edit_text, view?.bottomSheetContainer, true) + + data[0].hint?.let { editText1.hint = getString(it) } + editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES + editText1.addTextChangedListener { + + this.value = try { + editText1.text.toString().toDouble() + } catch (e: Exception) { + null + } + + } + data[0].defaultValue?.let { + val formatter = NumberFormat.getNumberInstance() + formatter.isGroupingUsed = false + editText1.setText(formatter.format(it)) + } + + editText1.setOnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_DONE) { + delegate.onRowValueChanged(getValue(), 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/BottomSheetType.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetType.kt index 8a678127..41ce26f5 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 @@ -11,6 +11,7 @@ enum class BottomSheetType { EDIT_TEXT { override fun newInstance() = BottomSheetEditTextFragment()}, EDIT_TEXT_MULTI_LINES { override fun newInstance() = BottomSheetEditTextMultiLinesFragment()}, DOUBLE_EDIT_TEXT { override fun newInstance() = BottomSheetDoubleEditTextFragment()}, + NUMERIC_TEXT { override fun newInstance() = BottomSheetNumericTextFragment()}, SUM { override fun newInstance() = BottomSheetSumFragment()}; abstract fun newInstance(): BottomSheetFragment @@ -26,7 +27,7 @@ enum class BottomSheetType { val addRequired : Boolean get() = when (this) { - EDIT_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 -> false else -> true } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt index 7eb0f035..27b2c73f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt @@ -49,17 +49,39 @@ enum class SessionRow : RowRepresentable { return when (session.getState()) { SessionState.PENDING, SessionState.PLANNED -> { arrayListOf( - GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, TOURNAMENT_NAME, TOURNAMENT_FEATURE, - START_DATE, END_DATE + GAME, + INITIAL_BUY_IN, + LOCATION, + BANKROLL, + TABLE_SIZE, + TOURNAMENT_TYPE, + TOURNAMENT_NAME, + TOURNAMENT_FEATURE, + START_DATE, + END_DATE ) } SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { arrayListOf( - PRIZE, BUY_IN, POSITION, PLAYERS, TIPS, + PRIZE, + BUY_IN, + POSITION, + PLAYERS, + TIPS, SeparatorRowRepresentable(), - GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, TOURNAMENT_NAME, TOURNAMENT_FEATURE, + GAME, + INITIAL_BUY_IN, + LOCATION, + BANKROLL, + TABLE_SIZE, + TOURNAMENT_TYPE, + TOURNAMENT_NAME, + TOURNAMENT_FEATURE, SeparatorRowRepresentable(), - START_DATE, END_DATE, BREAK_TIME, COMMENT + START_DATE, + END_DATE, + BREAK_TIME, + COMMENT ) } } @@ -73,15 +95,33 @@ enum class SessionRow : RowRepresentable { val liveBankroll = session.bankroll?.live ?: false return if (liveBankroll) { arrayListOf( - CASHED_OUT, BUY_IN, TIPS, + CASHED_OUT, + BUY_IN, + TIPS, SeparatorRowRepresentable(), - GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT + GAME, + BLINDS, + LOCATION, + BANKROLL, + TABLE_SIZE, + START_DATE, + END_DATE, + BREAK_TIME, + COMMENT ) } else { arrayListOf( NET_RESULT, SeparatorRowRepresentable(), - GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT + GAME, + BLINDS, + LOCATION, + BANKROLL, + TABLE_SIZE, + START_DATE, + END_DATE, + BREAK_TIME, + COMMENT ) } } @@ -131,7 +171,7 @@ enum class SessionRow : RowRepresentable { override val bottomSheetType: BottomSheetType get() { return when (this) { - NET_RESULT, CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.EDIT_TEXT + NET_RESULT, CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.NUMERIC_TEXT BUY_IN, TIPS -> BottomSheetType.SUM BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT GAME -> BottomSheetType.LIST_GAME @@ -151,10 +191,15 @@ enum class SessionRow : RowRepresentable { val sb: String? by map val bb: String? by map arrayListOf( - RowRepresentableEditDescriptor(sb, R.string.smallblind, 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)) + RowRepresentableEditDescriptor( + sb, R.string.smallblind, 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 + ) + ) } BUY_IN -> { val bb: Double? by map @@ -162,11 +207,11 @@ enum class SessionRow : RowRepresentable { val ratedBuyin: Double? by map val data = arrayListOf() if (bb != null) { - data.add(RowRepresentableEditDescriptor(100.0 * (bb?: 0.0))) - data.add(RowRepresentableEditDescriptor(200.0 * (bb?: 0.0))) + data.add(RowRepresentableEditDescriptor(100.0 * (bb ?: 0.0))) + data.add(RowRepresentableEditDescriptor(200.0 * (bb ?: 0.0))) } else if (fee != null) { - data.add(RowRepresentableEditDescriptor((fee?: 0.0) * 1.0)) - data.add(RowRepresentableEditDescriptor((fee?: 0.0) * 2.0)) + data.add(RowRepresentableEditDescriptor((fee ?: 0.0) * 1.0)) + data.add(RowRepresentableEditDescriptor((fee ?: 0.0) * 2.0)) } else { data.add(RowRepresentableEditDescriptor(0)) data.add(RowRepresentableEditDescriptor(0)) @@ -186,17 +231,18 @@ enum class SessionRow : RowRepresentable { data } CASHED_OUT, PRIZE, NET_RESULT -> { - val defaultValue: String? by map + val defaultValue: Double? by map arrayListOf( - RowRepresentableEditDescriptor( - defaultValue, - inputType = InputType.TYPE_CLASS_NUMBER - or InputType.TYPE_NUMBER_FLAG_DECIMAL - or InputType.TYPE_NUMBER_FLAG_SIGNED - )) + RowRepresentableEditDescriptor( + defaultValue, + inputType = InputType.TYPE_CLASS_NUMBER + or InputType.TYPE_NUMBER_FLAG_DECIMAL + or InputType.TYPE_NUMBER_FLAG_SIGNED + ) + ) } COMMENT -> { - val defaultValue : String? by map + val defaultValue: String? by map arrayListOf(RowRepresentableEditDescriptor(defaultValue, R.string.comment)) } BREAK_TIME -> { @@ -207,22 +253,23 @@ enum class SessionRow : RowRepresentable { ) } GAME -> { - val limit : Int? by map - val defaultValue : Any? by map - val data : RealmResults<*>? by map + val limit: Int? by map + val defaultValue: Any? by map + val data: RealmResults<*>? by map arrayListOf( RowRepresentableEditDescriptor(limit), - RowRepresentableEditDescriptor(defaultValue, data = data)) + RowRepresentableEditDescriptor(defaultValue, data = data) + ) } INITIAL_BUY_IN -> { - val defaultValue : Double? by map + val defaultValue: Double? by map arrayListOf( RowRepresentableEditDescriptor(defaultValue?.round(), inputType = InputType.TYPE_CLASS_NUMBER) ) } BANKROLL, LOCATION, TOURNAMENT_FEATURE, TOURNAMENT_NAME -> { - val defaultValue : Any? by map - val data : RealmResults<*>? by map + val defaultValue: Any? by map + val data: RealmResults<*>? by map arrayListOf( RowRepresentableEditDescriptor(defaultValue, data = data) ) @@ -237,7 +284,7 @@ enum class SessionRow : RowRepresentable { ) } POSITION -> { - val defaultValue : Int? by map + val defaultValue: Int? by map arrayListOf( RowRepresentableEditDescriptor( defaultValue, @@ -246,7 +293,7 @@ enum class SessionRow : RowRepresentable { ) } TABLE_SIZE -> { - val defaultValue : Int? by map + val defaultValue: Int? by map arrayListOf(RowRepresentableEditDescriptor(defaultValue)) } TIPS -> { @@ -256,19 +303,20 @@ enum class SessionRow : RowRepresentable { // Disable the buttons with value = 0, add current value & set the 2 edit texts arrayListOf( - RowRepresentableEditDescriptor(sb?: 0.0), - RowRepresentableEditDescriptor(bb?: 0.0), - RowRepresentableEditDescriptor(tips?: 0.0), + RowRepresentableEditDescriptor(sb ?: 0.0), + RowRepresentableEditDescriptor(bb ?: 0.0), + RowRepresentableEditDescriptor(tips ?: 0.0), RowRepresentableEditDescriptor("", inputType = InputType.TYPE_CLASS_NUMBER), RowRepresentableEditDescriptor("", inputType = InputType.TYPE_CLASS_NUMBER) ) } TOURNAMENT_TYPE -> { - val defaultValue : Any? by map + val defaultValue: Any? by map arrayListOf( - RowRepresentableEditDescriptor(defaultValue, staticData = TournamentType.values().map { - it - })) + RowRepresentableEditDescriptor(defaultValue, staticData = TournamentType.values().map { + it + }) + ) } else -> null } From 74d92ad622b6cbfbc01119580da703bdbdc79cc5 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 18:03:06 +0200 Subject: [PATCH 07/15] bumping to versionCode 14 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c7169b95..db66d90c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,7 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 28 - versionCode 13 + versionCode 14 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } From 307e6d2b745378c8df14b6f17e784a405dd9369f Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 19:24:13 +0200 Subject: [PATCH 08/15] Fix crashes --- .../android/ui/fragment/BankrollDataFragment.kt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt index 14283c47..c05569ff 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt @@ -88,18 +88,15 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS return when (row) { SimpleRow.NAME -> if (bankroll.name.isNotEmpty()) bankroll.name else NULL_TEXT BankrollRow.CURRENCY -> { - bankroll.currency?.let { - Currency.getInstance(it.code).currencyCode + bankroll.currency?.code?.let { code -> + Currency.getInstance(code).currencyCode } ?: run { NULL_TEXT } } BankrollRow.RATE -> { - this.bankroll.currency?.rate?.let { rate -> - CurrencyUtils.getCurrencyRateFormatter().format(rate) - } ?: run { - CurrencyUtils.getCurrencyRateFormatter().format(1.0) - } + val rate = this.bankroll.currency?.rate ?: 1.0 + CurrencyUtils.getCurrencyRateFormatter().format(rate) } else -> super.stringForRow(row) } From f5b9190583d1aadaefe800b740fd7c72cd1db4a8 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 19:40:18 +0200 Subject: [PATCH 09/15] Fixes more crashes --- app/build.gradle | 2 +- .../pokeranalytics/android/model/realm/Session.kt | 14 ++++++++++++-- .../bottomsheet/BottomSheetNumericTextFragment.kt | 10 +++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index db66d90c..6bf19dc6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,7 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 28 - versionCode 14 + versionCode 15 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } 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 0244b20e..8d755280 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 @@ -802,10 +802,20 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } SessionRow.INITIAL_BUY_IN -> tournamentEntryFee = if (value == null) null else (value as String).toDouble() SessionRow.LOCATION -> location = value as Location? - SessionRow.PLAYERS -> tournamentNumberOfPlayers = if (value != null) (value as String).toInt() else null + SessionRow.PLAYERS -> { + if (value is Double) { + this.tournamentNumberOfPlayers = value.toInt() + } else { + this.tournamentNumberOfPlayers = null + } + } SessionRow.POSITION -> { val localResult = if (result != null) result as Result else realm.createObject(Result::class.java) - localResult.tournamentFinalPosition = if (value == null) null else (value as String).toInt() + if (value is Double) { + localResult.tournamentFinalPosition = value.toInt() + } else { + localResult.tournamentFinalPosition = null + } result = localResult } SessionRow.START_DATE -> if (value is Date) { 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 8e953d6c..da9486d5 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 @@ -61,9 +61,13 @@ class BottomSheetNumericTextFragment : BottomSheetFragment() { } data[0].defaultValue?.let { - val formatter = NumberFormat.getNumberInstance() - formatter.isGroupingUsed = false - editText1.setText(formatter.format(it)) + if (it is Double || it is Long) { + val formatter = NumberFormat.getNumberInstance() + formatter.isGroupingUsed = false + editText1.setText(formatter.format(it)) + } else { + editText1.setText(it.toString()) + } } editText1.setOnEditorActionListener { _, actionId, _ -> From fba9968a108912dec129eef5d0a340e85dbd8236 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 19:47:19 +0200 Subject: [PATCH 10/15] Fixing crash and bug --- .../pokeranalytics/android/model/realm/Session.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 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 8d755280..73842543 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 @@ -800,7 +800,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat game = null } } - SessionRow.INITIAL_BUY_IN -> tournamentEntryFee = if (value == null) null else (value as String).toDouble() + SessionRow.INITIAL_BUY_IN -> { + this.tournamentEntryFee = (value as Double?) + } SessionRow.LOCATION -> location = value as Location? SessionRow.PLAYERS -> { if (value is Double) { @@ -829,9 +831,14 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } SessionRow.TOURNAMENT_NAME -> tournamentName = value as TournamentName? SessionRow.TOURNAMENT_TYPE -> tournamentType = value as Int? - SessionRow.TOURNAMENT_FEATURE -> value?.let { - tournamentFeatures = RealmList() - tournamentFeatures.addAll((it as ArrayList)) + SessionRow.TOURNAMENT_FEATURE -> { + + value?.let { + tournamentFeatures = RealmList() + tournamentFeatures.addAll((it as ArrayList)) + } ?: run { + tournamentFeatures.removeAll(this.tournamentFeatures) + } } } } From f4a749fbb8137566e374fba0e8762bd23514d037 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 09:23:54 +0200 Subject: [PATCH 11/15] bumping to versionCode 16 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6bf19dc6..4c62fa11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,7 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 28 - versionCode 15 + versionCode 16 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } From b591ba977c1692040122244778d21f76772e3d54 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 10:57:54 +0200 Subject: [PATCH 12/15] Fixes crash with thousands + improved format --- .../net/pokeranalytics/android/model/realm/Bankroll.kt | 6 +----- .../android/ui/fragment/BankrollDataFragment.kt | 7 +++---- .../pokeranalytics/android/ui/fragment/SettingsFragment.kt | 5 ++++- .../bottomsheet/BottomSheetNumericTextFragment.kt | 1 + .../android/ui/view/rowrepresentable/BankrollRow.kt | 4 ++-- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index c5a3df93..b05eb7e2 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -89,11 +89,7 @@ open class Bankroll() : RealmObject(), NameManageable, StaticRowRepresentableDat this.currency?.code = value as String? } BankrollRow.RATE -> { - value?.let { rate -> - this.currency?.rate = (rate as String).toDouble() - } ?: run { - this.currency?.rate = null - } + this.currency?.rate = value as Double? } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt index c05569ff..675e198f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt @@ -114,9 +114,8 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS return when (row) { SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.bankroll.name)) BankrollRow.RATE -> { - val rate = this.bankroll.currency?.rate ?: 1.0 - val rateFormatted = CurrencyUtils.getCurrencyRateFormatter().format(rate) - row.editingDescriptors(mapOf("defaultValue" to rateFormatted)) + val rate = this.bankroll.currency?.rate + row.editingDescriptors(mapOf("defaultValue" to rate)) } else -> null } @@ -205,7 +204,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS override fun onResponse(call: Call>, response: Response>) { response.body()?.let { it[currenciesConverterValue]?.value?.let { rate -> - onRowValueChanged(rate.toString(), BankrollRow.RATE) + onRowValueChanged(rate, BankrollRow.RATE) } } 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 8b6a3802..db953583 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 @@ -56,7 +56,10 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta override fun stringForRow(row: RowRepresentable): String { return when (row) { SettingRow.VERSION -> BuildConfig.VERSION_NAME + if (BuildConfig.DEBUG) " (${BuildConfig.VERSION_CODE}) DEBUG" else "" - SettingRow.CURRENCY -> Currency.getInstance(Preferences.getCurrencyLocale(this.parentActivity)).symbol + SettingRow.CURRENCY -> { + val locale = Preferences.getCurrencyLocale(this.parentActivity) + Currency.getInstance(locale).symbol + } else -> "" } } 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 da9486d5..da8f8510 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 @@ -63,6 +63,7 @@ class BottomSheetNumericTextFragment : BottomSheetFragment() { data[0].defaultValue?.let { if (it is Double || it is Long) { val formatter = NumberFormat.getNumberInstance() + formatter.maximumFractionDigits = 6 formatter.isGroupingUsed = false editText1.setText(formatter.format(it)) } else { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt index df724f8e..f5cfdc6a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt @@ -40,14 +40,14 @@ enum class BankrollRow : RowRepresentable, DefaultEditDataSource { return when (this) { LIVE -> BottomSheetType.NONE CURRENCY -> BottomSheetType.NONE - RATE -> BottomSheetType.EDIT_TEXT + RATE -> BottomSheetType.NUMERIC_TEXT REFRESH_RATE -> BottomSheetType.NONE } } override fun editingDescriptors(map: Map): ArrayList? { return when (this) { - BankrollRow.RATE -> { + RATE -> { val defaultValue : Any? by map arrayListOf( RowRepresentableEditDescriptor(defaultValue, R.string.rate, InputType.TYPE_CLASS_NUMBER From 4f1ed02a91847d699e4ef6a631f0c1fa6e87a3ae Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 11:17:44 +0200 Subject: [PATCH 13/15] Fixes crash when setting break and refresh UI --- .../java/net/pokeranalytics/android/model/realm/Session.kt | 2 +- .../net/pokeranalytics/android/ui/fragment/SessionFragment.kt | 3 +-- 2 files changed, 2 insertions(+), 3 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 73842543..8c06e858 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 @@ -756,7 +756,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat cgBigBlind = null } SessionRow.BREAK_TIME -> { - this.breakDuration = if (value != null) (value as String).toLong() * 60 * 1000 else 0 + this.breakDuration = (value as Double? ?: 0.0).toLong() * 60 * 1000 } SessionRow.BUY_IN -> { val localResult = if (this.result != null) this.result as Result else realm.createObject(Result::class.java) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index a0f6893a..627ba629 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -117,8 +117,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate { sessionAdapter.refreshRow(row) when (row) { SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT, SessionRow.BUY_IN, SessionRow.TIPS, - SessionRow.START_DATE, SessionRow.END_DATE, SessionRow.BANKROLL -> updateSessionUI() - SessionRow.BREAK_TIME -> this.sessionAdapter.notifyDataSetChanged() + SessionRow.START_DATE, SessionRow.END_DATE, SessionRow.BANKROLL, SessionRow.BREAK_TIME -> updateSessionUI() } } From cf0991a467c4cdaad6913bbe7be1146587e0dc9a Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 11:29:26 +0200 Subject: [PATCH 14/15] Patch session set break times --- .../android/PokerAnalyticsApplication.kt | 3 ++ .../android/model/migrations/Patcher.kt | 28 +++++++++++++++++++ .../android/model/realm/SessionSet.kt | 1 + 3 files changed, 32 insertions(+) create mode 100644 app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 60b02421..7cbb59df 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -9,6 +9,7 @@ import io.realm.RealmConfiguration import io.realm.kotlin.where import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import net.pokeranalytics.android.model.migrations.Patcher import net.pokeranalytics.android.model.migrations.PokerAnalyticsMigration import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.utils.Seed @@ -50,6 +51,8 @@ class PokerAnalyticsApplication : Application() { if (BuildConfig.DEBUG) { // this.createFakeSessions() } + + Patcher.patchBreaks() } /** 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 new file mode 100644 index 00000000..498cf6d2 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt @@ -0,0 +1,28 @@ +package net.pokeranalytics.android.model.migrations + +import io.realm.Realm +import net.pokeranalytics.android.model.realm.SessionSet + +class Patcher { + + companion object { + + fun patchBreaks() { + + val realm = Realm.getDefaultInstance() + val sets = realm.where(SessionSet::class.java).findAll() + + realm.executeTransaction { + sets.forEach { + it.computeStats() + } + + } + realm.close() + + } + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt index 9774e1b7..2e5cd71b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt @@ -61,6 +61,7 @@ open class SessionSet() : RealmObject(), Timed, Filterable { this.ratedNet = this.sessions?.sumByDouble { it.computableResult?.ratedNet ?: 0.0 } ?: 0.0 this.estimatedHands = this.sessions?.sumByDouble { it.estimatedHands } ?: 0.0 this.bbNet = this.sessions?.sumByDouble { it.bbNet } ?: 0.0 + this.breakDuration = this.sessions?.max("breakDuration")?.toLong() ?: 0L } /** From cef1a410738f30d40f251c20ee7eeb0a3e198ad8 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 11:33:02 +0200 Subject: [PATCH 15/15] bumping versionCode to 17 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4c62fa11..62def270 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,7 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 28 - versionCode 16 + versionCode 17 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }