From 6aaa5e4fae02a1ed46dc9ac8e209bee6bedea2b0 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 11 Apr 2019 10:41:05 +0200 Subject: [PATCH 001/245] Add only time picker --- .../android/ui/helpers/DateTimePickerManager.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt b/app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt index eea9bd32..d5e26d36 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt @@ -23,6 +23,7 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener, private lateinit var calendar: Calendar private var minimumDate: Date? = null private var onlyDate: Boolean = false + private var onlyTime: Boolean = false private var isClearable: Boolean = true companion object { @@ -33,6 +34,7 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener, date: Date?, minimumDate: Date? = null, onlyDate: Boolean? = false, + onlyTime: Boolean? = false, isClearable: Boolean? = true ): DateTimePickerManager { @@ -46,9 +48,14 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener, dateTimePickerManager.calendar = calendar dateTimePickerManager.minimumDate = minimumDate dateTimePickerManager.onlyDate = onlyDate ?: false + dateTimePickerManager.onlyTime = onlyTime ?: false dateTimePickerManager.isClearable = isClearable ?: true - dateTimePickerManager.showDatePicker() + if (dateTimePickerManager.onlyTime) { + dateTimePickerManager.showTimePicker() + } else { + dateTimePickerManager.showDatePicker() + } return dateTimePickerManager } From 68304b806b5b7ab2b5f89299e63a083704b18051 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 11 Apr 2019 11:07:40 +0200 Subject: [PATCH 002/245] enable dev features --- .../android/ui/activity/HomeActivity.kt | 2 +- .../android/ui/fragment/StatsFragment.kt | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt index 071e2a81..39602da7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt @@ -61,7 +61,7 @@ class HomeActivity : PokerAnalyticsActivity() { menuInflater.inflate(R.menu.home_menu, menu) this.homeMenu = menu //TODO: Change filter button visibility - homeMenu?.findItem(R.id.filter)?.isVisible = false + homeMenu?.findItem(R.id.filter)?.isVisible = true return super.onCreateOptionsMenu(menu) } 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 4f112698..000e43de 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 @@ -199,17 +199,17 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { -// if (row is StatRepresentable) { -// -// // filter groups -// val groupResults = this.computedResults?.filter { -// it.group.name == row.groupName -// } -// -// groupResults?.firstOrNull()?.let { -// this.launchStatComputationWithEvolution(row.stat, it.group) -// } -// } + if (row is StatRepresentable) { + + // filter groups + val groupResults = this.computedResults?.filter { + it.group.name == row.groupName + } + + groupResults?.firstOrNull()?.let { + this.launchStatComputationWithEvolution(row.stat, it.group) + } + } } From e86cfbd610f17ca3d2a137ec2f248afcf29f809b Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 11 Apr 2019 12:02:11 +0200 Subject: [PATCH 003/245] Add Time picker for filters --- .../android/model/filter/QueryCondition.kt | 3 ++ .../android/model/realm/FilterCondition.kt | 2 +- .../ui/fragment/FilterDetailsFragment.kt | 7 ++-- .../view/rowrepresentable/FilterElementRow.kt | 33 +++++----------- .../view/rowrepresentable/FilterSectionRow.kt | 38 +++++++++++++++---- 5 files changed, 49 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index 077c866c..8b16e84b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -6,6 +6,7 @@ import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.realm.FilterCondition import net.pokeranalytics.android.model.realm.FilterElementBlind import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.extensions.endOfDay import net.pokeranalytics.android.util.extensions.startOfDay import java.util.* @@ -73,6 +74,8 @@ enum class QueryCondition(var operator: Operator? = null) { PAST_DAYS, MORE_THAN_DURATION(Operator.MORE), LESS_THAN_DURATION(Operator.LESS), + STARTED_FROM_TIME, + ENDED_TO_TIME, CURRENCY, CURRENCY_CODE, diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt index afada902..cd853f3d 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt @@ -116,7 +116,7 @@ open class FilterCondition() : RealmObject() { */ fun getFilterConditionValue(filterElementRow: FilterElementRow): Any? { return when (filterElementRow) { - is From, is To -> dateValue //TODO: Probably change by 'date' (doesn't work now because the value isn't correctly saved + is DateFilterElementRow -> date is PastDays -> values else -> throw PokerAnalyticsException.FilterElementTypeMissing(filterElementRow) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index 042ecb95..94fb9439 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -27,12 +27,13 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.shortDate +import net.pokeranalytics.android.util.extensions.shortTime import net.pokeranalytics.android.util.extensions.toMinutes import timber.log.Timber import java.util.* import kotlin.collections.ArrayList -open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { +open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { lateinit var parentActivity: PokerAnalyticsActivity lateinit var rowRepresentableAdapter: RowRepresentableAdapter @@ -69,7 +70,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta Timber.d("Row: $row") when (row) { - is FilterElementRow.DateFilterElementRow -> DateTimePickerManager.create(requireContext(), row, this, row.dateValue, onlyDate = true) + is FilterElementRow.DateFilterElementRow -> DateTimePickerManager.create(requireContext(), row, this, row.dateValue, onlyDate = !row.showTime, onlyTime = row.showTime) is FilterElementRow.PastDays -> { val pastDays = if (row.lastDays > 0) row.lastDays.toString() else "" val data = row.editingDescriptors(mapOf("pastDays" to pastDays)) @@ -107,7 +108,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta is FilterElementRow.PastDays -> if (row.lastDays > 0) row.lastDays.toString() else NULL_TEXT is FilterElementRow.LastGames -> if (row.lastGames > 0) row.lastGames.toString() else NULL_TEXT is FilterElementRow.LastSessions -> if (row.lastSessions > 0) row.lastSessions.toString() else NULL_TEXT - is FilterElementRow.DateFilterElementRow -> row.dateValue.shortDate() + is FilterElementRow.DateFilterElementRow -> if (row.showTime) row.dateValue.shortTime() else row.dateValue.shortDate() is FilterElementRow.AmountFilterElement -> if (row.amount > 0) row.amount.toString() else NULL_TEXT is FilterElementRow.DurationFilterElement -> row.minutes.toMinutes(requireContext()) else -> super.stringForRow(row) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index d1c6a567..ab8a11fe 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -28,7 +28,7 @@ sealed class FilterElementRow : RowRepresentable { interface LessOperator : Operator open class BoolFilterElementRow : FilterElementRow() - open class DateFilterElementRow(var dateValue: Date = Date()) : FilterElementRow() + open class DateFilterElementRow(var dateValue: Date = Date(), var showTime: Boolean = false) : FilterElementRow() open class NumericFilterElementRow(open val doubleValue: Double = 0.0) : FilterElementRow() open class StringFilterElementRow(val stringValue: String = "") : FilterElementRow() @@ -86,6 +86,10 @@ sealed class FilterElementRow : RowRepresentable { object From : DateFilterElementRow() object To : DateFilterElementRow() + object FromTime : DateFilterElementRow(showTime = true) + object ToTime : DateFilterElementRow(showTime = true) + + // Data classes - holding value object ResultMoreThan : AmountFilterElement(), MoreOperator @@ -153,6 +157,8 @@ sealed class FilterElementRow : RowRepresentable { is Blind -> QueryCondition.BLINDS is From -> QueryCondition.STARTED_FROM_DATE is To -> QueryCondition.ENDED_TO_DATE + is FromTime -> QueryCondition.STARTED_FROM_TIME + is ToTime -> QueryCondition.ENDED_TO_TIME is Month -> QueryCondition.MONTH is Day -> QueryCondition.DAY_OF_WEEK is Year -> QueryCondition.YEAR @@ -180,7 +186,6 @@ sealed class FilterElementRow : RowRepresentable { is DurationMoreThan -> QueryCondition.MORE_THAN_DURATION is DurationLessThan -> QueryCondition.LESS_THAN_DURATION - //TODO: Check the conditions is LastGames -> QueryCondition.LAST_GAMES is LastSessions -> QueryCondition.LAST_SESSIONS @@ -215,8 +220,8 @@ sealed class FilterElementRow : RowRepresentable { is CurrentWeek -> R.string.current_week is CurrentMonth -> R.string.current_month is CurrentYear -> R.string.current_year - is From -> R.string.from - is To -> R.string.to + is From, FromTime -> R.string.from + is To, ToTime -> R.string.to is Live -> R.string.live is Online -> R.string.online is Weekday -> R.string.week_days @@ -235,7 +240,7 @@ sealed class FilterElementRow : RowRepresentable { override val viewType: Int get() { return when (this) { - is PastDays, is From, is To, is LastGames, is LastSessions, is ReBuyMoreThan, is ReBuyLessThan, + is PastDays, is From, is To, is FromTime, is ToTime, is LastGames, is LastSessions, is ReBuyMoreThan, is ReBuyLessThan, is DurationMoreThan, is DurationLessThan -> RowViewType.TITLE_VALUE_CHECK.ordinal else -> RowViewType.TITLE_CHECK.ordinal } @@ -330,22 +335,4 @@ sealed class FilterElementRow : RowRepresentable { return null } - /* - override fun editingDescriptors(map: Map): ArrayList? { - when (this) { - PAST_DAYS -> { - val defaultValue: String? by map - val data = arrayListOf() - data.add( - RowRepresentableEditDescriptor( - defaultValue, - inputType = InputType.TYPE_CLASS_NUMBER - ) - ) - } - } - - return super.editingDescriptors(map) - } - */ } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt index 1c2006be..bebfde32 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt @@ -9,6 +9,8 @@ import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow.* +import net.pokeranalytics.android.util.extensions.endOfDay +import net.pokeranalytics.android.util.extensions.startOfDay import java.text.DateFormatSymbols import java.util.* @@ -86,7 +88,8 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { TABLE_SIZE -> { val tableSizes = arrayListOf() val realm = Realm.getDefaultInstance() - val distinctTableSizes = realm.where().distinct("tableSize").findAll().sort("tableSize", Sort.ASCENDING) + val distinctTableSizes = + realm.where().distinct("tableSize").findAll().sort("tableSize", Sort.ASCENDING) distinctTableSizes.forEach { session -> session.tableSize?.let { tableSize -> tableSizes.add(TableSize(net.pokeranalytics.android.model.TableSize(tableSize))) @@ -110,7 +113,8 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { YEAR -> { val years = arrayListOf() val realm = Realm.getDefaultInstance() - val distinctYears = realm.where().distinct("year").findAll().sort("year", Sort.DESCENDING) + val distinctYears = + realm.where().distinct("year").findAll().sort("year", Sort.DESCENDING) distinctYears.forEach { session -> session.year?.let { year -> years.add(Year(year)) @@ -140,8 +144,17 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { } // Duration - SESSION_DURATION -> arrayListOf(DurationMoreThan as FilterElementRow, DurationLessThan as FilterElementRow) - RANGE -> arrayListOf(From, To) + SESSION_DURATION -> arrayListOf( + DurationMoreThan as FilterElementRow, + DurationLessThan as FilterElementRow + ) + RANGE -> { + val fromTime = FromTime + fromTime.dateValue = Date().startOfDay() + val toTime = ToTime + toTime.dateValue = Date().endOfDay() + arrayListOf(fromTime, toTime) + } // Sessions SESSIONS -> arrayListOf(LastGames(0), LastSessions(0)) @@ -152,7 +165,9 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { // TODO: Improve the way we get the blinds distinctly val blinds = arrayListOf() val realm = Realm.getDefaultInstance() - val sessions = realm.where().findAll().sort("cgSmallBlind", Sort.ASCENDING) + val sessions = + realm.where().isNotNull("cgSmallBlind").isNotNull("cgBigBlind").findAll() + .sort("cgSmallBlind", Sort.ASCENDING) val distinctBlinds: ArrayList = ArrayList() val blindsHashMap: ArrayList = ArrayList() @@ -164,14 +179,23 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { } distinctBlinds.forEach { session -> - blinds.add(Blind(session.cgSmallBlind, session.cgBigBlind, session.bankroll?.currency?.code)) + blinds.add( + Blind( + session.cgSmallBlind, + session.cgBigBlind, + session.bankroll?.currency?.code + ) + ) session.getBlinds() } realm.close() blinds } - CASH_RE_BUY_COUNT -> arrayListOf(ReBuyMoreThan as FilterElementRow, ReBuyLessThan as FilterElementRow) + CASH_RE_BUY_COUNT -> arrayListOf( + ReBuyMoreThan as FilterElementRow, + ReBuyLessThan as FilterElementRow + ) // Tournament TOURNAMENT_TYPE -> arrayListOf() From f7496b197467052fae8c32c8a1feb4211a53441e Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 11 Apr 2019 12:23:49 +0200 Subject: [PATCH 004/245] Remove warning --- .../pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index 94fb9439..40a5f226 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -244,7 +244,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent private fun saveData() { //TODO: Save currentFilter details data Timber.d("Save data for filter: ${currentFilter?.id}") - selectedRows?.forEach { + selectedRows.forEach { Timber.d("Selected rows: $it") } From 345e6d73040e8b3e5f182e04739ad310b0370585 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Thu, 11 Apr 2019 13:58:06 +0200 Subject: [PATCH 005/245] update blind management, blind is now called stake throughout the project --- .../filter/BlindFilterInstrumentedTest.kt | 34 ++- .../android/model/filter/QueryCondition.kt | 287 ++++++++---------- .../android/model/realm/Bankroll.kt | 11 + .../android/model/realm/Currency.kt | 11 +- .../android/model/realm/FilterCondition.kt | 22 +- .../android/model/realm/FilterElementBlind.kt | 8 - .../android/model/realm/Session.kt | 22 +- .../rowrepresentable/FilterCategoryRow.kt | 2 +- .../view/rowrepresentable/FilterElementRow.kt | 16 +- .../view/rowrepresentable/FilterSectionRow.kt | 29 +- 10 files changed, 190 insertions(+), 252 deletions(-) delete mode 100644 app/src/main/java/net/pokeranalytics/android/model/realm/FilterElementBlind.kt diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt index d19cee4a..c4cf68aa 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt @@ -42,9 +42,9 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.BLINDS - val blind = FilterElementRow.Blind(0.5, 1.0, null) - blind.filterSectionRow = FilterSectionRow.BLINDS + val filter = QueryCondition.STAKE + val blind = FilterElementRow.Stake(s1.getBlinds()) + blind.filterSectionRow = FilterSectionRow.STAKE val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) filter.updateValueMap(filterElement) @@ -86,12 +86,14 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.BLINDS - val blind = FilterElementRow.Blind(null, 1.0, null) - blind.filterSectionRow = FilterSectionRow.BLINDS + val filter = QueryCondition.STAKE + val blind1 = FilterElementRow.Stake(s1.getBlinds()) + val blind2 = FilterElementRow.Stake(s2.getBlinds()) + blind1.filterSectionRow = FilterSectionRow.STAKE + blind2.filterSectionRow = FilterSectionRow.STAKE - val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) - filter.updateValueMap(filterElement) + val filterElements = FilterCondition(filterElementRows = arrayListOf(blind1, blind2)) + filter.updateValueMap(filterElements) val sessions = Filter.queryOn(realm, arrayListOf(filter)) @@ -129,9 +131,9 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.BLINDS - val blind = FilterElementRow.Blind(1.0, 2.0, "AUD") - blind.filterSectionRow = FilterSectionRow.BLINDS + val filter = QueryCondition.STAKE + val blind = FilterElementRow.Stake(s3.getBlinds()) + blind.filterSectionRow = FilterSectionRow.STAKE val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) filter.updateValueMap(filterElement) @@ -172,12 +174,12 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.BLINDS - val blind1 = FilterElementRow.Blind(1.0, 2.0, null) - blind1.filterSectionRow = FilterSectionRow.BLINDS + val filter = QueryCondition.STAKE + val blind1 = FilterElementRow.Stake(s1.getBlinds()) + blind1.filterSectionRow = FilterSectionRow.STAKE - val blind2 = FilterElementRow.Blind(0.5, 1.0, null) - blind2.filterSectionRow = FilterSectionRow.BLINDS + val blind2 = FilterElementRow.Stake(s2.getBlinds()) + blind2.filterSectionRow = FilterSectionRow.STAKE val filterElement = FilterCondition(filterElementRows = arrayListOf(blind1, blind2)) filter.updateValueMap(filterElement) diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index 077c866c..53ff2a7f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -1,10 +1,8 @@ package net.pokeranalytics.android.model.filter -import io.realm.RealmList import io.realm.RealmQuery import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.realm.FilterCondition -import net.pokeranalytics.android.model.realm.FilterElementBlind import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.util.extensions.endOfDay import net.pokeranalytics.android.util.extensions.startOfDay @@ -31,7 +29,7 @@ enum class QueryCondition(var operator: Operator? = null) { LIMIT, TABLE_SIZE, TOURNAMENT_TYPE, - BLINDS, + STAKE, LAST_GAMES, LAST_SESSIONS, MORE_NUMBER_OF_TABLE(Operator.MORE), @@ -74,10 +72,6 @@ enum class QueryCondition(var operator: Operator? = null) { MORE_THAN_DURATION(Operator.MORE), LESS_THAN_DURATION(Operator.LESS), - CURRENCY, - CURRENCY_CODE, - BIG_BLIND, - SMALL_BLIND, COMMENT, ; @@ -115,7 +109,7 @@ enum class QueryCondition(var operator: Operator? = null) { return when (this) { BANKROLL, GAME, LOCATION, ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES, TOURNAMENT_NAME -> arrayOf("ids") LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> arrayOf("values") - BLINDS -> arrayOf("blinds") + STAKE -> arrayOf("stakes") STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> arrayOf("date") DAY_OF_WEEK -> arrayOf("dayOfWeek") MONTH -> arrayOf("month") @@ -129,169 +123,128 @@ enum class QueryCondition(var operator: Operator? = null) { * providing a base RealmQuery [realmQuery], the method is able to attached the corresponding query and returns the newly formed [RealmQuery] */ inline fun filter(realmQuery: RealmQuery): RealmQuery { - when { - this == BLINDS -> { - - val smallBlindFieldName = FilterHelper.fieldNameForQueryType(SMALL_BLIND) - val bigBlindFieldName = FilterHelper.fieldNameForQueryType(BIG_BLIND) - val currencyCodeFieldName = FilterHelper.fieldNameForQueryType(CURRENCY_CODE) - smallBlindFieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown - bigBlindFieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown - currencyCodeFieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown - - val blinds: RealmList by valueMap - blinds.forEachIndexed { index, blind -> - realmQuery - .beginGroup() - - blind.sb?.let { - realmQuery - .equalTo(smallBlindFieldName, it) - .and() - } - - realmQuery - .equalTo(bigBlindFieldName, blind.bb) - .and() - - blind.currencyCode?.let { - realmQuery.equalTo(currencyCodeFieldName, it) - } ?: run { - realmQuery.isNull(currencyCodeFieldName) - } - - realmQuery.endGroup() - - if (index < blinds.size - 1) { - realmQuery.or() - } - } - return realmQuery + val fieldName = FilterHelper.fieldNameForQueryType(this) + fieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown + when (operator) { + Operator.LESS -> { + val value: Double by valueMap + return realmQuery.lessThanOrEqualTo(fieldName, value) } - else -> { - - val fieldName = FilterHelper.fieldNameForQueryType(this) - fieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown + Operator.MORE -> { + val value: Double by valueMap + return realmQuery.greaterThanOrEqualTo(fieldName, value) + } + Operator.BETWEEN -> { + val leftValue: Double by valueMap + val rightValue: Double by valueMap + return realmQuery.between(fieldName, leftValue, rightValue) + } + } - when (operator) { - Operator.LESS -> { - val value: Double by valueMap - return realmQuery.lessThanOrEqualTo(fieldName, value) - } - Operator.MORE -> { - val value: Double by valueMap - return realmQuery.greaterThanOrEqualTo(fieldName, value) - } - Operator.BETWEEN -> { - val leftValue: Double by valueMap - val rightValue: Double by valueMap - return realmQuery.between(fieldName, leftValue, rightValue) - } + return when (this) { + LIVE, ONLINE -> realmQuery.equalTo(fieldName, this == LIVE) + CASH -> realmQuery.equalTo(fieldName, Session.Type.CASH_GAME.ordinal) + TOURNAMENT -> realmQuery.equalTo(fieldName, Session.Type.TOURNAMENT.ordinal) + ALL_TOURNAMENT_FEATURES -> { + val ids: Array by valueMap + ids.forEach { + realmQuery.equalTo(fieldName, it) } - - return when (this) { - LIVE, ONLINE -> realmQuery.equalTo(fieldName, this == LIVE) - CASH -> realmQuery.equalTo(fieldName, Session.Type.CASH_GAME.ordinal) - TOURNAMENT -> realmQuery.equalTo(fieldName, Session.Type.TOURNAMENT.ordinal) - ALL_TOURNAMENT_FEATURES -> { - val ids: Array by valueMap - ids.forEach { - realmQuery.equalTo(fieldName, it) - } - realmQuery - } - ANY_TOURNAMENT_FEATURES -> { - val ids: Array by valueMap - realmQuery.`in`(fieldName, ids) - } - BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { - val ids: Array by valueMap - realmQuery.`in`(fieldName, ids) - } - LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { - val values: Array? by valueMap - realmQuery.`in`(fieldName, values) - } - STARTED_FROM_DATE -> { - val date: Date by valueMap - realmQuery.greaterThanOrEqualTo(fieldName, date) - } - STARTED_TO_DATE -> { - val date: Date by valueMap - realmQuery.lessThanOrEqualTo(fieldName, date) - } - ENDED_FROM_DATE -> { - val date: Date by valueMap - realmQuery.greaterThanOrEqualTo(fieldName, date) - } - ENDED_TO_DATE -> { - val date: Date by valueMap - realmQuery.lessThanOrEqualTo(fieldName, date) - } - DAY_OF_WEEK -> { - val dayOfWeek: Int by valueMap - realmQuery.equalTo(fieldName, dayOfWeek) - } - MONTH -> { - val month: Int by valueMap - realmQuery.equalTo(fieldName, month) - } - YEAR -> { - val year: Int by valueMap - realmQuery.equalTo(fieldName, year) - } - WEEK_END, WEEK_DAY -> { - var query = realmQuery - if (this == WEEK_DAY) { - query = realmQuery.not() - } - query.`in`(fieldName, arrayOf(Calendar.SATURDAY, Calendar.SUNDAY)) - } - TODAY -> { - val startDate = Date() - realmQuery.between(fieldName, startDate.startOfDay(), startDate.endOfDay()) - } - TODAY_AND_YESTERDAY-> { - val startDate = Date() - val calendar = Calendar.getInstance() - calendar.time = startDate - calendar.add(Calendar.HOUR_OF_DAY, -24) - realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) - } - YESTERDAY -> { - val calendar = Calendar.getInstance() - calendar.time = Date() - calendar.add(Calendar.HOUR_OF_DAY, -24) - realmQuery.between(fieldName, calendar.time.startOfDay(), calendar.time.endOfDay()) - } - THIS_WEEK -> { - val startDate = Date() - val calendar = Calendar.getInstance() - calendar.time = startDate - calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, Calendar.SUNDAY) - realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) - } - THIS_MONTH -> { - val startDate = Date() - val calendar = Calendar.getInstance() - calendar.time = startDate - calendar.set(Calendar.DAY_OF_MONTH, 1) - realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) - } - THIS_YEAR -> { - val startDate = Date() - val calendar = Calendar.getInstance() - calendar.time = startDate - calendar.set(Calendar.DAY_OF_YEAR, 1) - realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) - } - else -> { - throw PokerAnalyticsException.QueryTypeUnhandled - } + realmQuery + } + ANY_TOURNAMENT_FEATURES -> { + val ids: Array by valueMap + realmQuery.`in`(fieldName, ids) + } + STAKE -> { + val stakes: Array by valueMap + realmQuery.`in`(fieldName, stakes) + } + BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { + val ids: Array by valueMap + realmQuery.`in`(fieldName, ids) + } + LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { + val values: Array? by valueMap + realmQuery.`in`(fieldName, values) + } + STARTED_FROM_DATE -> { + val date: Date by valueMap + realmQuery.greaterThanOrEqualTo(fieldName, date) + } + STARTED_TO_DATE -> { + val date: Date by valueMap + realmQuery.lessThanOrEqualTo(fieldName, date) + } + ENDED_FROM_DATE -> { + val date: Date by valueMap + realmQuery.greaterThanOrEqualTo(fieldName, date) + } + ENDED_TO_DATE -> { + val date: Date by valueMap + realmQuery.lessThanOrEqualTo(fieldName, date) + } + DAY_OF_WEEK -> { + val dayOfWeek: Int by valueMap + realmQuery.equalTo(fieldName, dayOfWeek) + } + MONTH -> { + val month: Int by valueMap + realmQuery.equalTo(fieldName, month) + } + YEAR -> { + val year: Int by valueMap + realmQuery.equalTo(fieldName, year) + } + WEEK_END, WEEK_DAY -> { + var query = realmQuery + if (this == WEEK_DAY) { + query = realmQuery.not() } + query.`in`(fieldName, arrayOf(Calendar.SATURDAY, Calendar.SUNDAY)) + } + TODAY -> { + val startDate = Date() + realmQuery.between(fieldName, startDate.startOfDay(), startDate.endOfDay()) + } + TODAY_AND_YESTERDAY-> { + val startDate = Date() + val calendar = Calendar.getInstance() + calendar.time = startDate + calendar.add(Calendar.HOUR_OF_DAY, -24) + realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) + } + YESTERDAY -> { + val calendar = Calendar.getInstance() + calendar.time = Date() + calendar.add(Calendar.HOUR_OF_DAY, -24) + realmQuery.between(fieldName, calendar.time.startOfDay(), calendar.time.endOfDay()) + } + THIS_WEEK -> { + val startDate = Date() + val calendar = Calendar.getInstance() + calendar.time = startDate + calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, Calendar.SUNDAY) + realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) + } + THIS_MONTH -> { + val startDate = Date() + val calendar = Calendar.getInstance() + calendar.time = startDate + calendar.set(Calendar.DAY_OF_MONTH, 1) + realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) + } + THIS_YEAR -> { + val startDate = Date() + val calendar = Calendar.getInstance() + calendar.time = startDate + calendar.set(Calendar.DAY_OF_YEAR, 1) + realmQuery.between(fieldName, calendar.time.startOfDay(), startDate.endOfDay()) + } + else -> { + throw PokerAnalyticsException.QueryTypeUnhandled } } - } fun updateValueMap(filterCondition: FilterCondition) { @@ -311,8 +264,8 @@ enum class QueryCondition(var operator: Operator? = null) { LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { valueMap = mapOf("values" to filterCondition.values) } - BLINDS -> { - valueMap = mapOf("blinds" to filterCondition.blinds) + STAKE -> { + valueMap = mapOf("stakes" to filterCondition.stakes) } STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> { valueMap = mapOf("date" to filterCondition.date) 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..55f0d897 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 @@ -3,6 +3,8 @@ package net.pokeranalytics.android.model.realm import io.realm.Realm import io.realm.RealmList import io.realm.RealmObject +import io.realm.RealmResults +import io.realm.annotations.LinkingObjects import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R @@ -32,6 +34,9 @@ open class Bankroll() : RealmObject(), NameManageable, StaticRowRepresentableDat } } + @LinkingObjects("bankroll") + private val sessions: RealmResults? = null + @PrimaryKey override var id = UUID.randomUUID().toString() @@ -46,6 +51,12 @@ open class Bankroll() : RealmObject(), NameManageable, StaticRowRepresentableDat // The currency of the bankroll var currency: Currency? = null + fun currencyCodeHasBeenUpdated() { + sessions?.forEach { + it.bankrollHasBeenUpdated() + } + } + override fun getDisplayName(): String { return this.name } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt index e6b96fca..39463454 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt @@ -1,7 +1,9 @@ package net.pokeranalytics.android.model.realm import io.realm.RealmObject +import io.realm.RealmResults import io.realm.annotations.Ignore +import io.realm.annotations.LinkingObjects import io.realm.annotations.PrimaryKey import java.util.* @@ -13,10 +15,17 @@ open class Currency : RealmObject() { @PrimaryKey var id = UUID.randomUUID().toString() - /** + @LinkingObjects("currency") + private val bankrolls: RealmResults? = null + + /** * The currency code of the currency, i.e. USD, EUR... */ var code: String? = null + set(value) { + field = value + bankrolls?.first()?.currencyCodeHasBeenUpdated() + } /** * The rate of the currency with the main currency diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt index afada902..aa7e6b01 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt @@ -37,13 +37,6 @@ open class FilterCondition() : RealmObject() { }) } } - is FilterElementBlind -> { - this.blindValues = RealmList().apply { - this.addAll(filterElementRows.map { - FilterElementBlind((it as FilterElementRow.Blind).sb, it.bb, it.code) - }) - } - } } } @@ -59,23 +52,12 @@ open class FilterCondition() : RealmObject() { private var numericValues: RealmList? = null private var dateValue: Date? = null private var stringValues: RealmList? = null - private var blindValues: RealmList? = null val ids: Array get() = stringValues?.toTypedArray() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing - val blinds: RealmList - get() { - blindValues?.let { - if (it.isNotEmpty()) { - return it - } else { - throw PokerAnalyticsException.FilterElementExpectedValueMissing - } - } - throw PokerAnalyticsException.FilterElementExpectedValueMissing - } - + val stakes: Array + get() = stringValues?.toTypedArray() ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing val date: Date get() = dateValue ?: throw PokerAnalyticsException.FilterElementExpectedValueMissing diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterElementBlind.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterElementBlind.kt deleted file mode 100644 index ebde6cad..00000000 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterElementBlind.kt +++ /dev/null @@ -1,8 +0,0 @@ -package net.pokeranalytics.android.model.realm - -import io.realm.RealmObject - -open class FilterElementBlind(var sb : Double? = null, - var bb : Double? = null, - var currencyCode : String? = null -) : RealmObject() \ 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 8bf81de2..12125fac 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 @@ -78,10 +78,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat LIMIT -> "limit" TABLE_SIZE -> "tableSize" TOURNAMENT_TYPE -> "tournamentType" - CURRENCY -> "bankroll.currency" - CURRENCY_CODE -> "bankroll.currency.code" - BIG_BLIND -> "cgBigBlind" - SMALL_BLIND -> "cgSmallBlind" + STAKE -> "stake" COMMENT -> "comment" BETWEEN_NUMBER_OF_TABLE, MORE_NUMBER_OF_TABLE, LESS_NUMBER_OF_TABLE -> "numberOfTable" MORE_THAN_NET_RESULT, LESS_THAN_NET_RESULT -> "computableResults.ratedNet" @@ -220,14 +217,27 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // The small blind value var cgSmallBlind: Double? = null + set(value) { + field = value + this.stake = getBlinds() + } // The big blind value var cgBigBlind: Double? = null set(value) { field = value this.computeStats() + this.stake = getBlinds() } + private var stake: String? = null + get() { + if (field == null) { + field = getBlinds() + } + return field + } + // Tournament // The entry fee of the tournament @@ -245,6 +255,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // The features of the tournament, like Knockout, Shootout, Turbo... var tournamentFeatures: RealmList = RealmList() + fun bankrollHasBeenUpdated() { + this.stake = getBlinds() + } + /** * Manages impacts on SessionSets * Should be called when the start / end date are changed diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt index e9ac2482..4ba5534f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt @@ -54,7 +54,7 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In BANKROLL ) CASH -> arrayListOf( - BLINDS, + STAKE, CASH_RE_BUY_COUNT ) TOURNAMENT -> arrayListOf( diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index d1c6a567..8c39c4ec 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -11,9 +11,6 @@ import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheet import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.util.NULL_TEXT -import net.pokeranalytics.android.util.extensions.formatted -import net.pokeranalytics.android.util.extensions.round import java.text.DateFormatSymbols import java.util.* @@ -100,14 +97,7 @@ sealed class FilterElementRow : RowRepresentable { data class Month(val month: Int) : SingleValueFilterElementRow(month) data class Day(val day: Int) : SingleValueFilterElementRow(day) - data class Blind(var sb: Double? = null, var bb: Double? = null, var code: String? = null) : FilterElementRow() { - val name: String - get() { - val currencyCode = code ?: Currency.getInstance(Locale.getDefault()).currencyCode - val currencySymbol = Currency.getInstance(currencyCode).symbol - return if (sb == null) NULL_TEXT else "$currencySymbol ${sb?.formatted()}/${bb?.round()}" - } - } + data class Stake(val stake : String) : StringFilterElementRow(stake) //TODO: Refactor? data class PastDays(var lastDays: Int = 0) : SingleValueFilterElementRow(lastDays) { @@ -150,7 +140,7 @@ sealed class FilterElementRow : RowRepresentable { return when (this) { is Cash -> QueryCondition.CASH is Tournament -> QueryCondition.TOURNAMENT - is Blind -> QueryCondition.BLINDS + is Stake -> QueryCondition.STAKE is From -> QueryCondition.STARTED_FROM_DATE is To -> QueryCondition.ENDED_TO_DATE is Month -> QueryCondition.MONTH @@ -302,7 +292,7 @@ sealed class FilterElementRow : RowRepresentable { } is DataFilterElementRow -> this.name is StaticDataFilterElementRow -> this.name - is Blind -> this.name + is Stake -> this.stake else -> super.getDisplayName() } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt index 1c2006be..918d8db2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt @@ -28,7 +28,7 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { SESSION_DURATION(net.pokeranalytics.android.R.string.session_duration), RANGE(net.pokeranalytics.android.R.string.hour_slot), SESSIONS(R.string.sessions), - BLINDS(net.pokeranalytics.android.R.string.blinds), + STAKE(net.pokeranalytics.android.R.string.stakes), CASH_RE_BUY_COUNT(net.pokeranalytics.android.R.string.rebuy_count), TOURNAMENT_TYPE(net.pokeranalytics.android.R.string.tournament_types), TOURNAMENT_NAME(net.pokeranalytics.android.R.string.tournament_name), @@ -147,29 +147,14 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { SESSIONS -> arrayListOf(LastGames(0), LastSessions(0)) // Cash - BLINDS -> { - - // TODO: Improve the way we get the blinds distinctly - val blinds = arrayListOf() + STAKE -> { + val stakes = arrayListOf() val realm = Realm.getDefaultInstance() - val sessions = realm.where().findAll().sort("cgSmallBlind", Sort.ASCENDING) - - val distinctBlinds: ArrayList = ArrayList() - val blindsHashMap: ArrayList = ArrayList() - sessions.forEach { - if (!blindsHashMap.contains(it.getBlinds())) { - blindsHashMap.add(it.getBlinds()) - distinctBlinds.add(it) - } - } - - distinctBlinds.forEach { session -> - blinds.add(Blind(session.cgSmallBlind, session.cgBigBlind, session.bankroll?.currency?.code)) - session.getBlinds() - } + realm.where().distinct("stake").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { + stakes.add(Stake(it.getBlinds())) + } realm.close() - - blinds + stakes } CASH_RE_BUY_COUNT -> arrayListOf(ReBuyMoreThan as FilterElementRow, ReBuyLessThan as FilterElementRow) From 6941555e34fc6f8d980df52e93a438d925b52861 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 11 Apr 2019 14:13:20 +0200 Subject: [PATCH 006/245] Update proguard rules --- app/proguard-rules.pro | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index baeaae1c..e4b45cbc 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -57,4 +57,7 @@ # Guava -dontwarn com.google.j2objc.annotations.** --keep class com.google.j2objc.annotations.** { *; } \ No newline at end of file +-keep class com.google.j2objc.annotations.** { *; } + +# Enum +-optimizations !class/unboxing/enum \ No newline at end of file From 3b512b0fa249250edb8faca5d969542a52f2f53f Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 11 Apr 2019 14:17:07 +0200 Subject: [PATCH 007/245] Fix currency crash --- .../android/model/realm/Session.kt | 2 +- .../android/model/utils/Seed.kt | 22 ++++++++++++------- .../view/rowrepresentable/FilterElementRow.kt | 3 ++- .../android/util/CurrencyUtils.kt | 21 +++++++++++++++++- 4 files changed, 37 insertions(+), 11 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 8bf81de2..486aca1b 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 @@ -486,7 +486,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat * Return the formatted blinds */ fun getBlinds(): String { - val currencyCode = bankroll?.currency?.code ?: Currency.getInstance(Locale.getDefault()).currencyCode + val currencyCode = bankroll?.currency?.code ?: CurrencyUtils.getLocaleCurrency().currencyCode val currencySymbol = Currency.getInstance(currencyCode).symbol return if (cgSmallBlind == null) NULL_TEXT else "$currencySymbol ${cgSmallBlind?.formatted()}/${cgBigBlind?.round()}" } diff --git a/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt b/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt index 2604de61..455499be 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt @@ -3,12 +3,15 @@ package net.pokeranalytics.android.model.utils import android.content.Context import io.realm.Realm import io.realm.kotlin.where -import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.realm.* +import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Currency -import net.pokeranalytics.android.util.Preferences +import net.pokeranalytics.android.model.realm.Game +import net.pokeranalytics.android.model.realm.TournamentFeature +import net.pokeranalytics.android.util.CurrencyUtils import java.util.* + + class Seed(var context:Context) : Realm.Transaction { override fun execute(realm: Realm) { @@ -18,7 +21,7 @@ class Seed(var context:Context) : Realm.Transaction { } private fun createDefaultTournamentFeatures(realm: Realm) { - context.resources.getStringArray(R.array.seed_tournament_features).forEach { + context.resources.getStringArray(net.pokeranalytics.android.R.array.seed_tournament_features).forEach { val tournamentFeature = TournamentFeature() tournamentFeature.id = UUID.randomUUID().toString() tournamentFeature.name = it @@ -27,23 +30,26 @@ class Seed(var context:Context) : Realm.Transaction { } private fun createDefaultCurrencyAndBankroll(realm: Realm) { + + Locale.setDefault(Locale.JAPANESE) + // Currency - val localeCurrency = java.util.Currency.getInstance(Locale.getDefault()) + val localeCurrency = CurrencyUtils.getLocaleCurrency() val defaultCurrency = Currency() defaultCurrency.code = localeCurrency.currencyCode realm.insertOrUpdate(defaultCurrency) // Bankroll val bankroll = Bankroll() - bankroll.name = context.resources.getString(R.string.live) + bankroll.name = context.resources.getString(net.pokeranalytics.android.R.string.live) bankroll.live = true bankroll.currency = realm.where().equalTo("code", localeCurrency.currencyCode).findFirst() realm.insertOrUpdate(bankroll) } private fun createDefaultGames(realm: Realm) { - val gamesName = context.resources.getStringArray(R.array.seed_games) - val gamesShortName = context.resources.getStringArray(R.array.seed_games_short_name) + val gamesName = context.resources.getStringArray(net.pokeranalytics.android.R.array.seed_games) + val gamesShortName = context.resources.getStringArray(net.pokeranalytics.android.R.array.seed_games_short_name) for ((index, name) in gamesName.withIndex()) { val game = Game() game.id = UUID.randomUUID().toString() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index ab8a11fe..d66d513f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -11,6 +11,7 @@ import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheet import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.util.CurrencyUtils import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.formatted import net.pokeranalytics.android.util.extensions.round @@ -107,7 +108,7 @@ sealed class FilterElementRow : RowRepresentable { data class Blind(var sb: Double? = null, var bb: Double? = null, var code: String? = null) : FilterElementRow() { val name: String get() { - val currencyCode = code ?: Currency.getInstance(Locale.getDefault()).currencyCode + val currencyCode = code ?: CurrencyUtils.getLocaleCurrency().currencyCode val currencySymbol = Currency.getInstance(currencyCode).symbol return if (sb == null) NULL_TEXT else "$currencySymbol ${sb?.formatted()}/${bb?.round()}" } diff --git a/app/src/main/java/net/pokeranalytics/android/util/CurrencyUtils.kt b/app/src/main/java/net/pokeranalytics/android/util/CurrencyUtils.kt index 861ada82..2aa76778 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/CurrencyUtils.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/CurrencyUtils.kt @@ -13,7 +13,7 @@ class CurrencyUtils { * return the currency associated with this bankroll */ fun getCurrency(bankroll: Bankroll? = null) : Currency { - val currencyCode = bankroll?.currency?.code ?: Currency.getInstance(Locale.getDefault()).currencyCode + val currencyCode = bankroll?.currency?.code ?: CurrencyUtils.getLocaleCurrency().currencyCode return Currency.getInstance(currencyCode) } @@ -40,6 +40,25 @@ class CurrencyUtils { return currencyFormatter } + /** + * Return the locale currency, or en_US if there + */ + fun getLocaleCurrency() : Currency { + return try { + Currency.getInstance(Locale.getDefault()) + } catch (ex: Exception) { + when (Locale.getDefault().language) { + "en" -> Currency.getInstance(Locale("en", "US")) + "fr" -> Currency.getInstance(Locale("fr", "FR")) + "es" -> Currency.getInstance(Locale("es", "ES")) + "de" -> Currency.getInstance(Locale("de", "DE")) + "ja" -> Currency.getInstance(Locale("ja", "JP")) + "zh" -> Currency.getInstance(Locale("zh", "CN")) + else -> Currency.getInstance(Locale("en", "US")) + } + } + } + } } \ No newline at end of file From ace7d7a6b6098bfb01cedb08ec4496f98d8e46a5 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 11 Apr 2019 14:43:37 +0200 Subject: [PATCH 008/245] Calculator now wraps object in a Report, Report -> ReportSetup + file renaming --- .../android/calculus/Calculator.kt | 10 +++--- .../{ComputableGroup.kt => Report.kt} | 24 ++++++++++++++ .../calculus/{Format.kt => TextFormat.kt} | 0 .../migrations/PokerAnalyticsMigration.kt | 1 + .../model/realm/{Report.kt => ReportSetup.kt} | 2 +- .../android/ui/fragment/StatsFragment.kt | 32 +++++++++---------- 6 files changed, 47 insertions(+), 22 deletions(-) rename app/src/main/java/net/pokeranalytics/android/calculus/{ComputableGroup.kt => Report.kt} (91%) rename app/src/main/java/net/pokeranalytics/android/calculus/{Format.kt => TextFormat.kt} (100%) rename app/src/main/java/net/pokeranalytics/android/model/realm/{Report.kt => ReportSetup.kt} (94%) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index f3cb17b3..2617ae13 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -60,7 +60,7 @@ class Calculator { companion object { - fun computeStatsWithFilters(realm: Realm, filters: List, options: Options): List { + fun computeStatsWithFilters(realm: Realm, filters: List, options: Options): Report { var computableGroups: MutableList = mutableListOf() filters.forEach { filter -> @@ -75,9 +75,9 @@ class Calculator { /** * Computes all stats for list of Session sessionGroup */ - fun computeGroups(realm: Realm, groups: List, options: Options): List { + fun computeGroups(realm: Realm, groups: List, options: Options): Report { - val computedResults = mutableListOf() + val report = Report() groups.forEach { group -> val s = Date() @@ -96,7 +96,7 @@ class Calculator { } results.finalize(options) // later treatment, such as evolution numericValues sorting - computedResults.add(results) + report.addResults(results) val e = Date() val duration = (e.time - s.time) / 1000.0 @@ -104,7 +104,7 @@ class Calculator { } - return computedResults + return report } /** diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt similarity index 91% rename from app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt rename to app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index b1fdf74f..9a22521c 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/ComputableGroup.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -10,6 +10,30 @@ import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.SessionSet +class Report() { + + private var _results: MutableList = mutableListOf() + + val results: List = this._results + +// private var groups: MutableList = mutableListOf() +// +// var options: Calculator.Options = options +// +// fun addGroup(group: ComputableGroup) { +// this.groups.add(group) +// } +// +// fun addGroups(groups: Collection) { +// this.groups.addAll(groups) +// } + + fun addResults(result: ComputedResults) { + this._results.add(result) + } + +} + /** * A sessionGroup of computable items identified by a name */ diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Format.kt b/app/src/main/java/net/pokeranalytics/android/calculus/TextFormat.kt similarity index 100% rename from app/src/main/java/net/pokeranalytics/android/calculus/Format.kt rename to app/src/main/java/net/pokeranalytics/android/calculus/TextFormat.kt 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..1513a8aa 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 @@ -36,6 +36,7 @@ class PokerAnalyticsMigration : RealmMigration { if (currentVersion == 1) { Timber.d("*** Running migration ${currentVersion + 1}") + schema.rename("Report", "ReportSetup") schema.rename("FilterElement", "FilterCondition") schema.get("Filter")?.let { it.renameField("filterElements", "filterConditions") diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Report.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt similarity index 94% rename from app/src/main/java/net/pokeranalytics/android/model/realm/Report.kt rename to app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt index abf711a9..2edad050 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt @@ -11,7 +11,7 @@ enum class ReportDisplay { MAP } -open class Report : RealmObject() { +open class ReportSetup : RealmObject() { @PrimaryKey var id = UUID.randomUUID().toString() 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 000e43de..65cb1378 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 @@ -37,7 +37,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc private var stringTournament = "" private lateinit var statsAdapter: RowRepresentableAdapter - private var computedResults : List? = null + private var report : Report? = null companion object { @@ -137,31 +137,31 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc GlobalScope.launch(coroutineContext) { - var results = listOf() + var r = Report() val test = GlobalScope.async { val s = Date() Timber.d(">>> start...") val realm = Realm.getDefaultInstance() - results = createSessionGroupsAndStartCompute(realm) - computedResults = results + r = createSessionGroupsAndStartCompute(realm) + report = r realm.close() val e = Date() val duration = (e.time - s.time) / 1000.0 - Timber.d(">>> ended in ${duration} seconds") + Timber.d(">>> ended in $duration seconds") } test.await() if (!isDetached) { - showResults(results) + showResults(r) } } } - private fun createSessionGroupsAndStartCompute(realm: Realm) : List { + private fun createSessionGroupsAndStartCompute(realm: Realm) : Report { val allStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NUMBER_OF_SETS, Stat.AVERAGE_DURATION, Stat.DURATION) val allSessionGroup = ComputableGroup(stringAll, listOf(), allStats) @@ -176,16 +176,16 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc } - private fun showResults(results: List) { - this.rowRepresentables = this.convertResultsIntoRepresentables(results) + private fun showResults(report: Report) { + this.rowRepresentables = this.convertReportIntoRepresentables(report) statsAdapter.notifyDataSetChanged() } - private fun convertResultsIntoRepresentables(results: List) : ArrayList { + private fun convertReportIntoRepresentables(report: Report) : ArrayList { val rows: ArrayList = ArrayList() - results.forEach { result -> + report.results.forEach { result -> rows.add(CustomizableRowRepresentable(title = result.group.name)) result.group.stats?.forEach { stat -> rows.add(StatRepresentable(stat, result.computedStat(stat), result.group.name)) @@ -202,7 +202,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc if (row is StatRepresentable) { // filter groups - val groupResults = this.computedResults?.filter { + val groupResults = this.report?.results?.filter { it.group.name == row.groupName } @@ -217,7 +217,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc GlobalScope.launch(coroutineContext) { - var results = listOf() + var report = Report() val test = GlobalScope.async { val s = Date() Timber.d(">>> start...") @@ -225,18 +225,18 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc val realm = Realm.getDefaultInstance() val options = Calculator.Options() options.evolutionValues = Calculator.Options.EvolutionValues.STANDARD - results = Calculator.computeGroups(realm, listOf(computableGroup), options) + report = Calculator.computeGroups(realm, listOf(computableGroup), options) realm.close() val e = Date() val duration = (e.time - s.time) / 1000.0 - Timber.d(">>> ended in ${duration} seconds") + Timber.d(">>> ended in $duration seconds") } test.await() if (!isDetached) { - results.firstOrNull()?.defaultStatEntries(stat)?.let { entries -> + report.results.firstOrNull()?.defaultStatEntries(stat)?.let { entries -> GraphActivity.newInstance(requireContext(), stat, entries) } } From ac75f5947a809551da6c53e1b8eef52c930c543b Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Thu, 11 Apr 2019 14:44:00 +0200 Subject: [PATCH 009/245] fix issue with filter conditions udpate --- .../pokeranalytics/android/model/realm/Filter.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index dbbba9bc..5184b586 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -65,8 +65,8 @@ open class Filter : RealmObject() { private set fun createOrUpdateFilterConditions(filterConditionRows: ArrayList) { - filterConditions.clear() - filterConditionRows + val casted = arrayListOf() + filterConditionRows .map { it.filterName } @@ -77,10 +77,14 @@ open class Filter : RealmObject() { it.filterName == filterName } .apply { - val casted = arrayListOf() casted.addAll(this) - filterConditions.add(FilterCondition(casted)) - } + val newFilterCondition = FilterCondition(casted) + val previousCondition = filterConditions.filter { + it.sectionName == newFilterCondition.filterName + } + filterConditions.removeAll(previousCondition) + filterConditions.add(newFilterCondition) + } } } From 4adeeddc9e3c980f64e7f59b5430ebcbd6ca9354 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 11 Apr 2019 14:48:17 +0200 Subject: [PATCH 010/245] Migration to 3rd model --- .../pokeranalytics/android/PokerAnalyticsApplication.kt | 2 +- .../android/model/migrations/PokerAnalyticsMigration.kt | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 60b02421..be1d6117 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -27,7 +27,7 @@ class PokerAnalyticsApplication : Application() { Realm.init(this) val realmConfiguration = RealmConfiguration.Builder() .name(Realm.DEFAULT_REALM_NAME) - .schemaVersion(2) + .schemaVersion(3) .migration(PokerAnalyticsMigration()) .initialData(Seed(this)) .build() 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 1513a8aa..29e15c3b 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 @@ -36,7 +36,6 @@ class PokerAnalyticsMigration : RealmMigration { if (currentVersion == 1) { Timber.d("*** Running migration ${currentVersion + 1}") - schema.rename("Report", "ReportSetup") schema.rename("FilterElement", "FilterCondition") schema.get("Filter")?.let { it.renameField("filterElements", "filterConditions") @@ -47,6 +46,13 @@ class PokerAnalyticsMigration : RealmMigration { currentVersion++ } + // Migrate to version 2 + if (currentVersion == 2) { + Timber.d("*** Running migration ${currentVersion + 1}") + schema.rename("Report", "ReportSetup") + currentVersion++ + } + } override fun equals(other: Any?): Boolean { From bf013b9c0e7934938076cf0845ebc1b80f0e9f5f Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 11 Apr 2019 15:00:37 +0200 Subject: [PATCH 011/245] Adding method to get bar chart data --- .../pokeranalytics/android/calculus/Report.kt | 16 ++++++++++++++++ .../net/pokeranalytics/android/calculus/Stat.kt | 7 ------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index 9a22521c..28875170 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -10,6 +10,9 @@ import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.SessionSet +/** + * The class returned after performing calculation in the Calculator object + */ class Report() { private var _results: MutableList = mutableListOf() @@ -32,6 +35,19 @@ class Report() { this._results.add(result) } + fun barEntries(stat: Stat): List { + val entries = mutableListOf() + + this._results.forEachIndexed { index, results -> + val cs = results.computedStat(stat) + cs?.let { computedStat -> + entries.add(Entry(index.toFloat(), computedStat.value.toFloat(), results.group)) + } + } + return entries + } + + } /** 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 01b652b1..b8ff79ef 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -191,11 +191,4 @@ class ComputedStat(var stat: Stat, var value: Double, var currency: Currency? = return this.stat.format(this.value, this.currency, context) } - /** - * Returns a TextFormat instance for an evolution value located at the specified [index] - */ - fun evolutionValueFormat(index: Int): TextFormat { - return TextFormat("undef ${index}") - } - } From d222bba9b1979cdf00d03b1889521c570d0ef115 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 11 Apr 2019 15:23:44 +0200 Subject: [PATCH 012/245] Adding method to get bar & multi line data set --- .../java/net/pokeranalytics/android/calculus/Report.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index 28875170..de8c329f 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -47,6 +47,14 @@ class Report() { return entries } + fun multiLineEntries(stat: Stat): List> { + val entries = mutableListOf>() + this._results.forEach { result -> + val entryList = result.singleLineEntries(stat) + entries.add(entryList) + } + return entries + } } From 29bbf57fc4123a3f786bfc6ba7ede452df5c9fe7 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 11 Apr 2019 15:41:48 +0200 Subject: [PATCH 013/245] Improve layouts --- app/src/main/res/layout/activity_graph.xml | 9 ++-- app/src/main/res/layout/fragment_graph.xml | 48 +++++++++++++--------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/app/src/main/res/layout/activity_graph.xml b/app/src/main/res/layout/activity_graph.xml index 70454fb9..b1ce6c7a 100644 --- a/app/src/main/res/layout/activity_graph.xml +++ b/app/src/main/res/layout/activity_graph.xml @@ -1,7 +1,8 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_graph.xml b/app/src/main/res/layout/fragment_graph.xml index cf58c3d3..f7b11840 100644 --- a/app/src/main/res/layout/fragment_graph.xml +++ b/app/src/main/res/layout/fragment_graph.xml @@ -1,25 +1,35 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> - + - + + + \ No newline at end of file From 2f5785acf1c56048d953628370b88ecd58744965 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 11 Apr 2019 15:41:57 +0200 Subject: [PATCH 014/245] Set correct layout --- .../net/pokeranalytics/android/ui/activity/GraphActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt index 8f815c9c..e0a840d9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt @@ -41,7 +41,7 @@ class GraphActivity : PokerAnalyticsActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_editable_data) + setContentView(R.layout.activity_graph) initUI() } From a7b6a08e44b348c2fb289f376b1d8015294ccb56 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 11 Apr 2019 15:44:21 +0200 Subject: [PATCH 015/245] Improve UI --- .../android/ui/fragment/GraphFragment.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) 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 a126610a..a5877680 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 @@ -12,6 +12,7 @@ import com.github.mikephil.charting.listener.OnChartValueSelectedListener import kotlinx.android.synthetic.main.fragment_graph.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.graph.setStyle @@ -22,6 +23,7 @@ interface GraphDataSource { class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { + private lateinit var parentActivity: PokerAnalyticsActivity lateinit var dataSource: GraphDataSource lateinit var stat: Stat @@ -29,7 +31,6 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { companion object { - } fun setData(stat: Stat, entries: List) { @@ -46,8 +47,23 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { initUI() } + /** + * Init UI + */ private fun initUI() { + parentActivity = activity as PokerAnalyticsActivity + + // Avoid a bug during setting the title + toolbar.title = "" + + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) + + //TODO: Set correct title + toolbar.title = "Stats" + val dataSet = LineDataSet(this.entries, this.stat.name) val colors = arrayOf(R.color.green_light).toIntArray() dataSet.setColors(colors, context) From a1688e515ac914d8fe624d3f3a5d57471988147e Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 11 Apr 2019 17:22:34 +0200 Subject: [PATCH 016/245] Update graph with legend and data --- .../pokeranalytics/android/calculus/Stat.kt | 38 +++++++++ .../android/ui/fragment/GraphFragment.kt | 52 ++++++++++-- .../android/ui/graph/GraphExtensions.kt | 19 ++--- .../android/ui/view/LegendView.kt | 66 ++++++++++++++++ app/src/main/res/layout/fragment_evograph.xml | 57 +++++++++++++ app/src/main/res/layout/fragment_graph.xml | 35 -------- .../main/res/layout/layout_legend_default.xml | 79 +++++++++++++++++++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/styles.xml | 55 ++++++++----- 9 files changed, 335 insertions(+), 68 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt create mode 100644 app/src/main/res/layout/fragment_evograph.xml delete mode 100644 app/src/main/res/layout/fragment_graph.xml create mode 100644 app/src/main/res/layout/layout_legend_default.xml 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 b8ff79ef..066a2214 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -23,6 +23,28 @@ interface StatBase : RealmModel { } +enum class GraphType { + LINE, + BAR, +} + +enum class AggregationType { + SESSION, + MONTH, + YEAR, + DURATION; + + val resId: Int + get() { + return when (this) { + SESSION -> R.string.session + MONTH -> R.string.month + YEAR -> R.string.year + DURATION -> R.string.duration + } + } +} + /** * An enum representing all the types of Session statistics */ @@ -165,6 +187,22 @@ enum class Stat(var underlyingClass: Class? = null) : RowRepresentabl } } + val graphType: GraphType + get() { + return when (this) { + NUMBER_OF_SETS, NUMBER_OF_GAMES -> GraphType.BAR + else -> GraphType.LINE + } + } + + val aggregationTypes: List + get() { + return when (this) { + NETRESULT -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR, AggregationType.DURATION) + else -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR, AggregationType.DURATION) + } + } + override val viewType: Int = RowViewType.TITLE_VALUE.ordinal } 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 a5877680..be0ad466 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 @@ -4,17 +4,24 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.charts.BarLineChartBase +import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.LineData import com.github.mikephil.charting.data.LineDataSet import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.listener.OnChartValueSelectedListener -import kotlinx.android.synthetic.main.fragment_graph.* +import com.google.android.material.chip.Chip +import kotlinx.android.synthetic.main.fragment_evograph.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.GraphType import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.graph.setStyle +import net.pokeranalytics.android.ui.view.LegendView +import net.pokeranalytics.android.util.extensions.px interface GraphDataSource { @@ -29,6 +36,9 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { lateinit var stat: Stat lateinit var entries: List + lateinit var legendView: LegendView + lateinit var chartView: BarLineChartBase<*> + companion object { } @@ -39,7 +49,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_graph, container, false) + return inflater.inflate(R.layout.fragment_evograph, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -54,6 +64,10 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { parentActivity = activity as PokerAnalyticsActivity + this.legendView = LegendView(requireContext()) + this.legendContainer.addView(this.legendView) + this.legendView.prepareWithStat(this.stat) + // Avoid a bug during setting the title toolbar.title = "" @@ -69,10 +83,36 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { dataSet.setColors(colors, context) val lineData = LineData(listOf(dataSet)) - this.chart.setStyle() + this.chartView = when (stat.graphType) { + GraphType.LINE -> { + val lineChart = LineChart(context) + lineChart.data = lineData + lineChart + } + GraphType.BAR -> { + val barChart = BarChart(context) + barChart + } + } + + this.chartContainer.addView(this.chartView) - this.chart.data = lineData - this.chart.setOnChartValueSelectedListener(this) + this.chartView.setStyle(requireContext()) + this.chartView.setOnChartValueSelectedListener(this) + + this.stat.aggregationTypes.forEachIndexed { index, type -> + + val chip = Chip(requireContext()) + chip.text = requireContext().getString(type.resId) + chip.chipStartPadding = 8f.px + chip.chipEndPadding = 8f.px + chip.isChecked = index == 0 + this.chipGroup.addView(chip) + } + + this.chipGroup.setOnCheckedChangeListener { group, i -> + + } } @@ -101,7 +141,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { } - this.text.text = "" +// this.text.text = "" diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt index 56cd4dda..74cc898e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt @@ -1,24 +1,25 @@ package net.pokeranalytics.android.ui.graph -import com.github.mikephil.charting.charts.BarChart +import android.content.Context +import androidx.core.content.ContextCompat import com.github.mikephil.charting.charts.BarLineChartBase -import com.github.mikephil.charting.charts.LineChart +import net.pokeranalytics.android.R -fun BarChart.setStyle() { - GraphHelper.setStyle(this) -} +//fun BarChart.setStyle(context: Context) { +// GraphHelper.setStyle(this, context) +//} -fun LineChart.setStyle() { - GraphHelper.setStyle(this) +fun BarLineChartBase<*>.setStyle(context: Context) { + GraphHelper.setStyle(this, context) } class GraphHelper { companion object { - fun setStyle(chart: BarLineChartBase<*>) { + fun setStyle(chart: BarLineChartBase<*>, context: Context) { -// this.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.) ChartAppearance.defaultColor + chart.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default) // this.xAxis.axisLineWidth = ChartAppearance.lineWidth // this.xAxis.enableGridDashedLine(3.0f, 5.0f, 1.0f) // diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt new file mode 100644 index 00000000..038bcf03 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt @@ -0,0 +1,66 @@ +package net.pokeranalytics.android.ui.view + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import androidx.constraintlayout.widget.ConstraintLayout +import kotlinx.android.synthetic.main.layout_legend_default.view.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.model.realm.Session + + +/** + * Display a row session + */ +class LegendView : FrameLayout { + + private lateinit var legendLayout: ConstraintLayout + + /** + * Constructors + */ + constructor(context: Context) : super(context) { + init() + } + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + init() + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + init() + } + + /** + * Init + */ + private fun init() { + val layoutInflater = LayoutInflater.from(context) + legendLayout = layoutInflater.inflate(R.layout.layout_legend_default, this, false) as ConstraintLayout + val layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) + addView(legendLayout, layoutParams) + } + + fun prepareWithStat(stat: Stat) { + + this.stat1Name.text = stat.name + this.stat2Name.text = stat.cumulativeLabelResId(context) + + } + + /** + * Set the session data to the view + */ + fun setData(session: Session) { + + this.title.text = "" + this.title.text = "" + this.title.text = "" + this.title.text = "" + this.title.text = "" + + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_evograph.xml b/app/src/main/res/layout/fragment_evograph.xml new file mode 100644 index 00000000..94615634 --- /dev/null +++ b/app/src/main/res/layout/fragment_evograph.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_graph.xml b/app/src/main/res/layout/fragment_graph.xml deleted file mode 100644 index f7b11840..00000000 --- a/app/src/main/res/layout/fragment_graph.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/layout_legend_default.xml b/app/src/main/res/layout/layout_legend_default.xml new file mode 100644 index 00000000..8f11f151 --- /dev/null +++ b/app/src/main/res/layout/layout_legend_default.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b0cd3cbe..65d61cb7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -37,4 +37,6 @@ #8e35c8 + #5c7258 + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 43246d76..a925d56a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -107,24 +107,43 @@ @font/roboto - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -179,6 +180,13 @@ @font/roboto + + + From f95b620c46d3632f50854cf8096868e0ad42326d Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 14:02:49 +0200 Subject: [PATCH 039/245] Update Graph UI --- .../android/ui/activity/GraphActivity.kt | 8 ++++-- .../android/ui/fragment/GraphFragment.kt | 14 ++-------- app/src/main/res/layout/activity_graph.xml | 28 +++++++++++++++---- app/src/main/res/layout/fragment_evograph.xml | 11 +------- 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt index e0a840d9..dfb626d5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt @@ -4,6 +4,7 @@ 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.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity @@ -30,9 +31,7 @@ class GraphActivity : PokerAnalyticsActivity() { * Default constructor */ fun newInstance(context: Context, stat: Stat, entries: List) { - - GraphActivity.parameters = GraphParameters(stat, entries) - + parameters = GraphParameters(stat, entries) val intent = Intent(context, GraphActivity::class.java) context.startActivity(intent) } @@ -50,6 +49,9 @@ class GraphActivity : PokerAnalyticsActivity() { */ private fun initUI() { + setSupportActionBar(toolbar) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + val fragmentManager = supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() val fragment = GraphFragment() 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 1293fc0a..9577935c 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 @@ -36,8 +36,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { private lateinit var parentActivity: PokerAnalyticsActivity lateinit var dataSource: GraphDataSource - lateinit var stat: Stat - lateinit var entries: List + private var stat: Stat = Stat.NETRESULT + private var entries: List = ArrayList() lateinit var legendView: LegendView lateinit var chartView: BarLineChartBase<*> @@ -66,20 +66,12 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { private fun initUI() { parentActivity = activity as PokerAnalyticsActivity + parentActivity.title = stat.localizedTitle(requireContext()) this.legendView = LegendView(requireContext()) this.legendContainer.addView(this.legendView) this.legendView.prepareWithStat(this.stat) - // Avoid a bug during setting the title - toolbar.title = "" - - parentActivity.setSupportActionBar(toolbar) - parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - setHasOptionsMenu(true) - - toolbar.title = stat.localizedTitle(requireContext()) - val dataSet = LineDataSet(this.entries, this.stat.name) val colors = arrayOf(R.color.green_light).toIntArray() dataSet.setColors(colors, context) diff --git a/app/src/main/res/layout/activity_graph.xml b/app/src/main/res/layout/activity_graph.xml index b1ce6c7a..44e1e283 100644 --- a/app/src/main/res/layout/activity_graph.xml +++ b/app/src/main/res/layout/activity_graph.xml @@ -1,8 +1,26 @@ - + + + android:layout_height="?attr/actionBarSize" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:title="@string/app_name" /> + + - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_evograph.xml b/app/src/main/res/layout/fragment_evograph.xml index eba9d9ac..63506299 100644 --- a/app/src/main/res/layout/fragment_evograph.xml +++ b/app/src/main/res/layout/fragment_evograph.xml @@ -5,22 +5,13 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + app:layout_constraintTop_toTopOf="parent" /> Date: Fri, 12 Apr 2019 14:03:17 +0200 Subject: [PATCH 040/245] Clean code --- .../android/ui/activity/SettingsActivity.kt | 34 +++++++++---------- .../android/ui/fragment/ReportsFragment.kt | 6 ++++ .../android/ui/fragment/SettingsFragment.kt | 18 +++++----- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/SettingsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/SettingsActivity.kt index 56a1701d..031da0f3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/SettingsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/SettingsActivity.kt @@ -9,25 +9,25 @@ import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity class SettingsActivity : PokerAnalyticsActivity() { - companion object { - fun newInstance(context: Context) { - val intent = Intent(context, SettingsActivity::class.java) - context.startActivity(intent) - } + companion object { + fun newInstance(context: Context) { + val intent = Intent(context, SettingsActivity::class.java) + context.startActivity(intent) + } - /** - * Create a new instance for result - */ - fun newInstanceForResult(fragment: Fragment, requestCode: Int) { - val intent = Intent(fragment.requireContext(), SettingsActivity::class.java) - fragment.startActivityForResult(intent, requestCode) - } + /** + * Create a new instance for result + */ + fun newInstanceForResult(fragment: Fragment, requestCode: Int) { + val intent = Intent(fragment.requireContext(), SettingsActivity::class.java) + fragment.startActivityForResult(intent, requestCode) + } - } + } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_settings) - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_settings) + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt index 8dc97324..7883f75e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.fragment_stats.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.activity.ComparisonChartActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -56,6 +57,11 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour return rowRepresentation } + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + super.onRowSelected(position, row, fromAction) + ComparisonChartActivity.newInstance(requireContext()) + } + // Business 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 97090c0d..cb19e3d0 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 @@ -30,7 +30,6 @@ import java.util.* class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, StaticRowRepresentableDataSource { - private lateinit var parentActivity: PokerAnalyticsActivity companion object { @@ -53,15 +52,8 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta const val REQUEST_CODE_CURRENCY: Int = 100 } - 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 - else -> "" - } - } - private lateinit var settingsAdapterRow: RowRepresentableAdapter + private lateinit var parentActivity: PokerAnalyticsActivity override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -87,6 +79,14 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta return rowRepresentation } + 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 + else -> "" + } + } + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (row) { From 3423651731cc30f6d430a903c9be309ac20338e3 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 14:10:05 +0200 Subject: [PATCH 041/245] Fix merge --- .../net/pokeranalytics/android/ui/fragment/SettingsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7b4af852..d6ebcdc1 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 @@ -92,7 +92,7 @@ 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 -> UserDefaults.currency.symbol else -> "" } } From 692e69fdac2ff8e6fd089d7282e8dd1d565d59bf Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 14:16:44 +0200 Subject: [PATCH 042/245] Improve style --- app/src/main/res/values/styles.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 2d8599bf..58c93d7e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -182,9 +182,10 @@ From b6a5bc6b93335765756c65943c803c25bac9d5ed Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 14:19:14 +0200 Subject: [PATCH 043/245] Bugfix --- .../net/pokeranalytics/android/ui/fragment/GraphFragment.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 effd8574..10b1cee9 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 @@ -100,6 +100,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.chipGroup.addView(chip) } + this.chipGroup.check(this.stat.aggregationTypes.first().ordinal) + this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { super.onCheckedChanged(group, checkedId) @@ -107,7 +109,6 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { } }) - this.chipGroup.check(this.stat.aggregationTypes.first().ordinal) } // OnChartValueSelectedListener From 44202dc50bbbc591762f9061406dcaa46ceed0c9 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 12 Apr 2019 14:20:48 +0200 Subject: [PATCH 044/245] Graph styling + restricting for proper stats --- .../pokeranalytics/android/calculus/Stat.kt | 11 ++- .../android/ui/fragment/GraphFragment.kt | 4 +- .../android/ui/fragment/StatsFragment.kt | 2 +- .../android/ui/graph/GraphExtensions.kt | 93 ++++++++----------- .../android/ui/view/RowViewType.kt | 7 +- 5 files changed, 59 insertions(+), 58 deletions(-) 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 d4e89d06..e4b93588 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -203,7 +203,16 @@ enum class Stat : RowRepresentable { get() { return when (this) { NETRESULT -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR, AggregationType.DURATION) - else -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR, AggregationType.DURATION) + NUMBER_OF_GAMES, NUMBER_OF_SETS -> listOf(AggregationType.MONTH, AggregationType.YEAR) + else -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR) + } + } + + val hasEvolutionGraph: Boolean + get() { + return when (this) { + DURATION, AVERAGE_DURATION -> false + else -> true } } 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 6afffdbf..0b1ad19b 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 @@ -96,9 +96,11 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.chartContainer.addView(this.chartView) - this.chartView.setStyle(requireContext()) + this.chartView.setStyle(false, requireContext()) this.chartView.setOnChartValueSelectedListener(this) + this.chartView.highlightValue((this.entries.size - 1).toFloat(), 0) + this.stat.aggregationTypes.forEach { type -> val chip = Chip(requireContext()) chip.id = type.ordinal 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 65cb1378..30decac6 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 @@ -199,7 +199,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - if (row is StatRepresentable) { + if (row is StatRepresentable && row.stat.hasEvolutionGraph) { // filter groups val groupResults = this.report?.results?.filter { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt index ee94423e..d5c5dfcc 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt @@ -1,76 +1,63 @@ package net.pokeranalytics.android.ui.graph import android.content.Context +import android.graphics.Typeface import androidx.core.content.ContextCompat import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.components.XAxis import net.pokeranalytics.android.R import net.pokeranalytics.android.util.extensions.px -//fun BarChart.setStyle(context: Context) { -// GraphHelper.setStyle(this, context) -//} +fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { -fun BarLineChartBase<*>.setStyle(context: Context) { - GraphHelper.setStyle(this, context) -} + // X Axis + this.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default) + this.xAxis.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) + this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) + this.xAxis.labelCount = 4 + this.xAxis.position = XAxis.XAxisPosition.BOTTOM -class GraphHelper { + this.xAxis.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) - companion object { + this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) + this.xAxis.typeface = Typeface.DEFAULT + this.xAxis.labelCount = 4 + this.xAxis.position = XAxis.XAxisPosition.BOTTOM - fun setStyle(chart: BarLineChartBase<*>, context: Context) { + this.xAxis.setDrawLabels(true) + this.xAxis.setDrawGridLines(true) + this.xAxis.granularity = 1.0f + this.xAxis.isGranularityEnabled = true + this.xAxis.isEnabled = true - chart.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default) - chart.xAxis.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) - chart.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) - chart.xAxis.labelCount = 4 - chart.xAxis.position = XAxis.XAxisPosition.BOTTOM + // Y Axis + this.axisLeft.setDrawAxisLine(false) + this.axisLeft.setDrawGridLines(true) + this.axisLeft.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) - chart.axisLeft.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) + this.axisLeft.setDrawZeroLine(true) +// this.axisLeft.zeroLineWidth = 1.0f.px + this.axisLeft.zeroLineColor = ContextCompat.getColor(context, R.color.chart_default) -// this.xAxis.axisLineWidth = ChartAppearance.lineWidth -// this.xAxis.enableGridDashedLine(3.0f, 5.0f, 1.0f) -// -// this.xAxis.labelTextColor = ChartAppearance.defaultColor -// this.xAxis.labelFont = Fonts.graphAxis -// this.xAxis.labelCount = 4 -// this.xAxis.labelPosition = .bottom -// -// this.xAxis.drawLabelsEnabled = true -// this.xAxis.drawGridLinesEnabled = true -// this.xAxis.granularity = 1.0 -// this.xAxis.granularityEnabled = true -// this.xAxis.enabled = true -// -// // Y Axis -// this.leftAxis.drawAxisLineEnabled = false -// this.leftAxis.drawGridLinesEnabled = true -// this.leftAxis.gridLineDashLengths = [3.0, 5.0] -// -// this.leftAxis.drawZeroLineEnabled = true -// this.leftAxis.zeroLineWidth = ChartAppearance.lineWidth -// this.leftAxis.zeroLineColor = ChartAppearance.defaultColor -// -// this.leftAxis.granularityEnabled = true -// this.leftAxis.granularity = 1.0 -// -// this.leftAxis.labelTextColor = ChartAppearance.defaultColor -// this.leftAxis.labelFont = Fonts.graphAxis -// this.leftAxis.labelCount = small ? 1 : 7 // @todo not great if interval is [0..2] for number of records as we get decimals -// + this.axisLeft.isGranularityEnabled = true + this.axisLeft.granularity = 1.0f + + this.axisLeft.textColor = ContextCompat.getColor(context, R.color.chart_default) + this.axisLeft.typeface = Typeface.DEFAULT + this.axisLeft.labelCount = + if (small) 1 else 7 // @todo not great if interval is [0..2] for number of records as we get decimals + + this.axisRight.isEnabled = false + this.legend.isEnabled = false + + +// @todo // if timeYAxis { -// this.leftAxis.valueFormatter = HourValueFormatter() +// this.axisLeft.valueFormatter = HourValueFormatter() // } else { -// this.leftAxis.valueFormatter = LargeNumberFormatter() +// this.axisLeft.valueFormatter = LargeNumberFormatter() // } // -// this.rightAxis.enabled = false -// -// this.legend.enabled = false - - } - } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 1659120d..4ffd4bec 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_transaction.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.StatRepresentable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -232,11 +233,13 @@ enum class RowViewType(private var layoutRes: Int) { itemView.findViewById(R.id.value)?.let { view -> adapter.dataSource.contentDescriptorForRow(row)?.textFormat?.let { view.setTextFormat(it, itemView.context) -// view.text = it.text -// view.setTextColor(it.getColor(itemView.context)) } } + if (row is StatRepresentable) { + itemView.findViewById(R.id.nextArrow)?.isVisible = row.stat.hasEvolutionGraph + } + // Listener val listener = View.OnClickListener { adapter.delegate?.onRowSelected(position, row) From 9dd61ac72d93eb4fdb479ef66650c65422c44b4b Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 14:25:11 +0200 Subject: [PATCH 045/245] Add schema 3 --- app/src/androidTest/assets/schema_3.realm | Bin 0 -> 3407872 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/src/androidTest/assets/schema_3.realm diff --git a/app/src/androidTest/assets/schema_3.realm b/app/src/androidTest/assets/schema_3.realm new file mode 100644 index 0000000000000000000000000000000000000000..4409e5b85d8e4bd91c18786e8ea277cb1c0931a5 GIT binary patch literal 3407872 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%0DD3gk;P;Qc8xA4E3vH8F@}#;9b^#k-y0s@|G|R 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 z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZr@c$%%p?Gwv`sx;s)xO_pa~`O5`({ST>OjWaGJ1 zAR10)0?9}s7zl=9`FJK5OvO_fuZ12}UVk-8a8T{06j0tN?r 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

oNjE}pbZ+Pp%@bq{QnlqDGfur< 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

_rv9qk$fVeQj=zJ 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⪚aO@U=^PrrmC*A~RIaZO%6Z>RH*;6Pd~w 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

AvI6r%c}ay{#>G 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 Date: Fri, 12 Apr 2019 14:32:27 +0200 Subject: [PATCH 046/245] Improve fragments loading --- .../android/ui/fragment/ComparisonChartFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt index 17508584..787402bf 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt @@ -92,6 +92,7 @@ class ComparisonChartFragment : PokerAnalyticsFragment(), StaticRowRepresentable viewPagerAdapter = ComparisonChartPagerAdapter(requireContext(), parentActivity.supportFragmentManager) viewPager.adapter = viewPagerAdapter + viewPager.offscreenPageLimit = 2 tabs.setupWithViewPager(viewPager) From dc3783427d70c750456d2495dec516b5fe0e3293 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 14:46:45 +0200 Subject: [PATCH 047/245] Refactoring (mainly rename files) --- .../android/ui/activity/HomeActivity.kt | 2 +- .../ui/fragment/ComparisonChartFragment.kt | 27 ++++++++++++++++--- .../ui/fragment/EditableDataFragment.kt | 2 +- .../android/ui/fragment/FiltersFragment.kt | 2 +- .../android/ui/fragment/SessionFragment.kt | 2 +- .../bottomsheet/BottomSheetFragment.kt | 2 +- app/src/main/res/layout/activity_home.xml | 2 +- .../{navigation.xml => navigation_home.xml} | 0 ...heet_menu.xml => toolbar_bottom_sheet.xml} | 0 .../res/menu/toolbar_comparison_chart.xml | 11 ++++++++ ...ble_data.xml => toolbar_editable_data.xml} | 0 .../menu/{home_menu.xml => toolbar_home.xml} | 0 ...ession_toolbar.xml => toolbar_session.xml} | 0 13 files changed, 41 insertions(+), 9 deletions(-) rename app/src/main/res/menu/{navigation.xml => navigation_home.xml} (100%) rename app/src/main/res/menu/{bottom_sheet_menu.xml => toolbar_bottom_sheet.xml} (100%) create mode 100644 app/src/main/res/menu/toolbar_comparison_chart.xml rename app/src/main/res/menu/{editable_data.xml => toolbar_editable_data.xml} (100%) rename app/src/main/res/menu/{home_menu.xml => toolbar_home.xml} (100%) rename app/src/main/res/menu/{session_toolbar.xml => toolbar_session.xml} (100%) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt index 096a6de5..af6939bb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt @@ -73,7 +73,7 @@ class HomeActivity : PokerAnalyticsActivity() { } override fun onCreateOptionsMenu(menu: Menu?): Boolean { - menuInflater.inflate(R.menu.home_menu, menu) + menuInflater.inflate(R.menu.toolbar_home, menu) this.homeMenu = menu //TODO: Change filter button visibility homeMenu?.findItem(R.id.filter)?.isVisible = true diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt index 787402bf..ec221671 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt @@ -1,9 +1,7 @@ package net.pokeranalytics.android.ui.fragment import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import kotlinx.android.synthetic.main.fragment_comparison_chart.* import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.BankrollActivity @@ -15,6 +13,7 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.MoreTabRow +import net.pokeranalytics.android.util.extensions.toast class ComparisonChartFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { @@ -40,6 +39,7 @@ class ComparisonChartFragment : PokerAnalyticsFragment(), StaticRowRepresentable private lateinit var parentActivity: PokerAnalyticsActivity private lateinit var viewPagerAdapter: ComparisonChartPagerAdapter + private var comparisonChartMenu: Menu? = null // Life Cycle @@ -54,6 +54,19 @@ class ComparisonChartFragment : PokerAnalyticsFragment(), StaticRowRepresentable initUI() } + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + inflater?.inflate(R.menu.toolbar_comparison_chart, menu) + this.comparisonChartMenu = menu + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item!!.itemId) { + R.id.settings -> openChangeStatistics() + } + return true + } + // Rows override fun adapterRows(): List? { return rowRepresentation @@ -98,4 +111,12 @@ class ComparisonChartFragment : PokerAnalyticsFragment(), StaticRowRepresentable } + /** + * Open change statistics + */ + private fun openChangeStatistics() { + //TODO + toast("Open change statistics") + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index 44e8b118..9b0123c7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -52,7 +52,7 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele } override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { - inflater?.inflate(R.menu.editable_data, menu) + inflater?.inflate(R.menu.toolbar_editable_data, menu) this.editableMenu = menu updateMenuUI() super.onCreateOptionsMenu(menu, inflater) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt index 8a9915a4..c470f429 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt @@ -71,7 +71,7 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat } override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { - inflater?.inflate(R.menu.editable_data, menu) + inflater?.inflate(R.menu.toolbar_editable_data, menu) this.filterMenu = menu updateMenuUI() super.onCreateOptionsMenu(menu, inflater) 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 41fdd733..45767d22 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 @@ -63,7 +63,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate { } override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { - inflater?.inflate(R.menu.session_toolbar, menu) + inflater?.inflate(R.menu.toolbar_session, menu) this.sessionMenu = menu updateMenuUI() super.onCreateOptionsMenu(menu, inflater) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt index 57c17392..f883c7f2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt @@ -97,7 +97,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { private fun initUI() { row.let { bottomSheetToolbar.title = row.localizedTitle(requireContext()) - bottomSheetToolbar.inflateMenu(R.menu.bottom_sheet_menu) + bottomSheetToolbar.inflateMenu(R.menu.toolbar_bottom_sheet) bottomSheetToolbar.setOnMenuItemClickListener { false } diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 275db019..d5788e1c 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -34,6 +34,6 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" - app:menu="@menu/navigation" /> + app:menu="@menu/navigation_home" /> \ No newline at end of file diff --git a/app/src/main/res/menu/navigation.xml b/app/src/main/res/menu/navigation_home.xml similarity index 100% rename from app/src/main/res/menu/navigation.xml rename to app/src/main/res/menu/navigation_home.xml diff --git a/app/src/main/res/menu/bottom_sheet_menu.xml b/app/src/main/res/menu/toolbar_bottom_sheet.xml similarity index 100% rename from app/src/main/res/menu/bottom_sheet_menu.xml rename to app/src/main/res/menu/toolbar_bottom_sheet.xml diff --git a/app/src/main/res/menu/toolbar_comparison_chart.xml b/app/src/main/res/menu/toolbar_comparison_chart.xml new file mode 100644 index 00000000..2132026e --- /dev/null +++ b/app/src/main/res/menu/toolbar_comparison_chart.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/editable_data.xml b/app/src/main/res/menu/toolbar_editable_data.xml similarity index 100% rename from app/src/main/res/menu/editable_data.xml rename to app/src/main/res/menu/toolbar_editable_data.xml diff --git a/app/src/main/res/menu/home_menu.xml b/app/src/main/res/menu/toolbar_home.xml similarity index 100% rename from app/src/main/res/menu/home_menu.xml rename to app/src/main/res/menu/toolbar_home.xml diff --git a/app/src/main/res/menu/session_toolbar.xml b/app/src/main/res/menu/toolbar_session.xml similarity index 100% rename from app/src/main/res/menu/session_toolbar.xml rename to app/src/main/res/menu/toolbar_session.xml From 221400ad32ce90d0889a0b7e555b724630fda37c Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 12 Apr 2019 14:54:32 +0200 Subject: [PATCH 048/245] Graph style --- .../java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt new file mode 100644 index 00000000..626bbe2b --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt @@ -0,0 +1,2 @@ +package net.pokeranalytics.android.ui.graph + From 1f8cb4d8f3f83513b80dc22905e34d9a154e877e Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 12 Apr 2019 14:54:43 +0200 Subject: [PATCH 049/245] Graph style --- .../android/PokerAnalyticsApplication.kt | 2 +- .../android/ui/fragment/GraphFragment.kt | 4 ++-- .../pokeranalytics/android/ui/graph/ChartDataSet.kt | 13 +++++++++++++ .../android/ui/graph/GraphExtensions.kt | 2 -- app/src/main/res/values/colors.xml | 1 + 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index a92e3af4..62539914 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -51,7 +51,7 @@ class PokerAnalyticsApplication : Application() { } if (BuildConfig.DEBUG) { - // this.createFakeSessions() + this.createFakeSessions() } } 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 7873db89..474e6a34 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 @@ -9,7 +9,6 @@ import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.LineData -import com.github.mikephil.charting.data.LineDataSet import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.listener.OnChartValueSelectedListener import com.google.android.material.chip.Chip @@ -21,6 +20,7 @@ import net.pokeranalytics.android.calculus.ObjectIdentifier import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity 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.util.extensions.ChipGroupExtension @@ -68,7 +68,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.legendContainer.addView(this.legendView) this.legendView.prepareWithStat(this.stat, this.entries.size) - val dataSet = LineDataSet(this.entries, this.stat.name) + val dataSet = PALineDataSet(this.entries, this.stat.name, requireContext()) val colors = arrayOf(R.color.green_light).toIntArray() dataSet.setColors(colors, context) dataSet.setDrawCircles(false) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt index 626bbe2b..df878d24 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt @@ -1,2 +1,15 @@ package net.pokeranalytics.android.ui.graph +import android.content.Context +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.data.LineDataSet +import net.pokeranalytics.android.R + +class PALineDataSet(yVals: List, label: String, context: Context) : LineDataSet(yVals, label) { + + init { + this.highLightColor = context.getColor(R.color.chart_highlight_indicator) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt index d5c5dfcc..12f82a12 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt @@ -17,8 +17,6 @@ fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { this.xAxis.labelCount = 4 this.xAxis.position = XAxis.XAxisPosition.BOTTOM - this.xAxis.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) - this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) this.xAxis.typeface = Typeface.DEFAULT this.xAxis.labelCount = 4 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 65d61cb7..16a219a4 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -38,5 +38,6 @@ #8e35c8 #5c7258 + #f8ffe5 From 7228130c73087d6f65b09d4ae908f1bc7370f44a Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 12 Apr 2019 14:55:36 +0200 Subject: [PATCH 050/245] fix migration to version 2 issue --- .../migrations/PokerAnalyticsMigration.kt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) 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 2d41451d..02748a29 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 @@ -35,9 +35,6 @@ class PokerAnalyticsMigration : RealmMigration { // Migrate to version 2 if (currentVersion == 1) { Timber.d("*** Running migration ${currentVersion + 1}") - schema.get("Session")?.let { - it.addField("blinds", String::class.java).setNullable("blinds", true) - } schema.rename("FilterElement", "FilterCondition") schema.get("Filter")?.let { it.renameField("filterElements", "filterConditions") @@ -52,7 +49,20 @@ class PokerAnalyticsMigration : RealmMigration { if (currentVersion == 2) { Timber.d("*** Running migration ${currentVersion + 1}") schema.rename("Report", "ReportSetup") - currentVersion++ + + schema.get("Session")?.let { + it.addField("blinds", String::class.java).setNullable("blinds", true) + } + + schema.get("FilterCondition")?.let { + it.addRealmListField("booleanValues", Boolean::class.java).setNullable("booleanValues", true) + } + + schema.get("FilterCondition")?.let { + it.removeField("blindValues") + } + + currentVersion++ } } From 91790f15ecba1ead32def6e976cf491386faeaf2 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 12 Apr 2019 15:01:17 +0200 Subject: [PATCH 051/245] Refactoring, moved UIExtensions in the ui package --- .../android/{util/extensions => ui}/UIExtensions.kt | 9 ++++++++- .../android/ui/fragment/ComparisonChartFragment.kt | 2 +- .../android/ui/fragment/GraphFragment.kt | 4 ++-- .../android/ui/fragment/SettingsFragment.kt | 6 +++--- .../bottomsheet/BottomSheetListGameFragment.kt | 2 +- .../bottomsheet/BottomSheetTableSizeGridFragment.kt | 2 +- .../pokeranalytics/android/ui/graph/GraphExtensions.kt | 2 +- .../android/ui/view/fields/FieldsExtension.kt | 10 ---------- 8 files changed, 17 insertions(+), 20 deletions(-) rename app/src/main/java/net/pokeranalytics/android/{util/extensions => ui}/UIExtensions.kt (91%) delete mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/UIExtensions.kt similarity index 91% rename from app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt rename to app/src/main/java/net/pokeranalytics/android/ui/UIExtensions.kt index 06f89e3b..20b26d1a 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/UIExtensions.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.util.extensions +package net.pokeranalytics.android.ui import android.content.ActivityNotFoundException import android.content.Context @@ -7,10 +7,12 @@ import android.content.res.Resources import android.net.Uri import android.widget.Toast import androidx.appcompat.app.AlertDialog +import androidx.appcompat.widget.AppCompatTextView import androidx.browser.customtabs.CustomTabsIntent import androidx.core.content.ContextCompat import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.TextFormat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.util.DeviceUtils @@ -100,4 +102,9 @@ fun showAlertDialog(context: Context, title: Int? = null, message: Int? = null) } builder.setPositiveButton(R.string.ok, null) builder.show() +} + +fun AppCompatTextView.setTextFormat(textFormat: TextFormat, context: Context) { + this.setTextColor(textFormat.getColor(context)) + this.text = textFormat.text } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt index ec221671..2b6648bb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt @@ -13,7 +13,7 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.MoreTabRow -import net.pokeranalytics.android.util.extensions.toast +import net.pokeranalytics.android.ui.toast class ComparisonChartFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { 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 474e6a34..eceea2f8 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 @@ -24,8 +24,8 @@ 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.util.extensions.ChipGroupExtension -import net.pokeranalytics.android.util.extensions.px -import net.pokeranalytics.android.util.extensions.toast +import net.pokeranalytics.android.ui.px +import net.pokeranalytics.android.ui.toast import java.text.DateFormat class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { 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 d6ebcdc1..a61e1238 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 @@ -25,9 +25,9 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.URL import net.pokeranalytics.android.util.UserDefaults -import net.pokeranalytics.android.util.extensions.openContactMail -import net.pokeranalytics.android.util.extensions.openPlayStorePage -import net.pokeranalytics.android.util.extensions.openUrl +import net.pokeranalytics.android.ui.openContactMail +import net.pokeranalytics.android.ui.openPlayStorePage +import net.pokeranalytics.android.ui.openUrl import java.util.* diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt index 919acd05..0b8da921 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt @@ -14,7 +14,7 @@ import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorExcep import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.util.extensions.px +import net.pokeranalytics.android.ui.px /** * Bottom Sheet List Game Fragment diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt index e2a7ac37..50625def 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt @@ -13,7 +13,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.GridSpacingItemDecoration import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.util.extensions.px +import net.pokeranalytics.android.ui.px class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt index 12f82a12..dbacb7be 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt @@ -6,7 +6,7 @@ import androidx.core.content.ContextCompat import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.components.XAxis import net.pokeranalytics.android.R -import net.pokeranalytics.android.util.extensions.px +import net.pokeranalytics.android.ui.px fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt deleted file mode 100644 index 1a7b35c5..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt +++ /dev/null @@ -1,10 +0,0 @@ -package net.pokeranalytics.android.ui.view.fields - -import android.content.Context -import androidx.appcompat.widget.AppCompatTextView -import net.pokeranalytics.android.calculus.TextFormat - -fun AppCompatTextView.setTextFormat(textFormat: TextFormat, context: Context) { - this.setTextColor(textFormat.getColor(context)) - this.text = textFormat.text -} \ No newline at end of file From acc019c21f46d623c3ce03bbac2ac0900bbc813d Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 12 Apr 2019 15:03:38 +0200 Subject: [PATCH 052/245] Moved UI related extensions in ui.extensions --- .../android/{util => ui}/extensions/ChipGroupExtension.kt | 2 +- .../android/ui/{ => extensions}/UIExtensions.kt | 2 +- .../android/ui/fragment/ComparisonChartFragment.kt | 2 +- .../net/pokeranalytics/android/ui/fragment/GraphFragment.kt | 6 +++--- .../pokeranalytics/android/ui/fragment/SettingsFragment.kt | 6 +++--- .../components/bottomsheet/BottomSheetListGameFragment.kt | 2 +- .../bottomsheet/BottomSheetTableSizeGridFragment.kt | 2 +- .../net/pokeranalytics/android/ui/graph/GraphExtensions.kt | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) rename app/src/main/java/net/pokeranalytics/android/{util => ui}/extensions/ChipGroupExtension.kt (88%) rename app/src/main/java/net/pokeranalytics/android/ui/{ => extensions}/UIExtensions.kt (98%) diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/ChipGroupExtension.kt b/app/src/main/java/net/pokeranalytics/android/ui/extensions/ChipGroupExtension.kt similarity index 88% rename from app/src/main/java/net/pokeranalytics/android/util/extensions/ChipGroupExtension.kt rename to app/src/main/java/net/pokeranalytics/android/ui/extensions/ChipGroupExtension.kt index 8a642069..e860242e 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/ChipGroupExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/extensions/ChipGroupExtension.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.util.extensions +package net.pokeranalytics.android.ui.extensions import com.google.android.material.chip.ChipGroup diff --git a/app/src/main/java/net/pokeranalytics/android/ui/UIExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt similarity index 98% rename from app/src/main/java/net/pokeranalytics/android/ui/UIExtensions.kt rename to app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt index 20b26d1a..e7535db1 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/UIExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.ui +package net.pokeranalytics.android.ui.extensions import android.content.ActivityNotFoundException import android.content.Context diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt index 2b6648bb..eb2d3041 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt @@ -13,7 +13,7 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.MoreTabRow -import net.pokeranalytics.android.ui.toast +import net.pokeranalytics.android.ui.extensions.toast class ComparisonChartFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { 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 eceea2f8..3e220e22 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 @@ -23,9 +23,9 @@ 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.util.extensions.ChipGroupExtension -import net.pokeranalytics.android.ui.px -import net.pokeranalytics.android.ui.toast +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 GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { 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 a61e1238..3d681cee 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 @@ -25,9 +25,9 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.URL import net.pokeranalytics.android.util.UserDefaults -import net.pokeranalytics.android.ui.openContactMail -import net.pokeranalytics.android.ui.openPlayStorePage -import net.pokeranalytics.android.ui.openUrl +import net.pokeranalytics.android.ui.extensions.openContactMail +import net.pokeranalytics.android.ui.extensions.openPlayStorePage +import net.pokeranalytics.android.ui.extensions.openUrl import java.util.* diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt index 0b8da921..3782f246 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt @@ -14,7 +14,7 @@ import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorExcep import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.px +import net.pokeranalytics.android.ui.extensions.px /** * Bottom Sheet List Game Fragment diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt index 50625def..7c199c09 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt @@ -13,7 +13,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.GridSpacingItemDecoration import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.px +import net.pokeranalytics.android.ui.extensions.px class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt index dbacb7be..e5f6e8a9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt @@ -6,7 +6,7 @@ import androidx.core.content.ContextCompat import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.components.XAxis import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.px +import net.pokeranalytics.android.ui.extensions.px fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { From 023528c26f5e06e0246fd6b809dce20f63b2b39a Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 15:09:33 +0200 Subject: [PATCH 053/245] Refactor GraphActivity to StatisticDetailsActivity --- app/src/main/AndroidManifest.xml | 10 +-- ...ctivity.kt => StatisticDetailsActivity.kt} | 29 +------ .../android/ui/fragment/GraphFragment.kt | 5 ++ .../ui/fragment/StatisticDetailsFragment.kt | 79 +++++++++++++++++++ .../android/ui/fragment/StatsFragment.kt | 4 +- .../res/layout/activity_statistic_details.xml | 15 ++++ .../res/layout/fragment_statistic_details.xml | 26 ++++++ 7 files changed, 136 insertions(+), 32 deletions(-) rename app/src/main/java/net/pokeranalytics/android/ui/activity/{GraphActivity.kt => StatisticDetailsActivity.kt} (55%) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt create mode 100644 app/src/main/res/layout/activity_statistic_details.xml create mode 100644 app/src/main/res/layout/fragment_statistic_details.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index acf5f807..4caf0748 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -44,6 +44,11 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> + + - - diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt similarity index 55% rename from app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt rename to app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt index dfb626d5..4a9ef680 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt @@ -8,14 +8,10 @@ import kotlinx.android.synthetic.main.activity_graph.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity -import net.pokeranalytics.android.ui.fragment.GraphFragment +import net.pokeranalytics.android.ui.fragment.GraphParameters -class GraphParameters(stat: Stat, entries: List) { - var stat: Stat = stat - var entries: List = entries -} -class GraphActivity : PokerAnalyticsActivity() { +class StatisticDetailsActivity : PokerAnalyticsActivity() { private enum class IntentKey(val keyName: String) { STAT("STAT"), @@ -32,7 +28,7 @@ class GraphActivity : PokerAnalyticsActivity() { */ fun newInstance(context: Context, stat: Stat, entries: List) { parameters = GraphParameters(stat, entries) - val intent = Intent(context, GraphActivity::class.java) + val intent = Intent(context, StatisticDetailsActivity::class.java) context.startActivity(intent) } @@ -40,7 +36,7 @@ class GraphActivity : PokerAnalyticsActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_graph) + setContentView(R.layout.activity_statistic_details) initUI() } @@ -49,23 +45,6 @@ class GraphActivity : PokerAnalyticsActivity() { */ private fun initUI() { - setSupportActionBar(toolbar) - supportActionBar?.setDisplayHomeAsUpEnabled(true) - - val fragmentManager = supportFragmentManager - val fragmentTransaction = fragmentManager.beginTransaction() - val fragment = GraphFragment() - - fragmentTransaction.add(R.id.container, fragment) - fragmentTransaction.commit() - - GraphActivity.parameters?.let { - fragment.setData(it.stat, it.entries) - GraphActivity.parameters = null - } ?: run { - throw Exception("Missing graph parameters") - } - } } 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 10b1cee9..dca87b22 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 @@ -28,6 +28,11 @@ import net.pokeranalytics.android.util.extensions.px import net.pokeranalytics.android.util.extensions.toast import java.text.DateFormat +class GraphParameters(stat: Stat, entries: List) { + var stat: Stat = stat + var entries: List = entries +} + class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { private lateinit var parentActivity: PokerAnalyticsActivity 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 new file mode 100644 index 00000000..50413327 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt @@ -0,0 +1,79 @@ +package net.pokeranalytics.android.ui.fragment + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.fragment_statistic_details.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment + +class StatisticDetailsFragment : PokerAnalyticsFragment() { + + companion object { + fun newInstance(context: Context) { + val intent = Intent(context, StatisticDetailsFragment::class.java) + context.startActivity(intent) + } + } + + private lateinit var parentActivity: PokerAnalyticsActivity + + private var stat: Stat = Stat.NETRESULT + private var entries: List = ArrayList() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_statistic_details, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initUI() + } + + /** + * Init UI + */ + private fun initUI() { + + parentActivity = activity as PokerAnalyticsActivity + + // Avoid a bug during setting the title + toolbar.title = "" + + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) + + toolbar.title = stat.localizedTitle(requireContext()) + + val fragmentManager = parentActivity.supportFragmentManager + val fragmentTransaction = fragmentManager.beginTransaction() + val fragment = GraphFragment() + + fragmentTransaction.add(R.id.container, fragment) + fragmentTransaction.commit() + + StatisticDetailsActivity.parameters?.let { + fragment.setData(it.stat, it.entries) + StatisticDetailsActivity.parameters = null + } ?: run { + throw Exception("Missing graph parameters") + } + } + + /** + * Set data + */ + fun setData(stat: Stat, entries: List) { + this.stat = stat + this.entries = entries + } + +} \ No newline at end of file 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 65cb1378..b10bd7a7 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 @@ -12,7 +12,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.model.StatRepresentable import net.pokeranalytics.android.model.filter.QueryCondition -import net.pokeranalytics.android.ui.activity.GraphActivity +import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity import net.pokeranalytics.android.ui.adapter.DisplayDescriptor import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -237,7 +237,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc if (!isDetached) { report.results.firstOrNull()?.defaultStatEntries(stat)?.let { entries -> - GraphActivity.newInstance(requireContext(), stat, entries) + StatisticDetailsActivity.newInstance(requireContext(), stat, entries) } } } diff --git a/app/src/main/res/layout/activity_statistic_details.xml b/app/src/main/res/layout/activity_statistic_details.xml new file mode 100644 index 00000000..62d1cb20 --- /dev/null +++ b/app/src/main/res/layout/activity_statistic_details.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_statistic_details.xml b/app/src/main/res/layout/fragment_statistic_details.xml new file mode 100644 index 00000000..44e1e283 --- /dev/null +++ b/app/src/main/res/layout/fragment_statistic_details.xml @@ -0,0 +1,26 @@ + + + + + + + + From a25e001ffb97f725e6c2b9f42074f764d66e543f Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 15:29:42 +0200 Subject: [PATCH 054/245] Fix imports --- .../main/java/net/pokeranalytics/android/ui/view/LegendView.kt | 2 +- .../main/java/net/pokeranalytics/android/ui/view/RowViewType.kt | 2 +- .../java/net/pokeranalytics/android/ui/view/SessionRowView.kt | 2 +- .../net/pokeranalytics/android/ui/view/TransactionRowView.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt index 03552cde..2995697b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt @@ -9,7 +9,7 @@ import kotlinx.android.synthetic.main.layout_legend_default.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.TextFormat -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat /** * Display a row session diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 4ffd4bec..387756b9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -17,7 +17,7 @@ import net.pokeranalytics.android.model.StatRepresentable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt index bce8118f..0f127f6a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt @@ -15,7 +15,7 @@ import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.realm.Session -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getShortDayName import net.pokeranalytics.android.util.extensions.shortTime diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt index 25f3b5a3..45102448 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt @@ -10,7 +10,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.realm.Transaction -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getShortDayName From 88b610b063b4782bfd16f2bdba2e4b6cafb2428f Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 15:29:52 +0200 Subject: [PATCH 055/245] Remove fake sessions creation --- .../net/pokeranalytics/android/PokerAnalyticsApplication.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 62539914..cfe97dca 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -51,7 +51,7 @@ class PokerAnalyticsApplication : Application() { } if (BuildConfig.DEBUG) { - this.createFakeSessions() + //this.createFakeSessions() } } From c8a9c848d5274c17d21d6131c441d065c7ec0775 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 15:44:53 +0200 Subject: [PATCH 056/245] Improve UI --- .../android/ui/fragment/HistoryFragment.kt | 13 ++--- app/src/main/res/layout/fragment_history.xml | 56 ++++++++++--------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index 78b61b06..59c01ec9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -6,6 +6,7 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.core.view.isVisible +import androidx.interpolator.view.animation.FastOutSlowInInterpolator import io.realm.RealmResults import io.realm.Sort import io.realm.kotlin.where @@ -56,12 +57,6 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource realmSessions.removeAllChangeListeners() } - override fun onResume() { - super.onResume() - // Old - //createSessionsHeaders() - } - /** * Init UI */ @@ -96,7 +91,11 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource disclaimerDismiss.setOnClickListener { Preferences.setStopShowingDisclaimer(requireContext()) - disclaimerContainer.isVisible = false + + disclaimerContainer.animate().translationY(disclaimerContainer.height.toFloat()) + .setInterpolator(FastOutSlowInInterpolator()) + .withEndAction { disclaimerContainer?.isVisible = false } + .start() } } diff --git a/app/src/main/res/layout/fragment_history.xml b/app/src/main/res/layout/fragment_history.xml index 317fb5a3..6177771c 100644 --- a/app/src/main/res/layout/fragment_history.xml +++ b/app/src/main/res/layout/fragment_history.xml @@ -53,51 +53,53 @@ + app:layout_constraintVertical_bias="0.5" + tools:visibility="visible" /> + android:id="@+id/disclaimerContainer" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:background="@color/green_darker" + android:orientation="vertical" + android:padding="24dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent"> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:layout_marginBottom="8dp" + android:text="@string/disclaimer" + android:textSize="18sp" + tools:visibility="visible" /> + android:id="@+id/disclaimerDismiss" + style="@style/PokerAnalyticsTheme.Button" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="16dp" + android:text="@string/iunderstand" /> From c50490f4e2453d068be6b2f3d360dbb7e1bab1c3 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 12 Apr 2019 15:48:09 +0200 Subject: [PATCH 057/245] Fixing stat graphs --- .../android/calculus/Calculator.kt | 66 +++++++++++++++---- .../pokeranalytics/android/calculus/Stat.kt | 8 +++ .../android/model/realm/Session.kt | 1 + .../android/model/realm/SessionSet.kt | 15 +++++ .../android/ui/view/LegendView.kt | 22 +++++-- .../android/ui/view/RowViewType.kt | 2 +- .../android/ui/view/SessionRowView.kt | 4 +- .../android/ui/view/TransactionRowView.kt | 4 +- .../main/res/layout/layout_legend_default.xml | 2 +- 9 files changed, 97 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index e8cd78ca..af908c6a 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -35,7 +35,7 @@ class Calculator { enum class EvolutionValues { NONE, STANDARD, - DATED + TIMED } var display: Display = Display.TABLE @@ -146,12 +146,17 @@ class Calculator { tBuyinSum += computable.ratedBuyin tHands += computable.estimatedHands - val session = computable.session ?: throw IllegalStateException("Computing lone ComputableResult") + val session = + computable.session ?: throw IllegalStateException("Computing lone ComputableResult") results.addEvolutionValue(tSum, stat = NETRESULT, data = session) results.addEvolutionValue(tSum / index, stat = AVERAGE, data = session) results.addEvolutionValue(index.toDouble(), stat = NUMBER_OF_GAMES, data = session) results.addEvolutionValue(tBBSum / tBBSessionCount, stat = AVERAGE_NET_BB, data = session) - results.addEvolutionValue((tWinningSessionCount / index).toDouble(), stat = WIN_RATIO, data = session) + results.addEvolutionValue( + (tWinningSessionCount.toDouble() / index.toDouble()), + stat = WIN_RATIO, + data = session + ) results.addEvolutionValue(tBuyinSum / index, stat = AVERAGE_BUYIN, data = session) Stat.netBBPer100Hands(tBBSum, tHands)?.let { netBB100 -> @@ -182,7 +187,7 @@ class Calculator { // var bbHourlyRate = gBBSum / gDuration when (options.evolutionValues) { - Options.EvolutionValues.DATED -> { + Options.EvolutionValues.STANDARD, Options.EvolutionValues.TIMED -> { var tHourlyDuration = 0.0 var tIndex = 0 @@ -202,16 +207,49 @@ class Calculator { tHourlyRate = gSum / tHourlyDuration tHourlyRateBB = gBBSum / tHourlyDuration - results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT, sessionSet) - results.addEvolutionValue(tSum / tHourlyDuration, tHourlyDuration, HOURLY_RATE, sessionSet) - results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) - results.addEvolutionValue(tIndex.toDouble(), tHourlyDuration, NUMBER_OF_SETS, sessionSet) - results.addEvolutionValue(sessionSet.netDuration.toDouble(), tHourlyDuration, DURATION, sessionSet) - results.addEvolutionValue(tHourlyDuration / tIndex, tHourlyDuration, AVERAGE_DURATION, sessionSet) - results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet) - - Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> - results.addEvolutionValue(netBB100, tHourlyDuration, NET_BB_PER_100_HANDS, sessionSet) + when (options.evolutionValues) { + Options.EvolutionValues.STANDARD -> { + results.addEvolutionValue(tHourlyRate, stat = HOURLY_RATE, data = sessionSet) + results.addEvolutionValue(tIndex.toDouble(), stat = NUMBER_OF_SETS, data = sessionSet) + results.addEvolutionValue( + sessionSet.netDuration.toDouble(), + stat = DURATION, + data = sessionSet + ) + results.addEvolutionValue( + tHourlyDuration / tIndex, + stat = AVERAGE_DURATION, + data = sessionSet + ) + results.addEvolutionValue(tHourlyRateBB, stat = HOURLY_RATE_BB, data = sessionSet) + + Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> + results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = sessionSet) + } + + } + Options.EvolutionValues.TIMED -> { + results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT, sessionSet) + results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) + results.addEvolutionValue(tIndex.toDouble(), tHourlyDuration, NUMBER_OF_SETS, sessionSet) + results.addEvolutionValue( + sessionSet.netDuration.toDouble(), + tHourlyDuration, + DURATION, + sessionSet + ) + results.addEvolutionValue( + tHourlyDuration / tIndex, + tHourlyDuration, + AVERAGE_DURATION, + sessionSet + ) + results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet) + + Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> + results.addEvolutionValue(netBB100, tHourlyDuration, NET_BB_PER_100_HANDS, sessionSet) + } + } } } 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 1f0845e8..2d72b901 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -214,6 +214,14 @@ enum class Stat : RowRepresentable { } } + val significantIndividualValue: Boolean + get() { + return when (this) { + WIN_RATIO, NUMBER_OF_SETS, NUMBER_OF_GAMES -> false + else -> true + } + } + override val viewType: Int = RowViewType.TITLE_VALUE.ordinal } 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 0b7b044f..3b661a74 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 @@ -879,6 +879,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat Stat.DURATION, Stat.AVERAGE_DURATION -> this.netDuration.toDouble() Stat.HOURLY_RATE, Stat.STANDARD_DEVIATION_HOURLY -> this.hourlyRate Stat.HANDS_PLAYED -> this.estimatedHands + Stat.WIN_RATIO -> null else -> throw StatFormattingException("format undefined for stat ${stat.name}") } 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 4b3178e7..77f4dc1b 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 @@ -14,6 +14,7 @@ import net.pokeranalytics.android.calculus.TextFormat import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.Timed +import net.pokeranalytics.android.util.NULL_TEXT import java.util.* @@ -79,12 +80,26 @@ open class SessionSet() : RealmObject(), Timed, Filterable { var bbNet: BB = 0.0 + val bbHourlyRate: BB + get() { + return this.bbNet / this.hourlyDuration + } + override fun formattedValue(stat: Stat, context: Context) : TextFormat { return when (stat) { Stat.NETRESULT, Stat.AVERAGE -> stat.format(this.ratedNet, null, context) Stat.DURATION, Stat.AVERAGE_DURATION -> stat.format(this.netDuration.toDouble(), null, context) Stat.HOURLY_RATE -> stat.format(this.hourlyRate, null, context) Stat.HANDS_PLAYED -> stat.format(this.estimatedHands, null, context) + Stat.HOURLY_RATE_BB -> stat.format(this.bbHourlyRate, null, context) + Stat.NET_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> { + val netBBPer100Hands = Stat.netBBPer100Hands(this.bbNet, this.estimatedHands) + if (netBBPer100Hands != null) { + return stat.format(this.estimatedHands, null, context) + } else { + return TextFormat(NULL_TEXT) + } + } else -> throw StatFormattingException("format undefined for stat ${stat.name}") } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt index 03552cde..eab4bfe2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt @@ -5,11 +5,12 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.widget.FrameLayout import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.isVisible import kotlinx.android.synthetic.main.layout_legend_default.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.TextFormat -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat /** * Display a row session @@ -48,8 +49,14 @@ class LegendView : FrameLayout { */ fun prepareWithStat(stat: Stat, counter: Int) { - this.stat1Name.text = stat.localizedTitle(context) - this.stat2Name.text = stat.cumulativeLabelResId(context) + if (stat.significantIndividualValue) { + this.stat1Name.text = stat.localizedTitle(context) + this.stat2Name.text = stat.cumulativeLabelResId(context) + } else { + this.stat1Name.text = stat.cumulativeLabelResId(context) + this.stat2Name.isVisible = false + } + this.counter.text = "$counter ${context.getString(R.string.sessions)}" } @@ -60,8 +67,13 @@ class LegendView : FrameLayout { fun setItemData(stat: Stat, title: String, statFormat1: TextFormat, statFormat2: TextFormat) { this.title.text = title - this.stat1Value.setTextFormat(statFormat1, context) - this.stat2Value.setTextFormat(statFormat2, context) + + if (stat.significantIndividualValue) { + this.stat1Value.setTextFormat(statFormat1, context) + this.stat2Value.setTextFormat(statFormat2, context) + } else { + this.stat1Value.setTextFormat(statFormat2, context) + } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 4ffd4bec..387756b9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -17,7 +17,7 @@ import net.pokeranalytics.android.model.StatRepresentable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt index bce8118f..362a83fb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt @@ -15,7 +15,7 @@ import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.realm.Session -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getShortDayName import net.pokeranalytics.android.util.extensions.shortTime @@ -151,8 +151,6 @@ class SessionRowView : FrameLayout { val result = session.result?.net ?: 0.0 val formattedStat = ComputedStat(Stat.NETRESULT, result, currency = session.currency).format(context) rowHistorySession.gameResult.setTextFormat(formattedStat, context) -// rowHistorySession.gameResult.setTextColor(formattedStat.getColor(context)) -// rowHistorySession.gameResult.text = formattedStat.text } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt index 25f3b5a3..6ccb8219 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt @@ -10,7 +10,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.realm.Transaction -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getShortDayName @@ -65,8 +65,6 @@ class TransactionRowView : FrameLayout { // Amount val formattedStat = ComputedStat(Stat.NETRESULT, transaction.amount).format(context) rowTransaction.transactionAmount.setTextFormat(formattedStat, context) -// rowTransaction.transactionAmount.setTextColor(formattedStat.getColor(context)) -// rowTransaction.transactionAmount.text = formattedStat.text } diff --git a/app/src/main/res/layout/layout_legend_default.xml b/app/src/main/res/layout/layout_legend_default.xml index 4d65f59a..e5684cbf 100644 --- a/app/src/main/res/layout/layout_legend_default.xml +++ b/app/src/main/res/layout/layout_legend_default.xml @@ -88,7 +88,7 @@ android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@id/stat2Value" + app:layout_constraintTop_toBottomOf="@id/stat1Value" tools:text="152 sessions" /> \ No newline at end of file From 659d421660e161ba9fd4486d9a846aaf9996cfaa Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 12 Apr 2019 16:05:48 +0200 Subject: [PATCH 058/245] add new comparator enum --- .../android/model/comparison/Comparator.kt | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt new file mode 100644 index 00000000..90e4f6f0 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -0,0 +1,73 @@ +package net.pokeranalytics.android.model.comparison + +import io.realm.Realm +import io.realm.RealmQuery +import io.realm.kotlin.where +import net.pokeranalytics.android.exceptions.PokerAnalyticsException +import net.pokeranalytics.android.model.filter.Filterable +import net.pokeranalytics.android.model.filter.QueryCondition + +enum class Comparator { + DAY_OF_WEEK, + MONTH, + BLIND, + ; + + val queryConditions: List + get() { + return when (this) { + DAY_OF_WEEK -> listOf() + else -> throw PokerAnalyticsException.QueryTypeUnhandled + } + } + +} + +fun List.combined(): List> { + val comparatorList = ArrayList>() + this.forEach { + comparatorList.add(it.queryConditions) + } + return getCombinations(comparatorList) +} + +inline fun List.query(realm: Realm): RealmQuery { + var realmQuery = realm.where() + this.forEach { + realmQuery = it.filter(realmQuery) + } + return realmQuery +} + +fun getCombinations(lists: List>): List> { + var combinations: MutableSet> = HashSet() + var newCombinations: MutableSet> + + var index = 0 + + // extract each of the integers in the first list + // and add each to ints as a new list + for (i in lists[0]) { + val newList = ArrayList() + newList.add(i) + combinations.add(newList) + } + index++ + while (index < lists.size) { + val nextList = lists[index] + newCombinations = HashSet() + for (first in combinations) { + for (second in nextList) { + val newList = ArrayList() + newList.addAll(first) + newList.add(second) + newCombinations.add(newList) + } + } + combinations = newCombinations + + index++ + } + + return combinations.toList() +} \ No newline at end of file From c54035f87d25c1af07ec83abce9512cc1585bf78 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 17:05:45 +0200 Subject: [PATCH 059/245] Add new legend layout --- app/src/main/res/drawable/circle_green.xml | 11 +++ .../main/res/layout/layout_legend_color.xml | 74 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 app/src/main/res/drawable/circle_green.xml create mode 100644 app/src/main/res/layout/layout_legend_color.xml diff --git a/app/src/main/res/drawable/circle_green.xml b/app/src/main/res/drawable/circle_green.xml new file mode 100644 index 00000000..93111933 --- /dev/null +++ b/app/src/main/res/drawable/circle_green.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_legend_color.xml b/app/src/main/res/layout/layout_legend_color.xml new file mode 100644 index 00000000..2b4b9b82 --- /dev/null +++ b/app/src/main/res/layout/layout_legend_color.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + \ No newline at end of file From 57f4f2be6ccff0c6d5342a70711737ad1d597017 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 12 Apr 2019 17:15:59 +0200 Subject: [PATCH 060/245] Clean file --- .../main/java/net/pokeranalytics/android/ui/view/LegendView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt index eab4bfe2..3d94b2a3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt @@ -40,7 +40,7 @@ class LegendView : FrameLayout { private fun init() { val layoutInflater = LayoutInflater.from(context) legendLayout = layoutInflater.inflate(R.layout.layout_legend_default, this, false) as ConstraintLayout - val layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) + val layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) addView(legendLayout, layoutParams) } From da3fe957c527ef4d2e0c31c32d969e80a796a431 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 12 Apr 2019 17:39:27 +0200 Subject: [PATCH 061/245] Added method to compute a Report with Comparators and conditions --- .../android/calculus/Calculator.kt | 22 ++++++++++++++++++- .../android/model/filter/QueryCondition.kt | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index af908c6a..fb435fd5 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -2,6 +2,10 @@ package net.pokeranalytics.android.calculus import io.realm.Realm import net.pokeranalytics.android.calculus.Stat.* +import net.pokeranalytics.android.model.comparison.Comparator +import net.pokeranalytics.android.model.comparison.combined +import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.filter.name import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.SessionSet @@ -60,9 +64,25 @@ class Calculator { companion object { + fun computeStatsWithComparators(realm: Realm, comparators: List = listOf(), conditions: List = listOf(), options: Options): Report { + + val computableGroups: MutableList = mutableListOf() + comparators.combined().forEach { comparatorConditions -> + + val allConditions = mutableListOf() + allConditions.addAll(conditions) + allConditions.addAll(comparatorConditions) + + val group = ComputableGroup(allConditions.name(), conditions) + computableGroups.add(group) + + } + return Calculator.computeGroups(realm, computableGroups, options) + } + fun computeStatsWithFilters(realm: Realm, filters: List, options: Options): Report { - var computableGroups: MutableList = mutableListOf() + val computableGroups: MutableList = mutableListOf() filters.forEach { filter -> val group = ComputableGroup(filter.name, filter.filterConditions.map { it.queryCondition }) diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index b9f24f47..c07db415 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -8,6 +8,9 @@ import net.pokeranalytics.android.util.extensions.endOfDay import net.pokeranalytics.android.util.extensions.startOfDay import java.util.* +fun List.name() : String { + return this.map { it.name }.joinToString(" / ") +} /** * Enum describing the way a query should be handled From d2572eb14bfe6c1e569d34af30bd7a80e00f891f Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 08:55:43 +0200 Subject: [PATCH 062/245] Start working on Calendar fragment --- .../android/ui/fragment/CalendarFragment.kt | 11 ++++- .../android/ui/view/CalendarTabs.kt | 21 +++++++++ app/src/main/res/layout/fragment_calendar.xml | 44 +++++++++++++------ .../res/layout/fragment_comparison_chart.xml | 24 ++-------- 4 files changed, 66 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/CalendarTabs.kt diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index b05d036f..26ac454b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -5,9 +5,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager -import kotlinx.android.synthetic.main.fragment_stats.* +import kotlinx.android.synthetic.main.fragment_calendar.* +import kotlinx.android.synthetic.main.fragment_stats.recyclerView import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import net.pokeranalytics.android.ui.view.CalendarTabs + class CalendarFragment : PokerAnalyticsFragment() { @@ -51,6 +54,12 @@ class CalendarFragment : PokerAnalyticsFragment() { */ private fun initUI() { + CalendarTabs.values().forEach { + val tab = tabs.newTab() + tab.text = getString(it.resId) + tabs.addTab(tab) + } + val viewManager = LinearLayoutManager(requireContext()) recyclerView.apply { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/CalendarTabs.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/CalendarTabs.kt new file mode 100644 index 00000000..edf84717 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/CalendarTabs.kt @@ -0,0 +1,21 @@ +package net.pokeranalytics.android.ui.view + +import net.pokeranalytics.android.R + + +enum class CalendarTabs : Displayable { + NET_RESULTS, + NET_HOURLY_RATE, + NUMBER_OF_GAMES, + WIN_RATIO; + + override val resId: Int + get() { + return when (this) { + NET_RESULTS -> R.string.net_result + NET_HOURLY_RATE -> R.string.hour_rate_without_pauses + NUMBER_OF_GAMES -> R.string.number_of_records + WIN_RATIO -> R.string.win_ratio + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index aaa1d704..50adf8b2 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -1,18 +1,36 @@ - + + + + + + + + + + android:id="@+id/recyclerView" + android:layout_width="0dp" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/appBar" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_comparison_chart.xml b/app/src/main/res/layout/fragment_comparison_chart.xml index e24de7cb..290c62ac 100644 --- a/app/src/main/res/layout/fragment_comparison_chart.xml +++ b/app/src/main/res/layout/fragment_comparison_chart.xml @@ -7,11 +7,12 @@ + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - - - - - - - - + android:layout_height="wrap_content" /> From 346cece99dcd9d0d80120b906a03d3de9c33123b Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 09:43:06 +0200 Subject: [PATCH 063/245] Add calendar tabs --- .../android/ui/fragment/CalendarFragment.kt | 1 - .../net/pokeranalytics/android/ui/view/CalendarTabs.kt | 10 +++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 26ac454b..58598f82 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -46,7 +46,6 @@ class CalendarFragment : PokerAnalyticsFragment() { * Init data */ private fun initData() { - } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/CalendarTabs.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/CalendarTabs.kt index edf84717..677e3a0f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/CalendarTabs.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/CalendarTabs.kt @@ -7,7 +7,11 @@ enum class CalendarTabs : Displayable { NET_RESULTS, NET_HOURLY_RATE, NUMBER_OF_GAMES, - WIN_RATIO; + WIN_RATIO, + STANDARD_DEVIATION_PER_HOUR, + AVERAGE_NET_RESULT, + AVERAGE_DURATION, + DURATION_OF_PLAY; override val resId: Int get() { @@ -16,6 +20,10 @@ enum class CalendarTabs : Displayable { NET_HOURLY_RATE -> R.string.hour_rate_without_pauses NUMBER_OF_GAMES -> R.string.number_of_records WIN_RATIO -> R.string.win_ratio + STANDARD_DEVIATION_PER_HOUR -> R.string.standard_deviation_per_hour + AVERAGE_NET_RESULT -> R.string.average_net_result + AVERAGE_DURATION -> R.string.average_hours_played + DURATION_OF_PLAY -> R.string.total_hours_played } } } \ No newline at end of file From 85ef1f4efca58a6132d7560d9b317a9af5a49649 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 11:11:14 +0200 Subject: [PATCH 064/245] example of report launching in fragment --- .../pokeranalytics/android/calculus/Report.kt | 4 + .../android/ui/fragment/CalendarFragment.kt | 80 ++++++++++++++++++- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index e97d56f9..745af09d 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -136,6 +136,8 @@ class ComputableGroup(name: String, conditions: List, stats: Lis this._sessionSets = null } + val isEmpty: Boolean = this._computables?.isEmpty() ?: true + } class ComputedResults(group: ComputableGroup) { @@ -258,6 +260,8 @@ class ComputedResults(group: ComputableGroup) { return entries } + val isEmpty: Boolean = this.group.comparedComputables?.isEmpty ?: true + } class Point(val x: Double, val y: Double, val data: Any) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index b05d036f..0f21d694 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -5,11 +5,20 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager +import io.realm.Realm import kotlinx.android.synthetic.main.fragment_stats.* +import kotlinx.coroutines.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import net.pokeranalytics.android.calculus.Calculator +import net.pokeranalytics.android.calculus.Report +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.model.comparison.Comparator +import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment +import java.util.* +import kotlin.coroutines.CoroutineContext -class CalendarFragment : PokerAnalyticsFragment() { +class CalendarFragment : SessionObserverFragment(), CoroutineScope { companion object { @@ -44,8 +53,75 @@ class CalendarFragment : PokerAnalyticsFragment() { */ private fun initData() { + val comparator = Comparator.MONTH // returns all months + + val conditions = comparator.queryConditions + + conditions.forEach { + + val realm = getRealm() + Calculator.computeStatsWithComparators(realm, conditions = listOf(it), options = Calculator.Options()) + + } + + + } + override val coroutineContext: CoroutineContext + get() = Dispatchers.Main + + + private fun launchStatComputation() { + + val comparator = Comparator.MONTH // returns all months + +// val conditions = comparator.queryConditions + val conditions = listOf(QueryCondition.CASH, QueryCondition.TOURNAMENT) + + conditions.forEach { + + val realm = getRealm() + + + + GlobalScope.launch(coroutineContext) { + + var r = Report() + val test = GlobalScope.async { + val s = Date() + + val realm = Realm.getDefaultInstance() + + val report = Calculator.computeStatsWithComparators(realm, conditions = listOf(it), options = Calculator.Options()) + report.results.firstOrNull()?.let { + + + val isEmpty = it.isEmpty + val statValue = it.computedStat(Stat.NETRESULT)?.value + } + +// r = createSessionGroupsAndStartCompute(realm) +// report = r + realm.close() + + + } + test.await() + + if (!isDetached) { +// showResults(r) + } + } + + } + + + } + + + + /** * Init UI */ From e67e5e452dbcffe170322d039c0a3da6ca3c85d3 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 12:42:39 +0200 Subject: [PATCH 065/245] Fixing test build --- .../PerfsInstrumentedUnitTest.kt | 6 +-- .../unitTests/StatsInstrumentedUnitTest.kt | 51 +++++++------------ 2 files changed, 21 insertions(+), 36 deletions(-) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/performanceTests/PerfsInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/performanceTests/PerfsInstrumentedUnitTest.kt index fe5aff41..8cfd42ac 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/performanceTests/PerfsInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/performanceTests/PerfsInstrumentedUnitTest.kt @@ -3,11 +3,11 @@ package net.pokeranalytics.android.performanceTests import android.content.Context import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 -import net.pokeranalytics.android.components.RealmInstrumentedUnitTest import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.components.RealmInstrumentedUnitTest import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.SessionSet @@ -54,12 +54,12 @@ class PerfsInstrumentedUnitTest : RealmInstrumentedUnitTest() { Timber.d("sets: ${sets.size}") val stats: List = listOf(Stat.NETRESULT, Stat.AVERAGE) - val group = ComputableGroup("test", computableResults, sets, stats) + val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION) - val results: ComputedResults = Calculator.compute(group, options) + val results: ComputedResults = Calculator.compute(realm, group, options) Timber.d("*** ended in ${System.currentTimeMillis() - start} milliseconds") val sum = results.computedStat(Stat.NETRESULT) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt index 347d0576..f7dac0f4 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt @@ -120,14 +120,13 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { println(">>>>>> rated net = ${it.ratedNet} ") } - val sets = realm.where(SessionSet::class.java).findAll() val stats: List = listOf(Stat.NETRESULT, Stat.AVERAGE) - val group = ComputableGroup("test", computableResults, sets, stats) + val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION) - val results: ComputedResults = Calculator.compute(group, options) + val results: ComputedResults = Calculator.compute(realm, group, options) val delta = 0.01 val sum = results.computedStat(Stat.NETRESULT) @@ -263,15 +262,13 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { } - val computableResults = realm.where(ComputableResult::class.java).findAll() - val sets = realm.where(SessionSet::class.java).findAll() val stats: List = listOf(Stat.NETRESULT, Stat.AVERAGE) - val group = ComputableGroup("test", computableResults, sets, stats) + val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION) - val results: ComputedResults = Calculator.compute(group, options) + val results: ComputedResults = Calculator.compute(realm, group, options) val delta = 0.01 val duration = results.computedStat(Stat.DURATION) @@ -332,15 +329,13 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { realm.commitTransaction() - val computableResults = realm.where(ComputableResult::class.java).findAll() - val sets = realm.where(SessionSet::class.java).findAll() val stats: List = listOf(Stat.NETRESULT, Stat.AVERAGE) - val group = ComputableGroup("test", computableResults, sets, stats) + val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION) - val results: ComputedResults = Calculator.compute(group, options) + val results: ComputedResults = Calculator.compute(realm, group, options) val delta = 0.01 val duration = results.computedStat(Stat.DURATION) @@ -417,15 +412,13 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { realm.commitTransaction() - val computableResults = realm.where(ComputableResult::class.java).findAll() - val sets = realm.where(SessionSet::class.java).findAll() val stats: List = listOf(Stat.NETRESULT, Stat.AVERAGE) - val group = ComputableGroup("test", computableResults, sets, stats) + val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION) - val results: ComputedResults = Calculator.compute(group, options) + val results: ComputedResults = Calculator.compute(realm, group, options) val delta = 0.01 val duration = results.computedStat(Stat.DURATION) @@ -439,12 +432,10 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { s1.deleteFromRealm() } - val computableResults2 = realm.where(ComputableResult::class.java).findAll() - val sets2 = realm.where(SessionSet::class.java).findAll() val stats2: List = listOf(Stat.NETRESULT, Stat.AVERAGE) - val group2 = ComputableGroup("test", computableResults2, sets2, stats2) + val group2 = ComputableGroup("test", listOf(), stats2) - val results2: ComputedResults = Calculator.compute(group2, options) + val results2: ComputedResults = Calculator.compute(realm, group2, options) val duration2 = results2.computedStat(Stat.DURATION) if (duration2 != null) { @@ -566,15 +557,13 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { s1.endDate = null } - val computableResults = realm.where(ComputableResult::class.java).findAll() - val sets = realm.where(SessionSet::class.java).findAll() val stats: List = listOf(Stat.NETRESULT, Stat.AVERAGE) - val group = ComputableGroup("test", computableResults, sets, stats) + val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() // options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION) - val results: ComputedResults = Calculator.compute(group, options) + val results: ComputedResults = Calculator.compute(realm, group, options) val delta = 0.01 val duration = results.computedStat(Stat.DURATION) @@ -623,9 +612,9 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { val computableResults = realm.where(ComputableResult::class.java).findAll() val sets = realm.where(SessionSet::class.java).findAll() val stats: List = listOf(Stat.NETRESULT) - val group = ComputableGroup("test", computableResults, sets, stats) + val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() - val results: ComputedResults = Calculator.compute(group, options) + val results: ComputedResults = Calculator.compute(realm, group, options) val netResult = results.computedStat(Stat.NETRESULT) Assert.assertEquals(250.0, netResult?.value) @@ -658,12 +647,10 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { } - val computableResults = realm.where(ComputableResult::class.java).findAll() - val sets = realm.where(SessionSet::class.java).findAll() val stats: List = listOf(Stat.NETRESULT) - val group = ComputableGroup("test", computableResults, sets, stats) + val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() - val results: ComputedResults = Calculator.compute(group, options) + val results: ComputedResults = Calculator.compute(realm, group, options) val netResult = results.computedStat(Stat.NETRESULT) Assert.assertEquals(250.0, netResult?.value) @@ -679,10 +666,8 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { } } - val updatedComputableResults = realm.where(ComputableResult::class.java).findAll() - val updatedSets = realm.where(SessionSet::class.java).findAll() - val updatedGroup = ComputableGroup("test", updatedComputableResults, updatedSets, stats) - val updatedResults: ComputedResults = Calculator.compute(updatedGroup, options) + val updatedGroup = ComputableGroup("test", listOf(), stats) + val updatedResults: ComputedResults = Calculator.compute(realm, updatedGroup, options) val updatedNetResult = updatedResults.computedStat(Stat.NETRESULT) Assert.assertEquals(650.0, updatedNetResult?.value) From 7afea99f58db87af4bdc09c0e57e2b688f9c7f74 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 14:31:47 +0200 Subject: [PATCH 066/245] fixes issue with method when no comparators are given --- .../net/pokeranalytics/android/calculus/Calculator.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index fb435fd5..f7f42459 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -73,11 +73,17 @@ class Calculator { allConditions.addAll(conditions) allConditions.addAll(comparatorConditions) - val group = ComputableGroup(allConditions.name(), conditions) + val group = ComputableGroup(allConditions.name(), allConditions) computableGroups.add(group) } - return Calculator.computeGroups(realm, computableGroups, options) + + if (computableGroups.size == 0) { + val group = ComputableGroup(conditions.name(), conditions) + computableGroups.add(group) + } + + return this.computeGroups(realm, computableGroups, options) } fun computeStatsWithFilters(realm: Realm, filters: List, options: Options): Report { From 02c73ba487c1e0754fbadd1ee3125e3713886a6d Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Mon, 15 Apr 2019 15:13:42 +0200 Subject: [PATCH 067/245] refactor QueryCondition enum to sealedclass --- .../filter/BlindFilterInstrumentedTest.kt | 8 +- .../filter/DateFilterInstrumentedUnitTest.kt | 14 +- .../filter/ExceptionFilterInstrumentedTest.kt | 2 +- .../filter/RealmFilterInstrumentedUnitTest.kt | 4 +- .../SessionFilterInstrumentedUnitTest.kt | 32 +-- .../android/model/filter/QueryCondition.kt | 184 ++++++++++-------- .../android/model/realm/Filter.kt | 8 +- .../android/model/realm/FilterCondition.kt | 2 +- .../android/model/realm/Session.kt | 44 ++--- .../view/rowrepresentable/FilterElementRow.kt | 155 ++++++++++----- 10 files changed, 264 insertions(+), 189 deletions(-) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt index 9ace6e81..969c2e3b 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt @@ -42,7 +42,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.BLIND + val filter = QueryCondition.BLIND() val blind = FilterElementRow.Blind(s1.blinds!!, true) blind.filterSectionRow = FilterSectionRow.BLIND val filterElement = FilterCondition(filterElementRows = arrayListOf(blind)) @@ -86,7 +86,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.BLIND + val filter = QueryCondition.BLIND() val blind1 = FilterElementRow.Blind(s1.blinds!!, true) val blind2 = FilterElementRow.Blind(s2.blinds!!, true) blind1.filterSectionRow = FilterSectionRow.BLIND @@ -132,7 +132,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.BLIND + val filter = QueryCondition.BLIND() val blind = FilterElementRow.Blind(s3.blinds!!, false) blind.filterSectionRow = FilterSectionRow.BLIND @@ -175,7 +175,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.BLIND + val filter = QueryCondition.BLIND() val blind1 = FilterElementRow.Blind(s1.blinds!!, false) blind1.filterSectionRow = FilterSectionRow.BLIND diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/DateFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/DateFilterInstrumentedUnitTest.kt index 8ef9c845..2ccb7ea5 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/DateFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/DateFilterInstrumentedUnitTest.kt @@ -30,7 +30,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val filter = QueryCondition.DAY_OF_WEEK + val filter = QueryCondition.DAY_OF_WEEK() cal.time = s1.startDate val filterElementRow = FilterElementRow.Day(cal.get(Calendar.DAY_OF_WEEK)) @@ -59,7 +59,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val filter = QueryCondition.MONTH + val filter = QueryCondition.MONTH() cal.time = s1.startDate val filterElementRow = FilterElementRow.Month(cal.get(Calendar.MONTH)) @@ -88,7 +88,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(100.0, true, cal.time) realm.commitTransaction() - val filter = QueryCondition.YEAR + val filter = QueryCondition.YEAR() cal.time = s1.startDate val filterElementRow = FilterElementRow.Year(cal.get(Calendar.YEAR)) filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE @@ -383,7 +383,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val s2 = Session.testInstance(100.0, true, cal.time, 1) realm.commitTransaction() - val filter = QueryCondition.STARTED_FROM_DATE + val filter = QueryCondition.STARTED_FROM_DATE() val filterElementRow = FilterElementRow.From.apply { dateValue = s2.startDate!!} filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) @@ -411,7 +411,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.STARTED_TO_DATE + val filter = QueryCondition.STARTED_TO_DATE() val filterElementRow = FilterElementRow.From.apply { dateValue = s1.startDate!! } filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) @@ -440,7 +440,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.ENDED_FROM_DATE + val filter = QueryCondition.ENDED_FROM_DATE() val filterElementRow = FilterElementRow.From.apply { dateValue = s2.endDate() } filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) @@ -469,7 +469,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { realm.commitTransaction() - val filter = QueryCondition.ENDED_TO_DATE + val filter = QueryCondition.ENDED_TO_DATE() val filterElementRow = FilterElementRow.From.apply { dateValue = s1.endDate() } filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/ExceptionFilterInstrumentedTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/ExceptionFilterInstrumentedTest.kt index fd756ada..a5552ef1 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/ExceptionFilterInstrumentedTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/ExceptionFilterInstrumentedTest.kt @@ -15,7 +15,7 @@ class ExceptionFilterInstrumentedTest: BaseFilterInstrumentedUnitTest() { @Test(expected = PokerAnalyticsException.FilterElementExpectedValueMissing::class) fun testValueKeyFilterException() { - val filter = QueryCondition.STARTED_FROM_DATE + val filter = QueryCondition.STARTED_FROM_DATE() val filterElement = FilterCondition() filter.updateValueMap(filterElement) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt index 5ad36cbe..b60c96bd 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/RealmFilterInstrumentedUnitTest.kt @@ -38,7 +38,7 @@ class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val filterComponent = filter.filterConditions.first() filterComponent?.let { - Assert.assertEquals(QueryCondition.CASH, QueryCondition.valueOf(it.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName)) + Assert.assertTrue(it.queryCondition is QueryCondition.CASH) } ?: run { Assert.fail() } @@ -55,7 +55,7 @@ class RealmFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Assert.assertEquals(1, sessions.size) sessions[0]?.run { - Assert.assertEquals(Session.Type.CASH_GAME.ordinal, (this as Session).type) + Assert.assertEquals(Session.Type.CASH_GAME.ordinal, this.type) } ?: run { Assert.fail() } diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/SessionFilterInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/SessionFilterInstrumentedUnitTest.kt index 1ad26832..5bc1d2c7 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/SessionFilterInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/SessionFilterInstrumentedUnitTest.kt @@ -109,7 +109,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(bankroll = b2) realm.commitTransaction() - val filter = QueryCondition.BANKROLL + val filter = QueryCondition.BANKROLL() val filterElementRow = FilterElementRow.Bankroll(b1) filterElementRow.filterSectionRow = FilterSectionRow.BANKROLL filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow))) @@ -140,7 +140,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(bankroll = b3) realm.commitTransaction() - val filter = QueryCondition.BANKROLL + val filter = QueryCondition.BANKROLL() val filterElementRow = FilterElementRow.Bankroll(b1) filterElementRow.filterSectionRow = FilterSectionRow.BANKROLL @@ -169,7 +169,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(game = g2) realm.commitTransaction() - val filter = QueryCondition.GAME + val filter = QueryCondition.GAME() val filterElementRow = FilterElementRow.Game(g2) filterElementRow.filterSectionRow = FilterSectionRow.GAME filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow))) @@ -200,7 +200,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(game = g3) realm.commitTransaction() - val filter = QueryCondition.GAME + val filter = QueryCondition.GAME() val filterElementRow = FilterElementRow.Game(g2) filterElementRow.filterSectionRow = FilterSectionRow.GAME @@ -229,7 +229,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(location = l2) realm.commitTransaction() - val filter = QueryCondition.LOCATION + val filter = QueryCondition.LOCATION() val filterElementRow = FilterElementRow.Location(l1) filterElementRow.filterSectionRow = FilterSectionRow.LOCATION filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow))) @@ -260,7 +260,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(location = l3) realm.commitTransaction() - val filter = QueryCondition.LOCATION + val filter = QueryCondition.LOCATION() val filterElementRow = FilterElementRow.Location(l1) filterElementRow.filterSectionRow = FilterSectionRow.LOCATION @@ -290,7 +290,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentName = t2) realm.commitTransaction() - val filter = QueryCondition.TOURNAMENT_NAME + val filter = QueryCondition.TOURNAMENT_NAME() val filterElementRow = FilterElementRow.TournamentName(t1) filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME @@ -322,7 +322,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentName = t3) realm.commitTransaction() - val filter = QueryCondition.TOURNAMENT_NAME + val filter = QueryCondition.TOURNAMENT_NAME() val filterElementRow = FilterElementRow.TournamentName(t1) filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME val filterElementRow2 = FilterElementRow.TournamentName(t2) @@ -358,7 +358,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentFeatures = RealmList(t1)) realm.commitTransaction() - val filter = QueryCondition.ALL_TOURNAMENT_FEATURES + val filter = QueryCondition.ALL_TOURNAMENT_FEATURES() val filterElementRow = FilterElementRow.AllTournamentFeature(t1) filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE val filterElementRow2 = FilterElementRow.AllTournamentFeature(t2) @@ -393,7 +393,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentFeatures = RealmList(t1)) realm.commitTransaction() - val filter = QueryCondition.ANY_TOURNAMENT_FEATURES + val filter = QueryCondition.ANY_TOURNAMENT_FEATURES() val filterElementRow = FilterElementRow.AnyTournamentFeature(t1) filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE val filterElementRow2 = FilterElementRow.AnyTournamentFeature(t2) @@ -427,7 +427,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tournamentFeatures = RealmList(t1)) realm.commitTransaction() - val filter = QueryCondition.ANY_TOURNAMENT_FEATURES + val filter = QueryCondition.ANY_TOURNAMENT_FEATURES() val filterElementRow = FilterElementRow.AnyTournamentFeature(t2) filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow))) @@ -452,7 +452,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(tableSize = 10) realm.commitTransaction() - val filter = QueryCondition.TABLE_SIZE + val filter = QueryCondition.TABLE_SIZE() val filterElementRow = FilterElementRow.TableSize(TableSize(2)) filterElementRow.filterSectionRow = FilterSectionRow.TABLE_SIZE val filterElementRow2 = FilterElementRow.TableSize(TableSize(4)) @@ -479,7 +479,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { val s2 = Session.testInstance(netResult = 570.0) realm.commitTransaction() - val filter = QueryCondition.MORE_THAN_NET_RESULT + val filter = QueryCondition.MORE_THAN_NET_RESULT() val filterElementRow = FilterElementRow.ResultMoreThan.apply { this.amount = 204.0 } filterElementRow.filterSectionRow = FilterSectionRow.VALUE filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) @@ -504,7 +504,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(netResult = 570.0) realm.commitTransaction() - val filter = QueryCondition.LESS_THAN_NET_RESULT + val filter = QueryCondition.LESS_THAN_NET_RESULT() val filterElementRow = FilterElementRow.ResultMoreThan.apply { this.amount = 540.0 } filterElementRow.filterSectionRow = FilterSectionRow.VALUE filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) @@ -529,12 +529,12 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() { Session.testInstance(netResult = 570.0) realm.commitTransaction() - val filterMore = QueryCondition.MORE_THAN_NET_RESULT + val filterMore = QueryCondition.MORE_THAN_NET_RESULT() val filterElementRow = FilterElementRow.ResultMoreThan.apply { this.amount = 200.0 } filterElementRow.filterSectionRow = FilterSectionRow.VALUE filterMore.updateValueMap(FilterCondition(arrayListOf(filterElementRow))) - val filterLess = QueryCondition.LESS_THAN_NET_RESULT + val filterLess = QueryCondition.LESS_THAN_NET_RESULT() val filterElementRow2 = FilterElementRow.ResultMoreThan.apply { this.amount = 400.0 } filterElementRow2.filterSectionRow = FilterSectionRow.VALUE filterLess.updateValueMap(FilterCondition(arrayListOf(filterElementRow2))) diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index c07db415..d7ba8bc0 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -18,68 +18,20 @@ fun List.name() : String { * To handle that, the enum has a public [valueMap] variable * A new type should also set the expected numericValues required in the [filterValuesExpectedKeys] */ -enum class QueryCondition(var operator: Operator? = null) { - LIVE, - CASH, - ONLINE, - TOURNAMENT, - BANKROLL, - GAME, - TOURNAMENT_NAME, - ANY_TOURNAMENT_FEATURES, - ALL_TOURNAMENT_FEATURES, - LOCATION, - LIMIT, - TABLE_SIZE, - TOURNAMENT_TYPE, - BLIND, - LAST_GAMES, - LAST_SESSIONS, - MORE_NUMBER_OF_TABLE(Operator.MORE), - LESS_NUMBER_OF_TABLE(Operator.LESS), - BETWEEN_NUMBER_OF_TABLE(Operator.BETWEEN), - MORE_THAN_NET_RESULT(Operator.MORE), - LESS_THAN_NET_RESULT(Operator.LESS), - MORE_THAN_BUY_IN(Operator.MORE), - LESS_THAN_BUY_IN(Operator.LESS), - MORE_THAN_CASH_OUT(Operator.MORE), - LESS_THAN_CASH_OUT(Operator.LESS), - MORE_THAN_TIPS(Operator.MORE), - LESS_THAN_TIPS(Operator.LESS), - MORE_THAN_NUMBER_OF_PLAYER(Operator.MORE), - LESS_THAN_NUMBER_OF_PLAYER(Operator.LESS), - BETWEEN_NUMBER_OF_PLAYER(Operator.BETWEEN), - MORE_THAN_TOURNAMENT_FEE(Operator.MORE), - LESS_THAN_TOURNAMENT_FEE(Operator.LESS), - BETWEEN_TOURNAMENT_FEE(Operator.BETWEEN), - MIN_RE_BUY(Operator.MORE), - MAX_RE_BUY(Operator.LESS), - // Dates - STARTED_FROM_DATE, - STARTED_TO_DATE, - ENDED_FROM_DATE, - ENDED_TO_DATE, - DAY_OF_WEEK, - MONTH, - YEAR, - WEEK_DAY, - WEEK_END, - TODAY, - YESTERDAY, - TODAY_AND_YESTERDAY, - THIS_WEEK, - THIS_MONTH, - THIS_YEAR, - PAST_DAYS, - MORE_THAN_DURATION(Operator.MORE), - LESS_THAN_DURATION(Operator.LESS), - STARTED_FROM_TIME, - ENDED_TO_TIME, +sealed class QueryCondition(var operator: Operator? = null) { - COMMENT, + abstract class QueryDataCondition : QueryCondition() - ; + companion object { + fun valueOf(name:String) : QueryCondition { + val kClass = Class.forName("${QueryCondition::class.qualifiedName}$$name").kotlin + val instance = kClass.objectInstance ?: kClass.java.newInstance() + return instance as QueryCondition + } + } + + val name: String = this::class.simpleName ?: throw PokerAnalyticsException.FilterElementUnknownName enum class Operator { BETWEEN, @@ -87,6 +39,67 @@ enum class QueryCondition(var operator: Operator? = null) { LESS; } + object LIVE : QueryCondition() + object CASH : QueryCondition() + object ONLINE : QueryCondition() + object TOURNAMENT: QueryCondition() + class BANKROLL: QueryDataCondition() + class GAME: QueryCondition() + class TOURNAMENT_NAME: QueryCondition() + class ANY_TOURNAMENT_FEATURES: QueryCondition() + class ALL_TOURNAMENT_FEATURES: QueryCondition() + class LOCATION: QueryCondition() + class LIMIT: QueryCondition() + class TABLE_SIZE: QueryCondition() + class TOURNAMENT_TYPE: QueryCondition() + class BLIND: QueryCondition() + class LAST_GAMES: QueryCondition() + class LAST_SESSIONS: QueryCondition() + class MORE_NUMBER_OF_TABLE: QueryCondition(Operator.MORE) + class LESS_NUMBER_OF_TABLE: QueryCondition(Operator.LESS) + class BETWEEN_NUMBER_OF_TABLE: QueryCondition(Operator.BETWEEN) + class MORE_THAN_NET_RESULT: QueryCondition(Operator.MORE) + class LESS_THAN_NET_RESULT: QueryCondition(Operator.LESS) + class MORE_THAN_BUY_IN: QueryCondition(Operator.MORE) + class LESS_THAN_BUY_IN: QueryCondition(Operator.LESS) + class MORE_THAN_CASH_OUT: QueryCondition(Operator.MORE) + class LESS_THAN_CASH_OUT: QueryCondition(Operator.LESS) + class MORE_THAN_TIPS: QueryCondition(Operator.MORE) + class LESS_THAN_TIPS: QueryCondition(Operator.LESS) + class MORE_THAN_NUMBER_OF_PLAYER: QueryCondition(Operator.MORE) + class LESS_THAN_NUMBER_OF_PLAYER: QueryCondition(Operator.LESS) + class BETWEEN_NUMBER_OF_PLAYER: QueryCondition(Operator.BETWEEN) + class MORE_THAN_TOURNAMENT_FEE: QueryCondition(Operator.MORE) + class LESS_THAN_TOURNAMENT_FEE: QueryCondition(Operator.LESS) + class BETWEEN_TOURNAMENT_FEE: QueryCondition(Operator.BETWEEN) + class MIN_RE_BUY: QueryCondition(Operator.MORE) + class MAX_RE_BUY: QueryCondition(Operator.LESS) + + // Dates + class STARTED_FROM_DATE: QueryCondition() + class STARTED_TO_DATE: QueryCondition() + class ENDED_FROM_DATE: QueryCondition() + class ENDED_TO_DATE: QueryCondition() + class DAY_OF_WEEK: QueryCondition() + class MONTH: QueryCondition() + class YEAR: QueryCondition() + object WEEK_DAY: QueryCondition() + object WEEK_END: QueryCondition() + object TODAY: QueryCondition() + object YESTERDAY: QueryCondition() + object TODAY_AND_YESTERDAY: QueryCondition() + object THIS_WEEK: QueryCondition() + object THIS_MONTH: QueryCondition() + object THIS_YEAR: QueryCondition() + class PAST_DAYS: QueryCondition() + class MORE_THAN_DURATION: QueryCondition(Operator.MORE) + class LESS_THAN_DURATION: QueryCondition(Operator.LESS) + class STARTED_FROM_TIME: QueryCondition() + class ENDED_TO_TIME: QueryCondition() + + class COMMENT: QueryCondition() + + var valueMap : Map? = null get() { this.filterValuesExpectedKeys?.let { valueMapExceptedKeys -> @@ -112,13 +125,13 @@ enum class QueryCondition(var operator: Operator? = null) { } } return when (this) { - BANKROLL, GAME, LOCATION, ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES, TOURNAMENT_NAME -> arrayOf("ids") - LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> arrayOf("values") - BLIND -> arrayOf("blinds", "hasDefaultCurrency") - STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> arrayOf("date") - DAY_OF_WEEK -> arrayOf("dayOfWeek") - MONTH -> arrayOf("month") - YEAR -> arrayOf("year") + is BANKROLL, is GAME, is LOCATION, is ANY_TOURNAMENT_FEATURES, is ALL_TOURNAMENT_FEATURES, is TOURNAMENT_NAME -> arrayOf("ids") + is LIMIT, is TOURNAMENT_TYPE, is TABLE_SIZE -> arrayOf("values") + is BLIND -> arrayOf("blinds", "hasDefaultCurrency") + is STARTED_FROM_DATE, is STARTED_TO_DATE, is ENDED_FROM_DATE, is ENDED_TO_DATE -> arrayOf("date") + is DAY_OF_WEEK -> arrayOf("dayOfWeek") + is MONTH -> arrayOf("month") + is YEAR -> arrayOf("year") else -> null } } @@ -150,18 +163,18 @@ enum class QueryCondition(var operator: Operator? = null) { LIVE, ONLINE -> realmQuery.equalTo(fieldName, this == LIVE) CASH -> realmQuery.equalTo(fieldName, Session.Type.CASH_GAME.ordinal) TOURNAMENT -> realmQuery.equalTo(fieldName, Session.Type.TOURNAMENT.ordinal) - ALL_TOURNAMENT_FEATURES -> { + is ALL_TOURNAMENT_FEATURES -> { val ids: Array by valueMap ids.forEach { realmQuery.equalTo(fieldName, it) } realmQuery } - ANY_TOURNAMENT_FEATURES -> { + is ANY_TOURNAMENT_FEATURES -> { val ids: Array by valueMap realmQuery.`in`(fieldName, ids) } - BLIND -> { + is BLIND -> { val blinds: Array by valueMap val hasDefaultCurrency: Array by valueMap //realmQuery.`in`(fieldName, blinds) @@ -182,39 +195,39 @@ enum class QueryCondition(var operator: Operator? = null) { } realmQuery } - BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { + is BANKROLL, is GAME, is LOCATION, is TOURNAMENT_NAME -> { val ids: Array by valueMap realmQuery.`in`(fieldName, ids) } - LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { + is LIMIT, is TOURNAMENT_TYPE, is TABLE_SIZE -> { val values: Array? by valueMap realmQuery.`in`(fieldName, values) } - STARTED_FROM_DATE -> { + is STARTED_FROM_DATE -> { val date: Date by valueMap realmQuery.greaterThanOrEqualTo(fieldName, date) } - STARTED_TO_DATE -> { + is STARTED_TO_DATE -> { val date: Date by valueMap realmQuery.lessThanOrEqualTo(fieldName, date) } - ENDED_FROM_DATE -> { + is ENDED_FROM_DATE -> { val date: Date by valueMap realmQuery.greaterThanOrEqualTo(fieldName, date) } - ENDED_TO_DATE -> { + is ENDED_TO_DATE -> { val date: Date by valueMap realmQuery.lessThanOrEqualTo(fieldName, date) } - DAY_OF_WEEK -> { + is DAY_OF_WEEK -> { val dayOfWeek: Int by valueMap realmQuery.equalTo(fieldName, dayOfWeek) } - MONTH -> { + is MONTH -> { val month: Int by valueMap realmQuery.equalTo(fieldName, month) } - YEAR -> { + is YEAR -> { val year: Int by valueMap realmQuery.equalTo(fieldName, year) } @@ -280,27 +293,28 @@ enum class QueryCondition(var operator: Operator? = null) { } when (this) { - ALL_TOURNAMENT_FEATURES, ANY_TOURNAMENT_FEATURES, BANKROLL, GAME, LOCATION, TOURNAMENT_NAME -> { + is BANKROLL -> valueMap = mapOf("ids" to filterCondition.ids) + is ALL_TOURNAMENT_FEATURES, is ANY_TOURNAMENT_FEATURES, is GAME, is LOCATION, is TOURNAMENT_NAME -> { valueMap = mapOf("ids" to filterCondition.ids) } - LIMIT, TOURNAMENT_TYPE, TABLE_SIZE -> { + is LIMIT, is TOURNAMENT_TYPE, is TABLE_SIZE -> { valueMap = mapOf("values" to filterCondition.values) } - BLIND -> { + is BLIND -> { valueMap = mapOf( "blinds" to filterCondition.blinds, "hasDefaultCurrency" to filterCondition.hasDefaultCurrency) } - STARTED_FROM_DATE, STARTED_TO_DATE, ENDED_FROM_DATE, ENDED_TO_DATE -> { + is STARTED_FROM_DATE, is STARTED_TO_DATE, is ENDED_FROM_DATE, is ENDED_TO_DATE -> { valueMap = mapOf("date" to filterCondition.date) } - DAY_OF_WEEK -> { + is DAY_OF_WEEK -> { valueMap = mapOf("dayOfWeek" to filterCondition.dayOfWeek) } - MONTH -> { + is MONTH -> { valueMap = mapOf("month" to filterCondition.month) } - YEAR -> { + is YEAR -> { valueMap = mapOf("year" to filterCondition.year) } else -> { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index 5184b586..9009b80b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -68,13 +68,13 @@ open class Filter : RealmObject() { val casted = arrayListOf() filterConditionRows .map { - it.filterName + it.id } .distinct() .forEach { filterName-> filterConditionRows .filter { - it.filterName == filterName + it.id == filterName } .apply { casted.addAll(this) @@ -97,7 +97,7 @@ open class Filter : RealmObject() { fun contains(filterElementRow: FilterElementRow): Boolean { val filtered = filterConditions.filter { - it.filterName == filterElementRow.filterName + it.filterName == filterElementRow.id } if (filtered.isEmpty()) { return false @@ -125,7 +125,7 @@ open class Filter : RealmObject() { */ private fun getSavedValueForElement(filterElementRow: FilterElementRow): Any? { val filtered = filterConditions.filter { - it.filterName == filterElementRow.filterName + it.filterName == filterElementRow.id } if (filtered.isNotEmpty()) { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt index 52851300..96ada039 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt @@ -15,7 +15,7 @@ open class FilterCondition() : RealmObject() { this.sectionName = sectionName } - constructor(filterElementRows: ArrayList) : this(filterElementRows.first().filterName, filterElementRows.first().filterSectionRow.name) { + constructor(filterElementRows: ArrayList) : this(filterElementRows.first().id, filterElementRows.first().filterSectionRow.name) { val row = filterElementRows.first() this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName 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 3b661a74..acc98d9a 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 @@ -66,28 +66,28 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return when (queryCondition) { LIVE, ONLINE -> "bankroll.live" CASH, TOURNAMENT -> "type" - BANKROLL -> "bankroll.id" - GAME -> "game.id" - TOURNAMENT_NAME -> "tournamentName.id" - ANY_TOURNAMENT_FEATURES, ALL_TOURNAMENT_FEATURES -> "tournamentFeatures.id" - LOCATION -> "location.id" - LIMIT -> "limit" - TABLE_SIZE -> "tableSize" - TOURNAMENT_TYPE -> "tournamentType" - BLIND -> "blind" - COMMENT -> "comment" - BETWEEN_NUMBER_OF_TABLE, MORE_NUMBER_OF_TABLE, LESS_NUMBER_OF_TABLE -> "numberOfTable" - MORE_THAN_NET_RESULT, LESS_THAN_NET_RESULT -> "computableResults.ratedNet" - MORE_THAN_BUY_IN, LESS_THAN_BUY_IN -> "result.buyin" - MORE_THAN_CASH_OUT, LESS_THAN_CASH_OUT -> "result.cashout" - MORE_THAN_TIPS, LESS_THAN_TIPS -> "result.tips" - MORE_THAN_NUMBER_OF_PLAYER, LESS_THAN_NUMBER_OF_PLAYER, BETWEEN_NUMBER_OF_PLAYER -> "tournamentNumberOfPlayers" - MORE_THAN_TOURNAMENT_FEE, LESS_THAN_TOURNAMENT_FEE, BETWEEN_TOURNAMENT_FEE -> "tournamentEntryFee" - STARTED_FROM_DATE, STARTED_TO_DATE -> "startDate" - ENDED_FROM_DATE, ENDED_TO_DATE -> "endDate" - DAY_OF_WEEK, WEEK_END, WEEK_DAY -> "dayOfWeek" - MONTH -> "month" - YEAR -> "year" + is BANKROLL -> "bankroll.id" + is GAME -> "game.id" + is TOURNAMENT_NAME -> "tournamentName.id" + is ANY_TOURNAMENT_FEATURES, is ALL_TOURNAMENT_FEATURES -> "tournamentFeatures.id" + is LOCATION -> "location.id" + is LIMIT -> "limit" + is TABLE_SIZE -> "tableSize" + is TOURNAMENT_TYPE -> "tournamentType" + is BLIND -> "blinds" + is COMMENT -> "comment" + is BETWEEN_NUMBER_OF_TABLE, is MORE_NUMBER_OF_TABLE, is LESS_NUMBER_OF_TABLE -> "numberOfTable" + is MORE_THAN_NET_RESULT, is LESS_THAN_NET_RESULT -> "computableResults.ratedNet" + is MORE_THAN_BUY_IN, is LESS_THAN_BUY_IN -> "result.buyin" + is MORE_THAN_CASH_OUT, is LESS_THAN_CASH_OUT -> "result.cashout" + is MORE_THAN_TIPS, is LESS_THAN_TIPS -> "result.tips" + is MORE_THAN_NUMBER_OF_PLAYER, is LESS_THAN_NUMBER_OF_PLAYER, is BETWEEN_NUMBER_OF_PLAYER -> "tournamentNumberOfPlayers" + is MORE_THAN_TOURNAMENT_FEE, is LESS_THAN_TOURNAMENT_FEE, is BETWEEN_TOURNAMENT_FEE -> "tournamentEntryFee" + is STARTED_FROM_DATE, is STARTED_TO_DATE -> "startDate" + is ENDED_FROM_DATE, is ENDED_TO_DATE -> "endDate" + is DAY_OF_WEEK, is WEEK_END, is WEEK_DAY -> "dayOfWeek" + is MONTH -> "month" + is YEAR -> "year" TODAY, YESTERDAY, TODAY_AND_YESTERDAY, THIS_YEAR, THIS_MONTH, THIS_WEEK -> "startDate" else -> null } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index 747a2db6..c50c6f0f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -4,20 +4,16 @@ import android.content.Context import android.text.InputType import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PokerAnalyticsException -import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.realm.FilterCondition import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.util.Preferences -import net.pokeranalytics.android.util.UserDefaults import java.text.DateFormatSymbols import java.util.* sealed class FilterElementRow : RowRepresentable { - interface Duration { var minutes: Int } @@ -27,6 +23,7 @@ sealed class FilterElementRow : RowRepresentable { interface LessOperator : Operator open class BoolFilterElementRow : FilterElementRow() + open class DateFilterElementRow(var dateValue: Date = Date(), var showTime: Boolean = false) : FilterElementRow() open class NumericFilterElementRow(open val doubleValue: Double = 0.0) : FilterElementRow() open class StringFilterElementRow(val stringValue: String = "") : FilterElementRow() @@ -40,11 +37,11 @@ sealed class FilterElementRow : RowRepresentable { } open class DataFilterElementRow(data: Manageable) : StringFilterElementRow(data.id) { - val id: String = data.id + val objectId: String = data.id val name: String = (data as RowRepresentable).getDisplayName() - } + } - open class StaticDataFilterElementRow(val row: RowRepresentable, val id: Int) : NumericFilterElementRow(id.toDouble()) { + open class StaticDataFilterElementRow(val row: RowRepresentable, val objectId: Int) : NumericFilterElementRow(objectId.toDouble()) { override val resId: Int? = row.resId val name: String = row.getDisplayName() @@ -139,50 +136,50 @@ sealed class FilterElementRow : RowRepresentable { lateinit var filterSectionRow: FilterSectionRow - val filterName: String = this.queryCondition.name + val id: String = this.criteria.name - private val queryCondition: QueryCondition + private val criteria: QueryCriteria get() { return when (this) { - is Cash -> QueryCondition.CASH - is Tournament -> QueryCondition.TOURNAMENT - is Blind -> QueryCondition.BLIND - is From -> QueryCondition.STARTED_FROM_DATE - is To -> QueryCondition.ENDED_TO_DATE - is FromTime -> QueryCondition.STARTED_FROM_TIME - is ToTime -> QueryCondition.ENDED_TO_TIME - is Month -> QueryCondition.MONTH - is Day -> QueryCondition.DAY_OF_WEEK - is Year -> QueryCondition.YEAR - is Live -> QueryCondition.LIVE - is Online -> QueryCondition.ONLINE - is Weekday -> QueryCondition.WEEK_DAY - is Weekend -> QueryCondition.WEEK_END - is Today -> QueryCondition.TODAY - is Yesterday -> QueryCondition.YESTERDAY - is TodayAndYesterday -> QueryCondition.TODAY_AND_YESTERDAY - is CurrentWeek -> QueryCondition.THIS_WEEK - is CurrentMonth -> QueryCondition.THIS_MONTH - is CurrentYear -> QueryCondition.THIS_YEAR - is PastDays -> QueryCondition.PAST_DAYS - is Limit -> QueryCondition.LIMIT - is TableSize -> QueryCondition.TABLE_SIZE - is Game -> QueryCondition.GAME - is Bankroll -> QueryCondition.BANKROLL - is Location -> QueryCondition.LOCATION - is TournamentName -> QueryCondition.TOURNAMENT_NAME - is AnyTournamentFeature -> QueryCondition.ANY_TOURNAMENT_FEATURES - is AllTournamentFeature -> QueryCondition.ALL_TOURNAMENT_FEATURES - is ResultMoreThan -> QueryCondition.MORE_THAN_NET_RESULT - is ResultLessThan -> QueryCondition.LESS_THAN_NET_RESULT - is DurationMoreThan -> QueryCondition.MORE_THAN_DURATION - is DurationLessThan -> QueryCondition.LESS_THAN_DURATION + is Cash -> QueryCriteria.CASH + is Tournament -> QueryCriteria.TOURNAMENT + is Blind -> QueryCriteria.BLIND + is From -> QueryCriteria.STARTED_FROM_DATE + is To -> QueryCriteria.ENDED_TO_DATE + is FromTime -> QueryCriteria.STARTED_FROM_TIME + is ToTime -> QueryCriteria.ENDED_TO_TIME + is Month -> QueryCriteria.MONTH + is Day -> QueryCriteria.DAY_OF_WEEK + is Year -> QueryCriteria.YEAR + is Live -> QueryCriteria.LIVE + is Online -> QueryCriteria.ONLINE + is Weekday -> QueryCriteria.WEEK_DAY + is Weekend -> QueryCriteria.WEEK_END + is Today -> QueryCriteria.TODAY + is Yesterday -> QueryCriteria.YESTERDAY + is TodayAndYesterday -> QueryCriteria.TODAY_AND_YESTERDAY + is CurrentWeek -> QueryCriteria.THIS_WEEK + is CurrentMonth -> QueryCriteria.THIS_MONTH + is CurrentYear -> QueryCriteria.THIS_YEAR + is PastDays -> QueryCriteria.PAST_DAYS + is Limit -> QueryCriteria.LIMIT + is TableSize -> QueryCriteria.TABLE_SIZE + is Game -> QueryCriteria.GAME + is Bankroll -> QueryCriteria.BANKROLL + is Location -> QueryCriteria.LOCATION + is TournamentName -> QueryCriteria.TOURNAMENT_NAME + is AnyTournamentFeature -> QueryCriteria.ANY_TOURNAMENT_FEATURES + is AllTournamentFeature -> QueryCriteria.ALL_TOURNAMENT_FEATURES + is ResultMoreThan -> QueryCriteria.MORE_THAN_NET_RESULT + is ResultLessThan -> QueryCriteria.LESS_THAN_NET_RESULT + is DurationMoreThan -> QueryCriteria.MORE_THAN_DURATION + is DurationLessThan -> QueryCriteria.LESS_THAN_DURATION //TODO: Check the conditions - is LastGames -> QueryCondition.LAST_GAMES - is LastSessions -> QueryCondition.LAST_SESSIONS - is ReBuyMoreThan -> QueryCondition.MIN_RE_BUY - is ReBuyLessThan -> QueryCondition.MAX_RE_BUY + is LastGames -> QueryCriteria.LAST_GAMES + is LastSessions -> QueryCriteria.LAST_SESSIONS + is ReBuyMoreThan -> QueryCriteria.MIN_RE_BUY + is ReBuyLessThan -> QueryCriteria.MAX_RE_BUY else -> throw PokerAnalyticsException.UnknownQueryTypeForRow(this) } @@ -194,7 +191,7 @@ sealed class FilterElementRow : RowRepresentable { it.values.contains(this.intValue) } is DataFilterElementRow -> filterConditions.any { - it.ids.contains(this.id) + it.ids.contains(this.objectId) } else -> true } @@ -327,4 +324,68 @@ sealed class FilterElementRow : RowRepresentable { return null } + + private enum class QueryCriteria { + LIVE, + CASH, + ONLINE, + TOURNAMENT, + BANKROLL, + GAME, + TOURNAMENT_NAME, + ANY_TOURNAMENT_FEATURES, + ALL_TOURNAMENT_FEATURES, + LOCATION, + LIMIT, + TABLE_SIZE, + TOURNAMENT_TYPE, + BLIND, + LAST_GAMES, + LAST_SESSIONS, + MORE_NUMBER_OF_TABLE, + LESS_NUMBER_OF_TABLE, + BETWEEN_NUMBER_OF_TABLE, + MORE_THAN_NET_RESULT, + LESS_THAN_NET_RESULT, + MORE_THAN_BUY_IN, + LESS_THAN_BUY_IN, + MORE_THAN_CASH_OUT, + LESS_THAN_CASH_OUT, + MORE_THAN_TIPS, + LESS_THAN_TIPS, + MORE_THAN_NUMBER_OF_PLAYER, + LESS_THAN_NUMBER_OF_PLAYER, + BETWEEN_NUMBER_OF_PLAYER, + MORE_THAN_TOURNAMENT_FEE, + LESS_THAN_TOURNAMENT_FEE, + BETWEEN_TOURNAMENT_FEE, + MIN_RE_BUY, + MAX_RE_BUY, + + // Dates + STARTED_FROM_DATE, + STARTED_TO_DATE, + ENDED_FROM_DATE, + ENDED_TO_DATE, + DAY_OF_WEEK, + MONTH, + YEAR, + WEEK_DAY, + WEEK_END, + TODAY, + YESTERDAY, + TODAY_AND_YESTERDAY, + THIS_WEEK, + THIS_MONTH, + THIS_YEAR, + PAST_DAYS, + MORE_THAN_DURATION, + LESS_THAN_DURATION, + STARTED_FROM_TIME, + ENDED_TO_TIME, + + COMMENT, + + ; + } } \ No newline at end of file From 6b5befe52788d3b8cc2e67f48587f4e6fc55a69f Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 15:16:14 +0200 Subject: [PATCH 068/245] Working on CalendarFragment --- .../android/ui/fragment/CalendarFragment.kt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 7618d7b8..d54de355 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -17,6 +17,7 @@ import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.CalendarTabs +import timber.log.Timber import java.util.* import kotlin.coroutines.CoroutineContext @@ -46,6 +47,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { super.onViewCreated(view, savedInstanceState) initData() initUI() + + launchStatComputation() } @@ -56,6 +59,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { */ private fun initData() { + /* val comparator = Comparator.MONTH // returns all months val conditions = comparator.queryConditions @@ -66,8 +70,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { Calculator.computeStatsWithComparators(realm, conditions = listOf(it), options = Calculator.Options()) } - - + */ } @@ -86,8 +89,6 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { val realm = getRealm() - - GlobalScope.launch(coroutineContext) { var r = Report() @@ -96,12 +97,20 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { val realm = Realm.getDefaultInstance() + Timber.d("Get report for: $it") + val report = Calculator.computeStatsWithComparators(realm, conditions = listOf(it), options = Calculator.Options()) - report.results.firstOrNull()?.let { + Timber.d("Report: $report / Results: ${report.results.size}") + + report.results.firstOrNull()?.let { val isEmpty = it.isEmpty val statValue = it.computedStat(Stat.NETRESULT)?.value + + Timber.d("isEmpty: $isEmpty") + Timber.d("statValue: $statValue") + } // r = createSessionGroupsAndStartCompute(realm) From 8de559b2f7266aa82d9f8b09eb1bdf6bf2a93f4f Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Mon, 15 Apr 2019 16:01:56 +0200 Subject: [PATCH 069/245] add month and year comparator --- .../android/model/comparison/Comparator.kt | 17 +++++++++++++++++ .../android/model/filter/QueryCondition.kt | 14 +++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index 90e4f6f0..d75299a4 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -2,21 +2,38 @@ package net.pokeranalytics.android.model.comparison import io.realm.Realm import io.realm.RealmQuery +import io.realm.Sort import io.realm.kotlin.where import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.realm.Session enum class Comparator { DAY_OF_WEEK, + MONTH_OF_YEAR, MONTH, + YEAR, BLIND, ; val queryConditions: List get() { return when (this) { + MONTH_OF_YEAR -> List(12) { index-> QueryCondition.MONTH().apply { setMonth(index+1) } } DAY_OF_WEEK -> listOf() + YEAR -> { + val years = arrayListOf() + val realm = Realm.getDefaultInstance() + val distinctYears = realm.where().distinct("year").findAll().sort("year", Sort.DESCENDING) + distinctYears.forEach { session -> + session.year?.let { year -> + years.add(QueryCondition.YEAR().apply { setYear(year) }) + } + } + realm.close() + years + } else -> throw PokerAnalyticsException.QueryTypeUnhandled } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index d7ba8bc0..e7573c23 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -81,8 +81,16 @@ sealed class QueryCondition(var operator: Operator? = null) { class ENDED_FROM_DATE: QueryCondition() class ENDED_TO_DATE: QueryCondition() class DAY_OF_WEEK: QueryCondition() - class MONTH: QueryCondition() - class YEAR: QueryCondition() + class MONTH: QueryCondition() { + fun setMonth(month:Int) { + this.valueMap = mapOf("month" to month) + } + } + class YEAR: QueryCondition() { + fun setYear(year:Int) { + this.valueMap = mapOf("year" to year) + } + } object WEEK_DAY: QueryCondition() object WEEK_END: QueryCondition() object TODAY: QueryCondition() @@ -114,7 +122,7 @@ sealed class QueryCondition(var operator: Operator? = null) { } return field } - private set + protected set private val filterValuesExpectedKeys : Array? get() { From c269f9f9301672b0402c22029d26a0084c603721 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 16:03:09 +0200 Subject: [PATCH 070/245] Working on CalendarFragment --- .../android/ui/fragment/CalendarFragment.kt | 123 ++++++++++++------ 1 file changed, 82 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index d54de355..98f5829c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -8,15 +8,20 @@ import androidx.recyclerview.widget.LinearLayoutManager import io.realm.Realm import kotlinx.android.synthetic.main.fragment_calendar.* import kotlinx.android.synthetic.main.fragment_stats.recyclerView -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator -import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.realm.FilterCondition import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.CalendarTabs +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import timber.log.Timber import java.util.* import kotlin.coroutines.CoroutineContext @@ -24,55 +29,55 @@ import kotlin.coroutines.CoroutineContext class CalendarFragment : SessionObserverFragment(), CoroutineScope { - companion object { + companion object { - /** - * Create new instance - */ - fun newInstance(): CalendarFragment { - val fragment = CalendarFragment() - val bundle = Bundle() - fragment.arguments = bundle - return fragment - } - } + /** + * Create new instance + */ + fun newInstance(): CalendarFragment { + val fragment = CalendarFragment() + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + } - // Life Cycle + // Life Cycle - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_calendar, container, false) - } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_calendar, container, false) + } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initData() - initUI() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + initUI() - launchStatComputation() - } + launchStatComputation() + } - // Business + // Business - /** - * Init data - */ - private fun initData() { + /** + * Init data + */ + private fun initData() { - /* - val comparator = Comparator.MONTH // returns all months + /* + val comparator = Comparator.MONTH // returns all months - val conditions = comparator.queryConditions + val conditions = comparator.queryConditions - conditions.forEach { + conditions.forEach { - val realm = getRealm() - Calculator.computeStatsWithComparators(realm, conditions = listOf(it), options = Calculator.Options()) + val realm = getRealm() + Calculator.computeStatsWithComparators(realm, conditions = listOf(it), options = Calculator.Options()) - } - */ + } + */ - } + } override val coroutineContext: CoroutineContext get() = Dispatchers.Main @@ -81,10 +86,47 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { private fun launchStatComputation() { val comparator = Comparator.MONTH // returns all months + //val conditions = comparator.queryConditions + //val conditions = listOf(QueryCondition.CASH, QueryCondition.TOURNAMENT) + + val calendar = Calendar.getInstance() + calendar.set(Calendar.YEAR, 2018) + calendar.set(Calendar.MONTH, Calendar.DECEMBER) + + val filterMonth = QueryCondition.MONTH() + val filterElementRow = FilterElementRow.Month(calendar.get(Calendar.MONTH)) + filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE + val filterElement = FilterCondition(arrayListOf(filterElementRow)) + filterMonth.updateValueMap(filterElement) -// val conditions = comparator.queryConditions - val conditions = listOf(QueryCondition.CASH, QueryCondition.TOURNAMENT) + val filterYear = QueryCondition.YEAR() + val filterElementRow2 = FilterElementRow.Year(calendar.get(Calendar.YEAR)) + filterElementRow2.filterSectionRow = FilterSectionRow.DYNAMIC_DATE + val filterElement2 = FilterCondition(arrayListOf(filterElementRow2)) + filterYear.updateValueMap(filterElement2) + //comparator.queryConditions.first().updateValueMap() + + GlobalScope.launch { + + val realm = Realm.getDefaultInstance() + + val report = Calculator.computeStatsWithComparators(realm, conditions = listOf(filterMonth, filterYear), options = Calculator.Options()) + Timber.d("Report results: ${report.results.size}") + + report.results.firstOrNull()?.let { + + val isEmpty = it.isEmpty + val statValue = it.computedStat(Stat.NETRESULT)?.value + + Timber.d("isEmpty: $isEmpty") + Timber.d("statValue: $statValue") + + } + + } + + /* conditions.forEach { val realm = getRealm() @@ -127,13 +169,12 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { } } + */ } - - /** * Init UI */ From d2f68d4e127d27e7ff633642d18ff2faa0c27b21 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 16:50:47 +0200 Subject: [PATCH 071/245] Fix isEmpty check --- app/src/main/java/net/pokeranalytics/android/calculus/Report.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index 745af09d..cd343c30 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -260,7 +260,7 @@ class ComputedResults(group: ComputableGroup) { return entries } - val isEmpty: Boolean = this.group.comparedComputables?.isEmpty ?: true + val isEmpty: Boolean = this.group.isEmpty } From e39de5e1c7e25f1c0f7c209b386ce3bd5c31d474 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Mon, 15 Apr 2019 17:06:12 +0200 Subject: [PATCH 072/245] example month year comparator in calendar --- .../android/model/comparison/Comparator.kt | 16 +++++++++ .../android/ui/fragment/CalendarFragment.kt | 33 ++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index d75299a4..7a8c0500 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -8,6 +8,10 @@ import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.fragment.CalendarFragment +import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.HashSet enum class Comparator { DAY_OF_WEEK, @@ -23,6 +27,17 @@ enum class Comparator { MONTH_OF_YEAR -> List(12) { index-> QueryCondition.MONTH().apply { setMonth(index+1) } } DAY_OF_WEEK -> listOf() YEAR -> { + val years = arrayListOf() + val calendar = Calendar.getInstance() + calendar.time = Date() + val yearNow = calendar.get(Calendar.YEAR) + val realm = Realm.getDefaultInstance() + realm.where().sort("year", Sort.ASCENDING).findFirst()?.year?.let { + List(yearNow - it ) { index-> QueryCondition.YEAR().apply { setYear(yearNow - index) } } + } + realm.close() + years + /* val years = arrayListOf() val realm = Realm.getDefaultInstance() val distinctYears = realm.where().distinct("year").findAll().sort("year", Sort.DESCENDING) @@ -33,6 +48,7 @@ enum class Comparator { } realm.close() years + */ } else -> throw PokerAnalyticsException.QueryTypeUnhandled } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 7618d7b8..42df13ff 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -56,7 +56,38 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { */ private fun initData() { - val comparator = Comparator.MONTH // returns all months + val realm = getRealm() + + //example + //per year x month + val report = Calculator.computeStatsWithComparators(realm, comparators = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR), options = Calculator.Options()) + + report.results.forEach { + //show net result per year x month + print(it.computedStat(Stat.NETRESULT)?.value) + + /* + si on voulait faire Year en même temps, il faudrait un array de yearData et la possibilité d'appeler un computedStat sur un array de computedResult + un yearData devra alors conteneir une variable "results" qui serait un array de tous des results de tous les mois d'une année (qu'on viendrait piocher dans report.results + A discuter: + - stocker les queryConditions dans chaque result ? + - appeler un computedStat sur un array de computedResult ? + - demander si on veut ou pas une entrée vide quand pas de sessions pour une query dans report.results + */ + } + + + //per year + val reportMonth = Calculator.computeStatsWithComparators(realm, comparators = listOf(Comparator.YEAR), options = Calculator.Options()) + + reportMonth.results.forEach { + //show net result per year + print(it.computedStat(Stat.NETRESULT)?.value) + } + + + + val comparator = Comparator.MONTH // returns all months val conditions = comparator.queryConditions From c7f385d1c80a6eb16a8b2b42a6cda1d26b878bcf Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 17:15:56 +0200 Subject: [PATCH 073/245] Update HashSet to LinkedHashSet to keep order --- .../pokeranalytics/android/model/comparison/Comparator.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index d75299a4..13264ad4 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -45,7 +45,7 @@ fun List.combined(): List> { this.forEach { comparatorList.add(it.queryConditions) } - return getCombinations(comparatorList) + return getCombinations(comparatorList) } inline fun List.query(realm: Realm): RealmQuery { @@ -57,7 +57,7 @@ inline fun List.query(realm: Realm): Re } fun getCombinations(lists: List>): List> { - var combinations: MutableSet> = HashSet() + var combinations: MutableSet> = LinkedHashSet() var newCombinations: MutableSet> var index = 0 @@ -69,10 +69,10 @@ fun getCombinations(lists: List>): List> { newList.add(i) combinations.add(newList) } - index++ + index++ while (index < lists.size) { val nextList = lists[index] - newCombinations = HashSet() + newCombinations = LinkedHashSet() for (first in combinations) { for (second in nextList) { val newList = ArrayList() From da999a8c4880bde50710915ef55aa462c30e0601 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 17:16:09 +0200 Subject: [PATCH 074/245] Working on CalendarFragment --- .../android/ui/fragment/CalendarFragment.kt | 38 +++---------------- 1 file changed, 6 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 98f5829c..71eea2ee 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -16,14 +16,9 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator -import net.pokeranalytics.android.model.filter.QueryCondition -import net.pokeranalytics.android.model.realm.FilterCondition import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.CalendarTabs -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import timber.log.Timber -import java.util.* import kotlin.coroutines.CoroutineContext @@ -85,43 +80,22 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { private fun launchStatComputation() { - val comparator = Comparator.MONTH // returns all months - //val conditions = comparator.queryConditions - //val conditions = listOf(QueryCondition.CASH, QueryCondition.TOURNAMENT) - - val calendar = Calendar.getInstance() - calendar.set(Calendar.YEAR, 2018) - calendar.set(Calendar.MONTH, Calendar.DECEMBER) - - val filterMonth = QueryCondition.MONTH() - val filterElementRow = FilterElementRow.Month(calendar.get(Calendar.MONTH)) - filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE - val filterElement = FilterCondition(arrayListOf(filterElementRow)) - filterMonth.updateValueMap(filterElement) - - val filterYear = QueryCondition.YEAR() - val filterElementRow2 = FilterElementRow.Year(calendar.get(Calendar.YEAR)) - filterElementRow2.filterSectionRow = FilterSectionRow.DYNAMIC_DATE - val filterElement2 = FilterCondition(arrayListOf(filterElementRow2)) - filterYear.updateValueMap(filterElement2) - - //comparator.queryConditions.first().updateValueMap() + val comparator = Comparator.YEAR // returns all months GlobalScope.launch { val realm = Realm.getDefaultInstance() - val report = Calculator.computeStatsWithComparators(realm, conditions = listOf(filterMonth, filterYear), options = Calculator.Options()) + val report = Calculator.computeStatsWithComparators(realm, comparators = listOf(comparator), options = Calculator.Options()) Timber.d("Report results: ${report.results.size}") - report.results.firstOrNull()?.let { + report.results.forEach { - val isEmpty = it.isEmpty - val statValue = it.computedStat(Stat.NETRESULT)?.value - Timber.d("isEmpty: $isEmpty") - Timber.d("statValue: $statValue") + val isEmpty = it.isEmpty + val statValue = it.computedStat(Stat.NETRESULT)?.value + Timber.d("isEmpty: $isEmpty / statValue: $statValue / Number of stats: ${it.numberOfStats()}") } } From 63eb8a2cbd884ef29ca8c0abb91ea9a2a198afa2 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Mon, 15 Apr 2019 17:23:43 +0200 Subject: [PATCH 075/245] example month year comparator in calendar --- .../android/ui/fragment/CalendarFragment.kt | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 42df13ff..e9c891d3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -14,6 +14,7 @@ import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator +import net.pokeranalytics.android.model.comparison.combined import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.CalendarTabs @@ -87,19 +88,23 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { - val comparator = Comparator.MONTH // returns all months - - val conditions = comparator.queryConditions + // compute per cell (year x month) + // build conditions array and save it + val conditions = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() + // compute at index conditions.forEach { - - val realm = getRealm() - Calculator.computeStatsWithComparators(realm, conditions = listOf(it), options = Calculator.Options()) - + Calculator.computeStatsWithComparators(realm, conditions = it, options = Calculator.Options()) } + // compute per cell (year) + // build year conditions array and save it + val yearConditions = listOf(Comparator.YEAR) - + // compute at index + yearConditions .forEach { + Calculator.computeStatsWithComparators(realm, conditions = it.queryConditions, options = Calculator.Options()) + } } override val coroutineContext: CoroutineContext From 7b5371a71d3666ab82bb47ad3229aa5eefcb7c14 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 17:38:25 +0200 Subject: [PATCH 076/245] Update CalendarFragment --- .../android/ui/fragment/CalendarFragment.kt | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 6eb91234..0b1a4a36 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -5,20 +5,16 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager -import io.realm.Realm import kotlinx.android.synthetic.main.fragment_calendar.* import kotlinx.android.synthetic.main.fragment_stats.recyclerView import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.CalendarTabs -import timber.log.Timber import kotlin.coroutines.CoroutineContext @@ -88,20 +84,6 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { print(it.computedStat(Stat.NETRESULT)?.value) } - - - val comparator = Comparator.MONTH // returns all months - - val conditions = comparator.queryConditions - - conditions.forEach { - - val realm = getRealm() - Calculator.computeStatsWithComparators(realm, conditions = listOf(it), options = Calculator.Options()) - - } - */ - } override val coroutineContext: CoroutineContext @@ -110,6 +92,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { private fun launchStatComputation() { + /* val comparator = Comparator.YEAR // returns all months GlobalScope.launch { @@ -129,6 +112,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { } } + */ /* conditions.forEach { From 80e2dacb8628792cec0c308ad224808c720286e1 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 19:29:35 +0200 Subject: [PATCH 077/245] Fix isEmpty check --- .../main/java/net/pokeranalytics/android/calculus/Report.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index cd343c30..348dce5b 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -136,8 +136,10 @@ class ComputableGroup(name: String, conditions: List, stats: Lis this._sessionSets = null } - val isEmpty: Boolean = this._computables?.isEmpty() ?: true - + val isEmpty: Boolean + get() { + return this._computables?.isEmpty() ?: true + } } class ComputedResults(group: ComputableGroup) { From 874b539a5d05f6458538239977ad6c2cfdd4fffc Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 19:29:51 +0200 Subject: [PATCH 078/245] Bugfix and improve Comparator --- .../android/model/comparison/Comparator.kt | 140 ++++++++---------- 1 file changed, 65 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index 6ac15b43..ab2a614c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -8,99 +8,89 @@ import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.realm.Session -import net.pokeranalytics.android.ui.fragment.CalendarFragment import java.util.* import kotlin.collections.ArrayList -import kotlin.collections.HashSet enum class Comparator { - DAY_OF_WEEK, - MONTH_OF_YEAR, - MONTH, - YEAR, - BLIND, - ; + DAY_OF_WEEK, + MONTH_OF_YEAR, + MONTH, + YEAR, + BLIND, + ; - val queryConditions: List - get() { - return when (this) { - MONTH_OF_YEAR -> List(12) { index-> QueryCondition.MONTH().apply { setMonth(index+1) } } - DAY_OF_WEEK -> listOf() - YEAR -> { - val years = arrayListOf() - val calendar = Calendar.getInstance() - calendar.time = Date() - val yearNow = calendar.get(Calendar.YEAR) - val realm = Realm.getDefaultInstance() - realm.where().sort("year", Sort.ASCENDING).findFirst()?.year?.let { - List(yearNow - it ) { index-> QueryCondition.YEAR().apply { setYear(yearNow - index) } } - } - realm.close() - years - /* - val years = arrayListOf() - val realm = Realm.getDefaultInstance() - val distinctYears = realm.where().distinct("year").findAll().sort("year", Sort.DESCENDING) - distinctYears.forEach { session -> - session.year?.let { year -> - years.add(QueryCondition.YEAR().apply { setYear(year) }) - } - } - realm.close() - years - */ - } - else -> throw PokerAnalyticsException.QueryTypeUnhandled - } - } + val queryConditions: List + get() { + return when (this) { + MONTH_OF_YEAR -> List(12) { index -> QueryCondition.MONTH().apply { setMonth(index) } } + DAY_OF_WEEK -> listOf() + YEAR -> { + val years = arrayListOf() + val calendar = Calendar.getInstance() + calendar.time = Date() + val yearNow = calendar.get(Calendar.YEAR) + val realm = Realm.getDefaultInstance() + realm.where().sort("year", Sort.ASCENDING).findFirst()?.year?.let { + for (index in 0..(yearNow - it)) { + years.add(QueryCondition.YEAR().apply { setYear(yearNow - index) }) + } + } + realm.close() + years + } + else -> throw PokerAnalyticsException.QueryTypeUnhandled + } + } } fun List.combined(): List> { - val comparatorList = ArrayList>() - this.forEach { - comparatorList.add(it.queryConditions) - } + val comparatorList = ArrayList>() + this.forEach { + comparatorList.add(it.queryConditions) + } return getCombinations(comparatorList) } inline fun List.query(realm: Realm): RealmQuery { - var realmQuery = realm.where() - this.forEach { - realmQuery = it.filter(realmQuery) - } - return realmQuery + var realmQuery = realm.where() + this.forEach { + realmQuery = it.filter(realmQuery) + } + return realmQuery } fun getCombinations(lists: List>): List> { - var combinations: MutableSet> = LinkedHashSet() - var newCombinations: MutableSet> + var combinations: MutableSet> = LinkedHashSet() + var newCombinations: MutableSet> - var index = 0 + var index = 0 - // extract each of the integers in the first list - // and add each to ints as a new list - for (i in lists[0]) { - val newList = ArrayList() - newList.add(i) - combinations.add(newList) - } - index++ - while (index < lists.size) { - val nextList = lists[index] - newCombinations = LinkedHashSet() - for (first in combinations) { - for (second in nextList) { - val newList = ArrayList() - newList.addAll(first) - newList.add(second) - newCombinations.add(newList) - } - } - combinations = newCombinations + // extract each of the integers in the first list + // and add each to ints as a new list + if (lists.isNotEmpty()) { + for (i in lists[0]) { + val newList = ArrayList() + newList.add(i) + combinations.add(newList) + } + index++ + } + while (index < lists.size) { + val nextList = lists[index] + newCombinations = LinkedHashSet() + for (first in combinations) { + for (second in nextList) { + val newList = ArrayList() + newList.addAll(first) + newList.add(second) + newCombinations.add(newList) + } + } + combinations = newCombinations - index++ - } + index++ + } - return combinations.toList() + return combinations.toList() } \ No newline at end of file From 8884c0c7a62d4fb0e6bbaa00422525f35774392b Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 19:30:01 +0200 Subject: [PATCH 079/245] Clean & improve CalendarFragment --- .../android/ui/fragment/CalendarFragment.kt | 209 +++++++++--------- 1 file changed, 104 insertions(+), 105 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 62f702bf..65fec8b0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -8,15 +8,19 @@ import androidx.recyclerview.widget.LinearLayoutManager import io.realm.Realm import kotlinx.android.synthetic.main.fragment_calendar.* import kotlinx.android.synthetic.main.fragment_stats.recyclerView -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator -import net.pokeranalytics.android.calculus.Report +import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator -import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.comparison.combined import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.CalendarTabs +import timber.log.Timber import java.util.* import kotlin.coroutines.CoroutineContext @@ -36,6 +40,13 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { } } + override val coroutineContext: CoroutineContext + get() = Dispatchers.Main + + + private var sortedMonthlyReports: SortedMap = HashMap().toSortedMap() + private var sortedYearlyReports: SortedMap = HashMap().toSortedMap() + // Life Cycle override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -58,150 +69,138 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { */ private fun initData() { - val realm = getRealm() - - //example - //per year x month - val report = Calculator.computeStatsWithComparators(realm, comparators = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR), options = Calculator.Options()) - - report.results.forEach { - //show net result per year x month - print(it.computedStat(Stat.NETRESULT)?.value) - - /* - si on voulait faire Year en même temps, il faudrait un array de yearData et la possibilité d'appeler un computedStat sur un array de computedResult - un yearData devra alors conteneir une variable "results" qui serait un array de tous des results de tous les mois d'une année (qu'on viendrait piocher dans report.results - A discuter: - - stocker les queryConditions dans chaque result ? - - appeler un computedStat sur un array de computedResult ? - - demander si on veut ou pas une entrée vide quand pas de sessions pour une query dans report.results - */ - } - - - //per year - val reportMonth = Calculator.computeStatsWithComparators(realm, comparators = listOf(Comparator.YEAR), options = Calculator.Options()) - - reportMonth.results.forEach { - //show net result per year - print(it.computedStat(Stat.NETRESULT)?.value) - } - - - - // compute per cell (year x month) - // build conditions array and save it - val conditions = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() + } - // compute at index - conditions.forEach { - Calculator.computeStatsWithComparators(realm, conditions = it, options = Calculator.Options()) - } + /** + * Init UI + */ + private fun initUI() { - // compute per cell (year) - // build year conditions array and save it - val yearConditions = listOf(Comparator.YEAR) + CalendarTabs.values().forEach { + val tab = tabs.newTab() + tab.text = getString(it.resId) + tabs.addTab(tab) + } - // compute at index - yearConditions .forEach { - Calculator.computeStatsWithComparators(realm, conditions = it.queryConditions, options = Calculator.Options()) - } - } + val viewManager = LinearLayoutManager(requireContext()) - override val coroutineContext: CoroutineContext - get() = Dispatchers.Main + recyclerView.apply { + setHasFixedSize(true) + layoutManager = viewManager + //adapter = statsAdapter + } + } + /** + * Launch stat computation + */ private fun launchStatComputation() { - /* - val comparator = Comparator.YEAR // returns all months - GlobalScope.launch { - val realm = Realm.getDefaultInstance() - - val report = Calculator.computeStatsWithComparators(realm, comparators = listOf(comparator), options = Calculator.Options()) - Timber.d("Report results: ${report.results.size}") - - report.results.forEach { + val calendar = Calendar.getInstance() + calendar.set(Calendar.DAY_OF_MONTH, 1) + calendar.set(Calendar.HOUR_OF_DAY, 0) + calendar.set(Calendar.MINUTE, 0) + calendar.set(Calendar.SECOND, 0) + calendar.set(Calendar.MILLISECOND, 0) + val startDate = Date() + val realm = Realm.getDefaultInstance() + val montlyReports: HashMap = HashMap() + val yearlyReports: HashMap = HashMap() - val isEmpty = it.isEmpty - val statValue = it.computedStat(Stat.NETRESULT)?.value - Timber.d("isEmpty: $isEmpty / statValue: $statValue / Number of stats: ${it.numberOfStats()}") - } + // Compute data per YEAR x MONTH + val conditions = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() - } - */ + conditions.forEach { - /* - conditions.forEach { + val report = Calculator.computeStatsWithComparators(realm, conditions = it, options = Calculator.Options()) + //Timber.d("======> report results: ${report.results.size}") + report.results.forEach { computedResults -> + //Timber.d("======> computedResults empty: ${computedResults.isEmpty}") + if (!computedResults.isEmpty) { - val realm = getRealm() + // Set date data + it.forEach { condition -> + condition.valueMap?.get("year")?.let { year -> + calendar.set(Calendar.YEAR, year as Int) + } + condition.valueMap?.get("month")?.let { month -> + calendar.set(Calendar.MONTH, month as Int) + } + } - GlobalScope.launch(coroutineContext) { + montlyReports[calendar.time] = computedResults - var r = Report() - val test = GlobalScope.async { - val s = Date() + //val statValue = computedResults.computedStat(Stat.NETRESULT)?.value + //Timber.d("======> statValue: $statValue / Number of stats: ${computedResults.numberOfStats()}") + } + } + } - val realm = Realm.getDefaultInstance() + // Compute data per YEAR + val yearConditions = Comparator.YEAR.queryConditions - Timber.d("Get report for: $it") + // compute at index + yearConditions.forEach { condition -> - val report = Calculator.computeStatsWithComparators(realm, conditions = listOf(it), options = Calculator.Options()) - Timber.d("Report: $report / Results: ${report.results.size}") + val report = Calculator.computeStatsWithComparators(realm, conditions = listOf(condition), options = Calculator.Options()) + //Timber.d("======> report results: ${report.results.size}") + report.results.forEach { computedResults -> + //Timber.d("======> computedResults empty: ${computedResults.isEmpty}") + if (!computedResults.isEmpty) { - report.results.firstOrNull()?.let { + calendar.set(Calendar.MONTH, 0) - val isEmpty = it.isEmpty - val statValue = it.computedStat(Stat.NETRESULT)?.value + // Set date data + condition.valueMap?.get("year")?.let { year -> + calendar.set(Calendar.YEAR, year as Int) + } - Timber.d("isEmpty: $isEmpty") - Timber.d("statValue: $statValue") + yearlyReports[calendar.time] = computedResults + /* + computedResults.computedStat(Stat.NETRESULT)?.let { computedStat -> + Timber.d("======> statValue: ${computedStat.value}") + } + */ } + } + } -// r = createSessionGroupsAndStartCompute(realm) -// report = r - realm.close() + Timber.d("Computation: ${System.currentTimeMillis() - startDate.time}ms") + Timber.d("========== YEAR x MONTH") + sortedMonthlyReports = montlyReports.toSortedMap(compareByDescending { it }) + sortedMonthlyReports.keys.forEach { + Timber.d("$it => ${sortedMonthlyReports[it]?.computedStat(Stat.NETRESULT)?.value}") + } - } - test.await() + Timber.d("========== YEARLY") + sortedYearlyReports = yearlyReports.toSortedMap(compareByDescending { it }) + sortedYearlyReports.keys.forEach { + Timber.d("$it => ${sortedYearlyReports[it]?.computedStat(Stat.NETRESULT)?.value}") + } - if (!isDetached) { -// showResults(r) - } + GlobalScope.launch(coroutineContext) { + displayData() } } - } - /** - * Init UI + * Display data */ - private fun initUI() { + private fun displayData() { - CalendarTabs.values().forEach { - val tab = tabs.newTab() - tab.text = getString(it.resId) - tabs.addTab(tab) - } - val viewManager = LinearLayoutManager(requireContext()) - recyclerView.apply { - setHasFixedSize(true) - layoutManager = viewManager - //adapter = statsAdapter - } } } \ No newline at end of file From 1d529e607361102d8b33992f1acf3574e120d2ad Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 20:11:43 +0200 Subject: [PATCH 080/245] Add value --- .../java/net/pokeranalytics/android/util/FakeDataManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt b/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt index d11daa9a..bc5c7fd3 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt @@ -20,7 +20,7 @@ class FakeDataManager { val buyinList = arrayListOf(100.0, 200.0, 300.0, 500.0, 1000.0, 2000.0) val resultsList = arrayListOf( - -2500.0, -2000.0, -1500.0, -1000.0, -500.0, 200.0, 1000.0, 1500.0, 2500.0 + -2500.0, -2000.0, -1500.0, -1000.0, -500.0, 200.0, 1000.0, 1500.0, 2500.0, 3000.0 ) val commitFrequency = 100 From b5ada6a968ce281750f64e6154b220df88f62248 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 20:11:51 +0200 Subject: [PATCH 081/245] Improve logs --- .../net/pokeranalytics/android/PokerAnalyticsApplication.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index cfe97dca..a9d8e4cd 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -24,7 +24,6 @@ class PokerAnalyticsApplication : Application() { override fun onCreate() { super.onCreate() UserDefaults.init(this) - println("UserPreferences.defaultCurrency: ${UserDefaults.currency.symbol}") // Realm Realm.init(this) @@ -51,7 +50,8 @@ class PokerAnalyticsApplication : Application() { } if (BuildConfig.DEBUG) { - //this.createFakeSessions() + Timber.d("UserPreferences.defaultCurrency: ${UserDefaults.currency.symbol}") + //this.createFakeSessions() } } From 98bd3b461de8e43cb2f662de473cb3b833295c07 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 15 Apr 2019 20:12:05 +0200 Subject: [PATCH 082/245] Display first data in CalendarFragment --- .../android/ui/fragment/CalendarFragment.kt | 76 +++++++++++++++---- 1 file changed, 61 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 65fec8b0..2a7e7101 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.tabs.TabLayout import io.realm.Realm import kotlinx.android.synthetic.main.fragment_calendar.* import kotlinx.android.synthetic.main.fragment_stats.recyclerView @@ -18,14 +19,21 @@ import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.comparison.combined +import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate +import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.CalendarTabs +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable +import net.pokeranalytics.android.util.extensions.shortDate import timber.log.Timber import java.util.* import kotlin.coroutines.CoroutineContext -class CalendarFragment : SessionObserverFragment(), CoroutineScope { +class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { companion object { @@ -40,10 +48,13 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { } } + private lateinit var calendarAdapter: RowRepresentableAdapter + override val coroutineContext: CoroutineContext get() = Dispatchers.Main + private var rows: ArrayList = ArrayList() private var sortedMonthlyReports: SortedMap = HashMap().toSortedMap() private var sortedYearlyReports: SortedMap = HashMap().toSortedMap() @@ -61,6 +72,10 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { launchStatComputation() } + override fun adapterRows(): List? { + return rows + } + // Business @@ -68,7 +83,6 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { * Init data */ private fun initData() { - } /** @@ -82,12 +96,35 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { tabs.addTab(tab) } + tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + when(tab.position) { + 0 -> displayData(Stat.NETRESULT) + 1 -> displayData(Stat.HOURLY_RATE) + 2 -> displayData(Stat.NUMBER_OF_GAMES) + 3 -> displayData(Stat.WIN_RATIO) + 4 -> displayData(Stat.STANDARD_DEVIATION_HOURLY) + 5 -> displayData(Stat.AVERAGE) + 6 -> displayData(Stat.AVERAGE_DURATION) + 7 -> displayData(Stat.DURATION) + } + } + + override fun onTabUnselected(tab: TabLayout.Tab) { + } + + override fun onTabReselected(tab: TabLayout.Tab) { + } + + }) val viewManager = LinearLayoutManager(requireContext()) + calendarAdapter = RowRepresentableAdapter(this, this) + recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager - //adapter = statsAdapter + adapter = calendarAdapter } } @@ -134,9 +171,6 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { } montlyReports[calendar.time] = computedResults - - //val statValue = computedResults.computedStat(Stat.NETRESULT)?.value - //Timber.d("======> statValue: $statValue / Number of stats: ${computedResults.numberOfStats()}") } } } @@ -162,12 +196,6 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { } yearlyReports[calendar.time] = computedResults - - /* - computedResults.computedStat(Stat.NETRESULT)?.let { computedStat -> - Timber.d("======> statValue: ${computedStat.value}") - } - */ } } } @@ -186,8 +214,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { Timber.d("$it => ${sortedYearlyReports[it]?.computedStat(Stat.NETRESULT)?.value}") } - GlobalScope.launch(coroutineContext) { - displayData() + GlobalScope.launch(Dispatchers.Main) { + displayData(Stat.NETRESULT) } } @@ -197,9 +225,27 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope { /** * Display data */ - private fun displayData() { + private fun displayData(stat: Stat) { + + rows.clear() + + // Create yearly reports + sortedYearlyReports.keys.forEach { + Timber.d("$it => ${sortedYearlyReports[it]?.computedStat(Stat.NETRESULT)?.value}") + sortedYearlyReports[it]?.computedStat(stat)?.let { computedStat -> + rows.add( + CustomizableRowRepresentable( + customViewType = RowViewType.TITLE_VALUE_ARROW, + title = it.shortDate(), + value = computedStat.format(requireContext()).text + ) + ) + } + } + Timber.d("Rows: ${rows.size}") + calendarAdapter.notifyDataSetChanged() } From eb3698b0ad5bd4c1d2838371b255d3559f383902 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 15 Apr 2019 11:22:14 +0200 Subject: [PATCH 083/245] 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 084/245] 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 085/245] 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 086/245] 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 087/245] 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 088/245] 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 089/245] 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 090/245] 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 842d98279e7c238a12cb8f2b7e74575f578e61b4 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 09:36:50 +0200 Subject: [PATCH 091/245] Add new date extensions --- .../android/util/extensions/DateExtension.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt index 6a5a6d10..b60ba293 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt @@ -79,6 +79,14 @@ fun Date.getDayNumber() : String { fun Date.getShortDayName() : String { return SimpleDateFormat("EEE", Locale.getDefault()).format(this) } +// Return the month of the date +fun Date.getDateMonth(): String { + return SimpleDateFormat("MMMM", Locale.getDefault()).format(this).capitalize() +} +// Return the year of the date +fun Date.getDateYear(): String { + return SimpleDateFormat("yyyy", Locale.getDefault()).format(this).capitalize() +} // Return the month & year of the date fun Date.getMonthAndYear(): String { return SimpleDateFormat("MMMM yyyy", Locale.getDefault()).format(this).capitalize() @@ -117,4 +125,20 @@ fun Date.endOfDay() : Date { calendar.set(Calendar.SECOND, 59) calendar.set(Calendar.MILLISECOND, 999) return calendar.time +} + +// Return the date of the beginning of the current month +fun Date.startOfMonth() : Date { + val calendar = Calendar.getInstance() + calendar.time = this.startOfDay() + calendar.set(Calendar.DAY_OF_MONTH, 1) + return calendar.time +} + +// Return the date of the beginning of the current year +fun Date.startOfYear() : Date { + val calendar = Calendar.getInstance() + calendar.time = this.startOfMonth() + calendar.set(Calendar.MONTH, 0) + return calendar.time } \ No newline at end of file From de5045585898486cecbf46c8d0036d16b39d4600 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 09:36:56 +0200 Subject: [PATCH 092/245] Improve Calendar Fragment --- .../android/ui/fragment/CalendarFragment.kt | 109 ++++++++++++------ 1 file changed, 72 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 2a7e7101..10a10830 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -27,7 +27,10 @@ import net.pokeranalytics.android.ui.view.CalendarTabs import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable -import net.pokeranalytics.android.util.extensions.shortDate +import net.pokeranalytics.android.util.extensions.getDateMonth +import net.pokeranalytics.android.util.extensions.getDateYear +import net.pokeranalytics.android.util.extensions.startOfMonth +import net.pokeranalytics.android.util.extensions.startOfYear import timber.log.Timber import java.util.* import kotlin.coroutines.CoroutineContext @@ -35,6 +38,10 @@ import kotlin.coroutines.CoroutineContext class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { + enum class TimeFilter { + MONTH, YEAR + } + companion object { /** @@ -57,6 +64,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep private var rows: ArrayList = ArrayList() private var sortedMonthlyReports: SortedMap = HashMap().toSortedMap() private var sortedYearlyReports: SortedMap = HashMap().toSortedMap() + private var currentTimeFilter = TimeFilter.YEAR // Life Cycle @@ -98,7 +106,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { - when(tab.position) { + when (tab.position) { 0 -> displayData(Stat.NETRESULT) 1 -> displayData(Stat.HOURLY_RATE) 2 -> displayData(Stat.NUMBER_OF_GAMES) @@ -137,29 +145,20 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep GlobalScope.launch { val calendar = Calendar.getInstance() - calendar.set(Calendar.DAY_OF_MONTH, 1) - calendar.set(Calendar.HOUR_OF_DAY, 0) - calendar.set(Calendar.MINUTE, 0) - calendar.set(Calendar.SECOND, 0) - calendar.set(Calendar.MILLISECOND, 0) + calendar.time = Date().startOfMonth() val startDate = Date() val realm = Realm.getDefaultInstance() - val montlyReports: HashMap = HashMap() + val monthlyReports: HashMap = HashMap() val yearlyReports: HashMap = HashMap() - // Compute data per YEAR x MONTH + // Compute data per YEAR and MONTH val conditions = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() - conditions.forEach { - val report = Calculator.computeStatsWithComparators(realm, conditions = it, options = Calculator.Options()) - //Timber.d("======> report results: ${report.results.size}") report.results.forEach { computedResults -> - //Timber.d("======> computedResults empty: ${computedResults.isEmpty}") if (!computedResults.isEmpty) { - // Set date data it.forEach { condition -> condition.valueMap?.get("year")?.let { year -> @@ -170,40 +169,34 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } } - montlyReports[calendar.time] = computedResults + monthlyReports[calendar.time] = computedResults } } } + calendar.time = Date().startOfYear() + // Compute data per YEAR val yearConditions = Comparator.YEAR.queryConditions - - // compute at index yearConditions.forEach { condition -> - - val report = Calculator.computeStatsWithComparators(realm, conditions = listOf(condition), options = Calculator.Options()) - //Timber.d("======> report results: ${report.results.size}") report.results.forEach { computedResults -> - //Timber.d("======> computedResults empty: ${computedResults.isEmpty}") if (!computedResults.isEmpty) { - - calendar.set(Calendar.MONTH, 0) - // Set date data condition.valueMap?.get("year")?.let { year -> calendar.set(Calendar.YEAR, year as Int) } - yearlyReports[calendar.time] = computedResults } } } + // Logs + Timber.d("Computation: ${System.currentTimeMillis() - startDate.time}ms") Timber.d("========== YEAR x MONTH") - sortedMonthlyReports = montlyReports.toSortedMap(compareByDescending { it }) + sortedMonthlyReports = monthlyReports.toSortedMap(compareByDescending { it }) sortedMonthlyReports.keys.forEach { Timber.d("$it => ${sortedMonthlyReports[it]?.computedStat(Stat.NETRESULT)?.value}") } @@ -227,22 +220,64 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep */ private fun displayData(stat: Stat) { + val startDate = Date() + rows.clear() - // Create yearly reports - sortedYearlyReports.keys.forEach { - Timber.d("$it => ${sortedYearlyReports[it]?.computedStat(Stat.NETRESULT)?.value}") - sortedYearlyReports[it]?.computedStat(stat)?.let { computedStat -> - rows.add( - CustomizableRowRepresentable( - customViewType = RowViewType.TITLE_VALUE_ARROW, - title = it.shortDate(), - value = computedStat.format(requireContext()).text - ) - ) + Timber.d("currentTimeFilter: $currentTimeFilter") + + currentTimeFilter = TimeFilter.MONTH + + when (currentTimeFilter) { + + // Create monthly reports + TimeFilter.MONTH -> { + + val years: ArrayList = ArrayList() + + sortedMonthlyReports.keys.forEach { date -> + if (!years.contains(date.getDateYear())) { + years.add(date.getDateYear()) + rows.add( + CustomizableRowRepresentable( + customViewType = RowViewType.HEADER_TITLE, + title = date.getDateYear() + ) + ) + } + + sortedMonthlyReports[date]?.computedStat(stat)?.let { computedStat -> + rows.add( + CustomizableRowRepresentable( + customViewType = RowViewType.TITLE_VALUE_ARROW, + title = date.getDateMonth(), + computedStat = computedStat + ) + ) + } + } } + + // Create yearly reports + TimeFilter.YEAR -> { + + sortedYearlyReports.keys.forEach { date -> + Timber.d("$date => ${sortedYearlyReports[date]?.computedStat(Stat.NETRESULT)?.value}") + sortedYearlyReports[date]?.computedStat(stat)?.let { computedStat -> + rows.add( + CustomizableRowRepresentable( + customViewType = RowViewType.TITLE_VALUE_ARROW, + title = date.getDateYear(), + computedStat = computedStat + ) + ) + } + } + } + } + Timber.d("Display data: ${System.currentTimeMillis() - startDate.time}ms") Timber.d("Rows: ${rows.size}") calendarAdapter.notifyDataSetChanged() From 2c17e2ebf075fbb42258f7db272e560a7ff831a1 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 09:49:34 +0200 Subject: [PATCH 093/245] Update Strings --- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index fde8c339..72f518ef 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -281,7 +281,7 @@ m Menos Modificar… - mes + Mes Mes del año meses más infos diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index bc2ca2d0..b435206f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -280,7 +280,7 @@ min Meno Modifica… - mese + Mese Mese dell\'anno mesi altre info diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index de814433..b00b78df 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -280,7 +280,7 @@ mín. Menos Modificar… - mês + Mês Mês do ano meses mais informações diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3e35818b..11fadf0a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -307,7 +307,7 @@ mins Minus Modify… - month + Month Month of the year months more infos From 0bc2eb3fe4ec298b44909874efb6d5deeed74dc7 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 10:33:58 +0200 Subject: [PATCH 094/245] 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 095/245] 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 From f6ae11fa4a11e407143add35b174f2a281ebfdb8 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 11:17:44 +0200 Subject: [PATCH 096/245] 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 b13c5e89..8722f4f9 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 @@ -779,7 +779,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 45767d22..346396de 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 @@ -115,8 +115,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 0d27a20010245920aec05a84ba75730fc897c730 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 11:20:11 +0200 Subject: [PATCH 097/245] Update Strings --- app/src/main/res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e1b0c1f1..f4c9a0be 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -302,7 +302,7 @@ mins Moins Modifier… - mois + Mois Mois de l\'année mois plus d\'infos From 1a3f3fe966724004208b5bdee61fdf4c100fff3e Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 11:20:21 +0200 Subject: [PATCH 098/245] Add filters --- app/src/main/res/layout/fragment_calendar.xml | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index 50adf8b2..42d5029a 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -14,6 +14,57 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + + + + + + Date: Tue, 16 Apr 2019 11:20:59 +0200 Subject: [PATCH 099/245] Add cash & tournament --- .../net/pokeranalytics/android/model/comparison/Comparator.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index ab2a614c..5b570fd8 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -17,6 +17,8 @@ enum class Comparator { MONTH, YEAR, BLIND, + CASH, + TOURNAMENT, ; val queryConditions: List @@ -38,6 +40,8 @@ enum class Comparator { realm.close() years } + CASH -> listOf(QueryCondition.CASH) + TOURNAMENT -> listOf(QueryCondition.TOURNAMENT) else -> throw PokerAnalyticsException.QueryTypeUnhandled } } From 56d73c4974a645b202ae6dabc738e696e51e50ed Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 11:21:30 +0200 Subject: [PATCH 100/245] Update Calendar UI & data management --- .../android/ui/fragment/CalendarFragment.kt | 134 ++++++++++++++---- 1 file changed, 103 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 10a10830..c1356ac8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -38,7 +38,11 @@ import kotlin.coroutines.CoroutineContext class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { - enum class TimeFilter { + private enum class SessionType { + ALL, CASH, TOURNAMENT + } + + private enum class TimeFilter { MONTH, YEAR } @@ -64,7 +68,10 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep private var rows: ArrayList = ArrayList() private var sortedMonthlyReports: SortedMap = HashMap().toSortedMap() private var sortedYearlyReports: SortedMap = HashMap().toSortedMap() - private var currentTimeFilter = TimeFilter.YEAR + + private var currentSessionType = SessionType.ALL + private var currentTimeFilter = TimeFilter.MONTH + private var currentStat = Stat.NETRESULT // Life Cycle @@ -107,15 +114,16 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { when (tab.position) { - 0 -> displayData(Stat.NETRESULT) - 1 -> displayData(Stat.HOURLY_RATE) - 2 -> displayData(Stat.NUMBER_OF_GAMES) - 3 -> displayData(Stat.WIN_RATIO) - 4 -> displayData(Stat.STANDARD_DEVIATION_HOURLY) - 5 -> displayData(Stat.AVERAGE) - 6 -> displayData(Stat.AVERAGE_DURATION) - 7 -> displayData(Stat.DURATION) + 0 -> currentStat = Stat.NETRESULT + 1 -> currentStat = Stat.HOURLY_RATE + 2 -> currentStat = Stat.NUMBER_OF_GAMES + 3 -> currentStat = Stat.WIN_RATIO + 4 -> currentStat = Stat.STANDARD_DEVIATION_HOURLY + 5 -> currentStat = Stat.AVERAGE + 6 -> currentStat = Stat.AVERAGE_DURATION + 7 -> currentStat = Stat.DURATION } + displayData() } override fun onTabUnselected(tab: TabLayout.Tab) { @@ -123,8 +131,61 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep override fun onTabReselected(tab: TabLayout.Tab) { } - }) + + // Manage session type filter + filterSessionAll.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + currentSessionType = SessionType.ALL + filterSessionCash.isChecked = false + filterSessionTournament.isChecked = false + launchStatComputation() + } else if (currentSessionType == SessionType.ALL) { + filterSessionAll.isChecked = true + } + } + filterSessionCash.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + currentSessionType = SessionType.CASH + filterSessionAll.isChecked = false + filterSessionTournament.isChecked = false + launchStatComputation() + } else if (currentSessionType == SessionType.CASH) { + filterSessionCash.isChecked = true + } + } + filterSessionTournament.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + currentSessionType = SessionType.TOURNAMENT + filterSessionAll.isChecked = false + filterSessionCash.isChecked = false + launchStatComputation() + } else if (currentSessionType == SessionType.TOURNAMENT) { + filterSessionTournament.isChecked = true + } + } + + // Manage time filter + filterTimeMonth.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + currentTimeFilter = TimeFilter.MONTH + filterTimeYear.isChecked = false + displayData() + } else if (currentTimeFilter == TimeFilter.MONTH) { + filterTimeMonth.isChecked = true + } + + } + filterTimeYear.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + currentTimeFilter = TimeFilter.YEAR + filterTimeMonth.isChecked = false + displayData() + } else if (currentTimeFilter == TimeFilter.YEAR) { + filterTimeYear.isChecked = true + } + } + val viewManager = LinearLayoutManager(requireContext()) calendarAdapter = RowRepresentableAdapter(this, this) @@ -154,13 +215,19 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep val yearlyReports: HashMap = HashMap() // Compute data per YEAR and MONTH - val conditions = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() - conditions.forEach { - val report = Calculator.computeStatsWithComparators(realm, conditions = it, options = Calculator.Options()) + + val monthConditions = when(currentSessionType) { + SessionType.ALL -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() + SessionType.CASH -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.CASH).combined() + SessionType.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.TOURNAMENT).combined() + } + + monthConditions.forEach {conditions -> + val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = Calculator.Options()) report.results.forEach { computedResults -> if (!computedResults.isEmpty) { // Set date data - it.forEach { condition -> + conditions.forEach { condition -> condition.valueMap?.get("year")?.let { year -> calendar.set(Calendar.YEAR, year as Int) } @@ -177,38 +244,47 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep calendar.time = Date().startOfYear() // Compute data per YEAR - val yearConditions = Comparator.YEAR.queryConditions - yearConditions.forEach { condition -> - val report = Calculator.computeStatsWithComparators(realm, conditions = listOf(condition), options = Calculator.Options()) + val yearConditions = when(currentSessionType) { + SessionType.ALL -> listOf(Comparator.YEAR).combined() + SessionType.CASH -> listOf(Comparator.YEAR, Comparator.CASH).combined() + SessionType.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.TOURNAMENT).combined() + } + + yearConditions.forEach { conditions -> + val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = Calculator.Options()) report.results.forEach { computedResults -> if (!computedResults.isEmpty) { // Set date data - condition.valueMap?.get("year")?.let { year -> - calendar.set(Calendar.YEAR, year as Int) + conditions.forEach { condition -> + condition.valueMap?.get("year")?.let { year -> + calendar.set(Calendar.YEAR, year as Int) + } } yearlyReports[calendar.time] = computedResults } } } - // Logs + sortedMonthlyReports = monthlyReports.toSortedMap(compareByDescending { it }) + sortedYearlyReports = yearlyReports.toSortedMap(compareByDescending { it }) + // Logs + /* Timber.d("Computation: ${System.currentTimeMillis() - startDate.time}ms") Timber.d("========== YEAR x MONTH") - sortedMonthlyReports = monthlyReports.toSortedMap(compareByDescending { it }) sortedMonthlyReports.keys.forEach { Timber.d("$it => ${sortedMonthlyReports[it]?.computedStat(Stat.NETRESULT)?.value}") } Timber.d("========== YEARLY") - sortedYearlyReports = yearlyReports.toSortedMap(compareByDescending { it }) sortedYearlyReports.keys.forEach { Timber.d("$it => ${sortedYearlyReports[it]?.computedStat(Stat.NETRESULT)?.value}") } + */ GlobalScope.launch(Dispatchers.Main) { - displayData(Stat.NETRESULT) + displayData() } } @@ -218,16 +294,12 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep /** * Display data */ - private fun displayData(stat: Stat) { + private fun displayData() { val startDate = Date() rows.clear() - Timber.d("currentTimeFilter: $currentTimeFilter") - - currentTimeFilter = TimeFilter.MONTH - when (currentTimeFilter) { // Create monthly reports @@ -246,7 +318,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep ) } - sortedMonthlyReports[date]?.computedStat(stat)?.let { computedStat -> + sortedMonthlyReports[date]?.computedStat(currentStat)?.let { computedStat -> rows.add( CustomizableRowRepresentable( customViewType = RowViewType.TITLE_VALUE_ARROW, @@ -263,7 +335,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep sortedYearlyReports.keys.forEach { date -> Timber.d("$date => ${sortedYearlyReports[date]?.computedStat(Stat.NETRESULT)?.value}") - sortedYearlyReports[date]?.computedStat(stat)?.let { computedStat -> + sortedYearlyReports[date]?.computedStat(currentStat)?.let { computedStat -> rows.add( CustomizableRowRepresentable( customViewType = RowViewType.TITLE_VALUE_ARROW, From 405ac674d40bcc74ceb683dae7f307f7fe01e4a8 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 11:28:21 +0200 Subject: [PATCH 101/245] Add selectable --- .../android/ui/fragment/CalendarFragment.kt | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index c1356ac8..40056063 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -91,6 +91,10 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep return rows } + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + //toast("Open $row") + } + // Business @@ -268,10 +272,10 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep sortedMonthlyReports = monthlyReports.toSortedMap(compareByDescending { it }) sortedYearlyReports = yearlyReports.toSortedMap(compareByDescending { it }) - // Logs - /* Timber.d("Computation: ${System.currentTimeMillis() - startDate.time}ms") + // Logs + /* Timber.d("========== YEAR x MONTH") sortedMonthlyReports.keys.forEach { Timber.d("$it => ${sortedMonthlyReports[it]?.computedStat(Stat.NETRESULT)?.value}") @@ -286,9 +290,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep GlobalScope.launch(Dispatchers.Main) { displayData() } - } - } /** @@ -304,9 +306,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep // Create monthly reports TimeFilter.MONTH -> { - val years: ArrayList = ArrayList() - sortedMonthlyReports.keys.forEach { date -> if (!years.contains(date.getDateYear())) { years.add(date.getDateYear()) @@ -323,7 +323,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep CustomizableRowRepresentable( customViewType = RowViewType.TITLE_VALUE_ARROW, title = date.getDateMonth(), - computedStat = computedStat + computedStat = computedStat, + isSelectable = true ) ) } @@ -332,21 +333,19 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep // Create yearly reports TimeFilter.YEAR -> { - sortedYearlyReports.keys.forEach { date -> - Timber.d("$date => ${sortedYearlyReports[date]?.computedStat(Stat.NETRESULT)?.value}") sortedYearlyReports[date]?.computedStat(currentStat)?.let { computedStat -> rows.add( CustomizableRowRepresentable( customViewType = RowViewType.TITLE_VALUE_ARROW, title = date.getDateYear(), - computedStat = computedStat + computedStat = computedStat, + isSelectable = true ) ) } } } - } Timber.d("Display data: ${System.currentTimeMillis() - startDate.time}ms") From 998cbe037faa490dcb80f12cfcfeff2bfcd06b98 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 11:29:26 +0200 Subject: [PATCH 102/245] 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 a9d8e4cd..1c9b7d94 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 @@ -53,6 +54,8 @@ class PokerAnalyticsApplication : Application() { Timber.d("UserPreferences.defaultCurrency: ${UserDefaults.currency.symbol}") //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 77f4dc1b..cb3506c5 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 @@ -63,6 +63,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 c20be8cff9c73a35382e2d9025217cd1633692fa Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 16 Apr 2019 11:29:57 +0200 Subject: [PATCH 103/245] fix issue with currency --- .../android/ui/fragment/CurrenciesFragment.kt | 8 ++++++++ .../java/net/pokeranalytics/android/util/Preferences.kt | 8 ++++---- .../android/util/extensions/NumbersExtension.kt | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt index ba01d35f..4a53d724 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt @@ -46,6 +46,14 @@ class CurrenciesFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataS private val availableCurrencies = this.systemCurrencies.filter { !mostUsedCurrencyCodes.contains(it.currencyCode) + }.filter { + Locale.getAvailableLocales().filter {locale -> + try { + Currency.getInstance(locale).currencyCode == it.currencyCode + } catch (e: Exception) { + false + } + }.isNotEmpty() }.sortedBy { it.displayName }.map { diff --git a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt index 13a13beb..4c81b519 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -51,13 +51,13 @@ class Preferences { fun getCurrencyLocale(context : Context) : Locale? { getCurrencyCode(context)?.let { currencyCode -> - Locale.getAvailableLocales().filter{ + Locale.getAvailableLocales().filter { try { Currency.getInstance(it).currencyCode == currencyCode } catch (e: Exception) { false } - }.first().let { + }.firstOrNull()?.let { return it } } @@ -90,11 +90,11 @@ class UserDefaults private constructor(context: Context) { companion object : SingletonHolder(::UserDefaults) { lateinit var currency : Currency - lateinit var currencyLocale : Locale + var currencyLocale : Locale? = null fun setCurrencyValues(context: Context) { currency = Preferences.getDefaultCurrency(context) ?: getLocaleCurrency() - currencyLocale = Preferences.getCurrencyLocale(context) ?: Locale.getDefault() + currencyLocale = Preferences.getCurrencyLocale(context) } /** diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt index 5ee1d3cd..0b7d22e6 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt @@ -24,7 +24,7 @@ fun Double.formatted(): String { fun Double.toCurrency(currency: Currency? = null): String { - val currencyFormatter = NumberFormat.getCurrencyInstance(UserDefaults.currencyLocale) + val currencyFormatter = UserDefaults.currencyLocale?.let { NumberFormat.getCurrencyInstance(it) } ?: run { NumberFormat.getCurrencyInstance() } currency?.let { currencyFormatter.currency = currency } From cf589872c5c0effa1d8d619af169d31b6df90b45 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 16 Apr 2019 12:01:24 +0200 Subject: [PATCH 104/245] fix issue with migration --- .../android/model/migrations/PokerAnalyticsMigration.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fea47c99..8336fd41 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 @@ -52,7 +52,7 @@ class PokerAnalyticsMigration : RealmMigration { schema.rename("Report", "ReportSetup") schema.get("Session")?.let { - it.addField("blinds", String::class.java).setNullable("blinds", true) + it.addField("blinds", String::class.java) } schema.get("FilterCondition")?.let { From fd8a0edb5d34fc8d1faa95ae1fffca9bc2189fe7 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 12:50:37 +0200 Subject: [PATCH 105/245] Clean file & add sessionsChanged --- .../android/ui/fragment/CalendarFragment.kt | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 40056063..b11bb28f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -13,7 +13,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch -import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat @@ -36,6 +35,8 @@ import java.util.* import kotlin.coroutines.CoroutineContext + + class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { private enum class SessionType { @@ -76,7 +77,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep // Life Cycle override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_calendar, container, false) + return inflater.inflate(net.pokeranalytics.android.R.layout.fragment_calendar, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -95,6 +96,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep //toast("Open $row") } + override fun sessionsChanged() { + launchStatComputation() + } // Business @@ -138,7 +142,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep }) // Manage session type filter - filterSessionAll.setOnCheckedChangeListener { buttonView, isChecked -> + filterSessionAll.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { currentSessionType = SessionType.ALL filterSessionCash.isChecked = false @@ -148,7 +152,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep filterSessionAll.isChecked = true } } - filterSessionCash.setOnCheckedChangeListener { buttonView, isChecked -> + filterSessionCash.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { currentSessionType = SessionType.CASH filterSessionAll.isChecked = false @@ -158,7 +162,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep filterSessionCash.isChecked = true } } - filterSessionTournament.setOnCheckedChangeListener { buttonView, isChecked -> + filterSessionTournament.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { currentSessionType = SessionType.TOURNAMENT filterSessionAll.isChecked = false @@ -170,7 +174,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } // Manage time filter - filterTimeMonth.setOnCheckedChangeListener { buttonView, isChecked -> + filterTimeMonth.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { currentTimeFilter = TimeFilter.MONTH filterTimeYear.isChecked = false @@ -180,7 +184,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } } - filterTimeYear.setOnCheckedChangeListener { buttonView, isChecked -> + filterTimeYear.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { currentTimeFilter = TimeFilter.YEAR filterTimeMonth.isChecked = false @@ -220,13 +224,13 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep // Compute data per YEAR and MONTH - val monthConditions = when(currentSessionType) { + val monthConditions = when (currentSessionType) { SessionType.ALL -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() SessionType.CASH -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.CASH).combined() SessionType.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.TOURNAMENT).combined() } - monthConditions.forEach {conditions -> + monthConditions.forEach { conditions -> val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = Calculator.Options()) report.results.forEach { computedResults -> if (!computedResults.isEmpty) { @@ -248,7 +252,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep calendar.time = Date().startOfYear() // Compute data per YEAR - val yearConditions = when(currentSessionType) { + val yearConditions = when (currentSessionType) { SessionType.ALL -> listOf(Comparator.YEAR).combined() SessionType.CASH -> listOf(Comparator.YEAR, Comparator.CASH).combined() SessionType.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.TOURNAMENT).combined() From dc8ef3a63f92e1c633e92adef05fd28207f00c75 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 12:50:56 +0200 Subject: [PATCH 106/245] Manage multiple layout sizes --- .../res/layout-sw320dp/fragment_calendar.xml | 95 ++++++++++++++++++ .../res/layout-sw420dp/fragment_calendar.xml | 99 +++++++++++++++++++ app/src/main/res/layout/fragment_calendar.xml | 43 +++++--- 3 files changed, 222 insertions(+), 15 deletions(-) create mode 100644 app/src/main/res/layout-sw320dp/fragment_calendar.xml create mode 100644 app/src/main/res/layout-sw420dp/fragment_calendar.xml diff --git a/app/src/main/res/layout-sw320dp/fragment_calendar.xml b/app/src/main/res/layout-sw320dp/fragment_calendar.xml new file mode 100644 index 00000000..1f773978 --- /dev/null +++ b/app/src/main/res/layout-sw320dp/fragment_calendar.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw420dp/fragment_calendar.xml b/app/src/main/res/layout-sw420dp/fragment_calendar.xml new file mode 100644 index 00000000..f12b0457 --- /dev/null +++ b/app/src/main/res/layout-sw420dp/fragment_calendar.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index 42d5029a..c072581c 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -18,48 +18,61 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" + android:padding="8dp" android:orientation="horizontal"> + app:chipSpacing="8dp"> + android:text="@string/month"/> + android:text="@string/year"/> + + + + + + + android:checked="true" + android:text="@string/all"/> + android:text="@string/cash_game"/> + android:text="@string/tournament"/> From 8ad2b544b744ac589a97f36f7bce94e3518c0133 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 12:54:16 +0200 Subject: [PATCH 107/245] Update layout --- .../res/{layout-sw420dp => layout-sw400dp}/fragment_calendar.xml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/res/{layout-sw420dp => layout-sw400dp}/fragment_calendar.xml (100%) diff --git a/app/src/main/res/layout-sw420dp/fragment_calendar.xml b/app/src/main/res/layout-sw400dp/fragment_calendar.xml similarity index 100% rename from app/src/main/res/layout-sw420dp/fragment_calendar.xml rename to app/src/main/res/layout-sw400dp/fragment_calendar.xml From 91c7b4996059ad40cfeb5e3d464d6279027b01e7 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 16 Apr 2019 13:29:31 +0200 Subject: [PATCH 108/245] fix issue with currency --- .../pokeranalytics/android/model/realm/Bankroll.kt | 11 ----------- .../pokeranalytics/android/model/realm/Currency.kt | 14 ++------------ .../android/ui/fragment/SettingsFragment.kt | 5 +++-- 3 files changed, 5 insertions(+), 25 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 45f8dcd9..264400fd 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 @@ -3,8 +3,6 @@ package net.pokeranalytics.android.model.realm import io.realm.Realm import io.realm.RealmList import io.realm.RealmObject -import io.realm.RealmResults -import io.realm.annotations.LinkingObjects import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R @@ -34,9 +32,6 @@ open class Bankroll() : RealmObject(), NameManageable, StaticRowRepresentableDat } } - @LinkingObjects("bankroll") - private val sessions: RealmResults? = null - @PrimaryKey override var id = UUID.randomUUID().toString() @@ -51,12 +46,6 @@ open class Bankroll() : RealmObject(), NameManageable, StaticRowRepresentableDat // The currency of the bankroll var currency: Currency? = null - fun currencyCodeHasBeenUpdated() { - sessions?.forEach { - it.bankrollHasBeenUpdated() - } - } - override fun getDisplayName(): String { return this.name } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt index 60e67d27..5dc19015 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt @@ -1,11 +1,8 @@ package net.pokeranalytics.android.model.realm import io.realm.RealmObject -import io.realm.RealmResults import io.realm.annotations.Ignore -import io.realm.annotations.LinkingObjects import io.realm.annotations.PrimaryKey -import net.pokeranalytics.android.util.Preferences import java.util.* open class Currency : RealmObject() { @@ -16,19 +13,10 @@ open class Currency : RealmObject() { @PrimaryKey var id = UUID.randomUUID().toString() - @LinkingObjects("currency") - private val bankrolls: RealmResults? = null - /** * The currency code of the currency, i.e. USD, EUR... */ var code: String? = null - set(value) { - field = value - bankrolls?.forEach { - it.currencyCodeHasBeenUpdated() - } - } /** * The rate of the currency with the main currency @@ -49,6 +37,8 @@ open class Currency : RealmObject() { computable.ratedBuyin = it * rate } + computable.session?.bankrollHasBeenUpdated() + } } 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 4ed534d9..782b6de8 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 @@ -12,6 +12,7 @@ import kotlinx.android.synthetic.main.fragment_settings.* import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Bankroll +import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.activity.CurrenciesActivity import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.GDPRActivity @@ -74,8 +75,8 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta Preferences.setCurrencyCode(data.getStringExtra(CurrenciesFragment.INTENT_CURRENCY_CODE), requireContext()) val realm = Realm.getDefaultInstance() realm.executeTransaction { - it.where(Bankroll::class.java).isNull("currency.code").findAll().forEach { bankroll -> - bankroll.currencyCodeHasBeenUpdated() + it.where(Session::class.java).isNull("bankroll.currency.code").findAll().forEach { + it.bankrollHasBeenUpdated() } } realm.close() From 8bbc35ba9ab8a127be4d54215a410e39ff8893cb Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 16 Apr 2019 13:48:29 +0200 Subject: [PATCH 109/245] simplification of currency display (remove the relation with currencyLocale) --- .../android/ui/fragment/BankrollDataFragment.kt | 3 ++- .../main/java/net/pokeranalytics/android/util/Preferences.kt | 4 +--- .../android/util/extensions/NumbersExtension.kt | 2 +- 3 files changed, 4 insertions(+), 5 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 6e5604ff..8079f8e9 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 @@ -19,6 +19,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepres import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.Preferences +import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.extensions.toRate import retrofit2.Call import retrofit2.Response @@ -145,7 +146,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS */ private fun initData() { - defaultCurrency = Currency.getInstance(Preferences.getCurrencyLocale(this.parentActivity)) + defaultCurrency = UserDefaults.currency if (!isUpdating) { bankroll.currency = net.pokeranalytics.android.model.realm.Currency() diff --git a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt index 4c81b519..cfc53b7f 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -49,7 +49,7 @@ class Preferences { return getString(Keys.CURRENCY_CODE, context) } - fun getCurrencyLocale(context : Context) : Locale? { + private fun getCurrencyLocale(context : Context) : Locale? { getCurrencyCode(context)?.let { currencyCode -> Locale.getAvailableLocales().filter { try { @@ -90,11 +90,9 @@ class UserDefaults private constructor(context: Context) { companion object : SingletonHolder(::UserDefaults) { lateinit var currency : Currency - var currencyLocale : Locale? = null fun setCurrencyValues(context: Context) { currency = Preferences.getDefaultCurrency(context) ?: getLocaleCurrency() - currencyLocale = Preferences.getCurrencyLocale(context) } /** diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt index 0b7d22e6..5e2bb841 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/NumbersExtension.kt @@ -24,7 +24,7 @@ fun Double.formatted(): String { fun Double.toCurrency(currency: Currency? = null): String { - val currencyFormatter = UserDefaults.currencyLocale?.let { NumberFormat.getCurrencyInstance(it) } ?: run { NumberFormat.getCurrencyInstance() } + val currencyFormatter = NumberFormat.getCurrencyInstance() currency?.let { currencyFormatter.currency = currency } From 201b6dee986d05a6412cee2cea949c76101e6d99 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 14:41:00 +0200 Subject: [PATCH 110/245] Refactor and unify row management --- .../net/pokeranalytics/android/model/realm/Session.kt | 8 ++++---- .../android/ui/fragment/CurrenciesFragment.kt | 4 ++-- .../pokeranalytics/android/ui/fragment/StatsFragment.kt | 2 +- .../net/pokeranalytics/android/ui/view/RowViewType.kt | 2 +- .../{SeparatorRowRepresentable.kt => SeparatorRow.kt} | 2 +- .../android/ui/view/rowrepresentable/SessionRow.kt | 8 ++++---- .../view/rowrepresentable}/StatRepresentable.kt | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) rename app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/{SeparatorRowRepresentable.kt => SeparatorRow.kt} (75%) rename app/src/main/java/net/pokeranalytics/android/{model => ui/view/rowrepresentable}/StatRepresentable.kt (90%) 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 8722f4f9..eba8afc5 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 @@ -30,7 +30,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRow import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.UserDefaults @@ -584,7 +584,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency) ) ) - rows.add(SeparatorRowRepresentable()) + rows.add(SeparatorRow()) } SessionState.PAUSED -> { rows.add( @@ -594,7 +594,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency) ) ) - rows.add(SeparatorRowRepresentable()) + rows.add(SeparatorRow()) } SessionState.FINISHED -> { rows.add( @@ -621,7 +621,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // ) // ) // } - rows.add(SeparatorRowRepresentable()) + rows.add(SeparatorRow()) } else -> { } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt index 4a53d724..76d552e3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt @@ -16,7 +16,7 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRow import java.util.* class CurrenciesFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { @@ -28,7 +28,7 @@ class CurrenciesFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataS val rowRepresentation : List by lazy { val rows = ArrayList() rows.addAll(mostUsedCurrencies) - rows.add(SeparatorRowRepresentable()) + rows.add(SeparatorRow()) rows.addAll(availableCurrencies) rows } 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 4c0c34e2..1c09199c 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 @@ -10,7 +10,7 @@ import kotlinx.android.synthetic.main.fragment_stats.* import kotlinx.coroutines.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* -import net.pokeranalytics.android.model.StatRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.StatRepresentable import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity import net.pokeranalytics.android.ui.adapter.DisplayDescriptor diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 387756b9..42865a4b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_transaction.view.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.StatRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.StatRepresentable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRow.kt similarity index 75% rename from app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRowRepresentable.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRow.kt index 7497d908..a45bfb04 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRow.kt @@ -6,6 +6,6 @@ import net.pokeranalytics.android.ui.view.RowViewType /** * A class to display separator as row representable */ -class SeparatorRowRepresentable(customViewType: RowViewType? = RowViewType.SEPARATOR) : RowRepresentable { +class SeparatorRow(customViewType: RowViewType? = RowViewType.SEPARATOR) : RowRepresentable { override val viewType: Int = customViewType?.ordinal ?: RowViewType.SEPARATOR.ordinal } 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 27b2c73f..40a49efe 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 @@ -68,7 +68,7 @@ enum class SessionRow : RowRepresentable { POSITION, PLAYERS, TIPS, - SeparatorRowRepresentable(), + SeparatorRow(), GAME, INITIAL_BUY_IN, LOCATION, @@ -77,7 +77,7 @@ enum class SessionRow : RowRepresentable { TOURNAMENT_TYPE, TOURNAMENT_NAME, TOURNAMENT_FEATURE, - SeparatorRowRepresentable(), + SeparatorRow(), START_DATE, END_DATE, BREAK_TIME, @@ -98,7 +98,7 @@ enum class SessionRow : RowRepresentable { CASHED_OUT, BUY_IN, TIPS, - SeparatorRowRepresentable(), + SeparatorRow(), GAME, BLINDS, LOCATION, @@ -112,7 +112,7 @@ enum class SessionRow : RowRepresentable { } else { arrayListOf( NET_RESULT, - SeparatorRowRepresentable(), + SeparatorRow(), GAME, BLINDS, LOCATION, diff --git a/app/src/main/java/net/pokeranalytics/android/model/StatRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRepresentable.kt similarity index 90% rename from app/src/main/java/net/pokeranalytics/android/model/StatRepresentable.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRepresentable.kt index 25829c3a..ac081a20 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/StatRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRepresentable.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.model +package net.pokeranalytics.android.ui.view.rowrepresentable import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.Stat From 7a5d92d9dfee114afb248abb458e31ac22b6cba9 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 14:41:41 +0200 Subject: [PATCH 111/245] Rename StatRepresentable --- .../ui/view/rowrepresentable/{StatRepresentable.kt => StatRow.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/{StatRepresentable.kt => StatRow.kt} (100%) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt similarity index 100% rename from app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRepresentable.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt From d64a66b662140c56204cdb6f039e7e09c4797e42 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 14:41:54 +0200 Subject: [PATCH 112/245] Update StatRow reference --- .../android/ui/fragment/StatsFragment.kt | 10 +++++----- .../net/pokeranalytics/android/ui/view/RowViewType.kt | 4 ++-- .../android/ui/view/rowrepresentable/StatRow.kt | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) 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 1c09199c..5ee27236 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 @@ -10,7 +10,7 @@ import kotlinx.android.synthetic.main.fragment_stats.* import kotlinx.coroutines.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* -import net.pokeranalytics.android.ui.view.rowrepresentable.StatRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity import net.pokeranalytics.android.ui.adapter.DisplayDescriptor @@ -74,7 +74,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc override fun contentDescriptorForRow(row: RowRepresentable): DisplayDescriptor? { val dc = DisplayDescriptor() dc.textFormat = TextFormat(NULL_TEXT) - if (row is StatRepresentable) { + if (row is StatRow) { context?.let { context -> row.computedStat?.let { dc.textFormat = it.format(context) @@ -85,7 +85,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc } override fun statFormatForRow(row: RowRepresentable): TextFormat { - if (row is StatRepresentable) { + if (row is StatRow) { context?.let { context -> row.computedStat?.let { return it.format(context) } } @@ -188,7 +188,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc report.results.forEach { result -> rows.add(CustomizableRowRepresentable(title = result.group.name)) result.group.stats?.forEach { stat -> - rows.add(StatRepresentable(stat, result.computedStat(stat), result.group.name)) + rows.add(StatRow(stat, result.computedStat(stat), result.group.name)) } } @@ -199,7 +199,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - if (row is StatRepresentable && row.stat.hasEvolutionGraph) { + if (row is StatRow && row.stat.hasEvolutionGraph) { // filter groups val groupResults = this.report?.results?.filter { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 42865a4b..76254452 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_transaction.view.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.view.rowrepresentable.StatRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -236,7 +236,7 @@ enum class RowViewType(private var layoutRes: Int) { } } - if (row is StatRepresentable) { + if (row is StatRow) { itemView.findViewById(R.id.nextArrow)?.isVisible = row.stat.hasEvolutionGraph } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt index ac081a20..7dd06355 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt @@ -6,7 +6,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -class StatRepresentable(stat: Stat, computedStat: ComputedStat?, groupName: String = "") : RowRepresentable { +class StatRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "") : RowRepresentable { var stat: Stat = stat var computedStat: ComputedStat? = computedStat From 7447305cafc06e660898ff7fc426d33eb863a0f2 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 15:16:11 +0200 Subject: [PATCH 113/245] Work on aggregation type for evo graphs --- .../android/calculus/Calculator.kt | 70 +++-- .../android/ui/fragment/GraphFragment.kt | 141 ++++++--- .../android/ui/fragment/StatsFragment.kt | 296 ++++++++++-------- 3 files changed, 310 insertions(+), 197 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index f7f42459..ffd17417 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -7,7 +7,6 @@ import net.pokeranalytics.android.model.comparison.combined import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.name import net.pokeranalytics.android.model.realm.ComputableResult -import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.SessionSet import timber.log.Timber import java.util.* @@ -20,7 +19,11 @@ class Calculator { /** * The options used for calculations or display */ - class Options { + class Options( + display: Display = Display.TABLE, + evolutionValues: EvolutionValues = EvolutionValues.NONE, + stats: List = listOf() + ) { /** * The way the stats are going to be displayed @@ -42,9 +45,9 @@ class Calculator { TIMED } - var display: Display = Display.TABLE - var evolutionValues: EvolutionValues = EvolutionValues.NONE - var displayedStats: List = listOf() + var display: Display = display + var evolutionValues: EvolutionValues = evolutionValues + var displayedStats: List = stats /** * This function determines whether the standard deviation should be computed @@ -64,7 +67,36 @@ class Calculator { companion object { - fun computeStatsWithComparators(realm: Realm, comparators: List = listOf(), conditions: List = listOf(), options: Options): Report { + fun computeStatsWithEvolutionByAggregationType( + realm: Realm, + group: ComputableGroup, + aggregationType: AggregationType + ): Report { + + val options = Options(evolutionValues = Options.EvolutionValues.STANDARD) + if (aggregationType == AggregationType.DURATION) { + options.evolutionValues = Options.EvolutionValues.TIMED + } + + return when (aggregationType) { + AggregationType.SESSION, AggregationType.DURATION -> this.computeGroups(realm, listOf(group), options) + AggregationType.MONTH -> { + val comparators: List = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR) + this.computeStatsWithComparators(realm, comparators, group.conditions, options) + } + AggregationType.YEAR -> { + val comparators: List = listOf(Comparator.YEAR) + this.computeStatsWithComparators(realm, comparators, group.conditions, options) + } + } + } + + fun computeStatsWithComparators( + realm: Realm, + comparators: List = listOf(), + conditions: List = listOf(), + options: Options + ): Report { val computableGroups: MutableList = mutableListOf() comparators.combined().forEach { comparatorConditions -> @@ -86,18 +118,6 @@ class Calculator { return this.computeGroups(realm, computableGroups, options) } - fun computeStatsWithFilters(realm: Realm, filters: List, options: Options): Report { - - val computableGroups: MutableList = mutableListOf() - filters.forEach { filter -> - - val group = ComputableGroup(filter.name, filter.filterConditions.map { it.queryCondition }) - computableGroups.add(group) - - } - return Calculator.computeGroups(realm, computableGroups, options) - } - /** * Computes all stats for list of Session sessionGroup */ @@ -257,7 +277,12 @@ class Calculator { Options.EvolutionValues.TIMED -> { results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT, sessionSet) results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) - results.addEvolutionValue(tIndex.toDouble(), tHourlyDuration, NUMBER_OF_SETS, sessionSet) + results.addEvolutionValue( + tIndex.toDouble(), + tHourlyDuration, + NUMBER_OF_SETS, + sessionSet + ) results.addEvolutionValue( sessionSet.netDuration.toDouble(), tHourlyDuration, @@ -273,7 +298,12 @@ class Calculator { results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet) Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> - results.addEvolutionValue(netBB100, tHourlyDuration, NET_BB_PER_100_HANDS, sessionSet) + results.addEvolutionValue( + netBB100, + tHourlyDuration, + NET_BB_PER_100_HANDS, + sessionSet + ) } } } 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 6479fe10..9f3d5794 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 @@ -13,7 +13,9 @@ import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.listener.OnChartValueSelectedListener import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup +import io.realm.Realm import kotlinx.android.synthetic.main.fragment_evograph.* +import kotlinx.coroutines.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity @@ -23,25 +25,32 @@ 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 timber.log.Timber import java.text.DateFormat +import java.util.* +import kotlin.coroutines.CoroutineContext class GraphParameters(var stat: Stat, var report: Report) { } -class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { +class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, CoroutineScope { private lateinit var parentActivity: PokerAnalyticsActivity private var stat: Stat = Stat.NETRESULT - private var reports: Map = hashMapOf() - private var entries: List = ArrayList() + private var reports: MutableMap = hashMapOf() + + private var selectedReport: Report? = null lateinit var legendView: LegendView lateinit var chartView: BarLineChartBase<*> private var aggregationTypes: List = listOf() + override val coroutineContext: CoroutineContext + get() = Dispatchers.Main + companion object { } @@ -50,10 +59,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.stat = stat this.aggregationTypes = stat.aggregationTypes -// this.report = report - report.results.firstOrNull()?.defaultStatEntries(stat)?.let { - this.entries = it - } + this.reports[this.aggregationTypes.first()] = report + this.selectedReport = report } @@ -76,32 +83,10 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.legendView = LegendView(requireContext()) this.legendContainer.addView(this.legendView) - this.legendView.prepareWithStat(this.stat, this.entries.size) - - val dataSet = PALineDataSet(this.entries, this.stat.name, requireContext()) - val colors = arrayOf(R.color.green_light).toIntArray() - dataSet.setColors(colors, context) - dataSet.setDrawCircles(false) - val lineData = LineData(listOf(dataSet)) - - this.chartView = when (stat.graphType) { - GraphType.LINE -> { - val lineChart = LineChart(context) - lineChart.data = lineData - lineChart - } - GraphType.BAR -> { - val barChart = BarChart(context) - barChart - } - } - this.chartContainer.addView(this.chartView) - - this.chartView.setStyle(false, requireContext()) - this.chartView.setOnChartValueSelectedListener(this) - - this.chartView.highlightValue((this.entries.size - 1).toFloat(), 0) + this.selectedReport?.let { + this.loadGraph(it) + } this.aggregationTypes.forEach { type -> val chip = Chip(requireContext()) @@ -118,12 +103,85 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { super.onCheckedChanged(group, checkedId) val aggregationType = aggregationTypes[checkedId] -// toast("Show: ${this.aggregationTypes[group.getChildAt(checkedId).id].name}") + + reports[aggregationType]?.let { + loadGraph(it) + } ?: run { + + } + } }) } + private fun launchStatComputation() { + + GlobalScope.launch(coroutineContext) { + + var r: Report? = null + val test = GlobalScope.async { + val s = Date() + Timber.d(">>> start...") + + val realm = Realm.getDefaultInstance() + + val aggregationType = stat.aggregationTypes.first() +// r = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) + + realm.close() + + val e = Date() + val duration = (e.time - s.time) / 1000.0 + Timber.d(">>> ended in $duration seconds") + + } + test.await() + + if (!isDetached) { + r?.let { + loadGraph(it) + } + } + } + + } + + + fun loadGraph(report: Report) { + + report.results.firstOrNull()?.defaultStatEntries(stat)?.let { entries -> + + this.legendView.prepareWithStat(this.stat, entries.size) + + val dataSet = PALineDataSet(entries, this.stat.name, requireContext()) + val colors = arrayOf(R.color.green_light).toIntArray() + dataSet.setColors(colors, context) + dataSet.setDrawCircles(false) + val lineData = LineData(listOf(dataSet)) + + this.chartView = when (stat.graphType) { + GraphType.LINE -> { + val lineChart = LineChart(context) + lineChart.data = lineData + lineChart + } + GraphType.BAR -> { + val barChart = BarChart(context) + barChart + } + } + + this.chartContainer.addView(this.chartView) + + this.chartView.setStyle(false, requireContext()) + this.chartView.setOnChartValueSelectedListener(this) + + this.chartView.highlightValue((entries.size - 1).toFloat(), 0) + } + + } + // OnChartValueSelectedListener override fun onNothingSelected() { @@ -133,19 +191,18 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { override fun onValueSelected(e: Entry?, h: Highlight?) { e?.let { entry -> - h?.let { highlight -> - val identifier = entry.data as ObjectIdentifier - val item = getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() - item?.let { + val identifier = entry.data as ObjectIdentifier + val item = getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() + item?.let { - val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate()) - val entryValue = it.formattedValue(this.stat, requireContext()) - val totalStatValue = this.stat.format(e.y.toDouble(), null, requireContext()) + val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate()) + val entryValue = it.formattedValue(this.stat, requireContext()) + val totalStatValue = this.stat.format(e.y.toDouble(), null, requireContext()) - this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) - } + this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) } + } } 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 4c0c34e2..84f3cd80 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 @@ -28,96 +28,96 @@ import kotlin.coroutines.CoroutineContext class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope, RowRepresentableDelegate { - override val coroutineContext: CoroutineContext - get() = Dispatchers.Main + override val coroutineContext: CoroutineContext + get() = Dispatchers.Main - private var rowRepresentables: ArrayList = ArrayList() + private var rowRepresentables: ArrayList = ArrayList() private var stringAll = "" private var stringCashGame = "" private var stringTournament = "" - private lateinit var statsAdapter: RowRepresentableAdapter - private var report : Report? = null - - companion object { - - /** - * Create new instance - */ - fun newInstance(): StatsFragment { - val fragment = StatsFragment() - val bundle = Bundle() - fragment.arguments = bundle - return fragment - } - } - - // Life Cycle - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_stats, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initData() - initUI() - launchStatComputation() - } - - // Row Representable DS - - override fun adapterRows(): List? { - return this.rowRepresentables - } - - override fun contentDescriptorForRow(row: RowRepresentable): DisplayDescriptor? { - val dc = DisplayDescriptor() - dc.textFormat = TextFormat(NULL_TEXT) - if (row is StatRepresentable) { - context?.let { context -> - row.computedStat?.let { - dc.textFormat = it.format(context) - } - } - } - return dc - } - - override fun statFormatForRow(row: RowRepresentable): TextFormat { - if (row is StatRepresentable) { - context?.let { context -> - row.computedStat?.let { return it.format(context) } - } - } - return TextFormat(NULL_TEXT) - } - - override fun onResume() { - super.onResume() - statsAdapter.notifyDataSetChanged() - } - - // Override - - override fun sessionsChanged() { - this.launchStatComputation() - this.statsAdapter.notifyDataSetChanged() - } - - // Business - - /** - * Init data - */ - private fun initData() { - - this.stringAll = getString(R.string.all) - this.stringCashGame = getString(R.string.cash_game) - this.stringTournament = getString(R.string.tournament) - - this.statsAdapter = RowRepresentableAdapter(this, this) - } + private lateinit var statsAdapter: RowRepresentableAdapter + private var report: Report? = null + + companion object { + + /** + * Create new instance + */ + fun newInstance(): StatsFragment { + val fragment = StatsFragment() + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + } + + // Life Cycle + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_stats, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + initUI() + launchStatComputation() + } + + // Row Representable DS + + override fun adapterRows(): List? { + return this.rowRepresentables + } + + override fun contentDescriptorForRow(row: RowRepresentable): DisplayDescriptor? { + val dc = DisplayDescriptor() + dc.textFormat = TextFormat(NULL_TEXT) + if (row is StatRepresentable) { + context?.let { context -> + row.computedStat?.let { + dc.textFormat = it.format(context) + } + } + } + return dc + } + + override fun statFormatForRow(row: RowRepresentable): TextFormat { + if (row is StatRepresentable) { + context?.let { context -> + row.computedStat?.let { return it.format(context) } + } + } + return TextFormat(NULL_TEXT) + } + + override fun onResume() { + super.onResume() + statsAdapter.notifyDataSetChanged() + } + + // Override + + override fun sessionsChanged() { + this.launchStatComputation() + this.statsAdapter.notifyDataSetChanged() + } + + // Business + + /** + * Init data + */ + private fun initData() { + + this.stringAll = getString(R.string.all) + this.stringCashGame = getString(R.string.cash_game) + this.stringTournament = getString(R.string.tournament) + + this.statsAdapter = RowRepresentableAdapter(this, this) + } /** * Init UI @@ -133,67 +133,89 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc } } - private fun launchStatComputation() { + private fun launchStatComputation() { - GlobalScope.launch(coroutineContext) { - - var r = Report() - val test = GlobalScope.async { - val s = Date() - Timber.d(">>> start...") - - val realm = Realm.getDefaultInstance() - r = createSessionGroupsAndStartCompute(realm) - report = r - realm.close() - - val e = Date() - val duration = (e.time - s.time) / 1000.0 - Timber.d(">>> ended in $duration seconds") + GlobalScope.launch(coroutineContext) { - } - test.await() + var r = Report() + val test = GlobalScope.async { + val s = Date() + Timber.d(">>> start...") - if (!isDetached) { - showResults(r) - } - } + val realm = Realm.getDefaultInstance() + r = createSessionGroupsAndStartCompute(realm) + report = r + realm.close() - } + val e = Date() + val duration = (e.time - s.time) / 1000.0 + Timber.d(">>> ended in $duration seconds") - private fun createSessionGroupsAndStartCompute(realm: Realm) : Report { + } + test.await() - val allStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NUMBER_OF_SETS, Stat.AVERAGE_DURATION, Stat.DURATION) - val allSessionGroup = ComputableGroup(stringAll, listOf(), allStats) - val cgStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, Stat.AVERAGE, Stat.STANDARD_DEVIATION_HOURLY, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) - val cgSessionGroup = ComputableGroup(stringCashGame, listOf(QueryCondition.CASH), cgStats) - val tStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) - val tSessionGroup = ComputableGroup(stringTournament, listOf(QueryCondition.TOURNAMENT), tStats) + if (!isDetached) { + showResults(r) + } + } - Timber.d(">>>>> Start computations...") + } - return Calculator.computeGroups(realm, listOf(allSessionGroup, cgSessionGroup, tSessionGroup), Calculator.Options()) + private fun createSessionGroupsAndStartCompute(realm: Realm): Report { + + val allStats: List = listOf( + Stat.NETRESULT, + Stat.HOURLY_RATE, + Stat.AVERAGE, + Stat.NUMBER_OF_SETS, + Stat.AVERAGE_DURATION, + Stat.DURATION + ) + val allSessionGroup = ComputableGroup(stringAll, listOf(), allStats) + val cgStats: List = listOf( + Stat.NETRESULT, + Stat.HOURLY_RATE, + Stat.NET_BB_PER_100_HANDS, + Stat.HOURLY_RATE_BB, + Stat.AVERAGE, + Stat.STANDARD_DEVIATION_HOURLY, + Stat.WIN_RATIO, + Stat.NUMBER_OF_GAMES, + Stat.AVERAGE_BUYIN + ) + val cgSessionGroup = ComputableGroup(stringCashGame, listOf(QueryCondition.CASH), cgStats) + val tStats: List = + listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) + val tSessionGroup = ComputableGroup(stringTournament, listOf(QueryCondition.TOURNAMENT), tStats) + + Timber.d(">>>>> Start computations...") + + return Calculator.computeGroups( + realm, + listOf(allSessionGroup, cgSessionGroup, tSessionGroup), + Calculator.Options() + ) - } + } - private fun showResults(report: Report) { - this.rowRepresentables = this.convertReportIntoRepresentables(report) + private fun showResults(report: Report) { + this.rowRepresentables = this.convertReportIntoRepresentables(report) statsAdapter.notifyDataSetChanged() - } + } - private fun convertReportIntoRepresentables(report: Report) : ArrayList { + private fun convertReportIntoRepresentables(report: Report): ArrayList { - val rows: ArrayList = ArrayList() + val rows: ArrayList = ArrayList() - report.results.forEach { result -> - rows.add(CustomizableRowRepresentable(title = result.group.name)) - result.group.stats?.forEach { stat -> - rows.add(StatRepresentable(stat, result.computedStat(stat), result.group.name)) - } - } + report.results.forEach { result -> + rows.add(CustomizableRowRepresentable(title = result.group.name)) + result.group.stats?.forEach { stat -> + rows.add(StatRepresentable(stat, result.computedStat(stat), result.group.name)) + } + } - return rows - } + return rows + } // RowRepresentableDelegate @@ -223,10 +245,14 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc Timber.d(">>> start...") 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) +// val options = Calculator.Options() +// options.evolutionValues = Calculator.Options.EvolutionValues.STANDARD +// options.displayedStats = listOf(stat) + + val aggregationType = stat.aggregationTypes.first() + report = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) + +// report = Calculator.computeGroups(realm, listOf(computableGroup), options) realm.close() val e = Date() From dc9db3bb1c62361e0fdb8e6bf1cab382914ab4e2 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 15:18:15 +0200 Subject: [PATCH 114/245] Add Calendar Details --- app/src/main/AndroidManifest.xml | 5 ++ .../ui/activity/CalendarDetailsActivity.kt | 54 +++++++++++++ .../ui/fragment/CalendarDetailsFragment.kt | 80 +++++++++++++++++++ .../res/layout/activity_calendar_details.xml | 15 ++++ .../res/layout/fragment_calendar_details.xml | 26 ++++++ 5 files changed, 180 insertions(+) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt create mode 100644 app/src/main/res/layout/activity_calendar_details.xml create mode 100644 app/src/main/res/layout/fragment_calendar_details.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4caf0748..37e6961f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,11 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> + + = ArrayList() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_calendar_details, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initUI() + } + + /** + * Init UI + */ + private fun initUI() { + + parentActivity = activity as PokerAnalyticsActivity + + // Avoid a bug during setting the title + toolbar.title = "" + + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) + + /* + toolbar.title = stat.localizedTitle(requireContext()) + + val fragmentManager = parentActivity.supportFragmentManager + val fragmentTransaction = fragmentManager.beginTransaction() + val fragment = GraphFragment() + + fragmentTransaction.add(R.id.container, fragment) + fragmentTransaction.commit() + + StatisticDetailsActivity.parameters?.let { + fragment.setData(it.stat, it.report) + StatisticDetailsActivity.parameters = null + } ?: run { + throw Exception("Missing graph parameters") + } + */ + } + + /** + * Set data + */ + fun setData(stat: Stat, entries: List) { + //this.stat = stat + //this.entries = entries + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_calendar_details.xml b/app/src/main/res/layout/activity_calendar_details.xml new file mode 100644 index 00000000..5085b07e --- /dev/null +++ b/app/src/main/res/layout/activity_calendar_details.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_calendar_details.xml b/app/src/main/res/layout/fragment_calendar_details.xml new file mode 100644 index 00000000..44e1e283 --- /dev/null +++ b/app/src/main/res/layout/fragment_calendar_details.xml @@ -0,0 +1,26 @@ + + + + + + + + From ffb987bdef289d00d415d1a4a0ac6f8bd0a4e339 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 15:18:36 +0200 Subject: [PATCH 115/245] Link calendar details (wip) --- .../android/ui/fragment/CalendarFragment.kt | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index b11bb28f..48ddeb9a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -18,6 +18,7 @@ import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.comparison.combined +import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -35,8 +36,6 @@ import java.util.* import kotlin.coroutines.CoroutineContext - - class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { private enum class SessionType { @@ -69,6 +68,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep private var rows: ArrayList = ArrayList() private var sortedMonthlyReports: SortedMap = HashMap().toSortedMap() private var sortedYearlyReports: SortedMap = HashMap().toSortedMap() + private var datesForRows: HashMap = HashMap() private var currentSessionType = SessionType.ALL private var currentTimeFilter = TimeFilter.MONTH @@ -93,7 +93,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - //toast("Open $row") + Timber.d("Open ${datesForRows[row]}") + CalendarDetailsActivity.newInstance(requireContext()) } override fun sessionsChanged() { @@ -304,6 +305,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep val startDate = Date() + datesForRows.clear() rows.clear() when (currentTimeFilter) { @@ -323,14 +325,16 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } sortedMonthlyReports[date]?.computedStat(currentStat)?.let { computedStat -> - rows.add( - CustomizableRowRepresentable( - customViewType = RowViewType.TITLE_VALUE_ARROW, - title = date.getDateMonth(), - computedStat = computedStat, - isSelectable = true - ) + + val row = CustomizableRowRepresentable( + customViewType = RowViewType.TITLE_VALUE_ARROW, + title = date.getDateMonth(), + computedStat = computedStat, + isSelectable = true ) + + rows.add(row) + datesForRows.put(row, date) } } } @@ -339,14 +343,15 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep TimeFilter.YEAR -> { sortedYearlyReports.keys.forEach { date -> sortedYearlyReports[date]?.computedStat(currentStat)?.let { computedStat -> - rows.add( - CustomizableRowRepresentable( - customViewType = RowViewType.TITLE_VALUE_ARROW, - title = date.getDateYear(), - computedStat = computedStat, - isSelectable = true - ) + val row = CustomizableRowRepresentable( + customViewType = RowViewType.TITLE_VALUE_ARROW, + title = date.getDateYear(), + computedStat = computedStat, + isSelectable = true ) + + rows.add(row) + datesForRows.put(row, date) } } } From 792ef5d9b6f9b9ba520592b9998486bcd7c84109 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 16 Apr 2019 15:26:49 +0200 Subject: [PATCH 116/245] add some comparators --- .../android/model/comparison/Comparator.kt | 118 +++++++++++++++++- .../android/model/filter/QueryCondition.kt | 43 ++++++- 2 files changed, 151 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index 5b570fd8..961ede8f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -7,25 +7,35 @@ import io.realm.kotlin.where import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition -import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.model.realm.* import java.util.* import kotlin.collections.ArrayList enum class Comparator { DAY_OF_WEEK, MONTH_OF_YEAR, - MONTH, YEAR, BLIND, CASH, TOURNAMENT, + LIVE, + ONLINE, + GAME, + BANKROLL, + LOCATION, + TOURNAMENT_FEATURE, + TOURNAMENT_NAME, + DAY_PERIOD, + LIMIT_TYPE, + TABLE_SIZE, + TOURNAMENT_TYPE, ; val queryConditions: List get() { return when (this) { MONTH_OF_YEAR -> List(12) { index -> QueryCondition.MONTH().apply { setMonth(index) } } - DAY_OF_WEEK -> listOf() + DAY_OF_WEEK -> List(7) { index -> QueryCondition.DAY_OF_WEEK().apply { setDay(index) } } YEAR -> { val years = arrayListOf() val calendar = Calendar.getInstance() @@ -40,10 +50,108 @@ enum class Comparator { realm.close() years } + DAY_PERIOD -> listOf(QueryCondition.WEEK_DAY, QueryCondition.WEEK_END) CASH -> listOf(QueryCondition.CASH) TOURNAMENT -> listOf(QueryCondition.TOURNAMENT) - else -> throw PokerAnalyticsException.QueryTypeUnhandled - } + LIVE -> listOf(QueryCondition.LIVE) + ONLINE -> listOf(QueryCondition.ONLINE) + BLIND -> { + val blinds = arrayListOf() + val realm = Realm.getDefaultInstance() + realm.where().distinct("blind", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { + it.blinds?.let { stake -> + blinds.add(QueryCondition.BLIND().apply { setBlind(stake, it.hasDefaultCurrency)}) + } + } + realm.close() + blinds + } + GAME -> { + val objects = arrayListOf() + val realm = Realm.getDefaultInstance() + realm.where().findAll().forEach { + objects.add(QueryCondition.GAME().apply { setObjectId(it.id)}) + } + realm.close() + objects + } + BANKROLL -> { + val objects = arrayListOf() + val realm = Realm.getDefaultInstance() + realm.where().findAll().forEach { + objects.add(QueryCondition.BANKROLL().apply { setObjectId(it.id)}) + } + realm.close() + objects + } + LOCATION -> { + val objects = arrayListOf() + val realm = Realm.getDefaultInstance() + realm.where().findAll().forEach { + objects.add(QueryCondition.LOCATION().apply { setObjectId(it.id)}) + } + realm.close() + objects + } + TOURNAMENT_NAME -> { + val objects = arrayListOf() + val realm = Realm.getDefaultInstance() + realm.where().findAll().forEach { + objects.add(QueryCondition.TOURNAMENT_NAME().apply { setObjectId(it.id)}) + } + realm.close() + objects + } + TOURNAMENT_FEATURE -> { + val objects = arrayListOf() + val realm = Realm.getDefaultInstance() + realm.where().findAll().forEach { + objects.add(QueryCondition.ANY_TOURNAMENT_FEATURES().apply { setObjectId(it.id)}) + } + realm.close() + objects + } + LIMIT_TYPE -> { + val limits = arrayListOf() + val realm = Realm.getDefaultInstance() + val distinctLimitTypes = realm.where().distinct("limit").findAll().sort("limit", Sort.ASCENDING) + + distinctLimitTypes.forEach { session -> + session.limit?.let { limitType-> + limits.add(QueryCondition.LIMIT().apply { setLimitType(limitType) }) + } + } + realm.close() + limits + } + TABLE_SIZE -> { + val tableSizes = arrayListOf() + val realm = Realm.getDefaultInstance() + val distinctTableSizes = + realm.where().distinct("tableSize").findAll().sort("tableSize", Sort.ASCENDING) + distinctTableSizes.forEach { session -> + session.tableSize?.let { tableSize -> + tableSizes.add(QueryCondition.TABLE_SIZE().apply { setNumberOfPlayer(tableSize) }) + } + } + realm.close() + tableSizes + } + TOURNAMENT_TYPE -> { + val tableSizes = arrayListOf() + val realm = Realm.getDefaultInstance() + val distinctTournamentTypes = + realm.where().distinct("tournamentType").findAll().sort("tournamentType", Sort.ASCENDING) + distinctTournamentTypes.forEach { session -> + session.tournamentType?.let { tournamentType -> + tableSizes.add(QueryCondition.TOURNAMENT_TYPE().apply { setTournamentType(tournamentType) }) + } + } + realm.close() + tableSizes + } + else -> throw PokerAnalyticsException.QueryTypeUnhandled + } } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index e7573c23..9cc307e5 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -1,7 +1,10 @@ package net.pokeranalytics.android.model.filter import io.realm.RealmQuery +import io.realm.internal.Table import net.pokeranalytics.android.exceptions.PokerAnalyticsException +import net.pokeranalytics.android.model.Limit +import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.realm.FilterCondition import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.util.extensions.endOfDay @@ -22,6 +25,9 @@ fun List.name() : String { sealed class QueryCondition(var operator: Operator? = null) { abstract class QueryDataCondition : QueryCondition() + fun setObjectId(id:String) { + this.valueMap = mapOf("ids" to id) + } companion object { fun valueOf(name:String) : QueryCondition { @@ -49,10 +55,31 @@ sealed class QueryCondition(var operator: Operator? = null) { class ANY_TOURNAMENT_FEATURES: QueryCondition() class ALL_TOURNAMENT_FEATURES: QueryCondition() class LOCATION: QueryCondition() - class LIMIT: QueryCondition() - class TABLE_SIZE: QueryCondition() - class TOURNAMENT_TYPE: QueryCondition() - class BLIND: QueryCondition() + class LIMIT: QueryCondition() { + fun setLimitType(limitType: Int) { + this.valueMap = mapOf("values" to limitType) + } + } + + class TABLE_SIZE: QueryCondition() { + fun setNumberOfPlayer(numberOfPlayer: Int) { + this.valueMap = mapOf("values" to numberOfPlayer) + } + } + + class TOURNAMENT_TYPE: QueryCondition() { + fun setTournamentType(tournamentType:Int) { + this.valueMap = mapOf("values" to tournamentType) + } + } + + class BLIND: QueryCondition() { + fun setBlind(blind:String, hasDefaultCurrency:Boolean) { + this.valueMap = mapOf( + "blinds" to blind, + "hasDefaultCurrency" to hasDefaultCurrency) + } + } class LAST_GAMES: QueryCondition() class LAST_SESSIONS: QueryCondition() class MORE_NUMBER_OF_TABLE: QueryCondition(Operator.MORE) @@ -80,7 +107,13 @@ sealed class QueryCondition(var operator: Operator? = null) { class STARTED_TO_DATE: QueryCondition() class ENDED_FROM_DATE: QueryCondition() class ENDED_TO_DATE: QueryCondition() - class DAY_OF_WEEK: QueryCondition() + + class DAY_OF_WEEK: QueryCondition() { + fun setDay(dayOfWeek:Int) { + this.valueMap = mapOf("dayOfWeek" to dayOfWeek) + } + } + class MONTH: QueryCondition() { fun setMonth(month:Int) { this.valueMap = mapOf("month" to month) From 470aaee54ce6074145d9d682cfab77973ce71321 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 15:37:11 +0200 Subject: [PATCH 117/245] alpha of evo aggregation --- .../android/ui/activity/CalendarDetailsActivity.kt | 5 +++-- .../ui/activity/StatisticDetailsActivity.kt | 5 +++-- .../android/ui/fragment/GraphFragment.kt | 14 +++++++------- .../ui/fragment/StatisticDetailsFragment.kt | 2 +- .../android/ui/fragment/StatsFragment.kt | 8 ++------ 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt index 53563031..fa20b04a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity @@ -30,8 +31,8 @@ class CalendarDetailsActivity : PokerAnalyticsActivity() { context.startActivity(intent) } - fun newInstance(context: Context, stat: Stat, report: Report) { - parameters = GraphParameters(stat, report) + fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report) { + parameters = GraphParameters(stat, group, report) val intent = Intent(context, CalendarDetailsActivity::class.java) context.startActivity(intent) } 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 5a2b4d39..35349fc7 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 @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity @@ -25,8 +26,8 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { /** * Default constructor */ - fun newInstance(context: Context, stat: Stat, report: Report) { - parameters = GraphParameters(stat, report) + fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report) { + parameters = GraphParameters(stat, group, 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 9f3d5794..18ce6f6c 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 @@ -30,7 +30,7 @@ import java.text.DateFormat import java.util.* import kotlin.coroutines.CoroutineContext -class GraphParameters(var stat: Stat, var report: Report) { +class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var report: Report) { } @@ -40,8 +40,9 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co private var stat: Stat = Stat.NETRESULT private var reports: MutableMap = hashMapOf() + lateinit private var computableGroup: ComputableGroup - private var selectedReport: Report? = null + lateinit private var selectedReport: Report lateinit var legendView: LegendView lateinit var chartView: BarLineChartBase<*> @@ -55,8 +56,9 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } - fun setData(stat: Stat, report: Report) { + fun setData(stat: Stat, group: ComputableGroup, report: Report) { this.stat = stat + this.computableGroup = group this.aggregationTypes = stat.aggregationTypes this.reports[this.aggregationTypes.first()] = report @@ -84,9 +86,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co this.legendView = LegendView(requireContext()) this.legendContainer.addView(this.legendView) - this.selectedReport?.let { - this.loadGraph(it) - } + this.loadGraph(this.selectedReport) this.aggregationTypes.forEach { type -> val chip = Chip(requireContext()) @@ -127,7 +127,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co val realm = Realm.getDefaultInstance() val aggregationType = stat.aggregationTypes.first() -// r = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) + r = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) realm.close() 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 bb5d8ad0..26401474 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.report) + fragment.setData(it.stat, it.computableGroup, 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 32e2b523..4e66f0ec 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 @@ -10,7 +10,6 @@ import kotlinx.android.synthetic.main.fragment_stats.* import kotlinx.coroutines.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* -import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity import net.pokeranalytics.android.ui.adapter.DisplayDescriptor @@ -20,6 +19,7 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import net.pokeranalytics.android.util.NULL_TEXT import timber.log.Timber import java.util.* @@ -245,14 +245,10 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc Timber.d(">>> start...") val realm = Realm.getDefaultInstance() -// val options = Calculator.Options() -// options.evolutionValues = Calculator.Options.EvolutionValues.STANDARD -// options.displayedStats = listOf(stat) val aggregationType = stat.aggregationTypes.first() report = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) -// report = Calculator.computeGroups(realm, listOf(computableGroup), options) realm.close() val e = Date() @@ -263,7 +259,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc test.await() if (!isDetached) { - StatisticDetailsActivity.newInstance(requireContext(), stat, report) + StatisticDetailsActivity.newInstance(requireContext(), stat, computableGroup, report) } } From e11f2a0ced5239dd33de278b837381d672b1306d Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 17:10:00 +0200 Subject: [PATCH 118/245] Add new row layout --- app/src/main/res/layout/row_calendar_stat.xml | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 app/src/main/res/layout/row_calendar_stat.xml diff --git a/app/src/main/res/layout/row_calendar_stat.xml b/app/src/main/res/layout/row_calendar_stat.xml new file mode 100644 index 00000000..269a6378 --- /dev/null +++ b/app/src/main/res/layout/row_calendar_stat.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 7acf1ea7b88b1380803ee5b8b7831e2eb0f1db9d Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 17:10:08 +0200 Subject: [PATCH 119/245] Improve calendar & details --- .../ui/activity/CalendarDetailsActivity.kt | 26 +++----- .../ui/fragment/CalendarDetailsFragment.kt | 35 +++++++++++ .../android/ui/fragment/CalendarFragment.kt | 61 +++++++++++-------- .../res/layout/fragment_calendar_details.xml | 58 ++++++++++++++---- 4 files changed, 125 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt index 53563031..6a8e5654 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt @@ -4,34 +4,26 @@ import android.content.Context import android.content.Intent import android.os.Bundle import net.pokeranalytics.android.R -import net.pokeranalytics.android.calculus.Report -import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.calculus.ComputedResults +import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity -import net.pokeranalytics.android.ui.fragment.GraphParameters class CalendarDetailsActivity : PokerAnalyticsActivity() { - private enum class IntentKey(val keyName: String) { - STAT("STAT"), - ENTRIES("ENTRIES"), - } - companion object { - // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects - var parameters: GraphParameters? = null + var computedResults: ComputedResults? = null + var sessionTypeCondition: QueryCondition? = null + var title: String? = null /** * Default constructor */ - fun newInstance(context: Context) { - val intent = Intent(context, CalendarDetailsActivity::class.java) - context.startActivity(intent) - } - - fun newInstance(context: Context, stat: Stat, report: Report) { - parameters = GraphParameters(stat, report) + fun newInstance(context: Context, computedResults: ComputedResults, sessionTypeCondition: QueryCondition?, title: String?) { + this.computedResults = computedResults + this.sessionTypeCondition = sessionTypeCondition + this.title = title val intent = Intent(context, CalendarDetailsActivity::class.java) context.startActivity(intent) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index 04ae0170..27b1d366 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.github.mikephil.charting.data.Entry +import com.google.android.material.tabs.TabLayout import kotlinx.android.synthetic.main.fragment_calendar_details.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.extensions.toast import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment class CalendarDetailsFragment : PokerAnalyticsFragment() { @@ -50,6 +54,37 @@ class CalendarDetailsFragment : PokerAnalyticsFragment() { parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) + toolbar.title = CalendarDetailsActivity.title + + tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + toast("Tab: ${tab.position}") + + + } + + override fun onTabUnselected(tab: TabLayout.Tab) { + } + + override fun onTabReselected(tab: TabLayout.Tab) { + } + }) + + CalendarDetailsActivity.sessionTypeCondition?.let { + when(it) { + QueryCondition.CASH -> tabs.getTabAt(1)?.select() + QueryCondition.TOURNAMENT -> tabs.getTabAt(2)?.select() + else -> tabs.getTabAt(0)?.select() + } + } + + CalendarDetailsActivity.computedResults?.let { computedResults -> + + //computedResults.group.conditions + + + } + /* toolbar.title = stat.localizedTitle(requireContext()) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 48ddeb9a..07174f6a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -18,6 +18,7 @@ import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.comparison.combined +import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -27,10 +28,7 @@ import net.pokeranalytics.android.ui.view.CalendarTabs import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable -import net.pokeranalytics.android.util.extensions.getDateMonth -import net.pokeranalytics.android.util.extensions.getDateYear -import net.pokeranalytics.android.util.extensions.startOfMonth -import net.pokeranalytics.android.util.extensions.startOfYear +import net.pokeranalytics.android.util.extensions.* import timber.log.Timber import java.util.* import kotlin.coroutines.CoroutineContext @@ -38,11 +36,7 @@ import kotlin.coroutines.CoroutineContext class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { - private enum class SessionType { - ALL, CASH, TOURNAMENT - } - - private enum class TimeFilter { + enum class TimeFilter { MONTH, YEAR } @@ -70,8 +64,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep private var sortedYearlyReports: SortedMap = HashMap().toSortedMap() private var datesForRows: HashMap = HashMap() - private var currentSessionType = SessionType.ALL - private var currentTimeFilter = TimeFilter.MONTH + private var sessionTypeCondition: QueryCondition? = null + private var currentTimeFilter: TimeFilter = TimeFilter.MONTH private var currentStat = Stat.NETRESULT // Life Cycle @@ -93,8 +87,21 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - Timber.d("Open ${datesForRows[row]}") - CalendarDetailsActivity.newInstance(requireContext()) + + when (currentTimeFilter) { + TimeFilter.MONTH -> { + val date = datesForRows[row] + sortedMonthlyReports[datesForRows[row]]?.let { + CalendarDetailsActivity.newInstance(requireContext(), it, sessionTypeCondition, date?.getMonthAndYear()) + } + } + TimeFilter.YEAR -> { + val date = datesForRows[row] + sortedYearlyReports[datesForRows[row]]?.let { + CalendarDetailsActivity.newInstance(requireContext(), it, sessionTypeCondition, date?.getDateYear()) + } + } + } } override fun sessionsChanged() { @@ -145,31 +152,31 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep // Manage session type filter filterSessionAll.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { - currentSessionType = SessionType.ALL + sessionTypeCondition = null filterSessionCash.isChecked = false filterSessionTournament.isChecked = false launchStatComputation() - } else if (currentSessionType == SessionType.ALL) { + } else if (sessionTypeCondition == null) { filterSessionAll.isChecked = true } } filterSessionCash.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { - currentSessionType = SessionType.CASH + sessionTypeCondition = QueryCondition.CASH filterSessionAll.isChecked = false filterSessionTournament.isChecked = false launchStatComputation() - } else if (currentSessionType == SessionType.CASH) { + } else if (sessionTypeCondition == QueryCondition.CASH) { filterSessionCash.isChecked = true } } filterSessionTournament.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { - currentSessionType = SessionType.TOURNAMENT + sessionTypeCondition = QueryCondition.TOURNAMENT filterSessionAll.isChecked = false filterSessionCash.isChecked = false launchStatComputation() - } else if (currentSessionType == SessionType.TOURNAMENT) { + } else if (sessionTypeCondition == QueryCondition.TOURNAMENT) { filterSessionTournament.isChecked = true } } @@ -225,10 +232,10 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep // Compute data per YEAR and MONTH - val monthConditions = when (currentSessionType) { - SessionType.ALL -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() - SessionType.CASH -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.CASH).combined() - SessionType.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.TOURNAMENT).combined() + val monthConditions = when (sessionTypeCondition) { + QueryCondition.CASH -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.CASH).combined() + QueryCondition.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.TOURNAMENT).combined() + else -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() } monthConditions.forEach { conditions -> @@ -253,10 +260,10 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep calendar.time = Date().startOfYear() // Compute data per YEAR - val yearConditions = when (currentSessionType) { - SessionType.ALL -> listOf(Comparator.YEAR).combined() - SessionType.CASH -> listOf(Comparator.YEAR, Comparator.CASH).combined() - SessionType.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.TOURNAMENT).combined() + val yearConditions = when (sessionTypeCondition) { + QueryCondition.CASH -> listOf(Comparator.YEAR, Comparator.CASH).combined() + QueryCondition.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.TOURNAMENT).combined() + else -> listOf(Comparator.YEAR).combined() } yearConditions.forEach { conditions -> diff --git a/app/src/main/res/layout/fragment_calendar_details.xml b/app/src/main/res/layout/fragment_calendar_details.xml index 44e1e283..e40f2f7b 100644 --- a/app/src/main/res/layout/fragment_calendar_details.xml +++ b/app/src/main/res/layout/fragment_calendar_details.xml @@ -5,22 +5,58 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + - + + + + + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="parent" /> From 5b439cfb751c7e5aa7f4296571e14d2c9a400378 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 17:18:32 +0200 Subject: [PATCH 120/245] Added stats for Calendar report --- .../android/calculus/Calculator.kt | 142 ++++++++++++------ .../pokeranalytics/android/calculus/Report.kt | 4 + .../pokeranalytics/android/calculus/Stat.kt | 38 +++-- .../android/model/realm/Session.kt | 10 +- .../android/model/realm/SessionSet.kt | 12 +- .../android/ui/fragment/GraphFragment.kt | 2 +- 6 files changed, 140 insertions(+), 68 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index ffd17417..efe7d906 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -8,8 +8,11 @@ import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.name import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.SessionSet +import net.pokeranalytics.android.util.extensions.startOfDay import timber.log.Timber import java.util.* +import kotlin.math.max +import kotlin.math.min /** * The class performing stats computation @@ -62,7 +65,6 @@ class Calculator { return true } -// var aggregation: Aggregation? = null } companion object { @@ -161,7 +163,12 @@ class Calculator { val computables = computableGroup.computables(realm) Timber.d(">>>> Start computing group ${computableGroup.name}, ${computables.size} computables") - val results: ComputedResults = ComputedResults(computableGroup) + val computeLongestStreak = options.displayedStats.contains(LONGEST_STREAKS) + if (computeLongestStreak) { + computables.sort("session.startDate") + } + + val results = ComputedResults(computableGroup) val sum = computables.sum(ComputableResult.Field.RATED_NET.identifier).toDouble() val totalHands = computables.sum(ComputableResult.Field.ESTIMATED_HANDS.identifier).toDouble() @@ -170,54 +177,85 @@ class Calculator { val winningSessionCount = computables.sum(ComputableResult.Field.IS_POSITIVE.identifier).toInt() val totalBuyin = computables.sum(ComputableResult.Field.RATED_BUYIN.identifier).toDouble() - // Compute for each session + val maxNetResult = computables.max(ComputableResult.Field.RATED_NET.identifier)?.toDouble() + val minNetResult = computables.min(ComputableResult.Field.RATED_NET.identifier)?.toDouble() - when (options.evolutionValues) { - Options.EvolutionValues.STANDARD -> { + if (options.displayedStats.contains(LOCATIONS_PLAYED)) { + results.addStat(LOCATIONS_PLAYED, computables.distinctBy { it.session?.location?.id }.size.toDouble()) + } - var index: Int = 0 - var tSum = 0.0 - var tBBSum = 0.0 - var tBBSessionCount = 0 - var tWinningSessionCount = 0 - var tBuyinSum = 0.0 - var tHands = 0.0 - - computables.forEach { computable -> - index++ - tSum += computable.ratedNet - tBBSum += computable.bbNet - tBBSessionCount += computable.hasBigBlind - tWinningSessionCount += computable.isPositive - tBuyinSum += computable.ratedBuyin - tHands += computable.estimatedHands - - val session = - computable.session ?: throw IllegalStateException("Computing lone ComputableResult") - results.addEvolutionValue(tSum, stat = NETRESULT, data = session) - results.addEvolutionValue(tSum / index, stat = AVERAGE, data = session) - results.addEvolutionValue(index.toDouble(), stat = NUMBER_OF_GAMES, data = session) - results.addEvolutionValue(tBBSum / tBBSessionCount, stat = AVERAGE_NET_BB, data = session) - results.addEvolutionValue( - (tWinningSessionCount.toDouble() / index.toDouble()), - stat = WIN_RATIO, - data = session - ) - results.addEvolutionValue(tBuyinSum / index, stat = AVERAGE_BUYIN, data = session) - - Stat.netBBPer100Hands(tBBSum, tHands)?.let { netBB100 -> - results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = session) + val shouldIterateOverComputables = + (options.evolutionValues == Options.EvolutionValues.STANDARD || computeLongestStreak) + + // Iterate for each session + if (shouldIterateOverComputables) { + + var index: Int = 0 + var tSum = 0.0 + var tBBSum = 0.0 + var tBBSessionCount = 0 + var tWinningSessionCount = 0 + var tBuyinSum = 0.0 + var tHands = 0.0 + var winStreak = 0; var loseStreak = 0; var currentStreak = 0 + + computables.forEach { computable -> + index++ + tSum += computable.ratedNet + tBBSum += computable.bbNet + tBBSessionCount += computable.hasBigBlind + tWinningSessionCount += computable.isPositive + tBuyinSum += computable.ratedBuyin + tHands += computable.estimatedHands + + if (computable.isPositive == 1) { + if (currentStreak >= 0) { + currentStreak++ + } else { + currentStreak = 1 + loseStreak = min(loseStreak, currentStreak) } - - Stat.returnOnInvestment(tSum, tBuyinSum)?.let { roi -> - results.addEvolutionValue(roi, stat = ROI, data = session) + } + if (computable.isPositive == 0) { + if (currentStreak <= 0) { + currentStreak-- + } else { + currentStreak = -1 + winStreak = max(winStreak, currentStreak) } + } + + val session = + computable.session ?: throw IllegalStateException("Computing lone ComputableResult") + results.addEvolutionValue(tSum, stat = NETRESULT, data = session) + results.addEvolutionValue(tSum / index, stat = AVERAGE, data = session) + results.addEvolutionValue(index.toDouble(), stat = NUMBER_OF_GAMES, data = session) + results.addEvolutionValue(tBBSum / tBBSessionCount, stat = AVERAGE_NET_BB, data = session) + results.addEvolutionValue( + (tWinningSessionCount.toDouble() / index.toDouble()), + stat = WIN_RATIO, + data = session + ) + results.addEvolutionValue(tBuyinSum / index, stat = AVERAGE_BUYIN, data = session) + + Stat.netBBPer100Hands(tBBSum, tHands)?.let { netBB100 -> + results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = session) + } + Stat.returnOnInvestment(tSum, tBuyinSum)?.let { roi -> + results.addEvolutionValue(roi, stat = ROI, data = session) } + } - else -> { - // nothing + + if (currentStreak >= 0) { + winStreak = max(winStreak, currentStreak) + } else { + loseStreak = min(loseStreak, currentStreak) } + + results.addStat(LONGEST_STREAKS, winStreak.toDouble(), loseStreak.toDouble()) + } val sessionSets = computableGroup.sessionSets(realm) @@ -228,6 +266,7 @@ class Calculator { val gSum = sessionSets.sum(SessionSet.Field.RATED_NET.identifier).toDouble() val gTotalHands = sessionSets.sum(SessionSet.Field.ESTIMATED_HANDS.identifier).toDouble() val gBBSum = sessionSets.sum(SessionSet.Field.BB_NET.identifier).toDouble() + val maxDuration = sessionSets.max(SessionSet.Field.NET_DURATION.identifier)?.toDouble() val hourlyRate = gSum / gHourlyDuration // var bbHourlyRate = gBBSum / gDuration @@ -242,6 +281,7 @@ class Calculator { var tBBSum = 0.0 var tHourlyRate = 0.0 var tHourlyRateBB = 0.0 + val daysSet = mutableSetOf() sessionSets.forEach { sessionSet -> tIndex++ @@ -252,6 +292,7 @@ class Calculator { tHourlyRate = gSum / tHourlyDuration tHourlyRateBB = gBBSum / tHourlyDuration + daysSet.add(sessionSet.startDate.startOfDay()) when (options.evolutionValues) { Options.EvolutionValues.STANDARD -> { @@ -308,6 +349,8 @@ class Calculator { } } + results.addStat(DAYS_PLAYED, daysSet.size.toDouble()) + } } else -> { @@ -350,15 +393,24 @@ class Calculator { ComputedStat(HOURLY_RATE_BB, gBBSum / gHourlyDuration), ComputedStat(AVERAGE_NET_BB, gBBSum / bbSessionCount), ComputedStat(HANDS_PLAYED, totalHands) - ) ) Stat.returnOnInvestment(sum, totalBuyin)?.let { roi -> - results.addStats(setOf(ComputedStat(ROI, roi))) + results.addStat(ROI, roi) } Stat.netBBPer100Hands(bbSum, totalHands)?.let { netBB100 -> - results.addStats(setOf(ComputedStat(NET_BB_PER_100_HANDS, netBB100))) + results.addStat(NET_BB_PER_100_HANDS, netBB100) + } + + maxNetResult?.let { max -> + results.addStat(MAXIMUM_NETRESULT, max) + } + minNetResult?.let { min -> + results.addStat(MINIMUM_NETRESULT, min) + } + maxDuration?.let { maxd -> + results.addStat(MAXIMUM_DURATION, maxd) } val bbPer100Hands = bbSum / totalHands * 100 diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index 348dce5b..72b7d331 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -182,6 +182,10 @@ class ComputedResults(group: ComputableGroup) { } } + fun addStat(stat: Stat, value: Double, secondValue: Double? = null) { + this._computedStats[stat] = ComputedStat(stat, value, secondValue) + } + fun addStats(computedStats: Set) { computedStats.forEach { this._computedStats[it.stat] = it 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 2d72b901..4f1782da 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -70,7 +70,14 @@ enum class Stat : RowRepresentable { STANDARD_DEVIATION, STANDARD_DEVIATION_HOURLY, STANDARD_DEVIATION_BB_PER_100_HANDS, - HANDS_PLAYED; + HANDS_PLAYED, + LOCATIONS_PLAYED, + LONGEST_STREAKS, + MAXIMUM_NETRESULT, + MINIMUM_NETRESULT, + MAXIMUM_DURATION, + DAYS_PLAYED + ; /** * Returns whether the stat evolution numericValues requires a distribution sorting @@ -120,6 +127,12 @@ enum class Stat : RowRepresentable { STANDARD_DEVIATION_HOURLY -> R.string.standard_deviation_per_hour STANDARD_DEVIATION_BB_PER_100_HANDS -> R.string.standard_deviation_bb_per_100_hands HANDS_PLAYED -> R.string.number_of_hands + LOCATIONS_PLAYED -> R.string.locations_played + LONGEST_STREAKS -> R.string.longest_streaks + MAXIMUM_NETRESULT -> R.string.max_net_result + MINIMUM_NETRESULT -> R.string.min_net_result + MAXIMUM_DURATION -> R.string.longest_session + DAYS_PLAYED -> R.string.days_played } } @@ -127,7 +140,7 @@ enum class Stat : RowRepresentable { /** * Formats the value of the stat to be suitable for display */ - fun format(value: Double, currency: Currency? = null, context: Context): TextFormat { + fun format(value: Double, secondValue: Double? = null, currency: Currency? = null, context: Context): TextFormat { if (value.isNaN()) { return TextFormat(NULL_TEXT, R.color.white) @@ -135,30 +148,33 @@ enum class Stat : RowRepresentable { when (this) { // Amounts + red/green - Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE -> { + NETRESULT, HOURLY_RATE, AVERAGE, MAXIMUM_NETRESULT, MINIMUM_NETRESULT -> { val color = if (value >= this.threshold) R.color.green else R.color.red return TextFormat(value.toCurrency(currency), color) } // Red/green numericValues - Stat.HOURLY_RATE_BB, Stat.AVERAGE_NET_BB, Stat.NET_BB_PER_100_HANDS -> { + HOURLY_RATE_BB, AVERAGE_NET_BB, NET_BB_PER_100_HANDS -> { val color = if (value >= this.threshold) R.color.green else R.color.red return TextFormat(value.formatted(), color) } // white integers - Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES, Stat.HANDS_PLAYED -> { + NUMBER_OF_SETS, NUMBER_OF_GAMES, HANDS_PLAYED, LOCATIONS_PLAYED, DAYS_PLAYED -> { return TextFormat("${value.toInt()}") } // white durations - Stat.DURATION, Stat.AVERAGE_DURATION -> { + DURATION, AVERAGE_DURATION, MAXIMUM_DURATION -> { return TextFormat(value.formattedHourlyDuration()) } // red/green percentages - Stat.WIN_RATIO, Stat.ROI -> { + WIN_RATIO, ROI -> { val color = if (value * 100 >= this.threshold) R.color.green else R.color.red return TextFormat("${(value * 100).formatted()}%", color) } // white amountsr - Stat.AVERAGE_BUYIN, Stat.STANDARD_DEVIATION, Stat.STANDARD_DEVIATION_HOURLY, - Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> { + AVERAGE_BUYIN, STANDARD_DEVIATION, STANDARD_DEVIATION_HOURLY, + STANDARD_DEVIATION_BB_PER_100_HANDS -> { return TextFormat(value.toCurrency(currency)) } + LONGEST_STREAKS -> { + return TextFormat("${value.toInt()}W / ${secondValue!!.toInt()}L") + } else -> throw FormattingException("Stat formatting of ${this.name} not handled") } } @@ -228,7 +244,7 @@ enum class Stat : RowRepresentable { /** * ComputedStat contains a [stat] and their associated [value] */ -class ComputedStat(var stat: Stat, var value: Double, var currency: Currency? = null) { +class ComputedStat(var stat: Stat, var value: Double, var secondValue: Double? = null, var currency: Currency? = null) { constructor(stat: Stat, value: Double, previousValue: Double?) : this(stat, value) { if (previousValue != null) { @@ -245,7 +261,7 @@ class ComputedStat(var stat: Stat, var value: Double, var currency: Currency? = * Formats the value of the stat to be suitable for display */ fun format(context: Context): TextFormat { - return this.stat.format(this.value, this.currency, context) + return this.stat.format(this.value, this.secondValue, this.currency, context) } } 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 eba8afc5..81a4d522 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 @@ -581,7 +581,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, title = getFormattedDuration(), - computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency) + computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency = currency) ) ) rows.add(SeparatorRow()) @@ -591,7 +591,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, resId = R.string.pause, - computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency) + computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency = currency) ) ) rows.add(SeparatorRow()) @@ -601,14 +601,14 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, title = getFormattedDuration(), - computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency) + computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency = currency) ) ) rows.add( CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT, resId = R.string.hour_rate_without_pauses, - computedStat = ComputedStat(Stat.HOURLY_RATE, this.hourlyRate, currency) + computedStat = ComputedStat(Stat.HOURLY_RATE, this.hourlyRate, currency = currency) ) ) @@ -896,7 +896,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } value?.let { - return stat.format(it, currency, context) + return stat.format(it, currency = currency, context = context) } ?: run { return TextFormat(NULL_TEXT) } 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 cb3506c5..8842e1d7 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 @@ -88,15 +88,15 @@ open class SessionSet() : RealmObject(), Timed, Filterable { override fun formattedValue(stat: Stat, context: Context) : TextFormat { return when (stat) { - Stat.NETRESULT, Stat.AVERAGE -> stat.format(this.ratedNet, null, context) - Stat.DURATION, Stat.AVERAGE_DURATION -> stat.format(this.netDuration.toDouble(), null, context) - Stat.HOURLY_RATE -> stat.format(this.hourlyRate, null, context) - Stat.HANDS_PLAYED -> stat.format(this.estimatedHands, null, context) - Stat.HOURLY_RATE_BB -> stat.format(this.bbHourlyRate, null, context) + Stat.NETRESULT, Stat.AVERAGE -> stat.format(this.ratedNet, currency = null, context = context) + Stat.DURATION, Stat.AVERAGE_DURATION -> stat.format(this.netDuration.toDouble(), currency = null, context = context) + Stat.HOURLY_RATE -> stat.format(this.hourlyRate, currency = null, context = context) + Stat.HANDS_PLAYED -> stat.format(this.estimatedHands, currency = null, context = context) + Stat.HOURLY_RATE_BB -> stat.format(this.bbHourlyRate, currency = null, context = context) Stat.NET_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> { val netBBPer100Hands = Stat.netBBPer100Hands(this.bbNet, this.estimatedHands) if (netBBPer100Hands != null) { - return stat.format(this.estimatedHands, null, context) + return stat.format(this.estimatedHands, currency = null, context = context) } else { return TextFormat(NULL_TEXT) } 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 18ce6f6c..4738acf0 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 @@ -198,7 +198,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate()) val entryValue = it.formattedValue(this.stat, requireContext()) - val totalStatValue = this.stat.format(e.y.toDouble(), null, requireContext()) + val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext()) this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) } From 57dc22dad20cd78b1789e62e80af7a3c226e11dc Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 16 Apr 2019 17:55:17 +0200 Subject: [PATCH 121/245] Added tests for new stats --- .../unitTests/StatsInstrumentedUnitTest.kt | 87 ++++++++- .../android/calculus/Calculator.kt | 170 +++++++++--------- .../pokeranalytics/android/calculus/Report.kt | 2 +- 3 files changed, 167 insertions(+), 92 deletions(-) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt index f7dac0f4..6057578f 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt @@ -112,6 +112,10 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { s2.startDate = sd2 s2.endDate = ed2 + val l1 = realm.createObject(Location::class.java, UUID.randomUUID().toString()) + s1.location = l1 + s2.location = l1 + realm.commitTransaction() assertEquals(2, computableResults.size) @@ -124,7 +128,8 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() - options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION) + options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION, + Stat.LONGEST_STREAKS, Stat.LOCATIONS_PLAYED, Stat.DAYS_PLAYED) val results: ComputedResults = Calculator.compute(realm, group, options) val delta = 0.01 @@ -233,6 +238,42 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { Assert.fail("No std100 stat") } + results.computedStat(Stat.MAXIMUM_NETRESULT)?.let { + assertEquals(300.0, it.value, delta) + } ?: run { + Assert.fail("No MAXIMUM_NETRESULT") + } + + results.computedStat(Stat.MINIMUM_NETRESULT)?.let { + assertEquals(-100.0, it.value, delta) + } ?: run { + Assert.fail("No MINIMUM_NETRESULT") + } + + results.computedStat(Stat.MAXIMUM_DURATION)?.let { + assertEquals(3.0 * 3600 * 1000, it.value, delta) + } ?: run { + Assert.fail("No MAXIMUM_DURATION") + } + + results.computedStat(Stat.DAYS_PLAYED)?.let { + assertEquals(2.0, it.value, delta) + } ?: run { + Assert.fail("No DAYS_PLAYED") + } + + results.computedStat(Stat.LOCATIONS_PLAYED)?.let { + assertEquals(1.0, it.value, delta) + } ?: run { + Assert.fail("No LOCATIONS_PLAYED") + } + + results.computedStat(Stat.LONGEST_STREAKS)?.let { + assertEquals(1.0, it.value, delta) + assertEquals(1.0, it.secondValue!!, delta) + } ?: run { + Assert.fail("No LOCATIONS_PLAYED") + } } @Test @@ -513,7 +554,7 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { val sets = realm.where(SessionSet::class.java).findAll() - Assert.assertEquals(2, sets.size) + assertEquals(2, sets.size) } @@ -617,7 +658,7 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { val results: ComputedResults = Calculator.compute(realm, group, options) val netResult = results.computedStat(Stat.NETRESULT) - Assert.assertEquals(250.0, netResult?.value) + assertEquals(250.0, netResult?.value) } // @Test @@ -653,7 +694,7 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { val results: ComputedResults = Calculator.compute(realm, group, options) val netResult = results.computedStat(Stat.NETRESULT) - Assert.assertEquals(250.0, netResult?.value) + assertEquals(250.0, netResult?.value) println("currency set rate real test starts here") @@ -669,8 +710,44 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { val updatedGroup = ComputableGroup("test", listOf(), stats) val updatedResults: ComputedResults = Calculator.compute(realm, updatedGroup, options) val updatedNetResult = updatedResults.computedStat(Stat.NETRESULT) - Assert.assertEquals(650.0, updatedNetResult?.value) + assertEquals(650.0, updatedNetResult?.value) } + + @Test + fun testDaysPlayed() { + + val realm = this.mockRealm + + realm.executeTransaction { + + val s1 = newSessionInstance(realm) + val s2 = newSessionInstance(realm) + + val sdf = SimpleDateFormat("dd/M/yyyy hh:mm") + + val sd1 = sdf.parse("01/1/2019 09:00") + val ed1 = sdf.parse("01/1/2019 10:00") + val sd2 = sdf.parse("01/1/2019 19:00") + val ed2 = sdf.parse("01/1/2019 20:00") + + s1.startDate = sd1 + s1.endDate = ed1 + + s2.startDate = sd2 + s2.endDate = ed2 + } + + val group = ComputableGroup("", listOf(), listOf()) + val options = Calculator.Options(stats = listOf(Stat.DAYS_PLAYED)) + val report = Calculator.computeGroups(realm, listOf(group), options) + + report.results.firstOrNull()?.computedStat(Stat.DAYS_PLAYED)?.let { + assertEquals(1, it.value.toInt()) + } ?: run { + Assert.fail("Missing DAYS_PLAYED") + } + + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index efe7d906..59538abc 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -197,7 +197,7 @@ class Calculator { var tWinningSessionCount = 0 var tBuyinSum = 0.0 var tHands = 0.0 - var winStreak = 0; var loseStreak = 0; var currentStreak = 0 + var longestWinStreak = 0; var longestLoseStreak = 0; var currentStreak = 0 computables.forEach { computable -> index++ @@ -208,20 +208,19 @@ class Calculator { tBuyinSum += computable.ratedBuyin tHands += computable.estimatedHands - if (computable.isPositive == 1) { - if (currentStreak >= 0) { + if (computable.isPositive == 1) { // positive result + if (currentStreak >= 0) { // currently positive streak currentStreak++ - } else { + } else { // currently negative streak + longestLoseStreak = min(longestLoseStreak, currentStreak) currentStreak = 1 - loseStreak = min(loseStreak, currentStreak) } - } - if (computable.isPositive == 0) { - if (currentStreak <= 0) { + } else { // negative result + if (currentStreak <= 0) { // currently negative streak currentStreak-- - } else { + } else { // currently positive streak + longestWinStreak = max(longestWinStreak, currentStreak) currentStreak = -1 - winStreak = max(winStreak, currentStreak) } } @@ -249,12 +248,13 @@ class Calculator { } if (currentStreak >= 0) { - winStreak = max(winStreak, currentStreak) + longestWinStreak = max(longestWinStreak, currentStreak) } else { - loseStreak = min(loseStreak, currentStreak) + longestLoseStreak = min(longestLoseStreak, currentStreak) } - results.addStat(LONGEST_STREAKS, winStreak.toDouble(), loseStreak.toDouble()) + // loseStreak is negative and we want it positive + results.addStat(LONGEST_STREAKS, longestWinStreak.toDouble(), -longestLoseStreak.toDouble()) } @@ -271,90 +271,88 @@ class Calculator { val hourlyRate = gSum / gHourlyDuration // var bbHourlyRate = gBBSum / gDuration - when (options.evolutionValues) { - Options.EvolutionValues.STANDARD, Options.EvolutionValues.TIMED -> { - - var tHourlyDuration = 0.0 - var tIndex = 0 - var tSum = 0.0 - var tTotalHands = 0.0 - var tBBSum = 0.0 - var tHourlyRate = 0.0 - var tHourlyRateBB = 0.0 - val daysSet = mutableSetOf() - - sessionSets.forEach { sessionSet -> - tIndex++ - tHourlyDuration += sessionSet.hourlyDuration - tSum += sessionSet.ratedNet - tTotalHands += sessionSet.estimatedHands - tBBSum += sessionSet.bbNet - - tHourlyRate = gSum / tHourlyDuration - tHourlyRateBB = gBBSum / tHourlyDuration - daysSet.add(sessionSet.startDate.startOfDay()) - - when (options.evolutionValues) { - Options.EvolutionValues.STANDARD -> { - results.addEvolutionValue(tHourlyRate, stat = HOURLY_RATE, data = sessionSet) - results.addEvolutionValue(tIndex.toDouble(), stat = NUMBER_OF_SETS, data = sessionSet) - results.addEvolutionValue( - sessionSet.netDuration.toDouble(), - stat = DURATION, - data = sessionSet - ) - results.addEvolutionValue( - tHourlyDuration / tIndex, - stat = AVERAGE_DURATION, - data = sessionSet - ) - results.addEvolutionValue(tHourlyRateBB, stat = HOURLY_RATE_BB, data = sessionSet) + val computeDaysPlayed = options.displayedStats.contains(DAYS_PLAYED) + val shouldIterateOverSets = (options.evolutionValues != Options.EvolutionValues.NONE || computeDaysPlayed) - Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> - results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = sessionSet) - } + if (computeDaysPlayed) { + var tHourlyDuration = 0.0 + var tIndex = 0 + var tSum = 0.0 + var tTotalHands = 0.0 + var tBBSum = 0.0 + var tHourlyRate = 0.0 + var tHourlyRateBB = 0.0 + val daysSet = mutableSetOf() + + sessionSets.forEach { sessionSet -> + tIndex++ + tHourlyDuration += sessionSet.hourlyDuration + tSum += sessionSet.ratedNet + tTotalHands += sessionSet.estimatedHands + tBBSum += sessionSet.bbNet + + tHourlyRate = gSum / tHourlyDuration + tHourlyRateBB = gBBSum / tHourlyDuration + daysSet.add(sessionSet.startDate.startOfDay()) + + when (options.evolutionValues) { + Options.EvolutionValues.STANDARD -> { + results.addEvolutionValue(tHourlyRate, stat = HOURLY_RATE, data = sessionSet) + results.addEvolutionValue(tIndex.toDouble(), stat = NUMBER_OF_SETS, data = sessionSet) + results.addEvolutionValue( + sessionSet.netDuration.toDouble(), + stat = DURATION, + data = sessionSet + ) + results.addEvolutionValue( + tHourlyDuration / tIndex, + stat = AVERAGE_DURATION, + data = sessionSet + ) + results.addEvolutionValue(tHourlyRateBB, stat = HOURLY_RATE_BB, data = sessionSet) + + Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> + results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = sessionSet) } - Options.EvolutionValues.TIMED -> { - results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT, sessionSet) - results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) - results.addEvolutionValue( - tIndex.toDouble(), - tHourlyDuration, - NUMBER_OF_SETS, - sessionSet - ) - results.addEvolutionValue( - sessionSet.netDuration.toDouble(), - tHourlyDuration, - DURATION, - sessionSet - ) + + } + Options.EvolutionValues.TIMED -> { + results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT, sessionSet) + results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) + results.addEvolutionValue( + tIndex.toDouble(), + tHourlyDuration, + NUMBER_OF_SETS, + sessionSet + ) + results.addEvolutionValue( + sessionSet.netDuration.toDouble(), + tHourlyDuration, + DURATION, + sessionSet + ) + results.addEvolutionValue( + tHourlyDuration / tIndex, + tHourlyDuration, + AVERAGE_DURATION, + sessionSet + ) + results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet) + + Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> results.addEvolutionValue( - tHourlyDuration / tIndex, + netBB100, tHourlyDuration, - AVERAGE_DURATION, + NET_BB_PER_100_HANDS, sessionSet ) - results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet) - - Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> - results.addEvolutionValue( - netBB100, - tHourlyDuration, - NET_BB_PER_100_HANDS, - sessionSet - ) - } } } + } - results.addStat(DAYS_PLAYED, daysSet.size.toDouble()) + results.addStat(DAYS_PLAYED, daysSet.size.toDouble()) - } - } - else -> { - // nothing } } diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index 72b7d331..effdd611 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -183,7 +183,7 @@ class ComputedResults(group: ComputableGroup) { } fun addStat(stat: Stat, value: Double, secondValue: Double? = null) { - this._computedStats[stat] = ComputedStat(stat, value, secondValue) + this._computedStats[stat] = ComputedStat(stat, value, secondValue = secondValue) } fun addStats(computedStats: Set) { From 079a8397bd46aff45a8653a7660daa1ccadef98f Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 16 Apr 2019 18:10:14 +0200 Subject: [PATCH 122/245] Improve Calendar details --- .../ui/activity/StatisticDetailsActivity.kt | 2 +- .../ui/fragment/CalendarDetailsFragment.kt | 41 ++++++- .../android/ui/view/RowViewType.kt | 79 ++++++++++++- .../ui/view/rowrepresentable/GraphRow.kt | 21 ++++ .../ui/view/rowrepresentable/StatDoubleRow.kt | 13 +++ .../ui/view/rowrepresentable/StatRow.kt | 2 +- app/src/main/res/layout/row_calendar_stat.xml | 106 ------------------ app/src/main/res/layout/row_graph.xml | 19 ++++ app/src/main/res/layout/row_stats_double.xml | 51 +++++++++ 9 files changed, 221 insertions(+), 113 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatDoubleRow.kt delete mode 100644 app/src/main/res/layout/row_calendar_stat.xml create mode 100644 app/src/main/res/layout/row_graph.xml create mode 100644 app/src/main/res/layout/row_stats_double.xml 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 35349fc7..52e4a81e 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 @@ -14,7 +14,7 @@ import net.pokeranalytics.android.ui.fragment.GraphParameters class StatisticDetailsActivity : PokerAnalyticsActivity() { private enum class IntentKey(val keyName: String) { - STAT("STAT"), + STAT("STATS"), ENTRIES("ENTRIES"), } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index 27b1d366..15f72051 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager import com.github.mikephil.charting.data.Entry import com.google.android.material.tabs.TabLayout import kotlinx.android.synthetic.main.fragment_calendar_details.* @@ -14,10 +15,18 @@ import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate +import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.extensions.toast import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.GraphRow +import net.pokeranalytics.android.ui.view.rowrepresentable.StatDoubleRow -class CalendarDetailsFragment : PokerAnalyticsFragment() { +class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { companion object { fun newInstance(context: Context) { @@ -27,6 +36,9 @@ class CalendarDetailsFragment : PokerAnalyticsFragment() { } private lateinit var parentActivity: PokerAnalyticsActivity + private lateinit var statsAdapter: RowRepresentableAdapter + + private var rowRepresentables: ArrayList = ArrayList() //private var stat: Stat = Stat.NETRESULT //private var entries: List = ArrayList() @@ -40,6 +52,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment() { initUI() } + override fun adapterRows(): List? { + return rowRepresentables + } + /** * Init UI */ @@ -80,9 +96,32 @@ class CalendarDetailsFragment : PokerAnalyticsFragment() { CalendarDetailsActivity.computedResults?.let { computedResults -> + rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.net_result)) + rowRepresentables.add(GraphRow(Stat.NETRESULT, null, "")) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.NETRESULT), computedResults.computedStat(Stat.HOURLY_RATE))) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.LOCATIONS_PLAYED), computedResults.computedStat(Stat.LONGEST_STREAKS))) + rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.distribution)) + rowRepresentables.add(GraphRow(Stat.NETRESULT, null, "")) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.WIN_RATIO))) + rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.volume)) + rowRepresentables.add(GraphRow(Stat.NETRESULT, null, "")) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DURATION), computedResults.computedStat(Stat.AVERAGE_DURATION))) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DAYS_PLAYED))) + //computedResults.group.conditions + } + + statsAdapter = RowRepresentableAdapter(this, this) + + + + val viewManager = LinearLayoutManager(requireContext()) + recyclerView.apply { + setHasFixedSize(true) + layoutManager = viewManager + adapter = statsAdapter } /* diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 76254452..725517b6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -13,12 +13,13 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_transaction.view.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.StatDoubleRow +import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow /** * An interface used to factor the configuration of RecyclerView.ViewHolder @@ -61,7 +62,9 @@ enum class RowViewType(private var layoutRes: Int) { ROW_TRANSACTION(R.layout.row_transaction), ROW_BUTTON(R.layout.row_button), ROW_FOLLOW_US(R.layout.row_follow_us), - STAT(R.layout.row_stats_title_value), + STATS(R.layout.row_stats_title_value), + STATS_DOUBLE(R.layout.row_stats_double), + GRAPH(R.layout.row_graph), // Separator SEPARATOR(R.layout.row_separator); @@ -93,8 +96,10 @@ enum class RowViewType(private var layoutRes: Int) { // Row Follow Us ROW_FOLLOW_US -> RowFollowUsViewHolder(layout) - // Row Stat - STAT -> StatsTitleValueViewHolder(layout) + // Row Stats + STATS -> StatsTitleValueViewHolder(layout) + STATS_DOUBLE -> StatsDoubleViewHolder(layout) + GRAPH -> GraphViewHolder(layout) // Separator SEPARATOR -> SeparatorViewHolder(layout) @@ -248,6 +253,72 @@ enum class RowViewType(private var layoutRes: Int) { } } + /** + * Display a stat + */ + inner class StatsDoubleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + + + if (row is StatDoubleRow) { + + // Stat 1 + itemView.findViewById(R.id.stat1Name)?.let { view -> + row.computedStat1?.stat?.resId?.let { + view.text = view.context.getString(it) + } + } + + itemView.findViewById(R.id.stat1Value)?.let { view -> + row.computedStat1?.format(view.context)?.let { + view.setTextFormat(it, itemView.context) + } + } + + // Stat 2 + itemView.findViewById(R.id.stat2Name)?.let { view -> + row.computedStat2?.stat?.resId?.let { + view.text = view.context.getString(it) + } + } + + itemView.findViewById(R.id.stat2Value)?.let { view -> + row.computedStat2?.format(view.context)?.let { + view.setTextFormat(it, itemView.context) + } + } + } + + + + // Listener + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.findViewById(R.id.container)?.setOnClickListener(listener) + } + } + + + /** + * Display a stat + */ + inner class GraphViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + + //TODO: Implementation + + // Listener + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.findViewById(R.id.container)?.setOnClickListener(listener) + } + } + + /** * Display a button in a row */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt new file mode 100644 index 00000000..4290aa75 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt @@ -0,0 +1,21 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.calculus.ComputedStat +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + + +class GraphRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "") : RowRepresentable { + + var stat: Stat = stat + var computedStat: ComputedStat? = computedStat + var groupName: String = groupName + + override val viewType: Int + get() = RowViewType.GRAPH.ordinal + + override val resId: Int? + get() = this.stat.resId + +} diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatDoubleRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatDoubleRow.kt new file mode 100644 index 00000000..6c27eadd --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatDoubleRow.kt @@ -0,0 +1,13 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.calculus.ComputedStat +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + + +class StatDoubleRow(var computedStat1: ComputedStat? = null, var computedStat2: ComputedStat? = null) : RowRepresentable { + + override val viewType: Int + get() = RowViewType.STATS_DOUBLE.ordinal + +} diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt index 7dd06355..44abd20e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt @@ -13,7 +13,7 @@ class StatRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "") : var groupName: String = groupName override val viewType: Int - get() = RowViewType.STAT.ordinal + get() = RowViewType.STATS.ordinal override val resId: Int? get() = this.stat.resId diff --git a/app/src/main/res/layout/row_calendar_stat.xml b/app/src/main/res/layout/row_calendar_stat.xml deleted file mode 100644 index 269a6378..00000000 --- a/app/src/main/res/layout/row_calendar_stat.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/row_graph.xml b/app/src/main/res/layout/row_graph.xml new file mode 100644 index 00000000..dd4dc1f9 --- /dev/null +++ b/app/src/main/res/layout/row_graph.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_stats_double.xml b/app/src/main/res/layout/row_stats_double.xml new file mode 100644 index 00000000..cbe84c14 --- /dev/null +++ b/app/src/main/res/layout/row_stats_double.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + \ No newline at end of file From f1ad203ae275e1655c14e96f5fc28b9bfb750d1f Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 09:32:15 +0200 Subject: [PATCH 123/245] Bugfix --- .../net/pokeranalytics/android/ui/view/RowViewType.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 725517b6..24aa7c18 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -20,6 +20,7 @@ import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.StatDoubleRow import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow +import timber.log.Timber /** * An interface used to factor the configuration of RecyclerView.ViewHolder @@ -262,15 +263,21 @@ enum class RowViewType(private var layoutRes: Int) { if (row is StatDoubleRow) { + Timber.d("${row}") + + Timber.d("${row.computedStat1}") + Timber.d("${row.computedStat2}") // Stat 1 itemView.findViewById(R.id.stat1Name)?.let { view -> + view.text = "" row.computedStat1?.stat?.resId?.let { view.text = view.context.getString(it) } } itemView.findViewById(R.id.stat1Value)?.let { view -> + view.text = "" row.computedStat1?.format(view.context)?.let { view.setTextFormat(it, itemView.context) } @@ -278,12 +285,14 @@ enum class RowViewType(private var layoutRes: Int) { // Stat 2 itemView.findViewById(R.id.stat2Name)?.let { view -> + view.text = "" row.computedStat2?.stat?.resId?.let { view.text = view.context.getString(it) } } itemView.findViewById(R.id.stat2Value)?.let { view -> + view.text = "" row.computedStat2?.format(view.context)?.let { view.setTextFormat(it, itemView.context) } From a0c738e1c58cb641c0418a0f174099c1b5640442 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 17 Apr 2019 10:24:21 +0200 Subject: [PATCH 124/245] Calendar: Adding missing stats + fixing max duration format --- .../java/net/pokeranalytics/android/calculus/Calculator.kt | 2 +- .../android/ui/fragment/CalendarDetailsFragment.kt | 4 ++-- .../pokeranalytics/android/ui/fragment/CalendarFragment.kt | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 59538abc..d1709639 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -408,7 +408,7 @@ class Calculator { results.addStat(MINIMUM_NETRESULT, min) } maxDuration?.let { maxd -> - results.addStat(MAXIMUM_DURATION, maxd) + results.addStat(MAXIMUM_DURATION, maxd / 3600000) // (milliseconds to hours) } val bbPer100Hands = bbSum / totalHands * 100 diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index 15f72051..f83d712f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -102,11 +102,11 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.LOCATIONS_PLAYED), computedResults.computedStat(Stat.LONGEST_STREAKS))) rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.distribution)) rowRepresentables.add(GraphRow(Stat.NETRESULT, null, "")) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.WIN_RATIO))) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.WIN_RATIO), computedResults.computedStat(Stat.MAXIMUM_NETRESULT))) rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.volume)) rowRepresentables.add(GraphRow(Stat.NETRESULT, null, "")) rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DURATION), computedResults.computedStat(Stat.AVERAGE_DURATION))) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DAYS_PLAYED))) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DAYS_PLAYED), computedResults.computedStat(Stat.MAXIMUM_DURATION))) //computedResults.group.conditions diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 07174f6a..07fcb870 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -238,8 +238,11 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep else -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() } + val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED) + val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) monthConditions.forEach { conditions -> - val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = Calculator.Options()) + + val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = options) report.results.forEach { computedResults -> if (!computedResults.isEmpty) { // Set date data @@ -267,7 +270,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } yearConditions.forEach { conditions -> - val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = Calculator.Options()) + val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = options) report.results.forEach { computedResults -> if (!computedResults.isEmpty) { // Set date data From b96291de033b0b9ffdba752f320991e703b52e4a Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Wed, 17 Apr 2019 10:34:06 +0200 Subject: [PATCH 125/245] add entry fee comparator --- .../android/model/comparison/Comparator.kt | 15 ++++++++++- .../android/model/filter/QueryCondition.kt | 27 +++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index 961ede8f..de02cb45 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -29,12 +29,25 @@ enum class Comparator { LIMIT_TYPE, TABLE_SIZE, TOURNAMENT_TYPE, + TOURNAMENT_ENTRY_FEE, ; val queryConditions: List get() { return when (this) { - MONTH_OF_YEAR -> List(12) { index -> QueryCondition.MONTH().apply { setMonth(index) } } + TOURNAMENT_ENTRY_FEE -> { + val fees = arrayListOf() + val realm = Realm.getDefaultInstance() + val fieldName = Session.fieldNameForQueryType(QueryCondition.BETWEEN_TOURNAMENT_FEE()) + realm.where().distinct(fieldName).findAll().sort(fieldName, Sort.ASCENDING).map { + it.tournamentEntryFee?.let { fee -> + fees.add(QueryCondition.BETWEEN_TOURNAMENT_FEE().apply { between(fee, fee) }) + } + } + realm.close() + fees + } + MONTH_OF_YEAR -> List(12) { index -> QueryCondition.MONTH().apply { setMonth(index) } } DAY_OF_WEEK -> List(7) { index -> QueryCondition.DAY_OF_WEEK().apply { setDay(index) } } YEAR -> { val years = arrayListOf() diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index 9cc307e5..cf5dac46 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -29,6 +29,9 @@ sealed class QueryCondition(var operator: Operator? = null) { this.valueMap = mapOf("ids" to id) } + class MoreQueryCondition : QueryCondition(Operator.MORE) + class LessQueryCondition : QueryCondition(Operator.LESS) + companion object { fun valueOf(name:String) : QueryCondition { val kClass = Class.forName("${QueryCondition::class.qualifiedName}$$name").kotlin @@ -42,7 +45,10 @@ sealed class QueryCondition(var operator: Operator? = null) { enum class Operator { BETWEEN, MORE, - LESS; + LESS, + BETWEEN_RIGHT_EXCLUSIVE, + BETWEEN_LEFT_EXCLUSIVE, + ; } object LIVE : QueryCondition() @@ -98,7 +104,14 @@ sealed class QueryCondition(var operator: Operator? = null) { class BETWEEN_NUMBER_OF_PLAYER: QueryCondition(Operator.BETWEEN) class MORE_THAN_TOURNAMENT_FEE: QueryCondition(Operator.MORE) class LESS_THAN_TOURNAMENT_FEE: QueryCondition(Operator.LESS) - class BETWEEN_TOURNAMENT_FEE: QueryCondition(Operator.BETWEEN) + class BETWEEN_TOURNAMENT_FEE: QueryCondition(Operator.BETWEEN_RIGHT_EXCLUSIVE) { + fun between(leftValue:Double, rightValue:Double) { + this.valueMap = mapOf( + "leftValue" to leftValue, + "rightValue" to rightValue + ) + } + } class MIN_RE_BUY: QueryCondition(Operator.MORE) class MAX_RE_BUY: QueryCondition(Operator.LESS) @@ -198,6 +211,16 @@ sealed class QueryCondition(var operator: Operator? = null) { val rightValue: Double by valueMap return realmQuery.between(fieldName, leftValue, rightValue) } + Operator.BETWEEN_LEFT_EXCLUSIVE -> { + val leftValue: Double by valueMap + val rightValue: Double by valueMap + return realmQuery.greaterThan(fieldName, leftValue).and().lessThanOrEqualTo(fieldName, rightValue) + } + Operator.BETWEEN_RIGHT_EXCLUSIVE-> { + val leftValue: Double by valueMap + val rightValue: Double by valueMap + return realmQuery.greaterThanOrEqualTo(fieldName, leftValue).and().lessThan(fieldName, rightValue) + } } return when (this) { From d84cf9fad58d179b58c699826e1209715ea9f80b Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 10:38:08 +0200 Subject: [PATCH 126/245] Improve calendar details (wip) --- .../ui/activity/CalendarDetailsActivity.kt | 5 + .../ui/fragment/CalendarDetailsFragment.kt | 126 ++++++++++++------ .../android/ui/view/RowViewType.kt | 46 +++++++ .../ui/view/rowrepresentable/GraphRow.kt | 11 +- 4 files changed, 139 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt index 6a8e5654..721f98f2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt @@ -3,10 +3,12 @@ package net.pokeranalytics.android.ui.activity import android.content.Context import android.content.Intent import android.os.Bundle +import kotlinx.android.synthetic.main.activity_calendar_details.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.fragment.CalendarDetailsFragment class CalendarDetailsActivity : PokerAnalyticsActivity() { @@ -41,6 +43,9 @@ class CalendarDetailsActivity : PokerAnalyticsActivity() { */ private fun initUI() { + val calendarDetailsFragment = calendarDetailsFragment as CalendarDetailsFragment + calendarDetailsFragment.setData(computedResults, sessionTypeCondition) + } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index 15f72051..028fff65 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -7,24 +7,32 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager -import com.github.mikephil.charting.data.Entry import com.google.android.material.tabs.TabLayout +import io.realm.Realm import kotlinx.android.synthetic.main.fragment_calendar_details.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.Calculator +import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource -import net.pokeranalytics.android.ui.extensions.toast import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.GraphRow import net.pokeranalytics.android.ui.view.rowrepresentable.StatDoubleRow +import timber.log.Timber +import java.util.* +import kotlin.collections.ArrayList class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { @@ -38,6 +46,8 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable private lateinit var parentActivity: PokerAnalyticsActivity private lateinit var statsAdapter: RowRepresentableAdapter + private var computedResults: ComputedResults? = null + private var sessionTypeCondition: QueryCondition? = null private var rowRepresentables: ArrayList = ArrayList() //private var stat: Stat = Stat.NETRESULT @@ -49,13 +59,34 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + initData() initUI() + launchStatComputation() } override fun adapterRows(): List? { return rowRepresentables } + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + when(row) { + is GraphRow -> { + //TODO: Open graph details + } + } + } + + /** + * Init data + */ + private fun initData() { + Timber.d("initData") + + this.computedResults = CalendarDetailsActivity.computedResults + this.sessionTypeCondition = CalendarDetailsActivity.sessionTypeCondition + + } + /** * Init UI */ @@ -74,9 +105,12 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { - toast("Tab: ${tab.position}") - - + when(tab.position) { + 0 -> sessionTypeCondition = null + 1 -> sessionTypeCondition = QueryCondition.CASH + 2 -> sessionTypeCondition = QueryCondition.TOURNAMENT + } + launchStatComputation() } override fun onTabUnselected(tab: TabLayout.Tab) { @@ -86,7 +120,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable } }) - CalendarDetailsActivity.sessionTypeCondition?.let { + sessionTypeCondition?.let { when(it) { QueryCondition.CASH -> tabs.getTabAt(1)?.select() QueryCondition.TOURNAMENT -> tabs.getTabAt(2)?.select() @@ -94,28 +128,9 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable } } - CalendarDetailsActivity.computedResults?.let { computedResults -> - - rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.net_result)) - rowRepresentables.add(GraphRow(Stat.NETRESULT, null, "")) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.NETRESULT), computedResults.computedStat(Stat.HOURLY_RATE))) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.LOCATIONS_PLAYED), computedResults.computedStat(Stat.LONGEST_STREAKS))) - rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.distribution)) - rowRepresentables.add(GraphRow(Stat.NETRESULT, null, "")) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.WIN_RATIO))) - rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.volume)) - rowRepresentables.add(GraphRow(Stat.NETRESULT, null, "")) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DURATION), computedResults.computedStat(Stat.AVERAGE_DURATION))) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DAYS_PLAYED))) - - //computedResults.group.conditions - - } statsAdapter = RowRepresentableAdapter(this, this) - - val viewManager = LinearLayoutManager(requireContext()) recyclerView.apply { @@ -124,29 +139,60 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable adapter = statsAdapter } - /* - toolbar.title = stat.localizedTitle(requireContext()) - - val fragmentManager = parentActivity.supportFragmentManager - val fragmentTransaction = fragmentManager.beginTransaction() - val fragment = GraphFragment() + } - fragmentTransaction.add(R.id.container, fragment) - fragmentTransaction.commit() + /** + * + */ + private fun launchStatComputation() { + + computedResults?.let { computedResults -> + + GlobalScope.launch { + + val startDate = Date() + + val realm = Realm.getDefaultInstance() + val conditions = ArrayList().apply { + addAll(computedResults.group.conditions) + when (sessionTypeCondition) { + QueryCondition.CASH -> addAll(Comparator.CASH.queryConditions) + QueryCondition.TOURNAMENT -> addAll(Comparator.TOURNAMENT.queryConditions) + } + } + + val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD) + val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = options) + + Timber.d("Report take: ${System.currentTimeMillis() - startDate.time}ms") + + rowRepresentables.clear() + rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.net_result)) + rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.NETRESULT), computedResults.computedStat(Stat.HOURLY_RATE))) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.LOCATIONS_PLAYED), computedResults.computedStat(Stat.LONGEST_STREAKS))) + rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.distribution)) + rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.WIN_RATIO))) + rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.volume)) + rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DURATION), computedResults.computedStat(Stat.AVERAGE_DURATION))) + rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DAYS_PLAYED))) + + launch(Dispatchers.Main) { + statsAdapter.notifyDataSetChanged() + } + } - StatisticDetailsActivity.parameters?.let { - fragment.setData(it.stat, it.report) - StatisticDetailsActivity.parameters = null - } ?: run { - throw Exception("Missing graph parameters") } - */ + } /** * Set data */ - fun setData(stat: Stat, entries: List) { + fun setData(computedResults: ComputedResults?, sessionTypeCondition: QueryCondition?) { + Timber.d("Set data") //this.stat = stat //this.entries = entries } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 24aa7c18..14dea0a6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -3,6 +3,7 @@ package net.pokeranalytics.android.ui.view import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.FrameLayout import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.SwitchCompat @@ -10,14 +11,21 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible import androidx.core.widget.ContentLoadingProgressBar import androidx.recyclerview.widget.RecyclerView +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.charts.LineChart +import com.github.mikephil.charting.data.LineData import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_transaction.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.GraphType import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.extensions.setTextFormat +import net.pokeranalytics.android.ui.graph.PALineDataSet +import net.pokeranalytics.android.ui.graph.setStyle import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.GraphRow import net.pokeranalytics.android.ui.view.rowrepresentable.StatDoubleRow import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import timber.log.Timber @@ -319,6 +327,44 @@ enum class RowViewType(private var layoutRes: Int) { //TODO: Implementation + if (row is GraphRow) { + + row.report.results.firstOrNull()?.defaultStatEntries(row.stat)?.let { entries -> + + val context = itemView.context + + val dataSet = PALineDataSet(entries, row.stat.name, context) + val colors = arrayOf(R.color.green_light).toIntArray() + dataSet.setColors(colors, context) + dataSet.setDrawCircles(false) + val lineData = LineData(listOf(dataSet)) + + val chartView = when (row.stat.graphType) { + GraphType.LINE -> { + val lineChart = LineChart(context) + lineChart.data = lineData + lineChart + } + GraphType.BAR -> { + val barChart = BarChart(context) + barChart + } + } + + itemView.findViewById(R.id.chartContainer)?.let { + it.removeAllViews() + it.addView(chartView) + } + + chartView.setStyle(false, context) + //chartView.setOnChartValueSelectedListener(this) + chartView.highlightValue((entries.size - 1).toFloat(), 0) + + } + + } + + // Listener val listener = View.OnClickListener { adapter.delegate?.onRowSelected(position, row) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt index 4290aa75..5803cc84 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt @@ -1,21 +1,14 @@ package net.pokeranalytics.android.ui.view.rowrepresentable -import net.pokeranalytics.android.calculus.ComputedStat +import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -class GraphRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "") : RowRepresentable { - - var stat: Stat = stat - var computedStat: ComputedStat? = computedStat - var groupName: String = groupName +class GraphRow(var report: Report, var stat: Stat) : RowRepresentable { override val viewType: Int get() = RowViewType.GRAPH.ordinal - override val resId: Int? - get() = this.stat.resId - } From e55a1c85170e94017a0392c51265fc343ad90206 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 17 Apr 2019 11:14:37 +0200 Subject: [PATCH 127/245] Fix to get more positive values --- .../java/net/pokeranalytics/android/util/FakeDataManager.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt b/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt index bc5c7fd3..2ccbadf6 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/FakeDataManager.kt @@ -75,8 +75,9 @@ class FakeDataManager { session.game = games.random() session.result?.let { result -> + val buyin = buyinList.random() result.buyin = buyinList.random() - result.netResult = resultsList.random() + result.netResult = resultsList.random() + buyin } } From 4dbd91e078b4474c7fb443ef7dadfc8df7491e7d Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 17 Apr 2019 11:28:59 +0200 Subject: [PATCH 128/245] Fixing standard deviation computation --- .../unitTests/StatsInstrumentedUnitTest.kt | 4 +-- .../android/calculus/Calculator.kt | 32 ++++++++++--------- .../android/ui/fragment/CalendarFragment.kt | 4 ++- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt index 6057578f..374cadf6 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt @@ -251,7 +251,7 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { } results.computedStat(Stat.MAXIMUM_DURATION)?.let { - assertEquals(3.0 * 3600 * 1000, it.value, delta) + assertEquals(3.0, it.value, delta) } ?: run { Assert.fail("No MAXIMUM_DURATION") } @@ -650,8 +650,6 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { } - val computableResults = realm.where(ComputableResult::class.java).findAll() - val sets = realm.where(SessionSet::class.java).findAll() val stats: List = listOf(Stat.NETRESULT) val group = ComputableGroup("test", listOf(), stats) val options = Calculator.Options() diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index d1709639..4960638f 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -55,15 +55,19 @@ class Calculator { /** * This function determines whether the standard deviation should be computed */ - fun shouldComputeStandardDeviation(): Boolean { - this.displayedStats.forEach { stat -> - return when (stat) { - STANDARD_DEVIATION, STANDARD_DEVIATION_HOURLY, STANDARD_DEVIATION_BB_PER_100_HANDS -> true - else -> false + val computeStandardDeviation: Boolean + get() { + this.displayedStats.forEach { + if (it == STANDARD_DEVIATION_BB_PER_100_HANDS || it == STANDARD_DEVIATION || it == STANDARD_DEVIATION_HOURLY) { + return true + } } + return false } - return true - } + + val computeLongestStreak = this.displayedStats.contains(LONGEST_STREAKS) + val computeLocationsPlayed = this.displayedStats.contains(LOCATIONS_PLAYED) + val computeDaysPlayed = this.displayedStats.contains(DAYS_PLAYED) } @@ -163,8 +167,7 @@ class Calculator { val computables = computableGroup.computables(realm) Timber.d(">>>> Start computing group ${computableGroup.name}, ${computables.size} computables") - val computeLongestStreak = options.displayedStats.contains(LONGEST_STREAKS) - if (computeLongestStreak) { + if (options.computeLongestStreak) { computables.sort("session.startDate") } @@ -180,12 +183,12 @@ class Calculator { val maxNetResult = computables.max(ComputableResult.Field.RATED_NET.identifier)?.toDouble() val minNetResult = computables.min(ComputableResult.Field.RATED_NET.identifier)?.toDouble() - if (options.displayedStats.contains(LOCATIONS_PLAYED)) { + if (options.computeLocationsPlayed) { results.addStat(LOCATIONS_PLAYED, computables.distinctBy { it.session?.location?.id }.size.toDouble()) } val shouldIterateOverComputables = - (options.evolutionValues == Options.EvolutionValues.STANDARD || computeLongestStreak) + (options.evolutionValues == Options.EvolutionValues.STANDARD || options.computeLongestStreak) // Iterate for each session if (shouldIterateOverComputables) { @@ -271,10 +274,9 @@ class Calculator { val hourlyRate = gSum / gHourlyDuration // var bbHourlyRate = gBBSum / gDuration - val computeDaysPlayed = options.displayedStats.contains(DAYS_PLAYED) - val shouldIterateOverSets = (options.evolutionValues != Options.EvolutionValues.NONE || computeDaysPlayed) + val shouldIterateOverSets = (options.evolutionValues != Options.EvolutionValues.NONE || options.computeDaysPlayed) - if (computeDaysPlayed) { + if (shouldIterateOverSets) { var tHourlyDuration = 0.0 var tIndex = 0 @@ -414,7 +416,7 @@ class Calculator { val bbPer100Hands = bbSum / totalHands * 100 // Standard Deviation - if (options.shouldComputeStandardDeviation()) { + if (options.computeStandardDeviation) { // Session var stdSum = 0.0 diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 07fcb870..f6ca6cf9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -238,7 +238,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep else -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() } - val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED) + val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED, + Stat.STANDARD_DEVIATION_HOURLY + ) val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) monthConditions.forEach { conditions -> From 48a7102d8a511d86227e498584a02c2cb45ee42e Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 11:38:19 +0200 Subject: [PATCH 129/245] Improve layouts --- app/src/main/res/layout/row_graph.xml | 5 ++--- app/src/main/res/layout/row_stats_double.xml | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/row_graph.xml b/app/src/main/res/layout/row_graph.xml index dd4dc1f9..d4c78ac4 100644 --- a/app/src/main/res/layout/row_graph.xml +++ b/app/src/main/res/layout/row_graph.xml @@ -1,10 +1,9 @@ + android:padding="8dp"> + android:foreground="?selectableItemBackground" /> \ No newline at end of file diff --git a/app/src/main/res/layout/row_stats_double.xml b/app/src/main/res/layout/row_stats_double.xml index cbe84c14..9fd36e44 100644 --- a/app/src/main/res/layout/row_stats_double.xml +++ b/app/src/main/res/layout/row_stats_double.xml @@ -4,7 +4,10 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="16dp"> + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingStart="16dp" + android:paddingEnd="16dp"> Date: Wed, 17 Apr 2019 11:38:26 +0200 Subject: [PATCH 130/245] Improve Calendar Details --- .../ui/activity/CalendarDetailsActivity.kt | 6 +- .../ui/fragment/CalendarDetailsFragment.kt | 92 ++++++++++--------- .../android/ui/view/RowViewType.kt | 24 ++--- 3 files changed, 61 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt index 721f98f2..53c9cc77 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt @@ -17,7 +17,7 @@ class CalendarDetailsActivity : PokerAnalyticsActivity() { var computedResults: ComputedResults? = null var sessionTypeCondition: QueryCondition? = null - var title: String? = null + var detailsTitle: String? = null /** * Default constructor @@ -25,7 +25,7 @@ class CalendarDetailsActivity : PokerAnalyticsActivity() { fun newInstance(context: Context, computedResults: ComputedResults, sessionTypeCondition: QueryCondition?, title: String?) { this.computedResults = computedResults this.sessionTypeCondition = sessionTypeCondition - this.title = title + this.detailsTitle = title val intent = Intent(context, CalendarDetailsActivity::class.java) context.startActivity(intent) } @@ -44,7 +44,7 @@ class CalendarDetailsActivity : PokerAnalyticsActivity() { private fun initUI() { val calendarDetailsFragment = calendarDetailsFragment as CalendarDetailsFragment - calendarDetailsFragment.setData(computedResults, sessionTypeCondition) + calendarDetailsFragment.setData(computedResults, sessionTypeCondition, detailsTitle) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index 7c8d876c..7cd102f9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -19,11 +19,11 @@ import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.filter.QueryCondition -import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource +import net.pokeranalytics.android.ui.extensions.toast import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -46,6 +46,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable private lateinit var parentActivity: PokerAnalyticsActivity private lateinit var statsAdapter: RowRepresentableAdapter + private var title: String? = "" private var computedResults: ComputedResults? = null private var sessionTypeCondition: QueryCondition? = null private var rowRepresentables: ArrayList = ArrayList() @@ -59,9 +60,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() initUI() - launchStatComputation() } override fun adapterRows(): List? { @@ -69,24 +68,14 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - when(row) { + when (row) { is GraphRow -> { //TODO: Open graph details + toast("Open graph details") } } } - /** - * Init data - */ - private fun initData() { - Timber.d("initData") - - this.computedResults = CalendarDetailsActivity.computedResults - this.sessionTypeCondition = CalendarDetailsActivity.sessionTypeCondition - - } - /** * Init UI */ @@ -101,11 +90,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) - toolbar.title = CalendarDetailsActivity.title tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { - when(tab.position) { + when (tab.position) { 0 -> sessionTypeCondition = null 1 -> sessionTypeCondition = QueryCondition.CASH 2 -> sessionTypeCondition = QueryCondition.TOURNAMENT @@ -120,15 +108,6 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable } }) - sessionTypeCondition?.let { - when(it) { - QueryCondition.CASH -> tabs.getTabAt(1)?.select() - QueryCondition.TOURNAMENT -> tabs.getTabAt(2)?.select() - else -> tabs.getTabAt(0)?.select() - } - } - - statsAdapter = RowRepresentableAdapter(this, this) val viewManager = LinearLayoutManager(requireContext()) @@ -142,7 +121,26 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable } /** - * + * Display data + */ + private fun displayData() { + + title?.let { + toolbar.title = it + } + + sessionTypeCondition?.let { + when (it) { + QueryCondition.CASH -> tabs.getTabAt(1)?.select() + QueryCondition.TOURNAMENT -> tabs.getTabAt(2)?.select() + else -> tabs.getTabAt(0)?.select() + } + } + } + + + /** + * Launch stat computation */ private fun launchStatComputation() { @@ -166,18 +164,22 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable Timber.d("Report take: ${System.currentTimeMillis() - startDate.time}ms") - rowRepresentables.clear() - rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.net_result)) - rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.NETRESULT), computedResults.computedStat(Stat.HOURLY_RATE))) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.LOCATIONS_PLAYED), computedResults.computedStat(Stat.LONGEST_STREAKS))) - rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.distribution)) - rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.WIN_RATIO), computedResults.computedStat(Stat.MAXIMUM_NETRESULT))) - rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.volume)) - rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DURATION), computedResults.computedStat(Stat.AVERAGE_DURATION))) - rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DAYS_PLAYED), computedResults.computedStat(Stat.MAXIMUM_DURATION))) + report.results.firstOrNull()?.let { + + rowRepresentables.clear() + rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.net_result)) + rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) + rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.NETRESULT), it.computedStat(Stat.HOURLY_RATE))) + rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.LOCATIONS_PLAYED), it.computedStat(Stat.LONGEST_STREAKS))) + rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.distribution)) + rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) + rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.WIN_RATIO), it.computedStat(Stat.MAXIMUM_NETRESULT))) + rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.volume)) + rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) + rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.DURATION), it.computedStat(Stat.AVERAGE_DURATION))) + rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.DAYS_PLAYED), it.computedStat(Stat.MAXIMUM_DURATION))) + } + launch(Dispatchers.Main) { statsAdapter.notifyDataSetChanged() @@ -189,10 +191,16 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable /** * Set data */ - fun setData(computedResults: ComputedResults?, sessionTypeCondition: QueryCondition?) { + fun setData(computedResults: ComputedResults?, sessionTypeCondition: QueryCondition?, title: String?) { Timber.d("Set data") - //this.stat = stat - //this.entries = entries + + this.computedResults = computedResults + this.sessionTypeCondition = sessionTypeCondition + this.title = title + + displayData() + launchStatComputation() + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 14dea0a6..0d003054 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -28,7 +28,6 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepres import net.pokeranalytics.android.ui.view.rowrepresentable.GraphRow import net.pokeranalytics.android.ui.view.rowrepresentable.StatDoubleRow import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow -import timber.log.Timber /** * An interface used to factor the configuration of RecyclerView.ViewHolder @@ -176,7 +175,7 @@ enum class RowViewType(private var layoutRes: Int) { } // Icon - itemView.findViewById(R.id.icon)?.let { imageView -> + itemView.findViewById(R.id.icon)?.let { imageView -> row.imageRes?.let { imageRes -> imageView.setImageResource(imageRes) } @@ -218,16 +217,16 @@ enum class RowViewType(private var layoutRes: Int) { */ inner class RowFollowUsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { - itemView.findViewById(R.id.icon1).setOnClickListener { + itemView.findViewById(R.id.icon1)?.setOnClickListener { adapter.delegate?.onRowSelected(0, row) } - itemView.findViewById(R.id.icon2).setOnClickListener { + itemView.findViewById(R.id.icon2)?.setOnClickListener { adapter.delegate?.onRowSelected(1, row) } - itemView.findViewById(R.id.icon3).setOnClickListener { + itemView.findViewById(R.id.icon3)?.setOnClickListener { adapter.delegate?.onRowSelected(2, row) } - itemView.findViewById(R.id.icon4).setOnClickListener { + itemView.findViewById(R.id.icon4)?.setOnClickListener { adapter.delegate?.onRowSelected(3, row) } } @@ -269,12 +268,7 @@ enum class RowViewType(private var layoutRes: Int) { BindableHolder { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { - if (row is StatDoubleRow) { - Timber.d("${row}") - - Timber.d("${row.computedStat1}") - Timber.d("${row.computedStat2}") // Stat 1 itemView.findViewById(R.id.stat1Name)?.let { view -> @@ -351,25 +345,23 @@ enum class RowViewType(private var layoutRes: Int) { } } - itemView.findViewById(R.id.chartContainer)?.let { + itemView.findViewById(R.id.chartContainer)?.let { it.removeAllViews() it.addView(chartView) } chartView.setStyle(false, context) - //chartView.setOnChartValueSelectedListener(this) + chartView.setTouchEnabled(false) chartView.highlightValue((entries.size - 1).toFloat(), 0) - } } - // Listener val listener = View.OnClickListener { adapter.delegate?.onRowSelected(position, row) } - itemView.findViewById(R.id.container)?.setOnClickListener(listener) + itemView.findViewById(R.id.chartContainer)?.setOnClickListener(listener) } } From b0f5c84b315e66816e7a77bfaaa90eb27437f9e0 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 11:59:13 +0200 Subject: [PATCH 131/245] Improve Calendar details --- .../ui/fragment/CalendarDetailsFragment.kt | 15 +++++++++++++-- .../android/ui/fragment/CalendarFragment.kt | 7 +++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index 7cd102f9..ca5f52bb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -19,6 +19,7 @@ import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -72,6 +73,9 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable is GraphRow -> { //TODO: Open graph details toast("Open graph details") + row.report.results.firstOrNull()?.group?.let { computableGroup -> + StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report) + } } } } @@ -153,19 +157,27 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable val realm = Realm.getDefaultInstance() val conditions = ArrayList().apply { addAll(computedResults.group.conditions) + + // Remove session type conditions + removeAll(Comparator.CASH.queryConditions) + removeAll(Comparator.TOURNAMENT.queryConditions) + when (sessionTypeCondition) { QueryCondition.CASH -> addAll(Comparator.CASH.queryConditions) QueryCondition.TOURNAMENT -> addAll(Comparator.TOURNAMENT.queryConditions) } } - val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD) + val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED, Stat.STANDARD_DEVIATION_HOURLY) + val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = options) Timber.d("Report take: ${System.currentTimeMillis() - startDate.time}ms") report.results.firstOrNull()?.let { + // Create rows + rowRepresentables.clear() rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.net_result)) rowRepresentables.add(GraphRow(report, Stat.NETRESULT)) @@ -192,7 +204,6 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable * Set data */ fun setData(computedResults: ComputedResults?, sessionTypeCondition: QueryCondition?, title: String?) { - Timber.d("Set data") this.computedResults = computedResults this.sessionTypeCondition = sessionTypeCondition diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index f6ca6cf9..255b6393 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -230,6 +230,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep val monthlyReports: HashMap = HashMap() val yearlyReports: HashMap = HashMap() + val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED, Stat.STANDARD_DEVIATION_HOURLY ) + val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) + // Compute data per YEAR and MONTH val monthConditions = when (sessionTypeCondition) { @@ -238,10 +241,6 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep else -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() } - val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED, - Stat.STANDARD_DEVIATION_HOURLY - ) - val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) monthConditions.forEach { conditions -> val report = Calculator.computeStatsWithComparators(realm, conditions = conditions, options = options) From 65711c8369ef54d2ffd092a4c38e256d0448f57a Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 12:16:06 +0200 Subject: [PATCH 132/245] Clean code --- .../android/ui/fragment/CalendarDetailsFragment.kt | 2 -- .../main/java/net/pokeranalytics/android/ui/view/RowViewType.kt | 2 -- 2 files changed, 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index ca5f52bb..ddf831f2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -24,7 +24,6 @@ import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource -import net.pokeranalytics.android.ui.extensions.toast import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -72,7 +71,6 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable when (row) { is GraphRow -> { //TODO: Open graph details - toast("Open graph details") row.report.results.firstOrNull()?.group?.let { computableGroup -> StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 0d003054..7a062a13 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -137,8 +137,6 @@ enum class RowViewType(private var layoutRes: Int) { if (row.computedStat != null) { val format = row.computedStat!!.format(itemView.context) it.setTextFormat(format, itemView.context) -// it.setTextColor(format.getColor(itemView.context)) -// it.text = format.text } else if (row.value != null) { it.text = row.value } From e2c3854b574762434841a7371854a3d88893f054 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 15:11:53 +0200 Subject: [PATCH 133/245] Improve graph layout --- app/src/main/res/layout/row_graph.xml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/row_graph.xml b/app/src/main/res/layout/row_graph.xml index d4c78ac4..799076ec 100644 --- a/app/src/main/res/layout/row_graph.xml +++ b/app/src/main/res/layout/row_graph.xml @@ -2,17 +2,18 @@ + android:layout_height="wrap_content"> + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file From 0651263e45a530a5ab432e90d6ed5f24d774b6fc Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 15:14:13 +0200 Subject: [PATCH 134/245] Update calendar graph UI --- .../android/ui/fragment/GraphFragment.kt | 1 + .../android/ui/graph/GraphExtensions.kt | 26 +++++++++---------- .../android/ui/view/RowViewType.kt | 3 ++- 3 files changed, 16 insertions(+), 14 deletions(-) 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 4738acf0..1c8ecc05 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 @@ -158,6 +158,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co val colors = arrayOf(R.color.green_light).toIntArray() dataSet.setColors(colors, context) dataSet.setDrawCircles(false) + dataSet.setDrawValues(false) val lineData = LineData(listOf(dataSet)) this.chartView = when (stat.graphType) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt index e5f6e8a9..deefb062 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt @@ -1,31 +1,29 @@ package net.pokeranalytics.android.ui.graph import android.content.Context -import android.graphics.Typeface import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.components.XAxis import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.extensions.px + + fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { // X Axis this.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default) this.xAxis.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) - this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) - this.xAxis.labelCount = 4 this.xAxis.position = XAxis.XAxisPosition.BOTTOM - - this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) - this.xAxis.typeface = Typeface.DEFAULT - this.xAxis.labelCount = 4 - this.xAxis.position = XAxis.XAxisPosition.BOTTOM - this.xAxis.setDrawLabels(true) this.xAxis.setDrawGridLines(true) - this.xAxis.granularity = 1.0f this.xAxis.isGranularityEnabled = true + this.xAxis.granularity = 1.0f + this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) + this.xAxis.typeface = ResourcesCompat.getFont(context, R.font.roboto_medium) + this.xAxis.labelCount = 4 + this.xAxis.textSize = 12f this.xAxis.isEnabled = true // Y Axis @@ -41,12 +39,14 @@ fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { this.axisLeft.granularity = 1.0f this.axisLeft.textColor = ContextCompat.getColor(context, R.color.chart_default) - this.axisLeft.typeface = Typeface.DEFAULT - this.axisLeft.labelCount = - if (small) 1 else 7 // @todo not great if interval is [0..2] for number of records as we get decimals + this.axisLeft.typeface = ResourcesCompat.getFont(context, R.font.roboto_medium) + this.axisLeft.labelCount = if (small) 1 else 7 // @todo not great if interval is [0..2] for number of records as we get decimals + this.axisLeft.textSize = 12f this.axisRight.isEnabled = false this.legend.isEnabled = false + this.data.isHighlightEnabled = !small + this.description.isEnabled = false // @todo diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 7a062a13..c36d8028 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -329,6 +329,7 @@ enum class RowViewType(private var layoutRes: Int) { val colors = arrayOf(R.color.green_light).toIntArray() dataSet.setColors(colors, context) dataSet.setDrawCircles(false) + dataSet.setDrawValues(false) val lineData = LineData(listOf(dataSet)) val chartView = when (row.stat.graphType) { @@ -348,7 +349,7 @@ enum class RowViewType(private var layoutRes: Int) { it.addView(chartView) } - chartView.setStyle(false, context) + chartView.setStyle(true, context) chartView.setTouchEnabled(false) chartView.highlightValue((entries.size - 1).toFloat(), 0) } From 3f21ba56beeb3f5a39f00c64bb5b51228adbccf3 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 17 Apr 2019 17:21:37 +0200 Subject: [PATCH 135/245] Fixing issue with duration computation when filtering + tests --- .../components/SessionInstrumentedUnitTest.kt | 44 +++ .../unitTests/StatPerformanceUnitTest.kt | 34 ++ .../unitTests/StatsInstrumentedUnitTest.kt | 161 +++++---- .../android/calculus/Calculator.kt | 183 +++++++--- .../pokeranalytics/android/calculus/Report.kt | 34 +- .../pokeranalytics/android/calculus/Stat.kt | 5 +- .../android/exceptions/Exceptions.kt | 10 +- .../android/model/comparison/Comparator.kt | 10 - .../android/model/filter/Filterable.kt | 19 +- .../android/model/filter/QueryCondition.kt | 19 +- .../android/model/interfaces/Timed.kt | 4 +- .../android/model/realm/Filter.kt | 12 +- .../android/model/realm/Session.kt | 334 ++++++++++++------ .../android/model/realm/SessionSet.kt | 46 ++- .../android/ui/activity/HomeActivity.kt | 8 +- .../android/ui/fragment/CalendarFragment.kt | 4 +- .../ui/fragment/FilterDetailsFragment.kt | 2 +- .../android/ui/fragment/FiltersFragment.kt | 12 +- .../android/ui/fragment/GraphFragment.kt | 79 +++-- .../android/ui/fragment/StatsFragment.kt | 2 +- .../android/ui/graph/ChartDataSet.kt | 10 +- 21 files changed, 707 insertions(+), 325 deletions(-) create mode 100644 app/src/androidTest/java/net/pokeranalytics/android/components/SessionInstrumentedUnitTest.kt create mode 100644 app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatPerformanceUnitTest.kt diff --git a/app/src/androidTest/java/net/pokeranalytics/android/components/SessionInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/components/SessionInstrumentedUnitTest.kt new file mode 100644 index 00000000..fd6cf759 --- /dev/null +++ b/app/src/androidTest/java/net/pokeranalytics/android/components/SessionInstrumentedUnitTest.kt @@ -0,0 +1,44 @@ +package net.pokeranalytics.android.components + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import io.realm.RealmList +import net.pokeranalytics.android.model.realm.* +import org.junit.runner.RunWith +import java.util.* + +@RunWith(AndroidJUnit4::class) +open class SessionInstrumentedUnitTest : RealmInstrumentedUnitTest() { + + // convenience extension + fun Session.Companion.testInstance( + netResult: Double = 0.0, + isTournament: Boolean = false, + startDate: Date = Date(), + endDate: Int = 1, + bankroll: Bankroll? = null, + game: Game? = null, + location: Location? = null, + tournamentName: TournamentName? = null, + tournamentFeatures: RealmList = RealmList(), + numberOfTable: Int = 1, + limit: Int? = null, + tableSize: Int? = null + ): Session { + val session: Session = Session.newInstance(super.mockRealm, isTournament, bankroll) + session.game = game + session.location = location + session.tournamentFeatures = tournamentFeatures + session.tournamentName = tournamentName + session.limit = limit + session.numberOfTables = numberOfTable + session.tableSize = tableSize + session.startDate = startDate + session.result?.netResult = netResult + val cal = Calendar.getInstance() // creates calendar + cal.time = startDate // sets calendar time/date + cal.add(Calendar.HOUR_OF_DAY, endDate) // adds one hour + session.endDate = cal.time // returns new date object, one hour in the future + return session + } + +} \ No newline at end of file diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatPerformanceUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatPerformanceUnitTest.kt new file mode 100644 index 00000000..e7b9773b --- /dev/null +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatPerformanceUnitTest.kt @@ -0,0 +1,34 @@ +package net.pokeranalytics.android.unitTests + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import net.pokeranalytics.android.components.SessionInstrumentedUnitTest +import net.pokeranalytics.android.model.realm.Result +import net.pokeranalytics.android.model.realm.Session +import org.junit.Test +import org.junit.runner.RunWith +import java.util.* + +@RunWith(AndroidJUnit4::class) +class StatPerformanceUnitTest : SessionInstrumentedUnitTest() { + + @Test + fun testSessionNetResultOnLoad() { + val realm = mockRealm + realm.beginTransaction() + + for (index in 0..100) { + Session.testInstance((-2000..2000).random().toDouble()) + println("*** creating $index") + } + + realm.commitTransaction() + + val d1 = Date() + realm.where(Result::class.java).sum("netResult") + + val d2 = Date() + val duration = (d2.time - d1.time) + println("*** ended in $duration milliseconds") + } + +} \ No newline at end of file diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt index 374cadf6..5c27d92c 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/StatsInstrumentedUnitTest.kt @@ -1,13 +1,13 @@ package net.pokeranalytics.android.unitTests import androidx.test.ext.junit.runners.AndroidJUnit4 -import io.realm.RealmList import io.realm.RealmResults import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat -import net.pokeranalytics.android.components.RealmInstrumentedUnitTest +import net.pokeranalytics.android.components.SessionInstrumentedUnitTest +import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.Currency import org.junit.Assert @@ -23,62 +23,10 @@ import java.util.* * See [testing documentation](http://d.android.com/tools/testing). */ @RunWith(AndroidJUnit4::class) -class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { - - // convenience extension - private fun Session.Companion.testInstance( - netResult: Double = 0.0, - isTournament: Boolean = false, - startDate: Date = Date(), - endDate: Int = 1, - bankroll: Bankroll? = null, - game: Game? = null, - location: Location? = null, - tournamentName: TournamentName? = null, - tournamentFeatures: RealmList = RealmList(), - numberOfTable: Int = 1, - limit: Int? = null, - tableSize: Int? = null - ): Session { - val session: Session = Session.newInstance(super.mockRealm, isTournament, bankroll) - session.game = game - session.location = location - session.tournamentFeatures = tournamentFeatures - session.tournamentName = tournamentName - session.limit = limit - session.numberOfTables = numberOfTable - session.tableSize = tableSize - session.startDate = startDate - session.result?.netResult = netResult - val cal = Calendar.getInstance() // creates calendar - cal.time = startDate // sets calendar time/date - cal.add(Calendar.HOUR_OF_DAY, endDate) // adds one hour - session.endDate = cal.time // returns new date object, one hour in the future - return session - } - - @Test - fun testSessionNetResultOnLoad() { - val realm = mockRealm - realm.beginTransaction() - - for (index in 0..100) { - Session.testInstance((-2000..2000).random().toDouble()) - println("*** creating $index") - } - - realm.commitTransaction() - - val d1 = Date() - realm.where(Result::class.java).sum("netResult") - - val d2 = Date() - val duration = (d2.time - d1.time) - println("*** ended in $duration milliseconds") - } +class StatsInstrumentedUnitTest : SessionInstrumentedUnitTest() { @Test - fun testSessionStats() { + fun testAllSessionStats() { val realm = this.mockRealm @@ -124,8 +72,7 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { println(">>>>>> rated net = ${it.ratedNet} ") } - val stats: List = listOf(Stat.NETRESULT, Stat.AVERAGE) - val group = ComputableGroup("test", listOf(), stats) + val group = ComputableGroup("test") val options = Calculator.Options() options.displayedStats = listOf(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION, @@ -510,12 +457,12 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { val sets = realm.where(SessionSet::class.java).findAll() - Assert.assertEquals(1, sets.size) + assertEquals(1, sets.size) val set = sets.first() if (set != null) { - Assert.assertEquals(sd1.time, set.startDate.time) - Assert.assertEquals(ed1.time, set.endDate.time) + assertEquals(sd1.time, set.startDate.time) + assertEquals(ed1.time, set.endDate.time) } else { Assert.fail("No set") } @@ -712,7 +659,6 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { } - @Test fun testDaysPlayed() { @@ -748,4 +694,95 @@ class StatsInstrumentedUnitTest : RealmInstrumentedUnitTest() { } } + + @Test + fun testFilteredHourlyRate() { + + val realm = this.mockRealm + + realm.executeTransaction { + + val s1 = newSessionInstance(realm, true) + val s2 = newSessionInstance(realm, true) + val s3 = newSessionInstance(realm, false) + + val sdf = SimpleDateFormat("dd/M/yyyy hh:mm") + + val sd1 = sdf.parse("01/1/2019 09:00") + val ed1 = sdf.parse("01/1/2019 10:00") + val sd2 = sdf.parse("01/1/2019 04:00") + val ed2 = sdf.parse("01/1/2019 05:00") + val sd3 = sdf.parse("01/1/2019 03:00") + val ed3 = sdf.parse("01/1/2019 11:00") + + s1.startDate = sd1 + s1.endDate = ed1 + s2.startDate = sd2 + s2.endDate = ed2 + s3.startDate = sd3 + s3.endDate = ed3 + + } + + val group = ComputableGroup("test", listOf(QueryCondition.CASH)) + + val options = Calculator.Options() + options.displayedStats = listOf(Stat.DURATION) + + val results: ComputedResults = Calculator.compute(realm, group, options) + val delta = 0.01 + + val duration = results.computedStat(Stat.DURATION) + if (duration != null) { + assertEquals(2.0, duration.value, delta) + } else { + Assert.fail("No Net result stat") + } + } + + @Test + fun testFilteredHourlyRate2() { + + val realm = this.mockRealm + + realm.executeTransaction { + + val s1 = newSessionInstance(realm, true) + val s2 = newSessionInstance(realm, true) + val s3 = newSessionInstance(realm, false) + + val sdf = SimpleDateFormat("dd/M/yyyy hh:mm") + + val sd1 = sdf.parse("01/1/2019 06:00") + val ed1 = sdf.parse("01/1/2019 09:00") + val sd2 = sdf.parse("01/1/2019 07:00") + val ed2 = sdf.parse("01/1/2019 10:00") + val sd3 = sdf.parse("01/1/2019 03:00") + val ed3 = sdf.parse("01/1/2019 11:00") + + s1.startDate = sd1 + s1.endDate = ed1 + s2.startDate = sd2 + s2.endDate = ed2 + s3.startDate = sd3 + s3.endDate = ed3 + + } + + val group = ComputableGroup("test", listOf(QueryCondition.CASH)) + + val options = Calculator.Options() + options.displayedStats = listOf(Stat.DURATION) + + val results: ComputedResults = Calculator.compute(realm, group, options) + val delta = 0.01 + + val duration = results.computedStat(Stat.DURATION) + if (duration != null) { + assertEquals(4.0, duration.value, delta) + } else { + Assert.fail("No Net result stat") + } + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 4960638f..57d1ada4 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -5,9 +5,11 @@ import net.pokeranalytics.android.calculus.Stat.* import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.comparison.combined import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.filter.filter import net.pokeranalytics.android.model.filter.name import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.SessionSet +import net.pokeranalytics.android.model.realm.hourlyDuration import net.pokeranalytics.android.util.extensions.startOfDay import timber.log.Timber import java.util.* @@ -65,9 +67,18 @@ class Calculator { return false } - val computeLongestStreak = this.displayedStats.contains(LONGEST_STREAKS) - val computeLocationsPlayed = this.displayedStats.contains(LOCATIONS_PLAYED) - val computeDaysPlayed = this.displayedStats.contains(DAYS_PLAYED) + val computeLongestStreak: Boolean + get() { + return this.displayedStats.contains(LONGEST_STREAKS) + } + val computeLocationsPlayed: Boolean + get() { + return this.displayedStats.contains(LOCATIONS_PLAYED) + } + val computeDaysPlayed: Boolean + get() { + return this.displayedStats.contains(DAYS_PLAYED) + } } @@ -137,12 +148,12 @@ class Calculator { group.cleanup() // Computes actual sessionGroup stats - val results: ComputedResults = Calculator.compute(realm, group, options = options) + val results: ComputedResults = this.compute(realm, group, options = options) // Computes the compared sessionGroup if existing val comparedGroup = group.comparedComputables if (comparedGroup != null) { - val comparedResults = Calculator.compute(realm, comparedGroup, options = options) + val comparedResults = this.compute(realm, comparedGroup, options = options) group.comparedComputedResults = comparedResults results.computeStatVariations(comparedResults) } @@ -200,7 +211,9 @@ class Calculator { var tWinningSessionCount = 0 var tBuyinSum = 0.0 var tHands = 0.0 - var longestWinStreak = 0; var longestLoseStreak = 0; var currentStreak = 0 + var longestWinStreak = 0; + var longestLoseStreak = 0; + var currentStreak = 0 computables.forEach { computable -> index++ @@ -263,39 +276,49 @@ class Calculator { val sessionSets = computableGroup.sessionSets(realm) - // Compute for each serie - val gHourlyDuration = - sessionSets.sum(SessionSet.Field.NET_DURATION.identifier).toDouble() / 3600000 // (milliseconds to hours) - val gSum = sessionSets.sum(SessionSet.Field.RATED_NET.identifier).toDouble() - val gTotalHands = sessionSets.sum(SessionSet.Field.ESTIMATED_HANDS.identifier).toDouble() - val gBBSum = sessionSets.sum(SessionSet.Field.BB_NET.identifier).toDouble() - val maxDuration = sessionSets.max(SessionSet.Field.NET_DURATION.identifier)?.toDouble() + var gHourlyDuration: Double? = null + var gBBSum: Double? = null + var maxDuration: Double? = null - val hourlyRate = gSum / gHourlyDuration -// var bbHourlyRate = gBBSum / gDuration + if (computableGroup.conditions.size == 0) { // SessionSets are fine + gHourlyDuration = + sessionSets.sum(SessionSet.Field.NET_DURATION.identifier).toDouble() / 3600000 // (milliseconds to hours) + gBBSum = sessionSets.sum(SessionSet.Field.BB_NET.identifier).toDouble() - val shouldIterateOverSets = (options.evolutionValues != Options.EvolutionValues.NONE || options.computeDaysPlayed) + sessionSets.max(SessionSet.Field.NET_DURATION.identifier)?.let { + maxDuration = it.toDouble() / 3600000 + } + } + + val shouldIterateOverSets = computableGroup.conditions.size > 0 || + options.evolutionValues != Options.EvolutionValues.NONE || + options.computeDaysPlayed if (shouldIterateOverSets) { var tHourlyDuration = 0.0 var tIndex = 0 - var tSum = 0.0 - var tTotalHands = 0.0 + var tRatedNetSum = 0.0 var tBBSum = 0.0 + var tTotalHands = 0.0 var tHourlyRate = 0.0 var tHourlyRateBB = 0.0 val daysSet = mutableSetOf() + var tMaxDuration = 0.0 sessionSets.forEach { sessionSet -> tIndex++ - tHourlyDuration += sessionSet.hourlyDuration - tSum += sessionSet.ratedNet - tTotalHands += sessionSet.estimatedHands - tBBSum += sessionSet.bbNet - tHourlyRate = gSum / tHourlyDuration - tHourlyRateBB = gBBSum / tHourlyDuration + val setStats = SSStats(realm, sessionSet, computableGroup.conditions) + + tRatedNetSum += setStats.ratedNet + tBBSum += setStats.bbSum + tHourlyDuration += setStats.hourlyDuration + tTotalHands += setStats.estimatedHands + tMaxDuration = max(tMaxDuration, setStats.hourlyDuration) + + tHourlyRate = tRatedNetSum / tHourlyDuration + tHourlyRateBB = tBBSum / tHourlyDuration daysSet.add(sessionSet.startDate.startOfDay()) when (options.evolutionValues) { @@ -314,13 +337,13 @@ class Calculator { ) results.addEvolutionValue(tHourlyRateBB, stat = HOURLY_RATE_BB, data = sessionSet) - Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> + Stat.netBBPer100Hands(tBBSum, tTotalHands)?.let { netBB100 -> results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = sessionSet) } } Options.EvolutionValues.TIMED -> { - results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT, sessionSet) + results.addEvolutionValue(tRatedNetSum, tHourlyDuration, NETRESULT, sessionSet) results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) results.addEvolutionValue( tIndex.toDouble(), @@ -342,7 +365,7 @@ class Calculator { ) results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet) - Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> + Stat.netBBPer100Hands(tBBSum, tTotalHands)?.let { netBB100 -> results.addEvolutionValue( netBB100, tHourlyDuration, @@ -351,14 +374,24 @@ class Calculator { ) } } + else -> { + // nothing + } } results.addStat(DAYS_PLAYED, daysSet.size.toDouble()) } + + gHourlyDuration = tHourlyDuration + gBBSum = tBBSum + maxDuration = tMaxDuration + } var average = 0.0 + var hourlyRate = 0.0 + if (computables.size > 0) { average = sum / computables.size.toDouble() val winRatio = winningSessionCount.toDouble() / computables.size.toDouble() @@ -373,25 +406,30 @@ class Calculator { ) } - if (sessionSets.size > 0) { - val avgDuration = gHourlyDuration / sessionSets.size - results.addStats( - setOf( - ComputedStat(HOURLY_RATE, hourlyRate), - ComputedStat(AVERAGE_DURATION, avgDuration) - ) - ) + if (gHourlyDuration != null) { + + hourlyRate = sum / gHourlyDuration + if (sessionSets.size > 0) { + val avgDuration = gHourlyDuration / sessionSets.size + results.addStat(HOURLY_RATE, hourlyRate) + results.addStat(AVERAGE_DURATION, avgDuration) + } + results.addStat(DURATION, gHourlyDuration) + } + + if (gBBSum != null) { + if (gHourlyDuration != null) { + results.addStat(HOURLY_RATE_BB, gBBSum / gHourlyDuration) + } + results.addStat(AVERAGE_NET_BB, gBBSum / bbSessionCount) } // Create stats results.addStats( setOf( ComputedStat(NETRESULT, sum), - ComputedStat(DURATION, gHourlyDuration), ComputedStat(NUMBER_OF_SETS, sessionSets.size.toDouble()), ComputedStat(NUMBER_OF_GAMES, computables.size.toDouble()), - ComputedStat(HOURLY_RATE_BB, gBBSum / gHourlyDuration), - ComputedStat(AVERAGE_NET_BB, gBBSum / bbSessionCount), ComputedStat(HANDS_PLAYED, totalHands) ) ) @@ -410,7 +448,7 @@ class Calculator { results.addStat(MINIMUM_NETRESULT, min) } maxDuration?.let { maxd -> - results.addStat(MAXIMUM_DURATION, maxd / 3600000) // (milliseconds to hours) + results.addStat(MAXIMUM_DURATION, maxd) // (milliseconds to hours) } val bbPer100Hands = bbSum / totalHands * 100 @@ -428,20 +466,22 @@ class Calculator { val standardDeviation = Math.sqrt(stdSum / computables.size) val standardDeviationBBper100Hands = Math.sqrt(stdBBper100HandsSum / computables.size) + results.addStat(STANDARD_DEVIATION, standardDeviation) + results.addStat(STANDARD_DEVIATION_BB_PER_100_HANDS, standardDeviationBBper100Hands) + // Session Set - var hourlyStdSum = 0.0 - sessionSets.forEach { set -> - hourlyStdSum += Math.pow(set.hourlyRate - hourlyRate, 2.0) + if (gHourlyDuration != null) { + var hourlyStdSum = 0.0 + sessionSets.forEach { set -> + val ssStats = SSStats(realm, set, computableGroup.conditions) + val sHourlyRate = ssStats.hourlyRate + hourlyStdSum += Math.pow(sHourlyRate - hourlyRate, 2.0) + } + val hourlyStandardDeviation = Math.sqrt(hourlyStdSum / sessionSets.size) + + results.addStat(STANDARD_DEVIATION_HOURLY, hourlyStandardDeviation) } - val hourlyStandardDeviation = Math.sqrt(hourlyStdSum / sessionSets.size) - results.addStats( - setOf( - ComputedStat(STANDARD_DEVIATION, standardDeviation), - ComputedStat(STANDARD_DEVIATION_HOURLY, hourlyStandardDeviation), - ComputedStat(STANDARD_DEVIATION_BB_PER_100_HANDS, standardDeviationBBper100Hands) - ) - ) } return results @@ -450,4 +490,47 @@ class Calculator { } +} + +class SSStats(realm: Realm, sessionSet: SessionSet, conditions: List) { // Session Set Stats + + private var realm = realm + private var sessionSet = sessionSet + private var conditions = conditions + + var hourlyDuration: Double = 0.0 + var estimatedHands: Double = 0.0 + var bbSum: Double = 0.0 + var ratedNet: Double = 0.0 + + val hourlyRate: Double + get() { + return this.ratedNet / this.hourlyDuration + } + + init { + + if (sessionSet.sessions?.size == 1) { // use precomputed values + this.initStatsWithSet(sessionSet) + } else { // dynamically filter and compute subset + val setSessions = sessionSet.sessions!! + val filteredSessions = setSessions.filter(realm, conditions) + if (setSessions.size == filteredSessions.size) { + this.initStatsWithSet(sessionSet) + } else { + ratedNet = filteredSessions.sumByDouble { it.computableResult?.ratedNet ?: 0.0 } + bbSum = filteredSessions.sumByDouble { it.bbNet } + hourlyDuration = filteredSessions.hourlyDuration + estimatedHands = filteredSessions.sumByDouble { it.estimatedHands } + } + } + } + + private fun initStatsWithSet(sessionSet: SessionSet) { + ratedNet = sessionSet.ratedNet + bbSum = sessionSet.bbNet + hourlyDuration = sessionSet.hourlyDuration + estimatedHands = sessionSet.estimatedHands + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index effdd611..b0e813a6 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.calculus +import android.content.Context import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import io.realm.Realm @@ -35,13 +36,26 @@ class Report() { this._results.add(result) } + fun lineEntries(stat: Stat): List { + val entries = mutableListOf() + + this._results.forEachIndexed { index, results -> + val cs = results.computedStat(stat) + cs?.let { computedStat -> + entries.add(Entry(index.toFloat(), computedStat.value.toFloat(), results)) + } + } + return entries + } + fun barEntries(stat: Stat): List { val entries = mutableListOf() this._results.forEachIndexed { index, results -> val cs = results.computedStat(stat) cs?.let { computedStat -> - entries.add(Entry(index.toFloat(), computedStat.value.toFloat(), results.group)) + val barEntry = BarEntry(index.toFloat(), computedStat.value.toFloat(), results) + entries.add(barEntry) } } return entries @@ -61,7 +75,7 @@ class Report() { /** * A sessionGroup of computable items identified by a name */ -class ComputableGroup(name: String, conditions: List, stats: List? = null) { +class ComputableGroup(name: String, conditions: List = listOf(), stats: List? = null) { /** * The display name of the group @@ -140,9 +154,10 @@ class ComputableGroup(name: String, conditions: List, stats: Lis get() { return this._computables?.isEmpty() ?: true } + } -class ComputedResults(group: ComputableGroup) { +class ComputedResults(group: ComputableGroup) : StatEntry { /** * The session group used to computed the stats @@ -268,6 +283,19 @@ class ComputedResults(group: ComputableGroup) { val isEmpty: Boolean = this.group.isEmpty + + // Stat Entry + + override val entryTitle: String = this.group.name + + override fun formattedValue(stat: Stat, context: Context): TextFormat { + this.computedStat(stat)?.let { + return it.format(context) + } ?: run { + throw IllegalStateException("Missing stat in results") + } + } + } class Point(val x: Double, val y: Double, val data: Any) { 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 4f1782da..51ddc180 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -3,7 +3,6 @@ package net.pokeranalytics.android.calculus import android.content.Context import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.FormattingException -import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -21,8 +20,10 @@ class ObjectIdentifier(var id: String, var clazz: Class) { } -interface StatBase : Identifiable { +interface StatEntry { + + val entryTitle: String fun formattedValue(stat: Stat, context: Context): TextFormat } diff --git a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt index f1ff2e51..2314b31b 100644 --- a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt +++ b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt @@ -11,13 +11,13 @@ class ConfigurationException(message: String) : Exception(message) sealed class PokerAnalyticsException(message: String) : Exception(message) { object FilterElementUnknownName : PokerAnalyticsException(message = "No filterElement name was found to identify the queryCondition") object FilterElementUnknownSectionName: PokerAnalyticsException(message = "No filterElement section name was found to identify the queryCondition") - object FilterMissingEntity: PokerAnalyticsException(message = "This filter has no entity initialized") + object FilterMissingEntity: PokerAnalyticsException(message = "This queryWith has no entity initialized") object FilterUnhandledEntity : PokerAnalyticsException(message = "This entity is not filterable") object QueryValueMapUnknown: PokerAnalyticsException(message = "fieldName is missing") - object QueryTypeUnhandled: PokerAnalyticsException(message = "filter type not handled") + object QueryTypeUnhandled: PokerAnalyticsException(message = "queryWith type not handled") object QueryValueMapUnexpectedValue: PokerAnalyticsException(message = "valueMap null not expected") - object FilterElementExpectedValueMissing : PokerAnalyticsException(message = "filter is empty or null") - data class FilterElementTypeMissing(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "filter element '$filterElementRow' type is missing") + object FilterElementExpectedValueMissing : PokerAnalyticsException(message = "queryWith is empty or null") + data class FilterElementTypeMissing(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "queryWith element '$filterElementRow' type is missing") data class QueryValueMapMissingKeys(val missingKeys: List) : PokerAnalyticsException(message = "valueMap does not contain $missingKeys") - data class UnknownQueryTypeForRow(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "no filter type for $filterElementRow") + data class UnknownQueryTypeForRow(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "no queryWith type for $filterElementRow") } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index de02cb45..1490bf75 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -1,11 +1,9 @@ package net.pokeranalytics.android.model.comparison import io.realm.Realm -import io.realm.RealmQuery import io.realm.Sort import io.realm.kotlin.where import net.pokeranalytics.android.exceptions.PokerAnalyticsException -import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.realm.* import java.util.* @@ -177,14 +175,6 @@ fun List.combined(): List> { return getCombinations(comparatorList) } -inline fun List.query(realm: Realm): RealmQuery { - var realmQuery = realm.where() - this.forEach { - realmQuery = it.filter(realmQuery) - } - return realmQuery -} - fun getCombinations(lists: List>): List> { var combinations: MutableSet> = LinkedHashSet() var newCombinations: MutableSet> diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt index a7a7f467..ac37e68b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt @@ -1,6 +1,8 @@ package net.pokeranalytics.android.model.filter +import io.realm.Realm import io.realm.RealmModel +import io.realm.RealmResults import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.SessionSet @@ -11,7 +13,7 @@ import net.pokeranalytics.android.model.realm.SessionSet * - filters can be applied to different type of objects: Sessions, Hands, Transactions... * - filters can be applied to a list of different type of objects (feed) * - * A filter is described by the following: + * A queryWith is described by the following: * - a data type: Session, Hands... * - a field: table size of a Session * - an operator: equal, >=, <... @@ -27,7 +29,7 @@ import net.pokeranalytics.android.model.realm.SessionSet * - multiple numericValues as 'OR' * * Also: - * A filter should be able to be converted into a Realm query + * A queryWith should be able to be converted into a Realm query * */ @@ -47,6 +49,11 @@ interface Filterable : RealmModel { } +inline fun RealmResults.filter(realm: Realm, conditions: List) : RealmResults { + val query = conditions.queryWith(this.where()) + return query.findAll() +} + class FilterHelper { companion object { @@ -68,11 +75,13 @@ class FilterHelper { } + + // -//fun MutableList.filter(filter: FilterCondition) : List { +//fun MutableList.queryWith(queryWith: FilterCondition) : List { // -// return this.filter { f -> -// return@filter true +// return this.queryWith { f -> +// return@queryWith true // } //} diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index cf5dac46..5866cd28 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -1,10 +1,9 @@ package net.pokeranalytics.android.model.filter +import io.realm.Realm import io.realm.RealmQuery -import io.realm.internal.Table +import io.realm.kotlin.where import net.pokeranalytics.android.exceptions.PokerAnalyticsException -import net.pokeranalytics.android.model.Limit -import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.realm.FilterCondition import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.util.extensions.endOfDay @@ -15,6 +14,18 @@ fun List.name() : String { return this.map { it.name }.joinToString(" / ") } +inline fun List.query(realm: Realm): RealmQuery { + return this.queryWith(realm.where()) +} + +inline fun List.queryWith(query: RealmQuery): RealmQuery { + var realmQuery = query + this.forEach { + realmQuery = it.queryWith(realmQuery) + } + return realmQuery +} + /** * Enum describing the way a query should be handled * Some queries requires a value to be checked upon through equals, in, more, less, between @@ -194,7 +205,7 @@ sealed class QueryCondition(var operator: Operator? = null) { * main method of the enum * providing a base RealmQuery [realmQuery], the method is able to attached the corresponding query and returns the newly formed [RealmQuery] */ - inline fun filter(realmQuery: RealmQuery): RealmQuery { + inline fun queryWith(realmQuery: RealmQuery): RealmQuery { val fieldName = FilterHelper.fieldNameForQueryType(this) fieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown when (operator) { diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt index 49ba2542..82d0552f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt @@ -1,10 +1,10 @@ package net.pokeranalytics.android.model.interfaces import net.pokeranalytics.android.calculus.ObjectIdentifier -import net.pokeranalytics.android.calculus.StatBase +import net.pokeranalytics.android.calculus.StatEntry import java.util.* -interface Timed : StatBase { +interface Timed : StatEntry, Identifiable { fun startDate() : Date? diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index 9009b80b..3ac7f81b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -35,7 +35,7 @@ open class Filter : RealmObject() { return realm.copyToRealm(filter) } - // Get a filter by its id + // Get a queryWith by its id fun getFilterBydId(realm: Realm, filterId: String): Filter? { return realm.where().equalTo("id", filterId).findFirst() } @@ -44,7 +44,7 @@ open class Filter : RealmObject() { inline fun queryOn(realm: Realm, queries: List): RealmResults { var realmQuery = realm.where() queries.forEach { - realmQuery = it.filter(realmQuery) + realmQuery = it.queryWith(realmQuery) } Timber.d(">>> Filter query: ${realmQuery.description}") return realmQuery.findAll() @@ -54,10 +54,10 @@ open class Filter : RealmObject() { @PrimaryKey var id = UUID.randomUUID().toString() - // the filter name + // the queryWith name var name: String = "" - // the number of use of the filter, + // the number of use of the queryWith, // for MutableRealmInteger, see https://realm.io/docs/java/latest/#counters val usageCount: MutableRealmInteger = MutableRealmInteger.valueOf(0) @@ -106,7 +106,7 @@ open class Filter : RealmObject() { } /** - * Set the saved value in the filter for the given [filterElementRow] + * Set the saved value in the queryWith for the given [filterElementRow] */ fun setSavedValueForElement(filterElementRow: FilterElementRow) { when (filterElementRow) { @@ -140,7 +140,7 @@ open class Filter : RealmObject() { this.filterConditions.map { it.queryCondition }.forEach { - realmQuery = it.filter(realmQuery) + realmQuery = it.queryWith(realmQuery) } return realmQuery.findAll() 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 81a4d522..7d10e29a 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 @@ -35,6 +35,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.extensions.* +import java.text.DateFormat import java.util.* import java.util.Currency import kotlin.collections.ArrayList @@ -42,7 +43,7 @@ import kotlin.collections.ArrayList typealias BB = Double open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed, - TimeFilterable, Filterable { + TimeFilterable, Filterable { enum class Type { CASH_GAME, @@ -67,28 +68,28 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat LIVE, ONLINE -> "bankroll.live" CASH, TOURNAMENT -> "type" is BANKROLL -> "bankroll.id" - is GAME -> "game.id" - is TOURNAMENT_NAME -> "tournamentName.id" - is ANY_TOURNAMENT_FEATURES, is ALL_TOURNAMENT_FEATURES -> "tournamentFeatures.id" - is LOCATION -> "location.id" - is LIMIT -> "limit" - is TABLE_SIZE -> "tableSize" - is TOURNAMENT_TYPE -> "tournamentType" - is BLIND -> "blinds" - is COMMENT -> "comment" - is BETWEEN_NUMBER_OF_TABLE, is MORE_NUMBER_OF_TABLE, is LESS_NUMBER_OF_TABLE -> "numberOfTable" - is MORE_THAN_NET_RESULT, is LESS_THAN_NET_RESULT -> "computableResults.ratedNet" - is MORE_THAN_BUY_IN, is LESS_THAN_BUY_IN -> "result.buyin" - is MORE_THAN_CASH_OUT, is LESS_THAN_CASH_OUT -> "result.cashout" - is MORE_THAN_TIPS, is LESS_THAN_TIPS -> "result.tips" - is MORE_THAN_NUMBER_OF_PLAYER, is LESS_THAN_NUMBER_OF_PLAYER, is BETWEEN_NUMBER_OF_PLAYER -> "tournamentNumberOfPlayers" - is MORE_THAN_TOURNAMENT_FEE, is LESS_THAN_TOURNAMENT_FEE, is BETWEEN_TOURNAMENT_FEE -> "tournamentEntryFee" - is STARTED_FROM_DATE, is STARTED_TO_DATE -> "startDate" - is ENDED_FROM_DATE, is ENDED_TO_DATE -> "endDate" - is DAY_OF_WEEK, is WEEK_END, is WEEK_DAY -> "dayOfWeek" - is MONTH -> "month" - is YEAR -> "year" - TODAY, YESTERDAY, TODAY_AND_YESTERDAY, THIS_YEAR, THIS_MONTH, THIS_WEEK -> "startDate" + is GAME -> "game.id" + is TOURNAMENT_NAME -> "tournamentName.id" + is ANY_TOURNAMENT_FEATURES, is ALL_TOURNAMENT_FEATURES -> "tournamentFeatures.id" + is LOCATION -> "location.id" + is LIMIT -> "limit" + is TABLE_SIZE -> "tableSize" + is TOURNAMENT_TYPE -> "tournamentType" + is BLIND -> "blinds" + is COMMENT -> "comment" + is BETWEEN_NUMBER_OF_TABLE, is MORE_NUMBER_OF_TABLE, is LESS_NUMBER_OF_TABLE -> "numberOfTable" + is MORE_THAN_NET_RESULT, is LESS_THAN_NET_RESULT -> "computableResults.ratedNet" + is MORE_THAN_BUY_IN, is LESS_THAN_BUY_IN -> "result.buyin" + is MORE_THAN_CASH_OUT, is LESS_THAN_CASH_OUT -> "result.cashout" + is MORE_THAN_TIPS, is LESS_THAN_TIPS -> "result.tips" + is MORE_THAN_NUMBER_OF_PLAYER, is LESS_THAN_NUMBER_OF_PLAYER, is BETWEEN_NUMBER_OF_PLAYER -> "tournamentNumberOfPlayers" + is MORE_THAN_TOURNAMENT_FEE, is LESS_THAN_TOURNAMENT_FEE, is BETWEEN_TOURNAMENT_FEE -> "tournamentEntryFee" + is STARTED_FROM_DATE, is STARTED_TO_DATE -> "startDate" + is ENDED_FROM_DATE, is ENDED_TO_DATE -> "endDate" + is DAY_OF_WEEK, is WEEK_END, is WEEK_DAY -> "dayOfWeek" + is MONTH -> "month" + is YEAR -> "year" + TODAY, YESTERDAY, TODAY_AND_YESTERDAY, THIS_YEAR, THIS_MONTH, THIS_WEEK -> "startDate" else -> null } } @@ -114,7 +115,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // Timed interface - override var dayOfWeek : Int? = null + override var dayOfWeek: Int? = null override var month: Int? = null override var year: Int? = null override var dayOfMonth: Int? = null @@ -213,21 +214,21 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // The small blind value var cgSmallBlind: Double? = null - set(value) { - field = value - formatBlinds() - } + set(value) { + field = value + formatBlinds() + } // The big blind value var cgBigBlind: Double? = null set(value) { field = value this.computeStats() - formatBlinds() + formatBlinds() } - var blinds: String? = null - private set + var blinds: String? = null + private set // Tournament @@ -246,9 +247,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // The features of the tournament, like Knockout, Shootout, Turbo... var tournamentFeatures: RealmList = RealmList() - fun bankrollHasBeenUpdated() { - formatBlinds() - } + fun bankrollHasBeenUpdated() { + formatBlinds() + } /** * Manages impacts on SessionSets @@ -303,7 +304,8 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat */ val bbNet: BB get() { - val bb = this.cgBigBlind; val result = this.result + val bb = this.cgBigBlind; + val result = this.result if (bb != null && result != null) { return result.net / bb } else { @@ -487,19 +489,19 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return NULL_TEXT } - val hasDefaultCurrency: Boolean - get() { - return bankroll?.currency?.code == null - } + val hasDefaultCurrency: Boolean + get() { + return bankroll?.currency?.code == null + } - val currency : Currency - get() { - return bankroll?.currency?.code?.let { - Currency.getInstance(it) - } ?: run { - UserDefaults.currency - } - } + val currency: Currency + get() { + return bankroll?.currency?.code?.let { + Currency.getInstance(it) + } ?: run { + UserDefaults.currency + } + } /** * Return the game title @@ -518,18 +520,18 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return if (gameTitle.isNotBlank()) gameTitle else NULL_TEXT } - fun getFormattedBlinds(): String { - return blinds ?: NULL_TEXT - } + fun getFormattedBlinds(): String { + return blinds ?: NULL_TEXT + } - private fun formatBlinds() { - blinds = null - if (cgBigBlind == null) return - cgBigBlind?.let { bb -> - val sb = cgSmallBlind ?: bb / 2.0 - blinds = "${currency.symbol} ${sb.formatted()}/${bb.round()}" - } - } + private fun formatBlinds() { + blinds = null + if (cgBigBlind == null) return + cgBigBlind?.let { bb -> + val sb = cgSmallBlind ?: bb / 2.0 + blinds = "${currency.symbol} ${sb.formatted()}/${bb.round()}" + } + } // LifeCycle @@ -569,7 +571,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } @Ignore - private var rowRepresentationForCurrentState : List = mutableListOf() + private var rowRepresentationForCurrentState: List = mutableListOf() private fun updatedRowRepresentationForCurrentState(): List { val rows = ArrayList() @@ -669,7 +671,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } SessionRow.TOURNAMENT_FEATURE -> { if (tournamentFeatures.size > 2) { - "${tournamentFeatures.subList(0,2).joinToString { + "${tournamentFeatures.subList(0, 2).joinToString { it.name }}, ..." } else if (tournamentFeatures.size > 0) { @@ -696,56 +698,98 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat override fun editDescriptors(row: RowRepresentable): ArrayList? { return when (row) { - SessionRow.BANKROLL -> row.editingDescriptors(mapOf( - "defaultValue" to this.bankroll, - "data" to LiveData.BANKROLL.items(realm))) - SessionRow.GAME -> row.editingDescriptors(mapOf( - "limit" to this.limit, - "defaultValue" to this.game, - "data" to LiveData.GAME.items(realm))) - SessionRow.LOCATION -> row.editingDescriptors(mapOf( - "defaultValue" to this.location, - "data" to LiveData.LOCATION.items(realm))) - SessionRow.TOURNAMENT_FEATURE -> row.editingDescriptors(mapOf( - "defaultValue" to this.tournamentFeatures, - "data" to LiveData.TOURNAMENT_FEATURE.items(realm))) - SessionRow.TOURNAMENT_NAME -> row.editingDescriptors(mapOf( - "defaultValue" to this.tournamentName, - "data" to LiveData.TOURNAMENT_NAME.items(realm))) - SessionRow.TOURNAMENT_TYPE -> row.editingDescriptors(mapOf( - "defaultValue" to this.tournamentType)) - SessionRow.TABLE_SIZE -> row.editingDescriptors(mapOf( - "defaultValue" to this.tableSize)) - SessionRow.BLINDS -> row.editingDescriptors(mapOf( - "sb" to cgSmallBlind?.round(), - "bb" to cgBigBlind?.round() - )) - SessionRow.BUY_IN -> row.editingDescriptors(mapOf( - "bb" to cgBigBlind, - "fee" to this.tournamentEntryFee, - "ratedBuyin" to result?.buyin - )) + SessionRow.BANKROLL -> row.editingDescriptors( + mapOf( + "defaultValue" to this.bankroll, + "data" to LiveData.BANKROLL.items(realm) + ) + ) + SessionRow.GAME -> row.editingDescriptors( + mapOf( + "limit" to this.limit, + "defaultValue" to this.game, + "data" to LiveData.GAME.items(realm) + ) + ) + SessionRow.LOCATION -> row.editingDescriptors( + mapOf( + "defaultValue" to this.location, + "data" to LiveData.LOCATION.items(realm) + ) + ) + SessionRow.TOURNAMENT_FEATURE -> row.editingDescriptors( + mapOf( + "defaultValue" to this.tournamentFeatures, + "data" to LiveData.TOURNAMENT_FEATURE.items(realm) + ) + ) + SessionRow.TOURNAMENT_NAME -> row.editingDescriptors( + mapOf( + "defaultValue" to this.tournamentName, + "data" to LiveData.TOURNAMENT_NAME.items(realm) + ) + ) + SessionRow.TOURNAMENT_TYPE -> row.editingDescriptors( + mapOf( + "defaultValue" to this.tournamentType + ) + ) + SessionRow.TABLE_SIZE -> row.editingDescriptors( + mapOf( + "defaultValue" to this.tableSize + ) + ) + SessionRow.BLINDS -> row.editingDescriptors( + mapOf( + "sb" to cgSmallBlind?.round(), + "bb" to cgBigBlind?.round() + ) + ) + SessionRow.BUY_IN -> row.editingDescriptors( + mapOf( + "bb" to cgBigBlind, + "fee" to this.tournamentEntryFee, + "ratedBuyin" to result?.buyin + ) + ) SessionRow.BREAK_TIME -> row.editingDescriptors(mapOf()) - SessionRow.CASHED_OUT, SessionRow.PRIZE -> row.editingDescriptors(mapOf( - "defaultValue" to result?.cashout - )) - SessionRow.NET_RESULT -> row.editingDescriptors(mapOf( - "defaultValue" to result?.netResult - )) - SessionRow.COMMENT -> row.editingDescriptors(mapOf( - "defaultValue" to this.comment)) - SessionRow.INITIAL_BUY_IN -> row.editingDescriptors(mapOf( - "defaultValue" to this.tournamentEntryFee - )) - SessionRow.PLAYERS -> row.editingDescriptors(mapOf( - "defaultValue" to this.tournamentNumberOfPlayers)) - SessionRow.POSITION -> row.editingDescriptors(mapOf( - "defaultValue" to this.result?.tournamentFinalPosition)) - SessionRow.TIPS -> row.editingDescriptors(mapOf( - "sb" to cgSmallBlind?.round(), - "bb" to cgBigBlind?.round(), - "tips" to result?.tips - )) + SessionRow.CASHED_OUT, SessionRow.PRIZE -> row.editingDescriptors( + mapOf( + "defaultValue" to result?.cashout + ) + ) + SessionRow.NET_RESULT -> row.editingDescriptors( + mapOf( + "defaultValue" to result?.netResult + ) + ) + SessionRow.COMMENT -> row.editingDescriptors( + mapOf( + "defaultValue" to this.comment + ) + ) + SessionRow.INITIAL_BUY_IN -> row.editingDescriptors( + mapOf( + "defaultValue" to this.tournamentEntryFee + ) + ) + SessionRow.PLAYERS -> row.editingDescriptors( + mapOf( + "defaultValue" to this.tournamentNumberOfPlayers + ) + ) + SessionRow.POSITION -> row.editingDescriptors( + mapOf( + "defaultValue" to this.result?.tournamentFinalPosition + ) + ) + SessionRow.TIPS -> row.editingDescriptors( + mapOf( + "sb" to cgSmallBlind?.round(), + "bb" to cgBigBlind?.round(), + "tips" to result?.tips + ) + ) else -> null } } @@ -782,13 +826,15 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat 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) + val localResult = + if (this.result != null) this.result as Result else realm.createObject(Result::class.java) 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) + val localResult = + if (this.result != null) this.result as Result else realm.createObject(Result::class.java) localResult.cashout = value as Double? @@ -870,7 +916,12 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // Stat Base - override fun formattedValue(stat: Stat, context: Context) : TextFormat { + override val entryTitle: String + get() { + return DateFormat.getDateInstance(DateFormat.SHORT).format(this.startDate) + } + + override fun formattedValue(stat: Stat, context: Context): TextFormat { this.result?.let { result -> @@ -886,7 +937,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } } Stat.HOURLY_RATE_BB -> this.bbHourlyRate - Stat.NET_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> Stat.netBBPer100Hands(this.bbNet, this.estimatedHands) + Stat.NET_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> Stat.netBBPer100Hands( + this.bbNet, + this.estimatedHands + ) Stat.AVERAGE_NET_BB -> this.bbNet Stat.DURATION, Stat.AVERAGE_DURATION -> this.netDuration.toDouble() Stat.HOURLY_RATE, Stat.STANDARD_DEVIATION_HOURLY -> this.hourlyRate @@ -915,3 +969,57 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } +val AbstractList.hourlyDuration: Double + get() { + val intervals = mutableListOf() + this.forEach { + val interval = TimeInterval(it.startDate!!, it.endDate!!, it.breakDuration) + intervals.update(interval) + } + return intervals.sumByDouble { it.hourlyDuration } + } + +class TimeInterval(var start: Date, var end: Date, var breakDuration: Long) { + + val hourlyDuration: Double + get() { + val netDuration = end.time - start.time - breakDuration + return (netDuration / 3600000).toDouble() + } +} + +fun MutableList.update(timeInterval: TimeInterval): MutableList { + + val overlapped = this.filter { + + (it.start.before(timeInterval.start) && it.end.after(timeInterval.start)) || + (it.start.before(timeInterval.end) && it.end.after(timeInterval.end)) || + (it.start.after(timeInterval.start) && it.end.before(timeInterval.end)) + + } + + if (overlapped.size == 0) { // add + this.add(timeInterval) + } else { // update + + var start = timeInterval.start + var end = timeInterval.end + var breakDuration = timeInterval.breakDuration + + overlapped.forEach { + if (it.start.before(start)) { + start = it.start + } + if (it.end.after(end)) { + end = it.end + } + breakDuration = kotlin.math.max(it.breakDuration, breakDuration) + } + + this.removeAll(overlapped) + this.add(TimeInterval(start, end, breakDuration)) + + } + + return this +} \ 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 8842e1d7..51a0bc1c 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 @@ -15,6 +15,7 @@ import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.util.NULL_TEXT +import java.text.DateFormat import java.util.* @@ -86,25 +87,6 @@ open class SessionSet() : RealmObject(), Timed, Filterable { return this.bbNet / this.hourlyDuration } - override fun formattedValue(stat: Stat, context: Context) : TextFormat { - return when (stat) { - Stat.NETRESULT, Stat.AVERAGE -> stat.format(this.ratedNet, currency = null, context = context) - Stat.DURATION, Stat.AVERAGE_DURATION -> stat.format(this.netDuration.toDouble(), currency = null, context = context) - Stat.HOURLY_RATE -> stat.format(this.hourlyRate, currency = null, context = context) - Stat.HANDS_PLAYED -> stat.format(this.estimatedHands, currency = null, context = context) - Stat.HOURLY_RATE_BB -> stat.format(this.bbHourlyRate, currency = null, context = context) - Stat.NET_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> { - val netBBPer100Hands = Stat.netBBPer100Hands(this.bbNet, this.estimatedHands) - if (netBBPer100Hands != null) { - return stat.format(this.estimatedHands, currency = null, context = context) - } else { - return TextFormat(NULL_TEXT) - } - } - else -> throw StatFormattingException("format undefined for stat ${stat.name}") - } - } - enum class Field(val identifier: String) { RATED_NET("ratedNet"), HOURLY_RATE("hourlyRate"), @@ -126,6 +108,32 @@ open class SessionSet() : RealmObject(), Timed, Filterable { } + // Stat Base + + override val entryTitle: String + get() { + return DateFormat.getDateInstance(DateFormat.SHORT).format(this.startDate) + } + + override fun formattedValue(stat: Stat, context: Context) : TextFormat { + return when (stat) { + Stat.NETRESULT, Stat.AVERAGE -> stat.format(this.ratedNet, currency = null, context = context) + Stat.DURATION, Stat.AVERAGE_DURATION -> stat.format(this.netDuration.toDouble(), currency = null, context = context) + Stat.HOURLY_RATE -> stat.format(this.hourlyRate, currency = null, context = context) + Stat.HANDS_PLAYED -> stat.format(this.estimatedHands, currency = null, context = context) + Stat.HOURLY_RATE_BB -> stat.format(this.bbHourlyRate, currency = null, context = context) + Stat.NET_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> { + val netBBPer100Hands = Stat.netBBPer100Hands(this.bbNet, this.estimatedHands) + if (netBBPer100Hands != null) { + return stat.format(this.estimatedHands, currency = null, context = context) + } else { + return TextFormat(NULL_TEXT) + } + } + else -> throw StatFormattingException("format undefined for stat ${stat.name}") + } + } + // Timed override val objectIdentifier: ObjectIdentifier diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt index af6939bb..5c0041e9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt @@ -75,7 +75,7 @@ class HomeActivity : PokerAnalyticsActivity() { override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.toolbar_home, menu) this.homeMenu = menu - //TODO: Change filter button visibility + //TODO: Change queryWith button visibility homeMenu?.findItem(R.id.filter)?.isVisible = true return super.onCreateOptionsMenu(menu) } @@ -153,15 +153,15 @@ class HomeActivity : PokerAnalyticsActivity() { /* 0 -> { toolbar.title = getString(R.string.feed) - homeMenu?.findItem(R.id.filter)?.isVisible = false + homeMenu?.findItem(R.id.queryWith)?.isVisible = false } 1 -> { toolbar.title = getString(R.string.stats) - homeMenu?.findItem(R.id.filter)?.isVisible = false + homeMenu?.findItem(R.id.queryWith)?.isVisible = false } 2 -> { toolbar.title = getString(R.string.services) - homeMenu?.findItem(R.id.filter)?.isVisible = false + homeMenu?.findItem(R.id.queryWith)?.isVisible = false } */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 255b6393..d1ac4d8e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -149,7 +149,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } }) - // Manage session type filter + // Manage session type queryWith filterSessionAll.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { sessionTypeCondition = null @@ -181,7 +181,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } } - // Manage time filter + // Manage time queryWith filterTimeMonth.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { currentTimeFilter = TimeFilter.MONTH diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index 40a5f226..fda6e770 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -243,7 +243,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent */ private fun saveData() { //TODO: Save currentFilter details data - Timber.d("Save data for filter: ${currentFilter?.id}") + Timber.d("Save data for queryWith: ${currentFilter?.id}") selectedRows.forEach { Timber.d("Selected rows: $it") } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt index c470f429..88a45a50 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt @@ -60,7 +60,7 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat Timber.d("onActivityResult: $requestCode") if (data != null && data.hasExtra(FilterDetailsActivity.IntentKey.FILTER_ID.keyName)) { val filterId = data.getStringExtra(FilterDetailsActivity.IntentKey.FILTER_ID.keyName) - Timber.d("Updated filter: ${filterId}") + Timber.d("Updated queryWith: ${filterId}") } */ @@ -179,19 +179,19 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat } /** - * Valid the updates of the filter + * Valid the updates of the queryWith */ private fun validUpdates() { - Timber.d("Valid filter updates") + Timber.d("Valid queryWith updates") val filterId = currentFilter?.id ?: "" finishActivityWithResult(filterId) } /** - * Cancel the latest updates of the filter + * Cancel the latest updates of the queryWith */ private fun cancelUpdates() { - Timber.d("Cancel filter updates") + Timber.d("Cancel queryWith updates") val filterId = filterCopy?.id ?: "" @@ -208,7 +208,7 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat * Delete data */ private fun deleteFilter() { - Timber.d("Delete filter") + Timber.d("Delete queryWith") val realm = getRealm() realm.beginTransaction() currentFilter?.deleteFromRealm() 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 4738acf0..8fc0623e 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 @@ -7,8 +7,7 @@ import android.view.ViewGroup import com.github.mikephil.charting.charts.BarChart import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.charts.LineChart -import com.github.mikephil.charting.data.Entry -import com.github.mikephil.charting.data.LineData +import com.github.mikephil.charting.data.* import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.listener.OnChartValueSelectedListener import com.google.android.material.chip.Chip @@ -26,7 +25,6 @@ import net.pokeranalytics.android.ui.graph.PALineDataSet import net.pokeranalytics.android.ui.graph.setStyle import net.pokeranalytics.android.ui.view.LegendView import timber.log.Timber -import java.text.DateFormat import java.util.* import kotlin.coroutines.CoroutineContext @@ -86,7 +84,15 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co this.legendView = LegendView(requireContext()) this.legendContainer.addView(this.legendView) - this.loadGraph(this.selectedReport) + this.chartView = when (stat.graphType) { + GraphType.LINE -> LineChart(context) + GraphType.BAR -> BarChart(context) + } + + this.chartView.setStyle(false, requireContext()) + this.chartContainer.addView(this.chartView) + + this.loadGraph(this.aggregationTypes.first(), this.selectedReport) this.aggregationTypes.forEach { type -> val chip = Chip(requireContext()) @@ -105,9 +111,9 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co val aggregationType = aggregationTypes[checkedId] reports[aggregationType]?.let { - loadGraph(it) + loadGraph(aggregationType, it) } ?: run { - + launchStatComputation(aggregationType) } } @@ -115,7 +121,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } - private fun launchStatComputation() { + private fun launchStatComputation(aggregationType: AggregationType) { GlobalScope.launch(coroutineContext) { @@ -126,8 +132,10 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co val realm = Realm.getDefaultInstance() - val aggregationType = stat.aggregationTypes.first() - r = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) + val report = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) + reports[aggregationType] = report + + r = report realm.close() @@ -140,40 +148,46 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co if (!isDetached) { r?.let { - loadGraph(it) + loadGraph(aggregationType, it) } } } } + fun loadGraph(aggregationType: AggregationType, report: Report) { - fun loadGraph(report: Report) { + val graphEntries = when (aggregationType) { + AggregationType.SESSION, AggregationType.DURATION -> report.results.firstOrNull()?.defaultStatEntries(stat) + AggregationType.MONTH, AggregationType.YEAR -> report.lineEntries(this.stat) + } - report.results.firstOrNull()?.defaultStatEntries(stat)?.let { entries -> + graphEntries?.let { entries -> this.legendView.prepareWithStat(this.stat, entries.size) - val dataSet = PALineDataSet(entries, this.stat.name, requireContext()) - val colors = arrayOf(R.color.green_light).toIntArray() - dataSet.setColors(colors, context) - dataSet.setDrawCircles(false) - val lineData = LineData(listOf(dataSet)) - - this.chartView = when (stat.graphType) { + when (stat.graphType) { GraphType.LINE -> { - val lineChart = LineChart(context) + val lineChart: LineChart = this.chartView as LineChart + + val dataSet = PALineDataSet(entries, this.stat.name, requireContext()) + val colors = arrayOf(R.color.green_light).toIntArray() + dataSet.setColors(colors, context) + dataSet.setDrawCircles(false) + val lineData = LineData(listOf(dataSet)) + lineChart.data = lineData - lineChart } GraphType.BAR -> { - val barChart = BarChart(context) - barChart + val barChart = this.chartView as BarChart + val dataSet = BarDataSet(entries as List, this.stat.name) + val colors = arrayOf(R.color.green_light).toIntArray() + dataSet.setColors(colors, context) + val barData = BarData(listOf(dataSet)) + barChart.data = barData } } - this.chartContainer.addView(this.chartView) - this.chartView.setStyle(false, requireContext()) this.chartView.setOnChartValueSelectedListener(this) @@ -192,11 +206,18 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co e?.let { entry -> - val identifier = entry.data as ObjectIdentifier - val item = getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() - item?.let { + val statEntry = when (entry.data) { + is ObjectIdentifier -> { + val identifier = entry.data as ObjectIdentifier + getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() + } + is StatEntry -> entry.data as StatEntry? + else -> null + } + + statEntry?.let { - val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate()) + val formattedDate = it.entryTitle val entryValue = it.formattedValue(this.stat, requireContext()) val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext()) 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 4e66f0ec..2f302352 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 @@ -223,7 +223,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc if (row is StatRow && row.stat.hasEvolutionGraph) { - // filter groups + // queryWith groups val groupResults = this.report?.results?.filter { it.group.name == row.groupName } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt index df878d24..71e7068a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt @@ -9,7 +9,15 @@ class PALineDataSet(yVals: List, label: String, context: Context) : LineD init { this.highLightColor = context.getColor(R.color.chart_highlight_indicator) + this.setDrawValues(false) } +} -} \ No newline at end of file +//class PABarDataSet(yVals: List, label: String, context: Context) : BarDataSet(yVals, label) { +// +// init { +// this.highLightColor = context.getColor(R.color.chart_highlight_indicator) +// } +// +//} \ No newline at end of file From aa3e94f30ed8897c8f07324628d7a468014dccec Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 17 Apr 2019 17:30:10 +0200 Subject: [PATCH 136/245] Refactoring method signature --- .../net/pokeranalytics/android/calculus/Calculator.kt | 2 +- .../net/pokeranalytics/android/model/filter/Filterable.kt | 6 ++---- .../pokeranalytics/android/model/filter/QueryCondition.kt | 8 +++----- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 57d1ada4..b0422dbb 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -514,7 +514,7 @@ class SSStats(realm: Realm, sessionSet: SessionSet, conditions: List RealmResults.filter(realm: Realm, conditions: List) : RealmResults { - val query = conditions.queryWith(this.where()) - return query.findAll() +inline fun RealmResults.filter(conditions: List) : RealmResults { + return conditions.queryWith(this.where()).findAll() } class FilterHelper { diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index 5866cd28..9d39f9ed 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -1,8 +1,6 @@ package net.pokeranalytics.android.model.filter -import io.realm.Realm import io.realm.RealmQuery -import io.realm.kotlin.where import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.realm.FilterCondition import net.pokeranalytics.android.model.realm.Session @@ -14,9 +12,9 @@ fun List.name() : String { return this.map { it.name }.joinToString(" / ") } -inline fun List.query(realm: Realm): RealmQuery { - return this.queryWith(realm.where()) -} +//inline fun List.query(realm: Realm): RealmQuery { +// return this.queryWith(realm.where()) +//} inline fun List.queryWith(query: RealmQuery): RealmQuery { var realmQuery = query From 689d29fb5d9c5d884bc0cfe09da971a38702e05e Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 17:39:17 +0200 Subject: [PATCH 137/245] Update layouts --- .../res/layout-sw320dp/fragment_calendar.xml | 16 ++++++++ .../res/layout-sw400dp/fragment_calendar.xml | 38 +++++++++++++------ app/src/main/res/layout/fragment_calendar.xml | 16 ++++++++ .../res/layout/fragment_calendar_details.xml | 30 ++++++++++++--- ...agment_evograph.xml => fragment_graph.xml} | 0 5 files changed, 83 insertions(+), 17 deletions(-) rename app/src/main/res/layout/{fragment_evograph.xml => fragment_graph.xml} (100%) diff --git a/app/src/main/res/layout-sw320dp/fragment_calendar.xml b/app/src/main/res/layout-sw320dp/fragment_calendar.xml index 1f773978..7bb22310 100644 --- a/app/src/main/res/layout-sw320dp/fragment_calendar.xml +++ b/app/src/main/res/layout-sw320dp/fragment_calendar.xml @@ -83,6 +83,22 @@ + + + android:orientation="horizontal" + android:padding="8dp"> + app:chipSpacing="8dp" + app:singleSelection="false"> + android:text="@string/month" /> + android:text="@string/year" /> @@ -51,27 +51,27 @@ android:id="@+id/filtersSession" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:singleSelection="false" - app:chipSpacing="6dp"> + app:chipSpacing="6dp" + app:singleSelection="false"> + android:text="@string/all" /> + android:text="@string/cash_game" /> + android:text="@string/tournament" /> @@ -87,6 +87,22 @@ + + + + + android:text="@string/all" /> + android:text="@string/cash_game" /> + android:text="@string/tournament" /> + + + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/appBar" /> diff --git a/app/src/main/res/layout/fragment_evograph.xml b/app/src/main/res/layout/fragment_graph.xml similarity index 100% rename from app/src/main/res/layout/fragment_evograph.xml rename to app/src/main/res/layout/fragment_graph.xml From f1c4587b28815ecb5f57dd2174e422c8fdb83810 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 17:39:43 +0200 Subject: [PATCH 138/245] Add animations functions --- .../android/ui/extensions/UIExtensions.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt index e7535db1..a067ebb3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt @@ -5,11 +5,13 @@ import android.content.Context import android.content.Intent import android.content.res.Resources import android.net.Uri +import android.view.View import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.AppCompatTextView import androidx.browser.customtabs.CustomTabsIntent import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.TextFormat @@ -107,4 +109,16 @@ fun showAlertDialog(context: Context, title: Int? = null, message: Int? = null) fun AppCompatTextView.setTextFormat(textFormat: TextFormat, context: Context) { this.setTextColor(textFormat.getColor(context)) this.text = textFormat.text +} + +fun View.hideWithAnimation() { + isVisible = true + animate().cancel() + animate().alpha(0f).withEndAction { isVisible = false }.start() +} + +fun View.showWithAnimation() { + isVisible = true + animate().cancel() + animate().alpha(1f).start() } \ No newline at end of file From f07c8184138bf0c95d63bc9800ab527a2bbe786e Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 17:40:39 +0200 Subject: [PATCH 139/245] Refactor and clean code --- .../android/ui/fragment/GraphFragment.kt | 91 +++++++++---------- 1 file changed, 44 insertions(+), 47 deletions(-) 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 1c8ecc05..3326309f 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 @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import com.github.mikephil.charting.charts.BarChart import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.charts.LineChart @@ -14,7 +15,7 @@ import com.github.mikephil.charting.listener.OnChartValueSelectedListener import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import io.realm.Realm -import kotlinx.android.synthetic.main.fragment_evograph.* +import kotlinx.android.synthetic.main.fragment_graph.* import kotlinx.coroutines.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* @@ -40,39 +41,46 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co private var stat: Stat = Stat.NETRESULT private var reports: MutableMap = hashMapOf() - lateinit private var computableGroup: ComputableGroup - lateinit private var selectedReport: Report - - lateinit var legendView: LegendView - lateinit var chartView: BarLineChartBase<*> + private lateinit var computableGroup: ComputableGroup + private lateinit var selectedReport: Report + private lateinit var legendView: LegendView + private lateinit var chartView: BarLineChartBase<*> + private var displayAggregationChoices: Boolean = true private var aggregationTypes: List = listOf() override val coroutineContext: CoroutineContext get() = Dispatchers.Main - companion object { - - } - - fun setData(stat: Stat, group: ComputableGroup, report: Report) { - this.stat = stat - this.computableGroup = group - - this.aggregationTypes = stat.aggregationTypes - this.reports[this.aggregationTypes.first()] = report - this.selectedReport = report - - } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_evograph, container, false) + return inflater.inflate(R.layout.fragment_graph, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initUI() + loadGraph(selectedReport) + } + + // OnChartValueSelectedListener + override fun onNothingSelected() { + // nothing to do + } + + override fun onValueSelected(e: Entry?, h: Highlight?) { + e?.let { entry -> + val identifier = entry.data as ObjectIdentifier + val item = getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() + item?.let { + + val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate()) + val entryValue = it.formattedValue(this.stat, requireContext()) + val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext()) + + this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) + } + } } /** @@ -86,8 +94,6 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co this.legendView = LegendView(requireContext()) this.legendContainer.addView(this.legendView) - this.loadGraph(this.selectedReport) - this.aggregationTypes.forEach { type -> val chip = Chip(requireContext()) chip.id = type.ordinal @@ -97,6 +103,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co this.chipGroup.addView(chip) } + this.chipGroup.isVisible = displayAggregationChoices this.chipGroup.check(this.stat.aggregationTypes.first().ordinal) this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { @@ -147,8 +154,10 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } - - fun loadGraph(report: Report) { + /** + * Load graph + */ + private fun loadGraph(report: Report) { report.results.firstOrNull()?.defaultStatEntries(stat)?.let { entries -> @@ -183,29 +192,17 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } - // OnChartValueSelectedListener - - override fun onNothingSelected() { - // nothing to do - } - - override fun onValueSelected(e: Entry?, h: Highlight?) { - - e?.let { entry -> - - val identifier = entry.data as ObjectIdentifier - val item = getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() - item?.let { - - val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate()) - val entryValue = it.formattedValue(this.stat, requireContext()) - val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext()) - - this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) - } - - } + /** + * Set data + */ + fun setData(stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean) { + this.stat = stat + this.computableGroup = group + this.aggregationTypes = stat.aggregationTypes + this.reports[this.aggregationTypes.first()] = report + this.selectedReport = report + this.displayAggregationChoices = displayAggregationChoices } } \ No newline at end of file From 87e1ae3bbefe23e9f2a94485108ee1d32832d1e4 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 17:41:15 +0200 Subject: [PATCH 140/245] Improve UI --- .../android/ui/activity/StatisticDetailsActivity.kt | 4 +++- .../android/ui/fragment/CalendarDetailsFragment.kt | 11 ++++++++++- .../android/ui/fragment/CalendarFragment.kt | 8 ++++++++ .../android/ui/fragment/StatisticDetailsFragment.kt | 2 +- 4 files changed, 22 insertions(+), 3 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 52e4a81e..e7fa885e 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 @@ -22,12 +22,14 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects var parameters: GraphParameters? = null + var displayAggregationChoices: Boolean = true /** * Default constructor */ - fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report) { + fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true) { parameters = GraphParameters(stat, group, report) + this.displayAggregationChoices = displayAggregationChoices val intent = Intent(context, StatisticDetailsActivity::class.java) context.startActivity(intent) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index ddf831f2..bead1e0e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.tabs.TabLayout import io.realm.Realm @@ -72,7 +73,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable is GraphRow -> { //TODO: Open graph details row.report.results.firstOrNull()?.group?.let { computableGroup -> - StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report) + StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report, false) } } } @@ -146,6 +147,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable */ private fun launchStatComputation() { + progressBar.isVisible = true + progressBar.animate().alpha(1f).start() + recyclerView.animate().alpha(0f).start() + computedResults?.let { computedResults -> GlobalScope.launch { @@ -193,6 +198,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable launch(Dispatchers.Main) { statsAdapter.notifyDataSetChanged() + progressBar.animate().cancel() + progressBar.animate().alpha(0f).withEndAction { progressBar.isVisible = false }.start() + recyclerView.animate().cancel() + recyclerView.animate().alpha(1f).start() } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 255b6393..edf63519 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -23,6 +23,8 @@ import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource +import net.pokeranalytics.android.ui.extensions.hideWithAnimation +import net.pokeranalytics.android.ui.extensions.showWithAnimation import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.CalendarTabs import net.pokeranalytics.android.ui.view.RowRepresentable @@ -219,6 +221,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep */ private fun launchStatComputation() { + progressBar?.showWithAnimation() + recyclerView?.hideWithAnimation() + GlobalScope.launch { val calendar = Calendar.getInstance() @@ -373,6 +378,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep calendarAdapter.notifyDataSetChanged() + progressBar?.hideWithAnimation() + recyclerView?.showWithAnimation() + } } \ No newline at end of file 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 26401474..8ea97620 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.computableGroup, it.report) + fragment.setData(it.stat, it.computableGroup, it.report, StatisticDetailsActivity.displayAggregationChoices) StatisticDetailsActivity.parameters = null } ?: run { throw Exception("Missing graph parameters") From 6394472a9610899b2139b308b52bb2f71e2f524b Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 17 Apr 2019 17:57:00 +0200 Subject: [PATCH 141/245] Refactoring + cleanup --- .../android/calculus/Calculator.kt | 9 ++- .../model/extensions/SessionExtensions.kt | 58 ++++++++++++++++++- .../android/model/realm/Session.kt | 55 ------------------ 3 files changed, 59 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index b0422dbb..98abe3a3 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -4,12 +4,12 @@ import io.realm.Realm import net.pokeranalytics.android.calculus.Stat.* import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.comparison.combined +import net.pokeranalytics.android.model.extensions.hourlyDuration import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.filter import net.pokeranalytics.android.model.filter.name import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.SessionSet -import net.pokeranalytics.android.model.realm.hourlyDuration import net.pokeranalytics.android.util.extensions.startOfDay import timber.log.Timber import java.util.* @@ -309,7 +309,7 @@ class Calculator { sessionSets.forEach { sessionSet -> tIndex++ - val setStats = SSStats(realm, sessionSet, computableGroup.conditions) + val setStats = SSStats(sessionSet, computableGroup.conditions) tRatedNetSum += setStats.ratedNet tBBSum += setStats.bbSum @@ -473,7 +473,7 @@ class Calculator { if (gHourlyDuration != null) { var hourlyStdSum = 0.0 sessionSets.forEach { set -> - val ssStats = SSStats(realm, set, computableGroup.conditions) + val ssStats = SSStats(set, computableGroup.conditions) val sHourlyRate = ssStats.hourlyRate hourlyStdSum += Math.pow(sHourlyRate - hourlyRate, 2.0) } @@ -492,9 +492,8 @@ class Calculator { } -class SSStats(realm: Realm, sessionSet: SessionSet, conditions: List) { // Session Set Stats +class SSStats(sessionSet: SessionSet, conditions: List) { // Session Set Stats - private var realm = realm private var sessionSet = sessionSet private var conditions = conditions diff --git a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt index 02d9495b..a6caa598 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt @@ -25,9 +25,6 @@ enum class SessionState { */ fun Session.getState(): SessionState { -// if (timeFrame == null) { -// return SessionState.PENDING -// } val start = this.startDate if (start == null) { return SessionState.PENDING @@ -43,4 +40,59 @@ fun Session.getState(): SessionState { } } +} + +val AbstractList.hourlyDuration: Double + get() { + val intervals = mutableListOf() + this.forEach { + val interval = TimeInterval(it.startDate!!, it.endDate!!, it.breakDuration) + intervals.update(interval) + } + return intervals.sumByDouble { it.hourlyDuration } + } + +class TimeInterval(var start: Date, var end: Date, var breakDuration: Long) { + + val hourlyDuration: Double + get() { + val netDuration = end.time - start.time - breakDuration + return (netDuration / 3600000).toDouble() + } +} + +fun MutableList.update(timeInterval: TimeInterval): MutableList { + + val overlapped = this.filter { + + (it.start.before(timeInterval.start) && it.end.after(timeInterval.start)) || + (it.start.before(timeInterval.end) && it.end.after(timeInterval.end)) || + (it.start.after(timeInterval.start) && it.end.before(timeInterval.end)) + + } + + if (overlapped.size == 0) { // add + this.add(timeInterval) + } else { // update + + var start = timeInterval.start + var end = timeInterval.end + var breakDuration = timeInterval.breakDuration + + overlapped.forEach { + if (it.start.before(start)) { + start = it.start + } + if (it.end.after(end)) { + end = it.end + } + breakDuration = kotlin.math.max(it.breakDuration, breakDuration) + } + + this.removeAll(overlapped) + this.add(TimeInterval(start, end, breakDuration)) + + } + + return this } \ 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 7d10e29a..934528ee 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 @@ -968,58 +968,3 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } - -val AbstractList.hourlyDuration: Double - get() { - val intervals = mutableListOf() - this.forEach { - val interval = TimeInterval(it.startDate!!, it.endDate!!, it.breakDuration) - intervals.update(interval) - } - return intervals.sumByDouble { it.hourlyDuration } - } - -class TimeInterval(var start: Date, var end: Date, var breakDuration: Long) { - - val hourlyDuration: Double - get() { - val netDuration = end.time - start.time - breakDuration - return (netDuration / 3600000).toDouble() - } -} - -fun MutableList.update(timeInterval: TimeInterval): MutableList { - - val overlapped = this.filter { - - (it.start.before(timeInterval.start) && it.end.after(timeInterval.start)) || - (it.start.before(timeInterval.end) && it.end.after(timeInterval.end)) || - (it.start.after(timeInterval.start) && it.end.before(timeInterval.end)) - - } - - if (overlapped.size == 0) { // add - this.add(timeInterval) - } else { // update - - var start = timeInterval.start - var end = timeInterval.end - var breakDuration = timeInterval.breakDuration - - overlapped.forEach { - if (it.start.before(start)) { - start = it.start - } - if (it.end.after(end)) { - end = it.end - } - breakDuration = kotlin.math.max(it.breakDuration, breakDuration) - } - - this.removeAll(overlapped) - this.add(TimeInterval(start, end, breakDuration)) - - } - - return this -} \ No newline at end of file From 5c2baae1b024bf615836059bed372ca38f8d9c43 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 17 Apr 2019 17:58:13 +0200 Subject: [PATCH 142/245] code cleanup --- .../java/net/pokeranalytics/android/calculus/Calculator.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 98abe3a3..bc784814 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -494,9 +494,6 @@ class Calculator { class SSStats(sessionSet: SessionSet, conditions: List) { // Session Set Stats - private var sessionSet = sessionSet - private var conditions = conditions - var hourlyDuration: Double = 0.0 var estimatedHands: Double = 0.0 var bbSum: Double = 0.0 From f43714213b3d2968270b768fd1ae2d42207e10fb Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Wed, 17 Apr 2019 19:10:30 +0200 Subject: [PATCH 143/245] WIP criteria object to centralize query,filter,comparator stuff --- .../pokeranalytics/android/model/Criteria.kt | 90 +++++++++++++++++++ .../android/model/comparison/Comparator.kt | 53 ++--------- .../android/model/filter/Filterable.kt | 2 +- .../android/model/filter/QueryCondition.kt | 60 +++++++++---- .../android/model/realm/ComputableResult.kt | 2 +- .../android/model/realm/Session.kt | 52 +++++------ .../android/model/realm/SessionSet.kt | 2 +- 7 files changed, 170 insertions(+), 91 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/model/Criteria.kt diff --git a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt new file mode 100644 index 00000000..15b751e3 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt @@ -0,0 +1,90 @@ +package net.pokeranalytics.android.model + +import io.realm.Realm +import io.realm.RealmResults +import io.realm.Sort +import io.realm.kotlin.where +import net.pokeranalytics.android.exceptions.PokerAnalyticsException +import net.pokeranalytics.android.model.filter.FilterHelper +import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.interfaces.Identifiable +import net.pokeranalytics.android.model.realm.* + +sealed class Criteria { + abstract class RealmCriteria : Criteria() { + inline fun comparison(): List { + return compare < QueryCondition.QueryDataCondition, T >() + } + } + + abstract class SimpleCriteria(private val condition:QueryCondition): Criteria() { + fun comparison(): List { + return listOf(condition) + } + } + + abstract class StaticCriteria : Criteria() { + inline fun comparison(): List { + QueryCondition.distinct()?.let { + val values = it.mapNotNull { session -> + when (this) { + is Limits -> session.limit + else -> null + } + } + return compare(values) + } + return listOf() + } + } + + object Bankrolls: RealmCriteria() + object Games: RealmCriteria() + object TournamentNames: RealmCriteria() + object Locations: RealmCriteria() + object TournamentFeatures: RealmCriteria() + object Limits: StaticCriteria() + object TournamentTypes : StaticCriteria() + + object Tournament : SimpleCriteria(QueryCondition.TOURNAMENT) + + val queryConditions: List + get() { + return when (this) { + is Bankrolls -> comparison() + is Games -> comparison() + is TournamentFeatures-> comparison() + is TournamentNames-> comparison() + is Locations -> comparison() + is SimpleCriteria -> comparison() + is Limits -> comparison() + is TournamentTypes -> comparison() + else -> throw PokerAnalyticsException.QueryTypeUnhandled + } + } + + companion object { + inline fun < reified S : QueryCondition.QueryDataCondition, reified T : Identifiable > compare(): List { + val objects = arrayListOf() + val realm = Realm.getDefaultInstance() + realm.where().findAll().forEach { + objects.add((QueryCondition.getInstance() as S).apply { + setObject(it) + }) + } + realm.close() + return objects + } + + inline fun < reified S : QueryCondition.SingleValueQueryCondition > compare(values:List): List { + val objects = arrayListOf() + values.forEach { + objects.add((S::class.java.newInstance()).apply { + setValue(it) + }) + } + return objects + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index de02cb45..c9698a76 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -5,6 +5,7 @@ import io.realm.RealmQuery import io.realm.Sort import io.realm.kotlin.where import net.pokeranalytics.android.exceptions.PokerAnalyticsException +import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.realm.* @@ -38,7 +39,7 @@ enum class Comparator { TOURNAMENT_ENTRY_FEE -> { val fees = arrayListOf() val realm = Realm.getDefaultInstance() - val fieldName = Session.fieldNameForQueryType(QueryCondition.BETWEEN_TOURNAMENT_FEE()) + val fieldName = Session.fieldNameForQueryType(QueryCondition.BETWEEN_TOURNAMENT_FEE::class.java)!! realm.where().distinct(fieldName).findAll().sort(fieldName, Sort.ASCENDING).map { it.tournamentEntryFee?.let { fee -> fees.add(QueryCondition.BETWEEN_TOURNAMENT_FEE().apply { between(fee, fee) }) @@ -79,51 +80,11 @@ enum class Comparator { realm.close() blinds } - GAME -> { - val objects = arrayListOf() - val realm = Realm.getDefaultInstance() - realm.where().findAll().forEach { - objects.add(QueryCondition.GAME().apply { setObjectId(it.id)}) - } - realm.close() - objects - } - BANKROLL -> { - val objects = arrayListOf() - val realm = Realm.getDefaultInstance() - realm.where().findAll().forEach { - objects.add(QueryCondition.BANKROLL().apply { setObjectId(it.id)}) - } - realm.close() - objects - } - LOCATION -> { - val objects = arrayListOf() - val realm = Realm.getDefaultInstance() - realm.where().findAll().forEach { - objects.add(QueryCondition.LOCATION().apply { setObjectId(it.id)}) - } - realm.close() - objects - } - TOURNAMENT_NAME -> { - val objects = arrayListOf() - val realm = Realm.getDefaultInstance() - realm.where().findAll().forEach { - objects.add(QueryCondition.TOURNAMENT_NAME().apply { setObjectId(it.id)}) - } - realm.close() - objects - } - TOURNAMENT_FEATURE -> { - val objects = arrayListOf() - val realm = Realm.getDefaultInstance() - realm.where().findAll().forEach { - objects.add(QueryCondition.ANY_TOURNAMENT_FEATURES().apply { setObjectId(it.id)}) - } - realm.close() - objects - } + BANKROLL -> Criteria.Bankrolls.queryConditions + GAME -> Criteria.Games.queryConditions + TOURNAMENT_NAME-> Criteria.TournamentNames.queryConditions + TOURNAMENT_FEATURE-> Criteria.TournamentFeatures.queryConditions + LOCATION-> Criteria.Locations.queryConditions LIMIT_TYPE -> { val limits = arrayListOf() val realm = Realm.getDefaultInstance() diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt index a7a7f467..91b4f312 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/Filterable.kt @@ -51,7 +51,7 @@ class FilterHelper { companion object { - inline fun fieldNameForQueryType(queryCondition: QueryCondition): String? { + inline fun fieldNameForQueryType(queryCondition: Class< out QueryCondition>): String? { return when (T::class.java) { Session::class.java -> Session.fieldNameForQueryType(queryCondition) diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index cf5dac46..fa1ae1e9 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -1,12 +1,13 @@ package net.pokeranalytics.android.model.filter -import io.realm.RealmQuery +import io.realm.* import io.realm.internal.Table +import io.realm.kotlin.where import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.TableSize -import net.pokeranalytics.android.model.realm.FilterCondition -import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.model.interfaces.Identifiable +import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.util.extensions.endOfDay import net.pokeranalytics.android.util.extensions.startOfDay import java.util.* @@ -24,10 +25,12 @@ fun List.name() : String { sealed class QueryCondition(var operator: Operator? = null) { - abstract class QueryDataCondition : QueryCondition() - fun setObjectId(id:String) { - this.valueMap = mapOf("ids" to id) + abstract class QueryDataCondition < T: Identifiable> : QueryCondition() { + fun setObject(dataObject:T) { + this.valueMap = mapOf("ids" to arrayListOf(dataObject.id)) } + } + class MoreQueryCondition : QueryCondition(Operator.MORE) class LessQueryCondition : QueryCondition(Operator.LESS) @@ -38,6 +41,25 @@ sealed class QueryCondition(var operator: Operator? = null) { val instance = kClass.objectInstance ?: kClass.java.newInstance() return instance as QueryCondition } + + inline fun getInstance(): QueryCondition { + return when (T::class.java) { + is Bankroll -> BANKROLL() + else -> throw PokerAnalyticsException.QueryTypeUnhandled + } + } + + inline fun < reified T: Filterable, reified S: QueryCondition>distinct(): RealmResults? { + FilterHelper.fieldNameForQueryType(S::class.java)?.let { + val realm = Realm.getDefaultInstance() + val distincts = realm.where().distinct(it).findAll().sort(it, Sort.ASCENDING) + realm.close() + return distincts + } + return null + } + + } val name: String = this::class.simpleName ?: throw PokerAnalyticsException.FilterElementUnknownName @@ -51,29 +73,35 @@ sealed class QueryCondition(var operator: Operator? = null) { ; } + open class SingleValueQueryCondition : QueryCondition() { + fun setValue(value:Int) { + this.valueMap = mapOf("values" to arrayListOf(value)) + } + } + object LIVE : QueryCondition() object CASH : QueryCondition() object ONLINE : QueryCondition() object TOURNAMENT: QueryCondition() - class BANKROLL: QueryDataCondition() - class GAME: QueryCondition() - class TOURNAMENT_NAME: QueryCondition() - class ANY_TOURNAMENT_FEATURES: QueryCondition() - class ALL_TOURNAMENT_FEATURES: QueryCondition() - class LOCATION: QueryCondition() - class LIMIT: QueryCondition() { + class BANKROLL: QueryDataCondition() + class GAME: QueryDataCondition() + class TOURNAMENT_NAME: QueryDataCondition() + class ANY_TOURNAMENT_FEATURES: QueryDataCondition() + class ALL_TOURNAMENT_FEATURES: QueryDataCondition() + class LOCATION: QueryDataCondition() + class LIMIT: SingleValueQueryCondition() { fun setLimitType(limitType: Int) { this.valueMap = mapOf("values" to limitType) } } - class TABLE_SIZE: QueryCondition() { + class TABLE_SIZE: SingleValueQueryCondition() { fun setNumberOfPlayer(numberOfPlayer: Int) { this.valueMap = mapOf("values" to numberOfPlayer) } } - class TOURNAMENT_TYPE: QueryCondition() { + class TOURNAMENT_TYPE: SingleValueQueryCondition() { fun setTournamentType(tournamentType:Int) { this.valueMap = mapOf("values" to tournamentType) } @@ -195,7 +223,7 @@ sealed class QueryCondition(var operator: Operator? = null) { * providing a base RealmQuery [realmQuery], the method is able to attached the corresponding query and returns the newly formed [RealmQuery] */ inline fun filter(realmQuery: RealmQuery): RealmQuery { - val fieldName = FilterHelper.fieldNameForQueryType(this) + val fieldName = FilterHelper.fieldNameForQueryType(this::class.java) fieldName ?: throw PokerAnalyticsException.QueryValueMapUnknown when (operator) { Operator.LESS -> { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt index fd3aa17a..04589945 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt @@ -56,7 +56,7 @@ open class ComputableResult() : RealmObject(), Computable, Filterable { companion object { - fun fieldNameForQueryType(queryCondition: QueryCondition): String? { + fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? { return "session." + Session.fieldNameForQueryType(queryCondition) } 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 81a4d522..c594b099 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 @@ -62,33 +62,33 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return realm.copyToRealm(session) } - fun fieldNameForQueryType(queryCondition: QueryCondition): String? { + fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? { return when (queryCondition) { - LIVE, ONLINE -> "bankroll.live" - CASH, TOURNAMENT -> "type" - is BANKROLL -> "bankroll.id" - is GAME -> "game.id" - is TOURNAMENT_NAME -> "tournamentName.id" - is ANY_TOURNAMENT_FEATURES, is ALL_TOURNAMENT_FEATURES -> "tournamentFeatures.id" - is LOCATION -> "location.id" - is LIMIT -> "limit" - is TABLE_SIZE -> "tableSize" - is TOURNAMENT_TYPE -> "tournamentType" - is BLIND -> "blinds" - is COMMENT -> "comment" - is BETWEEN_NUMBER_OF_TABLE, is MORE_NUMBER_OF_TABLE, is LESS_NUMBER_OF_TABLE -> "numberOfTable" - is MORE_THAN_NET_RESULT, is LESS_THAN_NET_RESULT -> "computableResults.ratedNet" - is MORE_THAN_BUY_IN, is LESS_THAN_BUY_IN -> "result.buyin" - is MORE_THAN_CASH_OUT, is LESS_THAN_CASH_OUT -> "result.cashout" - is MORE_THAN_TIPS, is LESS_THAN_TIPS -> "result.tips" - is MORE_THAN_NUMBER_OF_PLAYER, is LESS_THAN_NUMBER_OF_PLAYER, is BETWEEN_NUMBER_OF_PLAYER -> "tournamentNumberOfPlayers" - is MORE_THAN_TOURNAMENT_FEE, is LESS_THAN_TOURNAMENT_FEE, is BETWEEN_TOURNAMENT_FEE -> "tournamentEntryFee" - is STARTED_FROM_DATE, is STARTED_TO_DATE -> "startDate" - is ENDED_FROM_DATE, is ENDED_TO_DATE -> "endDate" - is DAY_OF_WEEK, is WEEK_END, is WEEK_DAY -> "dayOfWeek" - is MONTH -> "month" - is YEAR -> "year" - TODAY, YESTERDAY, TODAY_AND_YESTERDAY, THIS_YEAR, THIS_MONTH, THIS_WEEK -> "startDate" + LIVE::class, ONLINE::class -> "bankroll.live" + CASH::class, TOURNAMENT::class -> "type" + BANKROLL::class -> "bankroll.id" + GAME::class -> "game.id" + TOURNAMENT_NAME::class -> "tournamentName.id" + ANY_TOURNAMENT_FEATURES::class, ALL_TOURNAMENT_FEATURES::class -> "tournamentFeatures.id" + LOCATION::class -> "location.id" + LIMIT::class -> "limit" + TABLE_SIZE::class -> "tableSize" + TOURNAMENT_TYPE::class -> "tournamentType" + BLIND::class -> "blinds" + COMMENT::class -> "comment" + BETWEEN_NUMBER_OF_TABLE::class, MORE_NUMBER_OF_TABLE::class, LESS_NUMBER_OF_TABLE::class -> "numberOfTable" + MORE_THAN_NET_RESULT::class, LESS_THAN_NET_RESULT::class -> "computableResults.ratedNet" + MORE_THAN_BUY_IN::class, LESS_THAN_BUY_IN::class -> "result.buyin" + MORE_THAN_CASH_OUT::class, LESS_THAN_CASH_OUT::class -> "result.cashout" + MORE_THAN_TIPS::class, LESS_THAN_TIPS::class -> "result.tips" + MORE_THAN_NUMBER_OF_PLAYER::class, LESS_THAN_NUMBER_OF_PLAYER::class, BETWEEN_NUMBER_OF_PLAYER::class -> "tournamentNumberOfPlayers" + MORE_THAN_TOURNAMENT_FEE::class, LESS_THAN_TOURNAMENT_FEE::class, BETWEEN_TOURNAMENT_FEE::class -> "tournamentEntryFee" + STARTED_FROM_DATE::class, STARTED_TO_DATE::class -> "startDate" + ENDED_FROM_DATE::class, ENDED_TO_DATE::class -> "endDate" + DAY_OF_WEEK::class, WEEK_END::class, WEEK_DAY::class -> "dayOfWeek" + MONTH::class -> "month" + YEAR::class -> "year" + TODAY::class, YESTERDAY::class, TODAY_AND_YESTERDAY::class, THIS_YEAR::class, THIS_MONTH::class, THIS_WEEK::class -> "startDate" else -> null } } 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 8842e1d7..6f6a4eee 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 @@ -120,7 +120,7 @@ open class SessionSet() : RealmObject(), Timed, Filterable { return realm.copyToRealm(sessionSet) } - fun fieldNameForQueryType(queryCondition: QueryCondition): String? { + fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? { return "sessions." + Session.fieldNameForQueryType(queryCondition) } From 0d42b6f84ad79cbec62c63c7344576072abf2d29 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 19:11:00 +0200 Subject: [PATCH 144/245] Close realm --- .../net/pokeranalytics/android/ui/fragment/CalendarFragment.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index edf63519..d985b9a5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -308,6 +308,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } */ + realm.close() + GlobalScope.launch(Dispatchers.Main) { displayData() } From 6bbf0db52c823c7389e8596e1defc6bd10dbff3b Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 19:11:11 +0200 Subject: [PATCH 145/245] Fix layout --- .../java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt index 406a0fa7..faa0d030 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt @@ -44,7 +44,7 @@ class MoreFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, // Life Cycle override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_calendar, container, false) + return inflater.inflate(R.layout.fragment_more, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { From 49087b394b52bfbb23651e52364ae0390959f50b Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 19:11:33 +0200 Subject: [PATCH 146/245] Fix typo --- .../net/pokeranalytics/android/model/comparison/Comparator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index de02cb45..fbb51d8d 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -71,7 +71,7 @@ enum class Comparator { BLIND -> { val blinds = arrayListOf() val realm = Realm.getDefaultInstance() - realm.where().distinct("blind", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { + realm.where().distinct("blinds", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { it.blinds?.let { stake -> blinds.add(QueryCondition.BLIND().apply { setBlind(stake, it.hasDefaultCurrency)}) } From 2a5f014235fe8c05d57573a3bf0951496ed4bf77 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 19:17:18 +0200 Subject: [PATCH 147/245] Clean files --- .../android/ui/fragment/GraphFragment.kt | 49 ++++++++----- .../android/ui/fragment/ReportsFragment.kt | 73 ++++++++++--------- 2 files changed, 72 insertions(+), 50 deletions(-) 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 3326309f..25798bad 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 @@ -14,9 +14,9 @@ import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.listener.OnChartValueSelectedListener import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup -import io.realm.Realm import kotlinx.android.synthetic.main.fragment_graph.* -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity @@ -26,9 +26,7 @@ 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 timber.log.Timber import java.text.DateFormat -import java.util.* import kotlin.coroutines.CoroutineContext class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var report: Report) { @@ -37,15 +35,28 @@ class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, CoroutineScope { + companion object { + + /** + * Create new instance + */ + fun newInstance(): GraphFragment { + val fragment = GraphFragment() + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + } + private lateinit var parentActivity: PokerAnalyticsActivity private var stat: Stat = Stat.NETRESULT private var reports: MutableMap = hashMapOf() - private lateinit var computableGroup: ComputableGroup - private lateinit var selectedReport: Report - private lateinit var legendView: LegendView - private lateinit var chartView: BarLineChartBase<*> + private var computableGroup: ComputableGroup? = null + private var selectedReport: Report? = null + private var legendView: LegendView? = null + private var chartView: BarLineChartBase<*>? = null private var displayAggregationChoices: Boolean = true private var aggregationTypes: List = listOf() @@ -60,7 +71,11 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initUI() - loadGraph(selectedReport) + + selectedReport?.let { + loadGraph(it) + } + } // OnChartValueSelectedListener @@ -78,7 +93,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co val entryValue = it.formattedValue(this.stat, requireContext()) val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext()) - this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) + this.legendView?.setItemData(this.stat, formattedDate, entryValue, totalStatValue) } } } @@ -122,6 +137,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } + /* private fun launchStatComputation() { GlobalScope.launch(coroutineContext) { @@ -151,8 +167,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } } } - } + */ /** * Load graph @@ -160,8 +176,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co private fun loadGraph(report: Report) { report.results.firstOrNull()?.defaultStatEntries(stat)?.let { entries -> - - this.legendView.prepareWithStat(this.stat, entries.size) + + this.legendView?.prepareWithStat(this.stat, entries.size) val dataSet = PALineDataSet(entries, this.stat.name, requireContext()) val colors = arrayOf(R.color.green_light).toIntArray() @@ -184,10 +200,9 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co this.chartContainer.addView(this.chartView) - this.chartView.setStyle(false, requireContext()) - this.chartView.setOnChartValueSelectedListener(this) - - this.chartView.highlightValue((entries.size - 1).toFloat(), 0) + this.chartView?.setStyle(false, requireContext()) + this.chartView?.setOnChartValueSelectedListener(this) + this.chartView?.highlightValue((entries.size - 1).toFloat(), 0) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt index 7883f75e..b8b5738a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt @@ -7,49 +7,49 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.fragment_stats.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.activity.ComparisonChartActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.ReportRow +import timber.log.Timber class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { - companion object { - - /** - * Create new instance - */ - fun newInstance(): ReportsFragment { - val fragment = ReportsFragment() - val bundle = Bundle() - fragment.arguments = bundle - return fragment - } - - val rowRepresentation: List by lazy { - val rows = ArrayList() - rows.addAll(ReportRow.getRows()) - rows - } - } + companion object { + + /** + * Create new instance + */ + fun newInstance(): ReportsFragment { + val fragment = ReportsFragment() + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + + val rowRepresentation: List by lazy { + val rows = ArrayList() + rows.addAll(ReportRow.getRows()) + rows + } + } private lateinit var reportsAdapter: RowRepresentableAdapter // Life Cycle - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_reports, container, false) - } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_reports, container, false) + } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initData() - initUI() - } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + initUI() + } // Rows @@ -59,17 +59,23 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { super.onRowSelected(position, row, fromAction) - ComparisonChartActivity.newInstance(requireContext()) + Timber.d("row: $row") + when (row) { + ReportRow.DAY_OF_WEEKS -> { + //TODO: Open ComparisonChartActivity with correct data + //TODO: Calcul report before or after + } + } } // Business - /** - * Init data - */ - private fun initData() { - } + /** + * Init data + */ + private fun initData() { + } /** * Init UI @@ -87,4 +93,5 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour } } + } \ No newline at end of file From 29932cc92f3f438c7b9efb1fc10adac4ebbfb268 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 17 Apr 2019 19:34:32 +0200 Subject: [PATCH 148/245] Clean code --- .../android/ui/fragment/GraphFragment.kt | 94 +++++++++---------- 1 file changed, 46 insertions(+), 48 deletions(-) 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 9de21a2a..d44e822e 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 @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import com.github.mikephil.charting.charts.BarChart import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.charts.LineChart @@ -48,34 +49,19 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } private lateinit var parentActivity: PokerAnalyticsActivity + private lateinit var computableGroup: ComputableGroup + private lateinit var selectedReport: Report + private lateinit var legendView: LegendView + private lateinit var chartView: BarLineChartBase<*> private var stat: Stat = Stat.NETRESULT private var reports: MutableMap = hashMapOf() - lateinit private var computableGroup: ComputableGroup - - lateinit private var selectedReport: Report - - lateinit var legendView: LegendView - lateinit var chartView: BarLineChartBase<*> - private var aggregationTypes: List = listOf() + private var displayAggregationChoices: Boolean = true override val coroutineContext: CoroutineContext get() = Dispatchers.Main - companion object { - - } - - fun setData(stat: Stat, group: ComputableGroup, report: Report) { - this.stat = stat - this.computableGroup = group - - this.aggregationTypes = stat.aggregationTypes - this.reports[this.aggregationTypes.first()] = report - this.selectedReport = report - - } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_evograph, container, false) @@ -86,6 +72,35 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co initUI() } + // OnChartValueSelectedListener + override fun onNothingSelected() { + // nothing to do + } + + override fun onValueSelected(e: Entry?, h: Highlight?) { + e?.let { entry -> + + val statEntry = when (entry.data) { + is ObjectIdentifier -> { + val identifier = entry.data as ObjectIdentifier + getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() + } + is StatEntry -> entry.data as StatEntry? + else -> null + } + + statEntry?.let { + + val formattedDate = it.entryTitle + val entryValue = it.formattedValue(this.stat, requireContext()) + val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext()) + + this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) + } + } + } + + /** * Init UI */ @@ -116,6 +131,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co this.chipGroup.addView(chip) } + this.chipGroup.isVisible = displayAggregationChoices this.chipGroup.check(this.stat.aggregationTypes.first().ordinal) this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { @@ -209,35 +225,17 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } - // OnChartValueSelectedListener - - override fun onNothingSelected() { - // nothing to do - } - - override fun onValueSelected(e: Entry?, h: Highlight?) { - - e?.let { entry -> - - val statEntry = when (entry.data) { - is ObjectIdentifier -> { - val identifier = entry.data as ObjectIdentifier - getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() - } - is StatEntry -> entry.data as StatEntry? - else -> null - } - - statEntry?.let { - - val formattedDate = it.entryTitle - val entryValue = it.formattedValue(this.stat, requireContext()) - val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext()) - - this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) - } + /** + * Set data + */ + fun setData(stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true) { + this.stat = stat + this.computableGroup = group - } + this.aggregationTypes = stat.aggregationTypes + this.reports[this.aggregationTypes.first()] = report + this.selectedReport = report + this.displayAggregationChoices = displayAggregationChoices } From 12d563bc6459a754df706e1d1038ecb5de204927 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Wed, 17 Apr 2019 19:42:35 +0200 Subject: [PATCH 149/245] post merge fix --- .../android/model/realm/ComputableResult.kt | 5 +- .../android/model/realm/Session.kt | 52 +++++++++---------- .../android/model/realm/SessionSet.kt | 5 +- 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt index 04589945..513040e9 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt @@ -57,7 +57,10 @@ open class ComputableResult() : RealmObject(), Computable, Filterable { companion object { fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? { - return "session." + Session.fieldNameForQueryType(queryCondition) + Session.fieldNameForQueryType(queryCondition)?.let { + return "session.$it" + } + return null } } 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 2b83ba98..49a3b80c 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 @@ -64,32 +64,32 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? { - return when (queryCondition) { - LIVE::class, ONLINE::class -> "bankroll.live" - CASH::class, TOURNAMENT::class -> "type" - BANKROLL::class -> "bankroll.id" - GAME::class -> "game.id" - TOURNAMENT_NAME::class -> "tournamentName.id" - ANY_TOURNAMENT_FEATURES::class, ALL_TOURNAMENT_FEATURES::class -> "tournamentFeatures.id" - LOCATION::class -> "location.id" - LIMIT::class -> "limit" - TABLE_SIZE::class -> "tableSize" - TOURNAMENT_TYPE::class -> "tournamentType" - BLIND::class -> "blinds" - COMMENT::class -> "comment" - BETWEEN_NUMBER_OF_TABLE::class, MORE_NUMBER_OF_TABLE::class, LESS_NUMBER_OF_TABLE::class -> "numberOfTable" - MORE_THAN_NET_RESULT::class, LESS_THAN_NET_RESULT::class -> "computableResults.ratedNet" - MORE_THAN_BUY_IN::class, LESS_THAN_BUY_IN::class -> "result.buyin" - MORE_THAN_CASH_OUT::class, LESS_THAN_CASH_OUT::class -> "result.cashout" - MORE_THAN_TIPS::class, LESS_THAN_TIPS::class -> "result.tips" - MORE_THAN_NUMBER_OF_PLAYER::class, LESS_THAN_NUMBER_OF_PLAYER::class, BETWEEN_NUMBER_OF_PLAYER::class -> "tournamentNumberOfPlayers" - MORE_THAN_TOURNAMENT_FEE::class, LESS_THAN_TOURNAMENT_FEE::class, BETWEEN_TOURNAMENT_FEE::class -> "tournamentEntryFee" - STARTED_FROM_DATE::class, STARTED_TO_DATE::class -> "startDate" - ENDED_FROM_DATE::class, ENDED_TO_DATE::class -> "endDate" - DAY_OF_WEEK::class, WEEK_END::class, WEEK_DAY::class -> "dayOfWeek" - MONTH::class -> "month" - YEAR::class -> "year" - TODAY::class, YESTERDAY::class, TODAY_AND_YESTERDAY::class, THIS_YEAR::class, THIS_MONTH::class, THIS_WEEK::class -> "startDate" + return when (queryCondition) { + LIVE::class.java, ONLINE::class.java -> "bankroll.live" + CASH::class.java, TOURNAMENT::class.java -> "type" + BANKROLL::class.java -> "bankroll.id" + GAME::class.java -> "game.id" + TOURNAMENT_NAME::class.java -> "tournamentName.id" + ANY_TOURNAMENT_FEATURES::class.java, ALL_TOURNAMENT_FEATURES::class.java -> "tournamentFeatures.id" + LOCATION::class.java -> "location.id" + LIMIT::class.java -> "limit" + TABLE_SIZE::class.java -> "tableSize" + TOURNAMENT_TYPE::class.java -> "tournamentType" + BLIND::class.java -> "blinds" + COMMENT::class.java -> "comment" + BETWEEN_NUMBER_OF_TABLE::class.java, MORE_NUMBER_OF_TABLE::class.java, LESS_NUMBER_OF_TABLE::class.java -> "numberOfTable" + MORE_THAN_NET_RESULT::class.java, LESS_THAN_NET_RESULT::class.java -> "computableResults.ratedNet" + MORE_THAN_BUY_IN::class.java, LESS_THAN_BUY_IN::class.java -> "result.buyin" + MORE_THAN_CASH_OUT::class.java, LESS_THAN_CASH_OUT::class.java -> "result.cashout" + MORE_THAN_TIPS::class.java, LESS_THAN_TIPS::class.java -> "result.tips" + MORE_THAN_NUMBER_OF_PLAYER::class.java, LESS_THAN_NUMBER_OF_PLAYER::class.java, BETWEEN_NUMBER_OF_PLAYER::class.java -> "tournamentNumberOfPlayers" + MORE_THAN_TOURNAMENT_FEE::class.java, LESS_THAN_TOURNAMENT_FEE::class.java, BETWEEN_TOURNAMENT_FEE::class.java -> "tournamentEntryFee" + STARTED_FROM_DATE::class.java, STARTED_TO_DATE::class.java -> "startDate" + ENDED_FROM_DATE::class.java, ENDED_TO_DATE::class.java -> "endDate" + DAY_OF_WEEK::class.java, WEEK_END::class.java, WEEK_DAY::class.java -> "dayOfWeek" + MONTH::class.java -> "month" + YEAR::class.java -> "year" + TODAY::class.java, YESTERDAY::class.java, TODAY_AND_YESTERDAY::class.java, THIS_YEAR::class.java, THIS_MONTH::class.java, THIS_WEEK::class.java -> "startDate" else -> null } } 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 06005334..80d3ed20 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 @@ -103,7 +103,10 @@ open class SessionSet() : RealmObject(), Timed, Filterable { } fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? { - return "sessions." + Session.fieldNameForQueryType(queryCondition) + Session.fieldNameForQueryType(queryCondition)?.let { + return "sessions.$it" + } + return null } } From 3a377dfd2860b1af32a0980851b8ffd578890584 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 08:07:10 +0200 Subject: [PATCH 150/245] Update configuration for Android Studio 3.4 --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index e831b501..5ca2cc91 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:3.4.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'io.realm:realm-gradle-plugin:5.8.0' classpath 'com.google.gms:google-services:4.2.0' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 56cc4fe3..38fd54cf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Feb 11 11:18:44 CET 2019 +#Thu Apr 18 07:56:20 CEST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip From f63487498e5e708675daf2c3a5b01e0c021b0c92 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 08:58:39 +0200 Subject: [PATCH 151/245] Update the theme for date picker --- app/src/main/res/values/styles.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 58c93d7e..d58f7de3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ -

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