Adds selection and legend update on graphs

feature/top10
Laurent 7 years ago
parent 7d40987e03
commit 4afd8a71b9
  1. 16
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  2. 13
      app/src/main/java/net/pokeranalytics/android/calculus/Report.kt
  3. 10
      app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt
  4. 5
      app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt
  5. 11
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  6. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt
  7. 25
      app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt
  8. 19
      app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt
  9. 11
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  10. 6
      app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt
  11. 6
      app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt
  12. 10
      app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt

@ -147,19 +147,19 @@ class Calculator {
tHands += computable.estimatedHands tHands += computable.estimatedHands
val session = computable.session ?: throw IllegalStateException("Computing lone ComputableResult") val session = computable.session ?: throw IllegalStateException("Computing lone ComputableResult")
results.addEvolutionValue(tSum, NETRESULT, session) results.addEvolutionValue(tSum, stat = NETRESULT, data = session)
results.addEvolutionValue(tSum / index, AVERAGE, session) results.addEvolutionValue(tSum / index, stat = AVERAGE, data = session)
results.addEvolutionValue(index.toDouble(), NUMBER_OF_GAMES, session) results.addEvolutionValue(index.toDouble(), stat = NUMBER_OF_GAMES, data = session)
results.addEvolutionValue(tBBSum / tBBSessionCount, AVERAGE_NET_BB, session) results.addEvolutionValue(tBBSum / tBBSessionCount, stat = AVERAGE_NET_BB, data = session)
results.addEvolutionValue((tWinningSessionCount / index).toDouble(), WIN_RATIO, session) results.addEvolutionValue((tWinningSessionCount / index).toDouble(), stat = WIN_RATIO, data = session)
results.addEvolutionValue(tBuyinSum / index, AVERAGE_BUYIN, session) results.addEvolutionValue(tBuyinSum / index, stat = AVERAGE_BUYIN, data = session)
Stat.netBBPer100Hands(tBBSum, tHands)?.let { netBB100 -> 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 -> Stat.returnOnInvestment(tSum, tBuyinSum)?.let { roi ->
results.addEvolutionValue(roi, ROI, session) results.addEvolutionValue(roi, stat = ROI, data = session)
} }
} }

