From 2b4fcb0a3d1019bbb93ac428de838f8b99bd06c1 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 15 May 2019 18:34:08 +0200 Subject: [PATCH] Refactoring of getDisplayName to have a Context passed + Custom Report display --- .../android/calculus/Calculator.kt | 19 +- .../pokeranalytics/android/calculus/Report.kt | 22 +- .../net/pokeranalytics/android/model/Limit.kt | 3 +- .../pokeranalytics/android/model/TableSize.kt | 2 +- .../android/model/TournamentType.kt | 3 +- .../android/model/filter/Query.kt | 15 +- .../android/model/filter/QueryCondition.kt | 49 ++-- .../android/model/realm/Bankroll.kt | 3 +- .../android/model/realm/CustomField.kt | 3 +- .../android/model/realm/CustomFieldEntry.kt | 2 +- .../android/model/realm/Filter.kt | 6 +- .../android/model/realm/Game.kt | 3 +- .../android/model/realm/Location.kt | 3 +- .../android/model/realm/ReportSetup.kt | 3 +- .../android/model/realm/Session.kt | 20 +- .../android/model/realm/SessionSet.kt | 8 +- .../android/model/realm/TournamentFeature.kt | 3 +- .../android/model/realm/TournamentName.kt | 3 +- .../android/model/realm/Transaction.kt | 8 +- .../android/model/realm/TransactionType.kt | 3 +- .../android/ui/activity/HomeActivity.kt | 9 +- .../ui/activity/ProgressReportActivity.kt | 2 +- .../ui/activity/TableReportActivity.kt | 12 +- .../android/ui/adapter/ReportPagerAdapter.kt | 4 +- .../ui/fragment/BankrollDetailsFragment.kt | 3 +- .../android/ui/fragment/BankrollFragment.kt | 1 - .../android/ui/fragment/CalendarFragment.kt | 1 - .../android/ui/fragment/CurrenciesFragment.kt | 3 +- .../android/ui/fragment/MoreFragment.kt | 2 +- .../android/ui/fragment/ReportsFragment.kt | 3 +- .../android/ui/fragment/StatisticsFragment.kt | 66 +++--- .../fragment/report/AbstractReportFragment.kt | 11 + .../report/ComparisonReportFragment.kt | 29 +-- .../report/ComposableTableReportFragment.kt | 221 ++++++++++++++++++ .../fragment/report/ProgressReportFragment.kt | 9 +- .../ui/fragment/report/TableReportFragment.kt | 216 +++-------------- .../android/ui/graph/GraphUnderlyingEntry.kt | 6 +- .../android/ui/view/RowRepresentable.kt | 2 +- .../android/ui/view/RowViewType.kt | 2 +- ...tails.xml => activity_progress_report.xml} | 0 .../fragment_composable_table_report.xml | 17 ++ app/src/main/res/layout/fragment_stats.xml | 26 ++- .../main/res/layout/fragment_table_report.xml | 27 +++ 43 files changed, 504 insertions(+), 349 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComposableTableReportFragment.kt rename app/src/main/res/layout/{activity_statistic_details.xml => activity_progress_report.xml} (100%) create mode 100644 app/src/main/res/layout/fragment_composable_table_report.xml create mode 100644 app/src/main/res/layout/fragment_table_report.xml 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 3633315c..223b1af4 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.calculus +import android.content.Context import io.realm.Realm import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat.* @@ -14,7 +15,6 @@ import net.pokeranalytics.android.model.realm.ReportSetup import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.util.extensions.startOfDay -import timber.log.Timber import java.util.* import kotlin.math.max import kotlin.math.min @@ -151,15 +151,14 @@ class Calculator { } /** - * Returns some default generated name + * Returns some default name */ - val defaultName: String - get() { - val statName = this.stats.firstOrNull()?.let { - it.getDisplayName() - } - return statName ?: this.query.name + fun getName(context: Context): String { + return when (this.stats.size) { + 1 -> this.stats.first().localizedTitle(context) + else -> this.query.getName(context) } + } } @@ -244,7 +243,7 @@ class Calculator { val e = Date() val duration = (e.time - s.time) / 1000.0 - Timber.d(">>> group ${group.name} in $duration seconds") +// Timber.d(">>> group ${group.name} in $duration seconds") } @@ -259,7 +258,7 @@ class Calculator { val results = ComputedResults(computableGroup, options.shouldManageMultiGroupProgressValues) val computables = computableGroup.computables(realm, options.shouldSortValues) - Timber.d(">>>> Start computing group ${computableGroup.name}, ${computables.size} computables") +// Timber.d(">>>> Start computing group ${computableGroup.name}, ${computables.size} computables") results.addStat(NUMBER_OF_GAMES, computables.size.toDouble()) val sum = computables.sum(ComputableResult.Field.RATED_NET.identifier).toDouble() 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 0307f39a..73bcc3ba 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -106,10 +106,10 @@ class ComputableGroup(query: Query, stats: List? = null) { /** * The display name of the group */ - val name: String - get() { - return this.query.name - } +// val name: String +// get() { +// return this.query.name +// } /** * A list of _conditions to get @@ -386,7 +386,7 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu entries.add(Entry(index.toFloat(), p.y.toFloat(), p.data)) } } - return DataSetFactory.lineDataSetInstance(entries, this.group.name, context) + return DataSetFactory.lineDataSetInstance(entries, this.group.query.getName(context), context) } fun durationEntries(stat: Stat, context: Context): LineDataSet { @@ -449,7 +449,9 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu // Stat Entry - override val entryTitle: String = this.group.name + override fun entryTitle(context: Context): String { + return this.group.query.getName(context) + } override fun formattedValue(stat: Stat): TextFormat { this.computedStat(stat)?.let { @@ -473,12 +475,12 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu return when (stat) { Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES, Stat.WIN_RATIO -> { val totalStatValue = stat.format(entry.y.toDouble(), currency = null) - DefaultLegendValues(this.entryTitle, totalStatValue) + DefaultLegendValues(this.entryTitle(context), totalStatValue) } else -> { val entryValue = this.formattedValue(stat) val countValue = this.computedStat(Stat.NUMBER_OF_GAMES)?.format() - DefaultLegendValues(this.entryTitle, entryValue, countValue) + DefaultLegendValues(this.entryTitle(context), entryValue, countValue) } } } @@ -487,12 +489,12 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu return when (stat) { Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES, Stat.WIN_RATIO -> { val totalStatValue = stat.format(entry.y.toDouble(), currency = null) - DefaultLegendValues(this.entryTitle, totalStatValue) + DefaultLegendValues(this.entryTitle(context), totalStatValue) } else -> { val entryValue = this.formattedValue(stat) val totalStatValue = stat.format(entry.y.toDouble(), currency = null) - DefaultLegendValues(this.entryTitle, entryValue, totalStatValue) + DefaultLegendValues(this.entryTitle(context), entryValue, totalStatValue) } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/Limit.kt b/app/src/main/java/net/pokeranalytics/android/model/Limit.kt index d99031d8..86515b79 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Limit.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Limit.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model +import android.content.Context import net.pokeranalytics.android.ui.view.RowRepresentable enum class Limit : RowRepresentable { @@ -32,7 +33,7 @@ enum class Limit : RowRepresentable { } } - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return this.longName } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt b/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt index c1bba39f..91d6f499 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt @@ -14,7 +14,7 @@ class TableSize(var numberOfPlayer: Int, var rowViewType: Int = RowViewType.TITL } } - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return if (this.numberOfPlayer == 2) { return "HU" } else { diff --git a/app/src/main/java/net/pokeranalytics/android/model/TournamentType.kt b/app/src/main/java/net/pokeranalytics/android/model/TournamentType.kt index 64a22295..4d6b2ebe 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/TournamentType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/TournamentType.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model +import android.content.Context import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -23,7 +24,7 @@ enum class TournamentType : RowRepresentable { } } - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return when (this) { MTT -> "MTT" SNG -> "SNG" diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt index ffcfdd62..0e4d9104 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt @@ -1,6 +1,8 @@ package net.pokeranalytics.android.model.filter +import android.content.Context import io.realm.RealmQuery +import net.pokeranalytics.android.R fun List.mapFirstCondition() : List { return this.map { it.conditions.first() } @@ -38,10 +40,17 @@ class Query { this._conditions.addAll(queryConditions) } - val name: String - get() { - return this._conditions.joinToString(" : ") { it.getDisplayName() } + fun getName(context: Context): String { + return when (this._conditions.size) { + 0 -> context.getString(R.string.all_sessions) // @todo should be dependant of the underlying type, ie. Session, Transaction... + else -> this._conditions.joinToString(" : ") { it.getDisplayName(context) } } + } + +// val name: String +// get() { +// return this._conditions.joinToString(" : ") { it.getDisplayName() } +// } inline fun queryWith(query: RealmQuery): RealmQuery { var realmQuery = query 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 88be28b0..619d5205 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,5 +1,6 @@ package net.pokeranalytics.android.model.filter +import android.content.Context import io.realm.Realm import io.realm.RealmQuery import io.realm.RealmResults @@ -106,12 +107,12 @@ sealed class QueryCondition : FilterElementRow { abstract class ListOfValues: QueryCondition(), Comparable> where T:Comparable { abstract var listOfValues: ArrayList - abstract fun labelForValue(value:T): String + abstract fun labelForValue(value:T, context: Context): String - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return when (listOfValues.size) { 0 -> return NULL_TEXT - 1,2 -> listOfValues.map { labelForValue(it) }.joinToString(", ") + 1,2 -> listOfValues.map { labelForValue(it, context) }.joinToString(", ") else -> "${listOfValues.size} $baseId" } } @@ -134,7 +135,7 @@ sealed class QueryCondition : FilterElementRow { super.updateValueBy(filterCondition) listOfValues = filterCondition.getValues() } - override fun labelForValue(value: Double): String { + override fun labelForValue(value: Double, context: Context): String { return value.toCurrency(UserDefaults.currency) } } @@ -145,14 +146,14 @@ sealed class QueryCondition : FilterElementRow { super.updateValueBy(filterCondition) listOfValues = filterCondition.getValues() } - override fun labelForValue(value: Int): String { + override fun labelForValue(value: Int, context: Context): String { return value.toString() } } abstract class ListOfString: ListOfValues() { override var listOfValues = ArrayList() - override fun labelForValue(value: String): String { return value } + override fun labelForValue(value: String, context: Context): String { return value } override fun updateValueBy(filterCondition: FilterCondition) { super.updateValueBy(filterCondition) listOfValues = filterCondition.getValues() @@ -160,7 +161,7 @@ sealed class QueryCondition : FilterElementRow { } abstract class SingleDate: SingleValue() { - override fun labelForValue(value: Date): String { + override fun labelForValue(value: Date, context: Context): String { return value.toString() } @@ -175,7 +176,7 @@ sealed class QueryCondition : FilterElementRow { } abstract class SingleInt: SingleValue() { - override fun labelForValue(value: Int): String { + override fun labelForValue(value: Int, context: Context): String { return value.toString() } override var singleValue: Int @@ -188,7 +189,7 @@ sealed class QueryCondition : FilterElementRow { } } - override fun getDisplayName(): String { return baseId } + override fun getDisplayName(context: Context): String { return baseId } override var filterSectionRow: FilterSectionRow = FilterSectionRow.CASH_TOURNAMENT @@ -200,7 +201,7 @@ sealed class QueryCondition : FilterElementRow { abstract val entity : Class - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { val realm = Realm.getDefaultInstance() val completeLabel = when (listOfValues.size) { 0 -> return NULL_TEXT @@ -234,19 +235,19 @@ sealed class QueryCondition : FilterElementRow { } object IsLive : QueryCondition() { - override fun getDisplayName(): String { return "Live" } + override fun getDisplayName(context: Context): String { return "Live" } } object IsCash : QueryCondition() { - override fun getDisplayName(): String { return "Cash" } + override fun getDisplayName(context: Context): String { return "Cash" } } object IsOnline : QueryCondition() { - override fun getDisplayName(): String { return "Online" } + override fun getDisplayName(context: Context): String { return "Online" } } object IsTournament : QueryCondition() { - override fun getDisplayName(): String { return "Tournament" } + override fun getDisplayName(context: Context): String { return "Tournament" } } class AnyBankroll(): QueryDataCondition() { @@ -300,20 +301,20 @@ sealed class QueryCondition : FilterElementRow { } class AnyLimit: ListOfInt() { - override fun labelForValue(value: Int): String { - return Limit.values()[value].getDisplayName() + override fun labelForValue(value: Int, context: Context): String { + return Limit.values()[value].getDisplayName(context) } } class AnyTableSize: ListOfInt() { - override fun labelForValue(value: Int): String { - return TableSize(value).getDisplayName() + override fun labelForValue(value: Int, context: Context): String { + return TableSize(value).getDisplayName(context) } } class AnyTournamentType: ListOfInt() { - override fun labelForValue(value: Int): String { - return TournamentType.values()[value].getDisplayName() + override fun labelForValue(value: Int, context: Context): String { + return TournamentType.values()[value].getDisplayName(context) } } @@ -350,13 +351,13 @@ sealed class QueryCondition : FilterElementRow { class EndedToDate: DateQuery() { override var operator = Operator.LESS } class AnyDayOfWeek: ListOfInt() { - override fun labelForValue(value: Int): String { + override fun labelForValue(value: Int, context: Context): String { return DateFormatSymbols.getInstance(Locale.getDefault()).weekdays[value] } } class AnyMonthOfYear(): ListOfInt() { - override fun labelForValue(value: Int): String { + override fun labelForValue(value: Int, context: Context): String { return DateFormatSymbols.getInstance(Locale.getDefault()).months[value] } @@ -366,7 +367,7 @@ sealed class QueryCondition : FilterElementRow { } class AnyYear(): ListOfInt() { - override fun labelForValue(value: Int): String { + override fun labelForValue(value: Int, context: Context): String { return "$value" } @@ -385,7 +386,7 @@ sealed class QueryCondition : FilterElementRow { object DuringThisYear: QueryCondition() class TournamentFee: ListOfDouble() { - override fun labelForValue(value: Double): String { + override fun labelForValue(value: Double, context: Context): String { return value.toCurrency(UserDefaults.currency) } } 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 7d69c508..2f54f7d9 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 @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.Realm import io.realm.RealmObject import io.realm.RealmResults @@ -42,7 +43,7 @@ open class Bankroll : RealmObject(), NameManageable, RowRepresentable { return this.currency?.rate ?: 1.0 } - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return this.name } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt index 0a6f59e4..e8c6188b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.Realm import io.realm.RealmList import io.realm.RealmObject @@ -48,7 +49,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa // @todo - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return this.name } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt index fed2340d..1fdc9a7e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt @@ -31,7 +31,7 @@ open class CustomFieldEntry : RealmObject(), RowRepresentable { return context.getString(R.string.value) } - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return if (value.isNotEmpty()) value else NULL_TEXT } 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 a4588e04..a9071b0e 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 @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.* import io.realm.annotations.PrimaryKey import io.realm.kotlin.where @@ -151,9 +152,8 @@ open class Filter : RealmObject(), RowRepresentable { return query } - - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { if (name.isNotEmpty()) return name - return this.query.name + return this.query.getName(context) } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index bfb54b51..2334baa0 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -47,7 +48,7 @@ open class Game : RealmObject(), NameManageable, StaticRowRepresentableDataSourc return this.name } - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return this.name } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index acbf0c63..878486ca 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import com.google.android.libraries.places.api.model.Place import io.realm.Realm import io.realm.RealmObject @@ -30,7 +31,7 @@ open class Location : RealmObject(), NameManageable, RowRepresentable { // the latitude of the location var latitude: Double? = null - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return this.name } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt index ccbaca2c..b63a205c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.Ignore @@ -40,7 +41,7 @@ open class ReportSetup : RealmObject(), RowRepresentable { var filter: Filter? = null // RowRepresentable - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return this.name } 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 18c02c44..c91d5b8b 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 @@ -12,7 +12,10 @@ import io.realm.annotations.LinkingObjects import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R -import net.pokeranalytics.android.calculus.* +import net.pokeranalytics.android.calculus.ComputedStat +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.calculus.StatFormattingException +import net.pokeranalytics.android.calculus.TextFormat import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.LiveData @@ -572,7 +575,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat @Ignore override val viewType: Int = RowViewType.ROW_SESSION.ordinal - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return "Session ${this.creationDate}" } @@ -689,7 +692,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } } SessionRow.TOURNAMENT_NAME -> tournamentName?.name ?: NULL_TEXT - else -> throw UnmanagedRowRepresentableException("Unmanaged row = ${row.getDisplayName()}") + else -> throw UnmanagedRowRepresentableException("Unmanaged row = ${row}") } } @@ -922,10 +925,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // Stat Entry - override val entryTitle: String - get() { - return DateFormat.getDateInstance(DateFormat.SHORT).format(this.startDate) - } + override fun entryTitle(context: Context): String { + return DateFormat.getDateInstance(DateFormat.SHORT).format(this.startDate) + } override fun formattedValue(stat: Stat): TextFormat { @@ -980,7 +982,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat val secondTitle = stat.localizedTitle(context) val entryValue = this.formattedValue(stat) - val dateValue = TextFormat(this.entryTitle) + val dateValue = TextFormat(this.entryTitle(context)) @@ -1001,7 +1003,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } } - DefaultLegendValues(this.entryTitle, left, right) + DefaultLegendValues(this.entryTitle(context), left, right) } else -> { super.legendValues(stat, entry, style, groupName, context) 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 fea9c1c8..ee0e43b5 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 @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.Realm import io.realm.RealmObject import io.realm.RealmResults @@ -114,10 +115,9 @@ open class SessionSet() : RealmObject(), Timed, Filterable { // Stat Base - override val entryTitle: String - get() { - return DateFormat.getDateInstance(DateFormat.SHORT).format(this.startDate) - } + override fun entryTitle(context: Context): String { + return DateFormat.getDateInstance(DateFormat.SHORT).format(this.startDate) + } override fun formattedValue(stat: Stat) : TextFormat { return when (stat) { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index 9ad58aad..95e6aaaa 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -38,7 +39,7 @@ open class TournamentFeature : RealmObject(), NameManageable, StaticRowRepresent // CountableUsage override var useCount: Int = 0 - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return this.name } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt index 1e7f21b9..5fe708c2 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -33,7 +34,7 @@ open class TournamentName : RealmObject(), NameManageable, StaticRowRepresentabl // The name of the tournament override var name: String = "" - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return this.name } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt index c37db354..0ae2ce7d 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.Ignore @@ -127,10 +128,9 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo // GraphUnderlyingEntry - override val entryTitle: String - get() { - return DateFormat.getDateInstance(DateFormat.SHORT).format(this.date) - } + override fun entryTitle(context: Context): String { + return DateFormat.getDateInstance(DateFormat.SHORT).format(this.date) + } override fun formattedValue(stat: Stat): TextFormat { return stat.format(this.amount) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index 8705eb16..d511ca28 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import android.content.Context import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey @@ -56,7 +57,7 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab // The predefined kind, if necessary, like: Withdrawal, deposit, or tips var kind: Int? = null - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return this.name } 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 bae6aa87..21d163a8 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 @@ -114,11 +114,12 @@ class HomeActivity : PokerAnalyticsActivity() { this.currencies = realm.where(Currency::class.java).findAll() this.currencies.addChangeListener { t, _ -> - realm.beginTransaction() - t.forEach { - it.refreshRelatedRatedValues() + realm.executeTransaction { + t.forEach { + it.refreshRelatedRatedValues() + } } - realm.commitTransaction() + } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt index 83c34102..dd61d2fe 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt @@ -34,7 +34,7 @@ class ProgressReportActivity : PokerAnalyticsActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_statistic_details) + setContentView(R.layout.activity_progress_report) initUI() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt index bdb070f5..adc357a7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt @@ -39,13 +39,11 @@ class TableReportActivity : PokerAnalyticsActivity() { */ private fun initUI() { - report?.let { - val fragmentTransaction = supportFragmentManager.beginTransaction() - val fragment = TableReportFragment.newInstance(it) - fragmentTransaction.add(R.id.reportDetailsContainer, fragment) - fragmentTransaction.commit() - report = null - } + val fragmentTransaction = supportFragmentManager.beginTransaction() + val fragment = TableReportFragment.newInstance(report, reportTitle) + fragmentTransaction.add(R.id.reportDetailsContainer, fragment) + fragmentTransaction.commit() + report = null } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt index 76bd436b..4d20ee9d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt @@ -9,7 +9,7 @@ import androidx.viewpager.widget.PagerAdapter import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.ui.fragment.GraphFragment -import net.pokeranalytics.android.ui.fragment.report.TableReportFragment +import net.pokeranalytics.android.ui.fragment.report.ComposableTableReportFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import java.lang.ref.WeakReference @@ -31,7 +31,7 @@ class ReportPagerAdapter(val context: Context, val fragmentManager: FragmentMana GraphFragment.newInstance(lineDataSets = dataSetList, style = GraphFragment.Style.MULTILINE) } 2 -> { - TableReportFragment.newInstance(report) + ComposableTableReportFragment.newInstance(report) } else -> PokerAnalyticsFragment() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt index e00b07ff..7d0e195c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt @@ -6,7 +6,6 @@ import android.os.Bundle import android.view.* import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.fragment_bankroll.* -import kotlinx.android.synthetic.main.fragment_stats.recyclerView import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.Stat @@ -116,7 +115,7 @@ class BankrollDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.operations)) bankrollReport.transactionBuckets.keys.forEach { key -> bankrollReport.transactionBuckets[key]?.let { transactionBucket -> - val typeName = transactionBucket.transactions.firstOrNull()?.type?.getDisplayName() + val typeName = transactionBucket.transactions.firstOrNull()?.type?.getDisplayName(requireContext()) val computedStat = ComputedStat(Stat.NET_RESULT, transactionBucket.total) rows.add(CustomizableRowRepresentable(RowViewType.TITLE_VALUE, title = typeName, computedStat = computedStat)) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt index 9deb5983..6ca073e9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt @@ -11,7 +11,6 @@ import com.github.mikephil.charting.data.LineDataSet import io.realm.RealmObject import io.realm.RealmResults import kotlinx.android.synthetic.main.fragment_bankroll.* -import kotlinx.android.synthetic.main.fragment_stats.recyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay 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 da922db1..04e7087a 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,7 +8,6 @@ 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 import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope 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 ff562e31..9f0e6ede 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 @@ -1,6 +1,7 @@ package net.pokeranalytics.android.ui.fragment import android.app.Activity +import android.content.Context import android.content.Intent import android.os.Bundle import android.view.LayoutInflater @@ -63,7 +64,7 @@ class CurrenciesFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataS private class CurrencyRow(var currency:Currency) : RowRepresentable { - override fun getDisplayName(): String { + override fun getDisplayName(context: Context): String { return currency.getDisplayName(Locale.getDefault()).capitalize() } 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 faa0d030..997ff82c 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 @@ -5,7 +5,7 @@ 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_more.* import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.BankrollActivity import net.pokeranalytics.android.ui.activity.SettingsActivity 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 54b3be17..8ad564ff 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 @@ -11,7 +11,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import io.realm.Realm import io.realm.RealmResults import kotlinx.android.synthetic.main.fragment_data_list.* -import kotlinx.android.synthetic.main.fragment_stats.recyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -75,7 +74,7 @@ class ReportsFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRe if (requestCode == ReportCreationActivity.RequestCode.NEW_REPORT.ordinal && resultCode == Activity.RESULT_OK) { ReportCreationActivity.options?.let { options -> - this.launchReportWithOptions(options, options.defaultName) + this.launchReportWithOptions(options, options.getName(requireContext())) } ReportCreationActivity.options = null } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt index 6077d2fd..ca28348e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt @@ -3,12 +3,15 @@ package net.pokeranalytics.android.ui.fragment import android.app.Activity import android.content.Intent import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import io.realm.Realm import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async import kotlinx.coroutines.launch +import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.Report @@ -17,36 +20,29 @@ import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.FiltersActivity -import net.pokeranalytics.android.ui.fragment.report.TableReportFragment +import net.pokeranalytics.android.ui.fragment.components.ResultsObserverFragment +import net.pokeranalytics.android.ui.fragment.report.ComposableTableReportFragment import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterHandler import net.pokeranalytics.android.ui.interfaces.FilterableType -import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import timber.log.Timber import java.util.* import kotlin.coroutines.CoroutineContext -class StatisticsFragment : TableReportFragment(), FilterHandler { +class StatisticsFragment : ResultsObserverFragment(), FilterHandler { - override val coroutineContext: CoroutineContext + val coroutineContext: CoroutineContext get() = Dispatchers.Main - private var stringAll = "" - private var stringCashGame = "" - private var stringTournament = "" + private lateinit var tableReportFragment: ComposableTableReportFragment companion object { /** * Create new instance */ - fun newInstance(report: Report? = null): StatisticsFragment { + fun newInstance(): StatisticsFragment { val fragment = StatisticsFragment() - report?.let { - fragment.report = it - } val bundle = Bundle() fragment.arguments = bundle return fragment @@ -55,26 +51,39 @@ class StatisticsFragment : TableReportFragment(), FilterHandler { // Life Cycle + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + super.onCreateView(inflater, container, savedInstanceState) + return inflater.inflate(R.layout.fragment_stats, container, false) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + initUI() launchStatComputation() } + private fun initUI() { + val fragmentTransaction = requireFragmentManager().beginTransaction() + val fragment = ComposableTableReportFragment.newInstance(null) + fragmentTransaction.add(R.id.tableContainer, fragment) + fragmentTransaction.commit() + this.tableReportFragment = fragment + } + override fun sessionsChanged() { this.launchStatComputation() - this.statsAdapter?.notifyDataSetChanged() } - override fun convertReportIntoRepresentables(report: Report): ArrayList { - val rows: ArrayList = ArrayList() - report.results.forEach { result -> - rows.add(CustomizableRowRepresentable(title = result.group.name)) - result.group.stats?.forEach { stat -> - rows.add(StatRow(stat, result.computedStat(stat), result.group.name)) - } - } - return rows - } +// override fun convertReportIntoRepresentables(report: Report): ArrayList { +// val rows: ArrayList = ArrayList() +// report.results.forEach { result -> +// rows.add(CustomizableRowRepresentable(title = result.group.name)) +// result.group.stats?.forEach { stat -> +// rows.add(StatRow(stat, result.computedStat(stat), result.group.name)) +// } +// } +// return rows +// } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) @@ -114,7 +123,10 @@ class StatisticsFragment : TableReportFragment(), FilterHandler { Timber.d(">>> start...") val realm = Realm.getDefaultInstance() - report = createSessionGroupsAndStartCompute(realm) + + val report = createSessionGroupsAndStartCompute(realm) + tableReportFragment.report = report + realm.close() val e = Date() @@ -125,7 +137,7 @@ class StatisticsFragment : TableReportFragment(), FilterHandler { test.await() if (!isDetached) { - showResults() + tableReportFragment.showResults() } } } @@ -146,7 +158,7 @@ class StatisticsFragment : TableReportFragment(), FilterHandler { Stat.HOURLY_DURATION ) - val query = filter?.query ?: run { Query() } + val query = filter?.query ?: Query() val allSessionGroup = ComputableGroup(query, allStats) val cgStats: List = listOf( diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt index d772aa46..ce526f85 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt @@ -1,17 +1,23 @@ package net.pokeranalytics.android.ui.fragment.report +import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem +import android.view.View import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Report +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.RealmFragment abstract class AbstractReportFragment : RealmFragment() { protected lateinit var selectedReport: Report + protected var reportTitle: String? = null + private var editableMenu: Menu? = null + protected lateinit var parentActivity: PokerAnalyticsActivity override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { menu?.clear() @@ -28,6 +34,11 @@ abstract class AbstractReportFragment : RealmFragment() { return true } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + parentActivity = activity as PokerAnalyticsActivity + } + /** * Update menu UI */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt index a9da7f01..ab4bc327 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt @@ -5,13 +5,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.google.android.material.tabs.TabLayout -import kotlinx.android.synthetic.main.fragment_report_details.* import kotlinx.android.synthetic.main.fragment_progress_report.toolbar +import kotlinx.android.synthetic.main.fragment_report_details.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.calculus.AggregationType 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.adapter.ReportPagerAdapter class ComparisonReportFragment : AbstractReportFragment() { @@ -30,12 +27,16 @@ class ComparisonReportFragment : AbstractReportFragment() { } } - private lateinit var parentActivity: PokerAnalyticsActivity +// private var reports: MutableMap = hashMapOf() +// private var stat: Stat = Stat.NET_RESULT +// private var displayAggregationChoices: Boolean = true - private var reports: MutableMap = hashMapOf() - private var stat: Stat = Stat.NET_RESULT - private var displayAggregationChoices: Boolean = true - private var reportTitle: String = "" + /** + * Set data + */ + fun setData(report: Report) { + this.selectedReport = report + } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) @@ -52,8 +53,6 @@ class ComparisonReportFragment : AbstractReportFragment() { */ private fun initUI() { - parentActivity = activity as PokerAnalyticsActivity - // Avoid a bug during setting the titleResId toolbar.title = "" @@ -80,12 +79,4 @@ class ComparisonReportFragment : AbstractReportFragment() { }) } - - /** - * Set data - */ - fun setData(report: Report) { - this.selectedReport = report - } - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComposableTableReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComposableTableReportFragment.kt new file mode 100644 index 00000000..9fc6c7a8 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComposableTableReportFragment.kt @@ -0,0 +1,221 @@ +package net.pokeranalytics.android.ui.fragment.report + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import io.realm.Realm +import kotlinx.android.synthetic.main.fragment_composable_table_report.* +import kotlinx.coroutines.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.* +import net.pokeranalytics.android.model.realm.ComputableResult +import net.pokeranalytics.android.ui.activity.ProgressReportActivity +import net.pokeranalytics.android.ui.adapter.DisplayDescriptor +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.RealmFragment +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.* +import kotlin.coroutines.CoroutineContext + +open class ComposableTableReportFragment : RealmFragment(), StaticRowRepresentableDataSource, CoroutineScope, + RowRepresentableDelegate { + + override val coroutineContext: CoroutineContext + get() = Dispatchers.Main + + private var rowRepresentables: ArrayList = ArrayList() + + var statsAdapter: RowRepresentableAdapter? = null + var report: Report? = null + + companion object { + + /** + * Create new instance + */ + fun newInstance(report: Report? = null): ComposableTableReportFragment { + val fragment = ComposableTableReportFragment() + fragment.report = report + + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + } + + // Life Cycle + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + super.onCreateView(inflater, container, savedInstanceState) + return inflater.inflate(R.layout.fragment_composable_table_report, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + initUI() + + report?.let { + showResults() + } + } + + // 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 StatRow) { + context?.let { _ -> + row.computedStat?.let { + dc.textFormat = it.format() + } + } + } + return dc + } + + override fun statFormatForRow(row: RowRepresentable): TextFormat { + if (row is StatRow) { + context?.let { _ -> + row.computedStat?.let { return it.format() } + } + } + return TextFormat(NULL_TEXT) + } + + override fun onResume() { + super.onResume() + statsAdapter?.notifyDataSetChanged() + } + + // Business + + /** + * Init data + */ + open fun initData() { + this.statsAdapter = RowRepresentableAdapter(this, this) + } + + /** + * Init UI + */ + open fun initUI() { + val viewManager = LinearLayoutManager(requireContext()) + + recyclerView.apply { + setHasFixedSize(true) + layoutManager = viewManager + adapter = statsAdapter + } + + } + + /** + * Show results + */ + fun showResults() { + report?.let { + this.rowRepresentables = this.convertReportIntoRepresentables(it) + statsAdapter?.notifyDataSetChanged() + } + } + + open fun convertReportIntoRepresentables(report: Report): ArrayList { + + val rows: ArrayList = ArrayList() + report.results.forEach { result -> + val title = result.group.query.getName(requireContext()).capitalize() + rows.add(CustomizableRowRepresentable(title = title)) + val statList = result.group.stats ?: report.options.stats + statList.forEach { stat -> + rows.add(StatRow(stat, result.computedStat(stat), result.group.query.getName(requireContext()))) + } + } + return rows + +// val rows: ArrayList = ArrayList() +// report.options.stats.forEach {stat -> +// rows.add(CustomizableRowRepresentable(title = stat.localizedTitle(requireContext()))) +// report.results.forEach { +// val title = it.group.name +// rows.add(StatRow(stat, it.computedStat(stat), it.group.name, title)) +// } +// } +// return rows + } + + // RowRepresentableDelegate + + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + + val cr = getRealm().where(ComputableResult::class.java).findAll() + if (cr.size < 2) { + Toast.makeText(context, R.string.less_then_2_values_for_display, Toast.LENGTH_LONG).show() + return + } + + if (row is StatRow && row.stat.hasProgressGraph) { + + // queryWith groups + val groupResults = this.report?.results?.filter { + row.groupName == it.group.query.getName(requireContext()) + } + + groupResults?.firstOrNull()?.let { + this.launchStatComputationWithEvolution(row.stat, it.group) + } + } + + } + + private fun launchStatComputationWithEvolution(stat: Stat, computableGroup: ComputableGroup) { + + showLoader() + + GlobalScope.launch(coroutineContext) { + + var report: Report? = null + val test = GlobalScope.async { + val s = Date() + Timber.d(">>> start...") + + val realm = Realm.getDefaultInstance() + + val aggregationType = stat.aggregationTypes.first() + report = + Calculator.computeStatsWithEvolutionByAggregationType(realm, stat, 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) { + hideLoader() + report?.let { + ProgressReportActivity.newInstance(requireContext(), stat, it) + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt index 16893708..2ac17009 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt @@ -21,7 +21,6 @@ import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.combined -import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.extensions.ChipGroupExtension import net.pokeranalytics.android.ui.extensions.hideWithAnimation import net.pokeranalytics.android.ui.extensions.px @@ -46,10 +45,8 @@ class ProgressReportFragment : AbstractReportFragment() { } } - private lateinit var parentActivity: PokerAnalyticsActivity private lateinit var graphFragment: GraphFragment - private var title: String? = null private var reports: MutableMap = hashMapOf() private var stat: Stat = Stat.NET_RESULT private var displayAggregationChoices: Boolean = true @@ -71,7 +68,7 @@ class ProgressReportFragment : AbstractReportFragment() { this.stat = stat this.selectedReport = report this.displayAggregationChoices = displayAggregationChoices - this.title = title + this.reportTitle = title stat.aggregationTypes.firstOrNull()?.let { reports[it] = report @@ -83,8 +80,6 @@ class ProgressReportFragment : AbstractReportFragment() { */ private fun initUI() { - parentActivity = activity as PokerAnalyticsActivity - // Avoid a bug during setting the titleResId toolbar.title = "" @@ -105,7 +100,7 @@ class ProgressReportFragment : AbstractReportFragment() { } } - toolbar.title = this.title ?: stat.localizedTitle(requireContext()) + toolbar.title = this.reportTitle ?: stat.localizedTitle(requireContext()) val aggregationTypes = stat.aggregationTypes aggregationTypes.forEachIndexed { index, type -> diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt index 8ceea198..1e55c8a4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt @@ -4,205 +4,59 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast -import androidx.recyclerview.widget.LinearLayoutManager -import io.realm.Realm -import kotlinx.android.synthetic.main.fragment_stats.* -import kotlinx.coroutines.* +import kotlinx.android.synthetic.main.fragment_progress_report.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.calculus.* -import net.pokeranalytics.android.model.realm.ComputableResult -import net.pokeranalytics.android.ui.activity.ProgressReportActivity -import net.pokeranalytics.android.ui.adapter.DisplayDescriptor -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.ResultsObserverFragment -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.* -import kotlin.coroutines.CoroutineContext +import net.pokeranalytics.android.calculus.Report -open class TableReportFragment : ResultsObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope, - RowRepresentableDelegate { +class TableReportFragment : AbstractReportFragment() { - override val coroutineContext: CoroutineContext - get() = Dispatchers.Main + private lateinit var tableReportFragment: ComposableTableReportFragment - private var rowRepresentables: ArrayList = ArrayList() + companion object { - var statsAdapter: RowRepresentableAdapter? = null - var report : Report? = null - - companion object { - - /** - * Create new instance - */ - fun newInstance(report: Report? = null): TableReportFragment { - val fragment = TableReportFragment() - report?.let { - fragment.report = it - } - val bundle = Bundle() - fragment.arguments = bundle - return fragment - } - } - - // Life Cycle - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_stats, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initData() - initUI() - - report?.let { - showResults() - } - } - - // 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 StatRow) { - context?.let { _ -> - row.computedStat?.let { - dc.textFormat = it.format() - } - } - } - return dc - } - - override fun statFormatForRow(row: RowRepresentable): TextFormat { - if (row is StatRow) { - context?.let { _ -> - row.computedStat?.let { return it.format() } - } - } - return TextFormat(NULL_TEXT) - } - - override fun onResume() { - super.onResume() - statsAdapter?.notifyDataSetChanged() - } - - // Business - - /** - * Init data - */ - open fun initData() { - this.statsAdapter = RowRepresentableAdapter(this, this) - } - - /** - * Init UI - */ - open fun initUI() { - val viewManager = LinearLayoutManager(requireContext()) - recyclerView.apply { - setHasFixedSize(true) - layoutManager = viewManager - adapter = statsAdapter - } - } - - /** - * Show results - */ - fun showResults() { - report?.let { - this.rowRepresentables = this.convertReportIntoRepresentables(it) - statsAdapter?.notifyDataSetChanged() - } - } - - open fun convertReportIntoRepresentables(report: Report): ArrayList { - val rows: ArrayList = ArrayList() - report.options.stats.forEach {stat -> - rows.add(CustomizableRowRepresentable(title = stat.localizedTitle(requireContext()))) - report.results.forEach { - val title = it.group.name - rows.add(StatRow(stat, it.computedStat(stat), it.group.name, title)) + /** + * Create new instance + */ + fun newInstance(report: Report? = null, title: String? = null): TableReportFragment { + val fragment = TableReportFragment() + fragment.reportTitle = title + report?.let { + fragment.selectedReport = it } - + val bundle = Bundle() + fragment.arguments = bundle + return fragment } - return rows } - // RowRepresentableDelegate - - override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - - val cr = getRealm().where(ComputableResult::class.java).findAll() - if (cr.size < 2) { - Toast.makeText(context, R.string.less_then_2_values_for_display, Toast.LENGTH_LONG).show() - return - } - - if (row is StatRow && row.stat.hasProgressGraph) { - - // queryWith groups - val groupResults = this.report?.results?.filter { - it.group.name == row.groupName - } - - groupResults?.firstOrNull()?.let { - this.launchStatComputationWithEvolution(row.stat, it.group) - } - } - + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + super.onCreateView(inflater, container, savedInstanceState) + return inflater.inflate(R.layout.fragment_table_report, container, false) } - private fun launchStatComputationWithEvolution(stat: Stat, computableGroup: ComputableGroup) { - - showLoader() - - GlobalScope.launch(coroutineContext) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initUI() + } - var report: Report? = null - val test = GlobalScope.async { - val s = Date() - Timber.d(">>> start...") + private fun initUI() { - val realm = Realm.getDefaultInstance() + // Avoid a bug during setting the titleResId + toolbar.title = "" - val aggregationType = stat.aggregationTypes.first() - report = Calculator.computeStatsWithEvolutionByAggregationType(realm, stat, computableGroup, aggregationType) + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) - realm.close() + toolbar.title = reportTitle - val e = Date() - val duration = (e.time - s.time) / 1000.0 - Timber.d(">>> ended in $duration seconds") + val fragmentTransaction = parentActivity.supportFragmentManager.beginTransaction() + val fragment = ComposableTableReportFragment.newInstance(this.selectedReport) + fragmentTransaction.add(R.id.tableReportContainer, fragment) + fragmentTransaction.commit() - } - test.await() + this.tableReportFragment = fragment - if (!isDetached) { - hideLoader() - report?.let { - ProgressReportActivity.newInstance(requireContext(), stat, it) - } - } - } } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt index bc0813f3..a5846e19 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt @@ -15,7 +15,7 @@ class ObjectIdentifier(var id: String, var clazz: Class) { interface GraphUnderlyingEntry { - val entryTitle: String + fun entryTitle(context: Context): String fun formattedValue(stat: Stat): TextFormat fun legendValues( @@ -29,12 +29,12 @@ interface GraphUnderlyingEntry { return when (stat) { Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES, Stat.WIN_RATIO, Stat.HOURLY_DURATION, Stat.AVERAGE_HOURLY_DURATION -> { val totalStatValue = stat.format(entry.y.toDouble(), currency = null) - DefaultLegendValues(this.entryTitle, totalStatValue) + DefaultLegendValues(this.entryTitle(context), totalStatValue) } else -> { val entryValue = this.formattedValue(stat) val totalStatValue = stat.format(entry.y.toDouble(), currency = null) - DefaultLegendValues(this.entryTitle, entryValue, totalStatValue) + DefaultLegendValues(this.entryTitle(context), entryValue, totalStatValue) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index 029a16aa..8eedb85a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -10,7 +10,7 @@ import net.pokeranalytics.android.util.NULL_TEXT */ interface RowRepresentable : Displayable, EditDataSource, ImageDecorator { - fun getDisplayName(): String { + fun getDisplayName(context: Context): String { return 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 fc50cc90..d78ec10b 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 @@ -175,7 +175,7 @@ enum class RowViewType(private var layoutRes: Int) { if (row.resId != null) { it.text = row.localizedTitle(itemView.context) } else { - it.text = row.getDisplayName() + it.text = row.getDisplayName(itemView.context) } } diff --git a/app/src/main/res/layout/activity_statistic_details.xml b/app/src/main/res/layout/activity_progress_report.xml similarity index 100% rename from app/src/main/res/layout/activity_statistic_details.xml rename to app/src/main/res/layout/activity_progress_report.xml diff --git a/app/src/main/res/layout/fragment_composable_table_report.xml b/app/src/main/res/layout/fragment_composable_table_report.xml new file mode 100644 index 00000000..97fa937b --- /dev/null +++ b/app/src/main/res/layout/fragment_composable_table_report.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_stats.xml b/app/src/main/res/layout/fragment_stats.xml index aaa1d704..e2581b98 100644 --- a/app/src/main/res/layout/fragment_stats.xml +++ b/app/src/main/res/layout/fragment_stats.xml @@ -2,17 +2,25 @@ - + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_table_report.xml b/app/src/main/res/layout/fragment_table_report.xml new file mode 100644 index 00000000..75b893ca --- /dev/null +++ b/app/src/main/res/layout/fragment_table_report.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file