From 4afd8a71b9d98e0bf70dbdcdb56f30edd8740d49 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 12 Apr 2019 12:25:25 +0200 Subject: [PATCH] Adds selection and legend update on graphs --- .../android/calculus/Calculator.kt | 16 ++++++------ .../pokeranalytics/android/calculus/Report.kt | 13 +++++----- .../pokeranalytics/android/calculus/Stat.kt | 10 +++++--- .../android/model/interfaces/Timed.kt | 5 +++- .../android/model/realm/Session.kt | 11 ++++---- .../android/model/realm/SessionSet.kt | 6 +++++ .../android/ui/fragment/GraphFragment.kt | 25 ++++++------------- .../android/ui/view/LegendView.kt | 19 +++++++------- .../android/ui/view/RowViewType.kt | 11 +++++--- .../android/ui/view/SessionRowView.kt | 6 +++-- .../android/ui/view/TransactionRowView.kt | 6 +++-- .../android/ui/view/fields/FieldsExtension.kt | 10 ++++++++ 12 files changed, 79 insertions(+), 59 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt 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 2617ae13..e8cd78ca 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -147,19 +147,19 @@ class Calculator { tHands += computable.estimatedHands val session = computable.session ?: throw IllegalStateException("Computing lone ComputableResult") - results.addEvolutionValue(tSum, NETRESULT, session) - results.addEvolutionValue(tSum / index, AVERAGE, session) - results.addEvolutionValue(index.toDouble(), NUMBER_OF_GAMES, session) - results.addEvolutionValue(tBBSum / tBBSessionCount, AVERAGE_NET_BB, session) - results.addEvolutionValue((tWinningSessionCount / index).toDouble(), WIN_RATIO, session) - results.addEvolutionValue(tBuyinSum / index, AVERAGE_BUYIN, session) + results.addEvolutionValue(tSum, stat = NETRESULT, data = session) + results.addEvolutionValue(tSum / index, stat = AVERAGE, data = session) + results.addEvolutionValue(index.toDouble(), stat = NUMBER_OF_GAMES, data = session) + results.addEvolutionValue(tBBSum / tBBSessionCount, stat = AVERAGE_NET_BB, data = session) + results.addEvolutionValue((tWinningSessionCount / index).toDouble(), stat = WIN_RATIO, data = session) + results.addEvolutionValue(tBuyinSum / index, stat = AVERAGE_BUYIN, data = session) Stat.netBBPer100Hands(tBBSum, tHands)?.let { netBB100 -> - results.addEvolutionValue(netBB100, NET_BB_PER_100_HANDS, session) + results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = session) } Stat.returnOnInvestment(tSum, tBuyinSum)?.let { roi -> - results.addEvolutionValue(roi, ROI, session) + results.addEvolutionValue(roi, stat = ROI, data = session) } } 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 de8c329f..e97d56f9 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -158,13 +158,14 @@ class ComputedResults(group: ComputableGroup) { /** * Adds a value to the evolution values */ - fun addEvolutionValue(value: Double, stat: Stat, data: Any) { - this._addEvolutionValue(Point(value, data), stat = stat) - } + fun addEvolutionValue(value: Double, duration: Double? = null, stat: Stat, data: Timed) { - fun addEvolutionValue(value: Double, duration: Double, stat: Stat, data: Timed) { - stat.underlyingClass = data::class.java - this._addEvolutionValue(Point(value, y = duration, data = data.id), stat = stat) + val point = if (duration != null) { + Point(duration, y = value, data = data.objectIdentifier) + } else { + Point(value, data = data.objectIdentifier) + } + this._addEvolutionValue(point, stat = stat) } private fun _addEvolutionValue(point: Point, stat: Stat) { 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 1b111ecf..d4e89d06 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -1,9 +1,9 @@ package net.pokeranalytics.android.calculus import android.content.Context -import io.realm.RealmModel import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.FormattingException +import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -17,7 +17,11 @@ class StatFormattingException(message: String) : Exception(message) { } -interface StatBase : RealmModel { +class ObjectIdentifier(var id: String, var clazz: Class) { + +} + +interface StatBase : Identifiable { fun formattedValue(stat: Stat, context: Context): TextFormat @@ -48,7 +52,7 @@ enum class AggregationType { /** * An enum representing all the types of Session statistics */ -enum class Stat(var underlyingClass: Class? = null) : RowRepresentable { +enum class Stat : RowRepresentable { NETRESULT, HOURLY_RATE, diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt index 01431a6e..49ba2542 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt @@ -1,9 +1,10 @@ package net.pokeranalytics.android.model.interfaces +import net.pokeranalytics.android.calculus.ObjectIdentifier import net.pokeranalytics.android.calculus.StatBase import java.util.* -interface Timed : StatBase, Identifiable { +interface Timed : StatBase { fun startDate() : Date? @@ -29,4 +30,6 @@ interface Timed : StatBase, Identifiable { val hourlyDuration: Double get() = this.netDuration / 3600000.0 + val objectIdentifier : ObjectIdentifier + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 486aca1b..f65c7fac 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 @@ -11,10 +11,7 @@ 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.ComputedStat -import net.pokeranalytics.android.calculus.Stat -import net.pokeranalytics.android.calculus.StatFormattingException -import net.pokeranalytics.android.calculus.TextFormat +import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.LiveData @@ -47,7 +44,6 @@ typealias BB = Double open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed, TimeFilterable, Filterable { - enum class Type { CASH_GAME, TOURNAMENT @@ -871,6 +867,11 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } + // Timed + + override val objectIdentifier: ObjectIdentifier + get() = ObjectIdentifier(this.id, Session::class.java) + } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt index 9774e1b7..4b3178e7 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 @@ -7,6 +7,7 @@ import io.realm.RealmResults import io.realm.annotations.Ignore import io.realm.annotations.LinkingObjects import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.calculus.ObjectIdentifier import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.StatFormattingException import net.pokeranalytics.android.calculus.TextFormat @@ -109,5 +110,10 @@ open class SessionSet() : RealmObject(), Timed, Filterable { } + // Timed + + override val objectIdentifier: ObjectIdentifier + get() = ObjectIdentifier(this.id, SessionSet::class.java) + } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt index 1293fc0a..6afffdbf 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 @@ -17,6 +17,7 @@ import com.google.android.material.chip.ChipGroup import kotlinx.android.synthetic.main.fragment_evograph.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.GraphType +import net.pokeranalytics.android.calculus.ObjectIdentifier import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment @@ -25,16 +26,11 @@ import net.pokeranalytics.android.ui.view.LegendView import net.pokeranalytics.android.util.extensions.ChipGroupExtension import net.pokeranalytics.android.util.extensions.px import net.pokeranalytics.android.util.extensions.toast - -interface GraphDataSource { - - -} +import java.text.DateFormat class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { private lateinit var parentActivity: PokerAnalyticsActivity - lateinit var dataSource: GraphDataSource lateinit var stat: Stat lateinit var entries: List @@ -69,7 +65,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.legendView = LegendView(requireContext()) this.legendContainer.addView(this.legendView) - this.legendView.prepareWithStat(this.stat) + this.legendView.prepareWithStat(this.stat, this.entries.size) // Avoid a bug during setting the title toolbar.title = "" @@ -133,23 +129,16 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { e?.let { entry -> h?.let { highlight -> - val id = entry.data as String - val item = getRealm().where(this.stat.underlyingClass).equalTo("id", id).findAll().firstOrNull() + val identifier = entry.data as ObjectIdentifier + val item = getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() item?.let { - val date = it.startDate() - - val entryStatName = this.stat.localizedTitle(requireContext()) + val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate()) val entryValue = it.formattedValue(this.stat, requireContext()) - - val totalStatName = this.stat.cumulativeLabelResId(requireContext()) val totalStatValue = this.stat.format(e.y.toDouble(), null, requireContext()) + this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) } - -// this.text.text = "" - - } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt index a5d4ad1b..03552cde 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt @@ -8,8 +8,8 @@ import androidx.constraintlayout.widget.ConstraintLayout import kotlinx.android.synthetic.main.layout_legend_default.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat -import net.pokeranalytics.android.model.realm.Session - +import net.pokeranalytics.android.calculus.TextFormat +import net.pokeranalytics.android.ui.view.fields.setTextFormat /** * Display a row session @@ -46,23 +46,22 @@ class LegendView : FrameLayout { /** * Set the stat data to the view */ - fun prepareWithStat(stat: Stat) { + fun prepareWithStat(stat: Stat, counter: Int) { this.stat1Name.text = stat.localizedTitle(context) this.stat2Name.text = stat.cumulativeLabelResId(context) - - //TODO: Set real data - this.title.text = "11/04/2019" - this.stat1Value.text = "$521" - this.stat2Value.text = "$15,051" - this.counter.text = "21 Sessions" + this.counter.text = "$counter ${context.getString(R.string.sessions)}" } /** * */ - fun setData(session: Session) { + fun setItemData(stat: Stat, title: String, statFormat1: TextFormat, statFormat2: TextFormat) { + + this.title.text = title + this.stat1Value.setTextFormat(statFormat1, context) + this.stat2Value.setTextFormat(statFormat2, context) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index c887ff71..4e757885 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 @@ -16,6 +16,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter +import net.pokeranalytics.android.ui.view.fields.setTextFormat import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable /** @@ -120,8 +121,9 @@ enum class RowViewType(private var layoutRes: Int) { itemView.findViewById(R.id.value)?.let { if (row.computedStat != null) { val format = row.computedStat!!.format(itemView.context) - it.setTextColor(format.getColor(itemView.context)) - it.text = format.text + it.setTextFormat(format, itemView.context) +// it.setTextColor(format.getColor(itemView.context)) +// it.text = format.text } else if (row.value != null) { it.text = row.value } @@ -221,8 +223,9 @@ enum class RowViewType(private var layoutRes: Int) { // Value itemView.findViewById(R.id.value)?.let { view -> adapter.dataSource.contentDescriptorForRow(row)?.textFormat?.let { - view.text = it.text - view.setTextColor(it.getColor(itemView.context)) + view.setTextFormat(it, itemView.context) +// view.text = it.text +// view.setTextColor(it.getColor(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 6cef22f9..45dc934e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt @@ -15,6 +15,7 @@ import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.view.fields.setTextFormat import net.pokeranalytics.android.util.CurrencyUtils import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getShortDayName @@ -150,8 +151,9 @@ class SessionRowView : FrameLayout { val result = session.result?.net ?: 0.0 val formattedStat = ComputedStat(Stat.NETRESULT, result, currency = CurrencyUtils.getCurrency(session.bankroll)).format(context) - rowHistorySession.gameResult.setTextColor(formattedStat.getColor(context)) - rowHistorySession.gameResult.text = formattedStat.text + rowHistorySession.gameResult.setTextFormat(formattedStat, context) +// rowHistorySession.gameResult.setTextColor(formattedStat.getColor(context)) +// rowHistorySession.gameResult.text = formattedStat.text } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt index ab45b09c..25f3b5a3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt @@ -10,6 +10,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.realm.Transaction +import net.pokeranalytics.android.ui.view.fields.setTextFormat import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getShortDayName @@ -63,8 +64,9 @@ class TransactionRowView : FrameLayout { // Amount val formattedStat = ComputedStat(Stat.NETRESULT, transaction.amount).format(context) - rowTransaction.transactionAmount.setTextColor(formattedStat.getColor(context)) - rowTransaction.transactionAmount.text = formattedStat.text + rowTransaction.transactionAmount.setTextFormat(formattedStat, context) +// rowTransaction.transactionAmount.setTextColor(formattedStat.getColor(context)) +// rowTransaction.transactionAmount.text = formattedStat.text } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt new file mode 100644 index 00000000..1a7b35c5 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt @@ -0,0 +1,10 @@ +package net.pokeranalytics.android.ui.view.fields + +import android.content.Context +import androidx.appcompat.widget.AppCompatTextView +import net.pokeranalytics.android.calculus.TextFormat + +fun AppCompatTextView.setTextFormat(textFormat: TextFormat, context: Context) { + this.setTextColor(textFormat.getColor(context)) + this.text = textFormat.text +} \ No newline at end of file