From eb3698b0ad5bd4c1d2838371b255d3559f383902 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 11:22:14 +0200 Subject: [PATCH 01/10] 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 acc98d9a..f14f0aa6 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 @@ -782,7 +782,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() } @@ -799,7 +805,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? ?: "" @@ -842,7 +854,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 dd9b1c94344b8ff8ab45648cbb2a64691da201e8 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 14:19:10 +0200 Subject: [PATCH 02/10] 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 02748a29..fea47c99 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 @@ -40,6 +40,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 ffadfef14359dde7457d1ced8df5cc1201a89f80 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 17:20:28 +0200 Subject: [PATCH 03/10] Solving conflict --- .../android/ui/fragment/BankrollDataFragment.kt | 8 ++------ 1 file changed, 2 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 1f02d4ec..277a3b1c 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,8 @@ 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 rate.toRate())) - } ?: run { - row.editingDescriptors(mapOf()) - } + val rate = this.bankroll.currency?.rate ?: 1.0 + row.editingDescriptors(mapOf("defaultValue" to rate.toRate())) } else -> null } From 6042db73aa98ca5e4453bee8569cd01ec571d9dc Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 18:02:24 +0200 Subject: [PATCH 04/10] merge cherry-picking --- .../android/model/realm/Result.kt | 17 ++- .../android/model/realm/Session.kt | 45 ++---- .../BottomSheetNumericTextFragment.kt | 80 +++++++++++ .../components/bottomsheet/BottomSheetType.kt | 3 +- .../ui/view/rowrepresentable/SessionRow.kt | 130 ++++++++++++------ 5 files changed, 195 insertions(+), 80 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 f14f0aa6..d2f5125e 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 @@ -649,8 +649,14 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat SessionRow.BANKROLL -> bankroll?.name ?: NULL_TEXT SessionRow.BLINDS -> getFormattedBlinds() SessionRow.BREAK_TIME -> if (this.breakDuration > 0.0) this.breakDuration.toMinutes() else NULL_TEXT +<<<<<<< HEAD SessionRow.BUY_IN -> this.result?.buyin?.toCurrency(currency) ?: NULL_TEXT SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> this.result?.cashout?.toCurrency(currency) ?: NULL_TEXT +======= + SessionRow.BUY_IN -> this.result?.buyin?.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 +>>>>>>> 0eba63f... Harmonizing number capture and management + fixing crashes SessionRow.COMMENT -> if (this.comment.isNotEmpty()) this.comment else NULL_TEXT SessionRow.END_DATE -> this.endDate?.shortDateTime() ?: NULL_TEXT SessionRow.GAME -> getFormattedGame() @@ -687,7 +693,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 } @@ -722,14 +728,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)) @@ -782,43 +788,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<*>) { @@ -837,7 +826,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() @@ -854,12 +842,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 20a4cdf76e174389be675fd31e8ad448799a600a Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 19:24:13 +0200 Subject: [PATCH 05/10] merge cherry-picking --- .../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 277a3b1c..01c247b9 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 -> - rate.toRate() - } ?: run { - 1.0.toRate() - } + val rate = this.bankroll.currency?.rate ?: 1.0 + rate.toRate() } else -> super.stringForRow(row) } From a27745bcc7c0aba907f23643b39ae787e79224ae Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 19:40:18 +0200 Subject: [PATCH 06/10] merge cherry-picking --- app/build.gradle | 4 ++++ .../android/model/realm/Session.kt | 23 +++++++++++-------- .../BottomSheetNumericTextFragment.kt | 10 +++++--- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 18f07644..065fb234 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,11 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 28 +<<<<<<< HEAD versionCode 8 +======= + versionCode 15 +>>>>>>> f5b9190... Fixes more crashes 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 d2f5125e..a5fff629 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 @@ -649,14 +649,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat SessionRow.BANKROLL -> bankroll?.name ?: NULL_TEXT SessionRow.BLINDS -> getFormattedBlinds() SessionRow.BREAK_TIME -> if (this.breakDuration > 0.0) this.breakDuration.toMinutes() else NULL_TEXT -<<<<<<< HEAD SessionRow.BUY_IN -> this.result?.buyin?.toCurrency(currency) ?: NULL_TEXT - SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> this.result?.cashout?.toCurrency(currency) ?: NULL_TEXT -======= - SessionRow.BUY_IN -> this.result?.buyin?.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 ->>>>>>> 0eba63f... Harmonizing number capture and management + fixing crashes + SessionRow.CASHED_OUT, SessionRow.PRIZE -> this.result?.cashout?.toCurrency(currency) ?: NULL_TEXT + SessionRow.NET_RESULT -> this.result?.netResult?.toCurrency(currency) ?: NULL_TEXT SessionRow.COMMENT -> if (this.comment.isNotEmpty()) this.comment else NULL_TEXT SessionRow.END_DATE -> this.endDate?.shortDateTime() ?: NULL_TEXT SessionRow.GAME -> getFormattedGame() @@ -830,10 +825,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 40a856536120d6daefacc2c9893f53d1ef44f4dc Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 19:47:19 +0200 Subject: [PATCH 07/10] 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 a5fff629..b13c5e89 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 @@ -823,7 +823,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) { @@ -852,9 +854,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 778825f2d0a939327f8d617351a92a87c78da981 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 09:34:59 +0200 Subject: [PATCH 08/10] Matching master version --- app/build.gradle | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 065fb234..4c62fa11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,11 +28,7 @@ android { applicationId "net.pokeranalytics.android" minSdkVersion 23 targetSdkVersion 28 -<<<<<<< HEAD - versionCode 8 -======= - versionCode 15 ->>>>>>> f5b9190... Fixes more crashes + versionCode 16 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } From 0bc2eb3fe4ec298b44909874efb6d5deeed74dc7 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 10:33:58 +0200 Subject: [PATCH 09/10] Refactored parameters for GraphFragment --- .../ui/activity/StatisticDetailsActivity.kt | 7 ++-- .../android/ui/fragment/GraphFragment.kt | 32 +++++++++++-------- .../ui/fragment/StatisticDetailsFragment.kt | 2 +- .../android/ui/fragment/StatsFragment.kt | 5 ++- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt index 4a9ef680..5a2b4d39 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt @@ -3,9 +3,8 @@ package net.pokeranalytics.android.ui.activity import android.content.Context import android.content.Intent import android.os.Bundle -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_graph.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.GraphParameters @@ -26,8 +25,8 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { /** * Default constructor */ - fun newInstance(context: Context, stat: Stat, entries: List) { - parameters = GraphParameters(stat, entries) + fun newInstance(context: Context, stat: Stat, report: Report) { + parameters = GraphParameters(stat, report) val intent = Intent(context, StatisticDetailsActivity::class.java) context.startActivity(intent) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt index 7e0b6647..6479fe10 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt @@ -15,22 +15,18 @@ import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import kotlinx.android.synthetic.main.fragment_evograph.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.calculus.GraphType -import net.pokeranalytics.android.calculus.ObjectIdentifier -import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.extensions.ChipGroupExtension +import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.graph.PALineDataSet import net.pokeranalytics.android.ui.graph.setStyle import net.pokeranalytics.android.ui.view.LegendView -import net.pokeranalytics.android.ui.extensions.ChipGroupExtension -import net.pokeranalytics.android.ui.extensions.px -import net.pokeranalytics.android.ui.extensions.toast import java.text.DateFormat -class GraphParameters(stat: Stat, entries: List) { - var stat: Stat = stat - var entries: List = entries +class GraphParameters(var stat: Stat, var report: Report) { + } class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { @@ -38,18 +34,27 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { private lateinit var parentActivity: PokerAnalyticsActivity private var stat: Stat = Stat.NETRESULT + private var reports: Map = hashMapOf() private var entries: List = ArrayList() lateinit var legendView: LegendView lateinit var chartView: BarLineChartBase<*> + private var aggregationTypes: List = listOf() + companion object { } - fun setData(stat: Stat, entries: List) { + fun setData(stat: Stat, report: Report) { this.stat = stat - this.entries = entries + + this.aggregationTypes = stat.aggregationTypes +// this.report = report + report.results.firstOrNull()?.defaultStatEntries(stat)?.let { + this.entries = it + } + } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -98,7 +103,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.chartView.highlightValue((this.entries.size - 1).toFloat(), 0) - this.stat.aggregationTypes.forEach { type -> + this.aggregationTypes.forEach { type -> val chip = Chip(requireContext()) chip.id = type.ordinal chip.text = requireContext().getString(type.resId) @@ -112,7 +117,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { super.onCheckedChanged(group, checkedId) - toast("Show: ${stat.aggregationTypes[group.getChildAt(checkedId).id].name}") + val aggregationType = aggregationTypes[checkedId] +// toast("Show: ${this.aggregationTypes[group.getChildAt(checkedId).id].name}") } }) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt index 50413327..bb5d8ad0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt @@ -61,7 +61,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { fragmentTransaction.commit() StatisticDetailsActivity.parameters?.let { - fragment.setData(it.stat, it.entries) + fragment.setData(it.stat, it.report) StatisticDetailsActivity.parameters = null } ?: run { throw Exception("Missing graph parameters") diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt index 14202d82..4c0c34e2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt @@ -225,6 +225,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc val realm = Realm.getDefaultInstance() val options = Calculator.Options() options.evolutionValues = Calculator.Options.EvolutionValues.STANDARD + options.displayedStats = listOf(stat) report = Calculator.computeGroups(realm, listOf(computableGroup), options) realm.close() @@ -236,9 +237,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc test.await() if (!isDetached) { - report.results.firstOrNull()?.defaultStatEntries(stat)?.let { entries -> - StatisticDetailsActivity.newInstance(requireContext(), stat, entries) - } + StatisticDetailsActivity.newInstance(requireContext(), stat, report) } } From f2b6fab607914e3965388e0fc00f7f85e0e2d349 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 10:57:54 +0200 Subject: [PATCH 10/10] cherry picking of b591ba9 --- .../java/net/pokeranalytics/android/model/realm/Bankroll.kt | 6 +----- .../android/ui/fragment/BankrollDataFragment.kt | 6 +++--- .../pokeranalytics/android/ui/fragment/SettingsFragment.kt | 1 - .../bottomsheet/BottomSheetNumericTextFragment.kt | 1 + .../android/ui/view/rowrepresentable/BankrollRow.kt | 4 ++-- 5 files changed, 7 insertions(+), 11 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 9ceba9f5..45f8dcd9 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 @@ -101,11 +101,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 01c247b9..6e5604ff 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,8 +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 - row.editingDescriptors(mapOf("defaultValue" to rate.toRate())) + val rate = this.bankroll.currency?.rate + row.editingDescriptors(mapOf("defaultValue" to rate)) } else -> null } @@ -204,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 3d681cee..4ed534d9 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 @@ -58,7 +58,6 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta private lateinit var settingsAdapterRow: RowRepresentableAdapter private lateinit var parentActivity: PokerAnalyticsActivity - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_settings, container, false) } 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