@ -158,13 +158,14 @@ class ComputedResults(group: ComputableGroup) {
/** /**
* Adds a value to the evolution values * Adds a value to the evolution values
*/ */
fun addEvolutionValue(value: Double, stat: Stat, data: Any) { fun addEvolutionValue(value: Double, duration: Double? = null, stat: Stat, data: Timed) {
this._addEvolutionValue(Point(value, data), stat = stat)
}
fun addEvolutionValue(value: Double, duration: Double, stat: Stat, data: Timed) { val point = if (duration != null) {
stat.underlyingClass = data::class.java Point(duration, y = value, data = data.objectIdentifier)
this._addEvolutionValue(Point(value, y = duration, data = data.id), stat = stat) } else {
Point(value, data = data.objectIdentifier)
}
this._addEvolutionValue(point, stat = stat)
} }
private fun _addEvolutionValue(point: Point, stat: Stat) { private fun _addEvolutionValue(point: Point, stat: Stat) {

@ -1,9 +1,9 @@
package net.pokeranalytics.android.calculus package net.pokeranalytics.android.calculus
import android.content.Context import android.content.Context
import io.realm.RealmModel
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.FormattingException import net.pokeranalytics.android.exceptions.FormattingException
import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.model.interfaces.Timed
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType 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<out Timed>) {
}
interface StatBase : Identifiable {
fun formattedValue(stat: Stat, context: Context): TextFormat fun formattedValue(stat: Stat, context: Context): TextFormat
@ -48,7 +52,7 @@ enum class AggregationType {
/** /**
* An enum representing all the types of Session statistics * An enum representing all the types of Session statistics
*/ */
enum class Stat(var underlyingClass: Class<out Timed>? = null) : RowRepresentable { enum class Stat : RowRepresentable {
NETRESULT, NETRESULT,
HOURLY_RATE, HOURLY_RATE,

@ -1,9 +1,10 @@
package net.pokeranalytics.android.model.interfaces package net.pokeranalytics.android.model.interfaces
import net.pokeranalytics.android.calculus.ObjectIdentifier
import net.pokeranalytics.android.calculus.StatBase import net.pokeranalytics.android.calculus.StatBase
import java.util.* import java.util.*
interface Timed : StatBase, Identifiable { interface Timed : StatBase {
fun startDate() : Date? fun startDate() : Date?
@ -29,4 +30,6 @@ interface Timed : StatBase, Identifiable {
val hourlyDuration: Double val hourlyDuration: Double
get() = this.netDuration / 3600000.0 get() = this.netDuration / 3600000.0
val objectIdentifier : ObjectIdentifier
} }

@ -11,10 +11,7 @@ import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.*
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.exceptions.ModelException
import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
@ -47,7 +44,6 @@ typealias BB = Double
open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed, open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed,
TimeFilterable, Filterable { TimeFilterable, Filterable {
enum class Type { enum class Type {
CASH_GAME, CASH_GAME,
TOURNAMENT TOURNAMENT
@ -871,6 +867,11 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
} }
// Timed
override val objectIdentifier: ObjectIdentifier
get() = ObjectIdentifier(this.id, Session::class.java)
} }

@ -7,6 +7,7 @@ import io.realm.RealmResults
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.LinkingObjects import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.calculus.ObjectIdentifier
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.calculus.StatFormattingException import net.pokeranalytics.android.calculus.StatFormattingException
import net.pokeranalytics.android.calculus.TextFormat 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)
} }

@ -17,6 +17,7 @@ import com.google.android.material.chip.ChipGroup
import kotlinx.android.synthetic.main.fragment_evograph.* import kotlinx.android.synthetic.main.fragment_evograph.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.GraphType import net.pokeranalytics.android.calculus.GraphType
import net.pokeranalytics.android.calculus.ObjectIdentifier
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment 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.ChipGroupExtension
import net.pokeranalytics.android.util.extensions.px import net.pokeranalytics.android.util.extensions.px
import net.pokeranalytics.android.util.extensions.toast import net.pokeranalytics.android.util.extensions.toast
import java.text.DateFormat
interface GraphDataSource {
}
class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener {
private lateinit var parentActivity: PokerAnalyticsActivity private lateinit var parentActivity: PokerAnalyticsActivity
lateinit var dataSource: GraphDataSource
lateinit var stat: Stat lateinit var stat: Stat
lateinit var entries: List<Entry> lateinit var entries: List<Entry>
@ -69,7 +65,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener {
this.legendView = LegendView(requireContext()) this.legendView = LegendView(requireContext())
this.legendContainer.addView(this.legendView) 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 // Avoid a bug during setting the title
toolbar.title = "" toolbar.title = ""
@ -133,23 +129,16 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener {
e?.let { entry -> e?.let { entry ->
h?.let { highlight -> h?.let { highlight ->
val id = entry.data as String val identifier = entry.data as ObjectIdentifier
val item = getRealm().where(this.stat.underlyingClass).equalTo("id", id).findAll().firstOrNull() val item = getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull()
item?.let { item?.let {
val date = it.startDate() val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate())
val entryStatName = this.stat.localizedTitle(requireContext())
val entryValue = it.formattedValue(this.stat, requireContext()) val entryValue = it.formattedValue(this.stat, requireContext())
val totalStatName = this.stat.cumulativeLabelResId(requireContext())
val totalStatValue = this.stat.format(e.y.toDouble(), null, requireContext()) val totalStatValue = this.stat.format(e.y.toDouble(), null, requireContext())
this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue)
} }
// this.text.text = ""
} }
} }

@ -8,8 +8,8 @@ import androidx.constraintlayout.widget.ConstraintLayout
import kotlinx.android.synthetic.main.layout_legend_default.view.* import kotlinx.android.synthetic.main.layout_legend_default.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Stat 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 * Display a row session
@ -46,23 +46,22 @@ class LegendView : FrameLayout {
/** /**
* Set the stat data to the view * Set the stat data to the view
*/ */
fun prepareWithStat(stat: Stat) { fun prepareWithStat(stat: Stat, counter: Int) {
this.stat1Name.text = stat.localizedTitle(context) this.stat1Name.text = stat.localizedTitle(context)
this.stat2Name.text = stat.cumulativeLabelResId(context) this.stat2Name.text = stat.cumulativeLabelResId(context)
this.counter.text = "$counter ${context.getString(R.string.sessions)}"
//TODO: Set real data
this.title.text = "11/04/2019"
this.stat1Value.text = "$521"
this.stat2Value.text = "$15,051"
this.counter.text = "21 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)
} }

@ -16,6 +16,7 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.view.fields.setTextFormat
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
/** /**
@ -120,8 +121,9 @@ enum class RowViewType(private var layoutRes: Int) {
itemView.findViewById<AppCompatTextView?>(R.id.value)?.let { itemView.findViewById<AppCompatTextView?>(R.id.value)?.let {
if (row.computedStat != null) { if (row.computedStat != null) {
val format = row.computedStat!!.format(itemView.context) val format = row.computedStat!!.format(itemView.context)
it.setTextColor(format.getColor(itemView.context)) it.setTextFormat(format, itemView.context)
it.text = format.text // it.setTextColor(format.getColor(itemView.context))
// it.text = format.text
} else if (row.value != null) { } else if (row.value != null) {
it.text = row.value it.text = row.value
} }
@ -221,8 +223,9 @@ enum class RowViewType(private var layoutRes: Int) {
// Value // Value
itemView.findViewById<AppCompatTextView?>(R.id.value)?.let { view -> itemView.findViewById<AppCompatTextView?>(R.id.value)?.let { view ->
adapter.dataSource.contentDescriptorForRow(row)?.textFormat?.let { adapter.dataSource.contentDescriptorForRow(row)?.textFormat?.let {
view.text = it.text view.setTextFormat(it, itemView.context)
view.setTextColor(it.getColor(itemView.context)) // view.text = it.text
// view.setTextColor(it.getColor(itemView.context))
} }
} }

@ -15,6 +15,7 @@ import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.SessionState
import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.realm.Session 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.CurrencyUtils
import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getDayNumber
import net.pokeranalytics.android.util.extensions.getShortDayName import net.pokeranalytics.android.util.extensions.getShortDayName
@ -150,8 +151,9 @@ class SessionRowView : FrameLayout {
val result = session.result?.net ?: 0.0 val result = session.result?.net ?: 0.0
val formattedStat = ComputedStat(Stat.NETRESULT, result, currency = CurrencyUtils.getCurrency(session.bankroll)).format(context) val formattedStat = ComputedStat(Stat.NETRESULT, result, currency = CurrencyUtils.getCurrency(session.bankroll)).format(context)
rowHistorySession.gameResult.setTextColor(formattedStat.getColor(context)) rowHistorySession.gameResult.setTextFormat(formattedStat, context)
rowHistorySession.gameResult.text = formattedStat.text // rowHistorySession.gameResult.setTextColor(formattedStat.getColor(context))
// rowHistorySession.gameResult.text = formattedStat.text
} }
} }

@ -10,6 +10,7 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.realm.Transaction 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.getDayNumber
import net.pokeranalytics.android.util.extensions.getShortDayName import net.pokeranalytics.android.util.extensions.getShortDayName
@ -63,8 +64,9 @@ class TransactionRowView : FrameLayout {
// Amount // Amount
val formattedStat = ComputedStat(Stat.NETRESULT, transaction.amount).format(context) val formattedStat = ComputedStat(Stat.NETRESULT, transaction.amount).format(context)
rowTransaction.transactionAmount.setTextColor(formattedStat.getColor(context)) rowTransaction.transactionAmount.setTextFormat(formattedStat, context)
rowTransaction.transactionAmount.text = formattedStat.text // rowTransaction.transactionAmount.setTextColor(formattedStat.getColor(context))
// rowTransaction.transactionAmount.text = formattedStat.text
} }

@ -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
}
Loading…
Cancel
Save