From ff3e4608d38692003295c2c251c187ef35734385 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 19 Apr 2019 09:55:27 +0200 Subject: [PATCH 1/6] fix issue with filter display --- .../net/pokeranalytics/android/model/Criteria.kt | 2 +- .../android/model/filter/QueryCondition.kt | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt index 9175d734..2fdbdd6b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt @@ -120,7 +120,7 @@ sealed class Criteria { val objects = arrayListOf() values.forEach { objects.add((S::class.java.newInstance()).apply { - intValues.add(it) + intValues = arrayListOf(it) }) } return objects 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 3c78df9a..0ea2b90e 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 @@ -45,12 +45,16 @@ inline fun List.queryWith(query: RealmQ sealed class QueryCondition : FilterElementRow { + interface Valuable > { + var values: ArrayList? + } + interface asListOfDouble { var doubleValues : ArrayList } interface asListOfBoolean { var booleanValues : ArrayList } interface asListOfString { var stringValues : ArrayList } interface asDateValue { var dateValue: Date - var showTime: Boolean + val showTime: Boolean } interface asListOfInt : asListOfDouble { @@ -61,13 +65,13 @@ sealed class QueryCondition : FilterElementRow { interface asIntValue : asListOfInt { var intValue: Int - get() { return intValues.first() } + get() { return intValues.firstOrNull() ?: 0 } set(value) { intValues = arrayListOf(value) } } interface asDoubleValue : asListOfDouble { var doubleValue : Double - get() { return doubleValues.first() } + get() { return doubleValues.firstOrNull() ?: 0.0 } set(value) { doubleValues = arrayListOf(value) } } @@ -183,7 +187,7 @@ sealed class QueryCondition : FilterElementRow { get() { if (intValues.size > 1) { return "multiple" - } else { + } else if (intValues.size > 0) { return Limit.values()[intValues.first()].longName } return "todo" @@ -255,11 +259,11 @@ sealed class QueryCondition : FilterElementRow { // Dates open class DateQuery: QueryCondition(), asDateValue { override var dateValue: Date = Date() - override var showTime: Boolean = false + override val showTime: Boolean = false } open class TimeQuery: DateQuery() { - override var showTime: Boolean = true + override val showTime: Boolean = true } class STARTED_FROM_DATE: DateQuery() From 3dc8384e4c7201434b78bd20a3b1fbe7b9401ac8 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 19 Apr 2019 11:18:51 +0200 Subject: [PATCH 2/6] fix issue with filter selection --- .../android/model/filter/QueryCondition.kt | 10 +++++- .../android/model/realm/Filter.kt | 35 ++++++++++--------- .../android/model/realm/FilterCondition.kt | 2 +- .../ui/fragment/FilterDetailsFragment.kt | 2 ++ .../view/rowrepresentable/FilterSectionRow.kt | 14 ++++---- 5 files changed, 38 insertions(+), 25 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 0ea2b90e..045b55cf 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 @@ -97,7 +97,15 @@ sealed class QueryCondition : FilterElementRow { interface BetweenLeftExclusive : Between interface BetweenRightExclusive : Between - val id: String get() { return this::class.simpleName ?: throw PokerAnalyticsException.FilterElementUnknownName } + val baseId = this::class.simpleName ?: throw PokerAnalyticsException.FilterElementUnknownName + + val id: List get() { + return when (this) { + is QueryDataCondition<*> -> this.stringValues.map { "$baseId+$it" } + is StaticDataQueryCondition -> this.intValues.map { "$baseId+$it" } + else -> listOf(baseId) + } + } override var filterSectionRow: FilterSectionRow = FilterSectionRow.CASH_TOURNAMENT 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 e470a1b4..f0638976 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 @@ -66,22 +66,26 @@ open class Filter : RealmObject() { private set fun createOrUpdateFilterConditions(filterConditionRows: ArrayList) { - val casted = arrayListOf() + println("list of querys saving: ${filterConditionRows.map { it.id }}") + println("list of querys previous: ${this.filterConditions.map { it.queryCondition.id }}") filterConditionRows .map { - it.id + it.filterSectionRow } .distinct() .forEach { filterName-> filterConditionRows .filter { - it.id == filterName + it.filterSectionRow == filterName } .apply { + + println("list of querys: ${this.map { it.id }}") + val casted = arrayListOf() casted.addAll(this) val newFilterCondition = FilterCondition(casted) val previousCondition = filterConditions.filter { - it.sectionName == newFilterCondition.filterName + it.filterName == newFilterCondition.filterName } filterConditions.removeAll(previousCondition) filterConditions.add(newFilterCondition) @@ -90,20 +94,19 @@ open class Filter : RealmObject() { } fun countBy(filterCategoryRow: FilterCategoryRow): Int { - val sections = filterCategoryRow.filterSectionRows - return filterConditions.count { - sections.contains(FilterSectionRow.valueOf(it.sectionName ?: throw PokerAnalyticsException.FilterElementUnknownSectionName)) - } + val sections = filterCategoryRow.filterSectionRows.map { it.name } + println("list of sections $sections") + val savedSections = filterConditions.filter { sections.contains(it.sectionName) }.flatMap { it.queryCondition.id } + println("list of savedSections $savedSections") + return savedSections.size } fun contains(filterElementRow: QueryCondition): Boolean { - val filtered = filterConditions.filter { - it.filterName == filterElementRow.id - } - if (filtered.isEmpty()) { - return false - } - return filterElementRow.contains(filtered) + println("list of saved queries ${filterConditions.map { it.queryCondition.id }}") + println("list of contains ${filterElementRow.id}") + val contained = filterConditions.flatMap{ it.queryCondition.id }.contains(filterElementRow.id.first()) + println("list of : $contained") + return contained } /** @@ -111,7 +114,7 @@ open class Filter : RealmObject() { */ fun loadValueForElement(filterElementRow: QueryCondition) { val filtered = filterConditions.filter { - it.filterName == filterElementRow.id + it.queryCondition == filterElementRow.id } if (filtered.isNotEmpty()) { return filterElementRow.updateValueMap(filtered.first()) 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 dd8c7e0c..7fd481ed 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 @@ -13,7 +13,7 @@ open class FilterCondition() : RealmObject() { this.sectionName = sectionName } - constructor(filterElementRows: ArrayList) : this(filterElementRows.first().id, filterElementRows.first().filterSectionRow.name) { + constructor(filterElementRows: ArrayList) : this(filterElementRows.first().baseId, filterElementRows.first().filterSectionRow.name) { val row = filterElementRows.first() this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName 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 c3615d7a..7dbc53a1 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 @@ -220,6 +220,8 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent } } + println("list of selected rows : $selectedRows") + // Update UI rowRepresentableAdapter.refreshRow(row) } 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 bd4b92a4..deba6d92 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 @@ -68,8 +68,8 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { when (this@FilterSectionRow) { // General - CASH_TOURNAMENT -> arrayListOf(QueryCondition.CASH, QueryCondition.TOURNAMENT) - LIVE_ONLINE -> arrayListOf(QueryCondition.LIVE, QueryCondition.ONLINE) + CASH_TOURNAMENT -> Criteria.SessionType.queryConditions + LIVE_ONLINE -> Criteria.BankrollType.queryConditions GAME -> Criteria.Games.queryConditions LIMIT_TYPE -> Criteria.Limits.queryConditions TABLE_SIZE -> Criteria.TableSizes.queryConditions @@ -151,7 +151,7 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { ) // Tournament - TOURNAMENT_TYPE -> arrayListOf() + TOURNAMENT_TYPE -> Criteria.TournamentTypes.queryConditions COMPLETION_PERCENTAGE -> arrayListOf() PLACE -> arrayListOf() PLAYERS_COUNT -> arrayListOf() @@ -159,10 +159,10 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { BUY_IN -> arrayListOf() - TOURNAMENT_NAME -> arrayListOf() - TOURNAMENT_FEATURE -> arrayListOf() - LOCATION -> arrayListOf() - BANKROLL -> arrayListOf() + TOURNAMENT_NAME -> Criteria.TournamentNames.queryConditions + TOURNAMENT_FEATURE -> Criteria.TournamentFeatures.queryConditions + LOCATION -> Criteria.Locations.queryConditions + BANKROLL -> Criteria.Bankrolls.queryConditions MULTI_TABLING -> arrayListOf() NUMBER_OF_PLAYERS -> arrayListOf() MULTI_PLAYER -> arrayListOf() From a983dc759851237daba5978430ed9ffba002f6fb Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 19 Apr 2019 11:19:30 +0200 Subject: [PATCH 3/6] Add formatting to graph axis --- .../pokeranalytics/android/calculus/Stat.kt | 35 +++++++---- .../android/ui/fragment/GraphFragment.kt | 11 +++- .../android/ui/graph/GraphExtensions.kt | 31 ++++++---- .../android/ui/graph/LargeNumberFormatter.kt | 32 ++++++++++ .../android/ui/view/RowViewType.kt | 3 +- .../util/extensions/NumbersExtension.kt | 22 ++++++- .../pokeranalytics/android/BasicUnitTest.kt | 34 +++++++++++ .../pokeranalytics/android/ExampleUnitTest.kt | 59 ------------------- 8 files changed, 142 insertions(+), 85 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/graph/LargeNumberFormatter.kt create mode 100644 app/src/test/java/net/pokeranalytics/android/BasicUnitTest.kt delete mode 100644 app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt 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 4e1aea9b..6a2d3401 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -4,6 +4,7 @@ import android.content.Context import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.FormattingException import net.pokeranalytics.android.model.interfaces.Timed +import net.pokeranalytics.android.ui.graph.AxisFormatting import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.NULL_TEXT @@ -40,14 +41,23 @@ enum class AggregationType { DURATION; val resId: Int - get() { - return when (this) { - SESSION -> R.string.session - MONTH -> R.string.month - YEAR -> R.string.year - DURATION -> R.string.duration + get() { + return when (this) { + SESSION -> R.string.session + MONTH -> R.string.month + YEAR -> R.string.year + DURATION -> R.string.duration + } } - } + + val axisFormatting: AxisFormatting + get() { + return when (this) { + DURATION -> AxisFormatting.X_DURATION + else -> AxisFormatting.DEFAULT + } + } + } /** @@ -195,10 +205,10 @@ enum class Stat : RowRepresentable { } - fun cumulativeLabelResId(context: Context) : String { + fun cumulativeLabelResId(context: Context): String { val resId = when (this) { AVERAGE, AVERAGE_DURATION, NET_BB_PER_100_HANDS, - HOURLY_RATE_BB, AVERAGE_NET_BB, ROI, WIN_RATIO, HOURLY_RATE -> R.string.average + HOURLY_RATE_BB, AVERAGE_NET_BB, ROI, WIN_RATIO, HOURLY_RATE -> R.string.average NUMBER_OF_SETS -> R.string.number_of_sessions NUMBER_OF_GAMES -> R.string.number_of_records NET_RESULT, DURATION -> R.string.total @@ -225,7 +235,12 @@ enum class Stat : RowRepresentable { val aggregationTypes: List get() { return when (this) { - NET_RESULT -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR, AggregationType.DURATION) + NET_RESULT -> 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) } 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 2492ed13..91240138 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 @@ -108,7 +108,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co GraphType.BAR -> BarChart(context) } - this.chartView.setStyle(false, requireContext()) + val axisFormatting = aggregationType.axisFormatting + this.chartView.setStyle(false, axisFormatting, requireContext()) this.chartContainer.addView(this.chartView) } @@ -118,7 +119,10 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co private fun loadGraph() { val graphEntries = when (aggregationType) { - AggregationType.SESSION, AggregationType.DURATION -> selectedReport.results.firstOrNull()?.defaultStatEntries(stat) + AggregationType.SESSION -> selectedReport.results.firstOrNull()?.defaultStatEntries(stat) + AggregationType.DURATION -> { + selectedReport.results.firstOrNull()?.durationEntries(stat) + } AggregationType.MONTH, AggregationType.YEAR -> { when (this.stat) { Stat.NUMBER_OF_GAMES, Stat.NUMBER_OF_SETS -> selectedReport.barEntries(this.stat) @@ -153,7 +157,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } } - this.chartView.setStyle(false, requireContext()) + val axisFormatting = aggregationType.axisFormatting + this.chartView.setStyle(false, axisFormatting, requireContext()) this.chartView.setOnChartValueSelectedListener(this) this.chartView.highlightValue((entries.size - 1).toFloat(), 0) 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 68aa648f..d667c35d 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 @@ -8,9 +8,16 @@ import com.github.mikephil.charting.components.XAxis import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.extensions.px +enum class AxisFormatting { + DEFAULT, + X_DURATION, + Y_DURATION, +} +fun BarLineChartBase<*>.setStyle(small: Boolean, axisFormatting: AxisFormatting = AxisFormatting.DEFAULT, context: Context) { -fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { + this.legend.isEnabled = false + this.description.isEnabled = false // X Axis this.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default) @@ -42,20 +49,22 @@ fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { 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.axisLeft.valueFormatter = LargeNumberFormatter() this.axisRight.isEnabled = false - this.legend.isEnabled = false - this.description.isEnabled = false this.data?.isHighlightEnabled = !small -// @todo -// if timeYAxis { -// this.axisLeft.valueFormatter = HourValueFormatter() -// } else { -// this.axisLeft.valueFormatter = LargeNumberFormatter() -// } -// - + when (axisFormatting) { + AxisFormatting.DEFAULT -> { + this.axisLeft.valueFormatter = LargeNumberFormatter() + } + AxisFormatting.X_DURATION -> { + this.xAxis.valueFormatter = HourFormatter() + } + AxisFormatting.Y_DURATION -> { + this.axisLeft.valueFormatter = HourFormatter() + } + } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/LargeNumberFormatter.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/LargeNumberFormatter.kt new file mode 100644 index 00000000..9c6fa0f3 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/LargeNumberFormatter.kt @@ -0,0 +1,32 @@ +package net.pokeranalytics.android.ui.graph + +import com.github.mikephil.charting.components.AxisBase +import com.github.mikephil.charting.formatter.ValueFormatter +import net.pokeranalytics.android.util.extensions.kmbFormatted + +class LargeNumberFormatter : ValueFormatter() { + + override fun getFormattedValue(value: Float): String { + return value.kmbFormatted + } + + override fun getAxisLabel(value: Float, axis: AxisBase?): String { + val test = value.kmbFormatted + return test + } + +} + +class HourFormatter : ValueFormatter() { + + override fun getFormattedValue(value: Float): String { + return value.kmbFormatted + "H" + } + + override fun getAxisLabel(value: Float, axis: AxisBase?): String { + val test = value.kmbFormatted + "H" + return test + } + +} + 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 c36d8028..6302008b 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 @@ -22,6 +22,7 @@ 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.AxisFormatting import net.pokeranalytics.android.ui.graph.PALineDataSet import net.pokeranalytics.android.ui.graph.setStyle import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable @@ -349,7 +350,7 @@ enum class RowViewType(private var layoutRes: Int) { it.addView(chartView) } - chartView.setStyle(true, context) + chartView.setStyle(true, AxisFormatting.DEFAULT, context) chartView.setTouchEnabled(false) chartView.highlightValue((entries.size - 1).toFloat(), 0) } 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 5e2bb841..9566e07a 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 @@ -2,11 +2,31 @@ package net.pokeranalytics.android.util.extensions import android.content.Context import net.pokeranalytics.android.R -import net.pokeranalytics.android.util.UserDefaults +import java.lang.Math.abs import java.text.DecimalFormat import java.text.NumberFormat import java.util.* +val Number.kmbFormatted: String + get() { + var thousandsExponent = 0 + var v = this.toDouble() + while (abs(v) >= 10000 && thousandsExponent < 3) { + v /= 1000 + thousandsExponent++ + } + + val unit = when(thousandsExponent) { + 0 -> "" + 1 -> "K" + 2 -> "M" + 3 -> "B" + else -> "B+" // shouldn't happen + } + + val formatter = NumberFormat.getInstance() + return formatter.format(v) + unit + } // Double diff --git a/app/src/test/java/net/pokeranalytics/android/BasicUnitTest.kt b/app/src/test/java/net/pokeranalytics/android/BasicUnitTest.kt new file mode 100644 index 00000000..0a2424f2 --- /dev/null +++ b/app/src/test/java/net/pokeranalytics/android/BasicUnitTest.kt @@ -0,0 +1,34 @@ +package net.pokeranalytics.android + +import net.pokeranalytics.android.util.extensions.kmbFormatted +import org.junit.Assert +import org.junit.Test + +class BasicUnitTest : RealmUnitTest() { + + @Test + fun testStats() { + Assert.assertEquals(0, 0) + } + + @Test + fun testFormatting() { + + val n1 = 100.0 + val n2 = 1000.0 + val n3 = n2 * n2 // 1M + val n4 = n3 * n2 // 1B + + val s1 = n1.kmbFormatted + val s2 = n2.kmbFormatted + val s3 = n3.kmbFormatted + val s4 = n4.kmbFormatted + + Assert.assertEquals("100", s1) + Assert.assertEquals("1K", s2) + Assert.assertEquals("1M", s3) + Assert.assertEquals("1B", s4) + + } + +} diff --git a/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt b/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt deleted file mode 100644 index c2cb85b7..00000000 --- a/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt +++ /dev/null @@ -1,59 +0,0 @@ -package net.pokeranalytics.android - -import org.junit.Assert -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ - -class ExampleUnitTest : RealmUnitTest() { - - @Test - fun testStats() { - Assert.assertEquals(0, 0) - } - - -// class Grade(someValue: Double) : SessionInterface { -// -// override var bbPer100Hands: Double = 0.0 -// override var ratedNet: Double = 0.0 -// override var value: Double = someValue -// -// override var sessionSet: SessionSet? = SessionSet() -// override var estimatedHands: Double = 0.0 -// override var bbNet: Double = 0.0 -// override var bigBlindSessionCount: Int = 0 // 0 or 1 -// override var ratedBuyin: Double = 0.0 -// -// } -// -// @Test -// fun testStats() { -// -// val grades: List = listOf(Grade(10.0), Grade(20.0)) -// val group = ComputableGroup(name = "test", computables = grades) -// -// val results: ComputedResults = Calculator.compute(group, Calculator.Options()) -// -// val sum = results.computedStat(Stat.NET_RESULT) -// if (sum != null) { -// assert(sum.value == 0.0) { "sum is ${sum.value}" } -// } else { -// fail("No Net result stat") -// } -// -// val average = results.computedStat(Stat.AVERAGE) -// if (average != null) { -// assert(average.value == 0.0) { "average is ${average.value}" } -// } else { -// fail("No AVERAGE stat") -// } -// -// } - - -} From ca2ef99609cbdb8cf4350d55083dfde9e7054b00 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 19 Apr 2019 11:23:41 +0200 Subject: [PATCH 4/6] code cleanup --- .../net/pokeranalytics/android/calculus/Report.kt | 2 +- .../java/net/pokeranalytics/android/calculus/Stat.kt | 6 +++--- .../pokeranalytics/android/model/realm/Session.kt | 2 +- .../pokeranalytics/android/model/realm/SessionSet.kt | 12 ++++++------ .../android/ui/fragment/GraphFragment.kt | 2 +- .../android/ui/fragment/StatsFragment.kt | 4 ++-- .../pokeranalytics/android/ui/view/RowViewType.kt | 6 +++--- .../pokeranalytics/android/ui/view/SessionRowView.kt | 2 +- .../android/ui/view/TransactionRowView.kt | 2 +- 9 files changed, 19 insertions(+), 19 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 4876b646..49fa3454 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -391,7 +391,7 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu override fun formattedValue(stat: Stat, context: Context): TextFormat { this.computedStat(stat)?.let { - return it.format(context) + return it.format() } ?: run { throw IllegalStateException("Missing stat in results") } 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 6a2d3401..c9f76c35 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -157,7 +157,7 @@ enum class Stat : RowRepresentable { /** * Formats the value of the stat to be suitable for display */ - fun format(value: Double, secondValue: Double? = null, currency: Currency? = null, context: Context): TextFormat { + fun format(value: Double, secondValue: Double? = null, currency: Currency? = null): TextFormat { if (value.isNaN()) { return TextFormat(NULL_TEXT, R.color.white) @@ -297,8 +297,8 @@ class ComputedStat(var stat: Stat, var value: Double, var secondValue: Double? = /** * Formats the value of the stat to be suitable for display */ - fun format(context: Context): TextFormat { - return this.stat.format(this.value, this.secondValue, this.currency, context) + fun format(): TextFormat { + return this.stat.format(this.value, this.secondValue, this.currency) } } 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 9d983688..9e99cfcc 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 @@ -950,7 +950,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } value?.let { - return stat.format(it, currency = currency, context = context) + return stat.format(it, currency = currency) } ?: 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 562724b8..e2777e86 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,15 +120,15 @@ open class SessionSet() : RealmObject(), Timed, Filterable { override fun formattedValue(stat: Stat, context: Context) : TextFormat { return when (stat) { - Stat.NET_RESULT, 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_RESULT, Stat.AVERAGE -> stat.format(this.ratedNet, currency = null) + Stat.DURATION, Stat.AVERAGE_DURATION -> stat.format(this.netDuration.toDouble(), currency = null) + Stat.HOURLY_RATE -> stat.format(this.hourlyRate, currency = null) + Stat.HANDS_PLAYED -> stat.format(this.estimatedHands, currency = null) + Stat.HOURLY_RATE_BB -> stat.format(this.bbHourlyRate, currency = null) 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) + return stat.format(this.estimatedHands, currency = null) } 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 91240138..62fabad5 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 @@ -84,7 +84,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co val formattedDate = it.entryTitle val entryValue = it.formattedValue(this.stat, requireContext()) - val totalStatValue = this.stat.format(entry.y.toDouble(), currency = null, context = requireContext()) + val totalStatValue = this.stat.format(entry.y.toDouble(), currency = null) 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 2d28347e..94993c8a 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 @@ -77,7 +77,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc if (row is StatRow) { context?.let { context -> row.computedStat?.let { - dc.textFormat = it.format(context) + dc.textFormat = it.format() } } } @@ -87,7 +87,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc override fun statFormatForRow(row: RowRepresentable): TextFormat { if (row is StatRow) { context?.let { context -> - row.computedStat?.let { return it.format(context) } + row.computedStat?.let { return it.format() } } } return TextFormat(NULL_TEXT) 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 6302008b..fd5040cc 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 @@ -136,7 +136,7 @@ enum class RowViewType(private var layoutRes: Int) { // Value itemView.findViewById(R.id.value)?.let { if (row.computedStat != null) { - val format = row.computedStat!!.format(itemView.context) + val format = row.computedStat!!.format() it.setTextFormat(format, itemView.context) } else if (row.value != null) { it.text = row.value @@ -279,7 +279,7 @@ enum class RowViewType(private var layoutRes: Int) { itemView.findViewById(R.id.stat1Value)?.let { view -> view.text = "" - row.computedStat1?.format(view.context)?.let { + row.computedStat1?.format()?.let { view.setTextFormat(it, itemView.context) } } @@ -294,7 +294,7 @@ enum class RowViewType(private var layoutRes: Int) { itemView.findViewById(R.id.stat2Value)?.let { view -> view.text = "" - row.computedStat2?.format(view.context)?.let { + row.computedStat2?.format()?.let { view.setTextFormat(it, itemView.context) } } 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 3fb91cac..9920cbee 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 @@ -149,7 +149,7 @@ class SessionRowView : FrameLayout { rowHistorySession.infoTitle.isVisible = false val result = session.result?.net ?: 0.0 - val formattedStat = ComputedStat(Stat.NET_RESULT, result, currency = session.currency).format(context) + val formattedStat = ComputedStat(Stat.NET_RESULT, result, currency = session.currency).format() rowHistorySession.gameResult.setTextFormat(formattedStat, context) } 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 aa3182b4..f9971876 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 @@ -63,7 +63,7 @@ class TransactionRowView : FrameLayout { rowTransaction.transactionSubtitle.text = subtitle // Amount - val formattedStat = ComputedStat(Stat.NET_RESULT, transaction.amount).format(context) + val formattedStat = ComputedStat(Stat.NET_RESULT, transaction.amount).format() rowTransaction.transactionAmount.setTextFormat(formattedStat, context) } From cd00e9b45a516403153f77e4a8a2244f60fad419 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 19 Apr 2019 11:32:13 +0200 Subject: [PATCH 5/6] fix issue with filter selection --- .../pokeranalytics/android/model/realm/Filter.kt | 6 ++++++ .../android/ui/fragment/FilterDetailsFragment.kt | 15 ++++++--------- 2 files changed, 12 insertions(+), 9 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 f0638976..106831ba 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 @@ -93,6 +93,12 @@ open class Filter : RealmObject() { } } + fun remove(filterCategoryRow: FilterCategoryRow) { + val sections = filterCategoryRow.filterSectionRows.map { it.name } + val savedSections = filterConditions.filter { sections.contains(it.sectionName) } + this.filterConditions.removeAll(savedSections) + } + fun countBy(filterCategoryRow: FilterCategoryRow): Int { val sections = filterCategoryRow.filterSectionRows.map { it.name } println("list of sections $sections") 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 7dbc53a1..80c89ba8 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 @@ -38,14 +38,14 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent lateinit var parentActivity: PokerAnalyticsActivity lateinit var rowRepresentableAdapter: RowRepresentableAdapter + private lateinit var primaryKey: String + private lateinit var filterCategoryRow: FilterCategoryRow private var currentFilter: Filter? = null private var rows: ArrayList = ArrayList() private var rowsForFilterSubcategoryRow: HashMap> = HashMap() - private var primaryKey: String? = null private var filterMenu: Menu? = null - private var filterCategoryRow: FilterCategoryRow? = null private val selectedRows = ArrayList() private var isUpdating = false private var shouldOpenKeyboard = true @@ -174,17 +174,14 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent */ private fun initData() { - primaryKey?.let { - currentFilter = Filter.getFilterBydId(getRealm(), it) - } + currentFilter = Filter.getFilterBydId(getRealm(), primaryKey) - filterCategoryRow?.let { - this.appBar.toolbar.title = it.localizedTitle(requireContext()) + this.appBar.toolbar.title = filterCategoryRow.localizedTitle(requireContext()) this.rows.clear() this.rowsForFilterSubcategoryRow.clear() - this.rows.addAll(it.filterElements) + this.rows.addAll(filterCategoryRow.filterElements) this.rows.forEach { element -> if (element is QueryCondition && currentFilter?.contains(element) == true) { @@ -195,7 +192,6 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) this.recyclerView.adapter = rowRepresentableAdapter - } } /** @@ -238,6 +234,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresent val realm = getRealm() realm.beginTransaction() + currentFilter?.remove(filterCategoryRow) currentFilter?.createOrUpdateFilterConditions(selectedRows) realm.commitTransaction() From 07acd7a980e5fdc94decd90cbadb666ec18995bf Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 19 Apr 2019 11:57:41 +0200 Subject: [PATCH 6/6] fix issue with calendar display add a new name interface for query condition --- .../android/PokerAnalyticsApplication.kt | 2 +- .../android/model/filter/QueryCondition.kt | 17 +++++++++++++++-- .../android/ui/fragment/CalendarFragment.kt | 4 +++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 1c9b7d94..75c03014 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -52,7 +52,7 @@ class PokerAnalyticsApplication : Application() { if (BuildConfig.DEBUG) { Timber.d("UserPreferences.defaultCurrency: ${UserDefaults.currency.symbol}") - //this.createFakeSessions() + this.createFakeSessions() } Patcher.patchBreaks() 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 045b55cf..f4a0d7e3 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 @@ -17,11 +17,12 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow 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.* import kotlin.collections.ArrayList fun List.name() : String { - return this.map { it.id }.joinToString(" / ") + return this.map { it.label() }.joinToString(" / ") } //inline fun List.query(realm: Realm): RealmQuery { @@ -43,7 +44,11 @@ inline fun List.queryWith(query: RealmQ * A new type should also set the expected numericValues required in the [filterValuesExpectedKeys] */ -sealed class QueryCondition : FilterElementRow { +interface Labelable { + fun label() : String +} + +sealed class QueryCondition : FilterElementRow, Labelable { interface Valuable > { var values: ArrayList? @@ -107,6 +112,14 @@ sealed class QueryCondition : FilterElementRow { } } + override fun label(): String { + return when (this) { + is YEAR -> "$intValue" + is MONTH -> DateFormatSymbols.getInstance(Locale.getDefault()).months[intValue] + else -> baseId + } + } + override var filterSectionRow: FilterSectionRow = FilterSectionRow.CASH_TOURNAMENT open class OperationQueryCondition : QueryCondition(), asDoubleValue { 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 6dcc9294..a88f35d6 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 @@ -240,6 +240,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep // Compute data per YEAR and MONTH + println(">>>> ${Comparator.MONTH_OF_YEAR.queryConditions.map { it.id }}") + 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() @@ -255,7 +257,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep conditions.forEach { condition -> when (condition) { is QueryCondition.YEAR -> calendar.set(Calendar.YEAR, condition.intValue) - is QueryCondition.MONTH -> calendar.set(Calendar.YEAR, condition.intValue) + is QueryCondition.MONTH -> calendar.set(Calendar.MONTH, condition.intValue) } }