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
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)
}
}

@ -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) {

@ -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<out Timed>) {
}
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<out Timed>? = null) : RowRepresentable {
enum class Stat : RowRepresentable {
NETRESULT,
HOURLY_RATE,

@ -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
}

@ -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)
}

@ -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)
}

@ -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<Entry>
@ -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 = ""
}
}

@ -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)
}

@ -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<AppCompatTextView?>(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<AppCompatTextView?>(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))
}
}

@ -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
}
}

@ -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
}

@ -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