Fixes issue with row selection + graph

csv
Laurent 7 years ago
parent 01914614e1
commit 9a3cd3d716
  1. 2
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  2. 5
      app/src/main/java/net/pokeranalytics/android/calculus/Report.kt
  3. 9
      app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt
  4. 13
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt
  5. 9
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReportManager.kt
  6. 4
      app/src/main/java/net/pokeranalytics/android/model/interfaces/Dated.kt
  7. 1
      app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt
  8. 10
      app/src/main/java/net/pokeranalytics/android/model/interfaces/Timed.kt
  9. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  10. 12
      app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt
  11. 13
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt
  12. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
  13. 4
      app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt
  14. 4
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt

@ -60,7 +60,7 @@ class PokerAnalyticsApplication : Application() {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
Timber.d("UserPreferences.defaultCurrency: ${UserDefaults.currency.symbol}") Timber.d("UserPreferences.defaultCurrency: ${UserDefaults.currency.symbol}")
this.createFakeSessions() // this.createFakeSessions()
} }
Patcher.patchAll(this.applicationContext) Patcher.patchAll(this.applicationContext)

@ -7,7 +7,8 @@ import io.realm.RealmResults
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.model.interfaces.GraphIdentifiableEntry
//import net.pokeranalytics.android.model.interfaces.Timed
import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.model.realm.SessionSet
@ -196,7 +197,7 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu
/** /**
* Adds a value to the evolution values * Adds a value to the evolution values
*/ */
fun addEvolutionValue(value: Double, duration: Double? = null, stat: Stat, data: Timed) { fun addEvolutionValue(value: Double, duration: Double? = null, stat: Stat, data: GraphIdentifiableEntry) {
val point = if (duration != null) { val point = if (duration != null) {
Point(duration, y = value, data = data.objectIdentifier) Point(duration, y = value, data = data.objectIdentifier)

@ -159,10 +159,15 @@ enum class Stat(override var uniqueIdentifier: Int) : IntIdentifiable, RowRepres
HOURLY_DURATION, AVERAGE_HOURLY_DURATION, MAXIMUM_DURATION -> { HOURLY_DURATION, AVERAGE_HOURLY_DURATION, MAXIMUM_DURATION -> {
return TextFormat(value.formattedHourlyDuration()) return TextFormat(value.formattedHourlyDuration())
} // red/green percentages } // red/green percentages
WIN_RATIO, ROI, RISK_OF_RUIN -> { WIN_RATIO, ROI -> {
val color = if (value * 100 >= this.threshold) R.color.green else R.color.red val color = if (value * 100 >= this.threshold) R.color.green else R.color.red
return TextFormat("${(value * 100).formatted()}%", color) return TextFormat("${(value * 100).formatted()}%", color)
} // white amountsr }
RISK_OF_RUIN -> {
val color = if (value * 100 <= this.threshold) R.color.green else R.color.red
return TextFormat("${(value * 100).formatted()}%", color)
}
// white amountsr
AVERAGE_BUYIN, STANDARD_DEVIATION, STANDARD_DEVIATION_HOURLY, AVERAGE_BUYIN, STANDARD_DEVIATION, STANDARD_DEVIATION_HOURLY,
STANDARD_DEVIATION_BB_PER_100_HANDS -> { STANDARD_DEVIATION_BB_PER_100_HANDS -> {
return TextFormat(value.toCurrency(currency)) return TextFormat(value.toCurrency(currency))

@ -4,9 +4,10 @@ import android.content.Context
import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.Entry
import com.github.mikephil.charting.data.LineDataSet import com.github.mikephil.charting.data.LineDataSet
import io.realm.Realm import io.realm.Realm
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.DatedValue import net.pokeranalytics.android.model.interfaces.DatedGraphEntry
import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.ui.graph.DataSetFactory import net.pokeranalytics.android.ui.graph.DataSetFactory
@ -116,12 +117,12 @@ class BankrollReport(var setup: BankrollReportSetup) {
/** /**
* The list of dated items used for the graph * The list of dated items used for the graph
*/ */
private var evolutionItems: MutableList<DatedValue> = mutableListOf() private var evolutionItems: MutableList<DatedGraphEntry> = mutableListOf()
/** /**
* Adds a list of dated items to the evolution items used to get the bankroll graph * Adds a list of dated items to the evolution items used to get the bankroll graph
*/ */
fun addDatedItems(items: Collection<DatedValue>) { fun addDatedItems(items: Collection<DatedGraphEntry>) {
this.evolutionItems.addAll(items) this.evolutionItems.addAll(items)
} }
@ -143,7 +144,7 @@ class BankrollReport(var setup: BankrollReportSetup) {
bucket.addTransaction(transaction) bucket.addTransaction(transaction)
} ?: run { } ?: run {
throw IllegalStateException("Transaction has no type") throw PAIllegalStateException("Transaction has no type")
} }
} }
@ -162,7 +163,7 @@ class BankrollReport(var setup: BankrollReportSetup) {
var total = this.initial var total = this.initial
this.evolutionItems.forEach { this.evolutionItems.forEach {
total += it.amount total += it.amount
val point = BRGraphPoint(total, it.date, it) val point = BRGraphPoint(total, it.date, it.objectIdentifier)
this.evolutionPoints.add(point) this.evolutionPoints.add(point)
} }
@ -276,6 +277,6 @@ class TransactionBucket(var name: String, useRate: Boolean = false) {
data class BRGraphPoint(var value: Double, var date: Date, var data: Any? = null) { data class BRGraphPoint(var value: Double, var date: Date, var data: Any? = null) {
var variation: Double = 0.0 // var variation: Double = 0.0
} }

@ -70,7 +70,7 @@ object BankrollReportManager {
GlobalScope.launch(coroutineContext) { GlobalScope.launch(coroutineContext) {
var report: BankrollReport? = null var report: BankrollReport? = null
val scope = GlobalScope.async { val coroutine = GlobalScope.async {
val s = Date() val s = Date()
Timber.d(">>>>> start computing bankroll...") Timber.d(">>>>> start computing bankroll...")
@ -86,8 +86,11 @@ object BankrollReportManager {
Timber.d(">>>>> ended in $duration seconds") Timber.d(">>>>> ended in $duration seconds")
} }
scope.await() coroutine.await()
report?.let { handler(it) }
report?.let {
handler(it)
}
} }
} }

@ -12,4 +12,6 @@ interface DatedValue : Dated {
var amount: Double var amount: Double
} }
interface DatedGraphEntry : DatedValue, GraphIdentifiableEntry

@ -55,6 +55,7 @@ interface Identifiable : RealmModel {
* A unique uniqueIdentifier getter * A unique uniqueIdentifier getter
*/ */
var id: String var id: String
} }
/** /**

@ -4,7 +4,13 @@ import net.pokeranalytics.android.ui.graph.GraphUnderlyingEntry
import net.pokeranalytics.android.ui.graph.ObjectIdentifier import net.pokeranalytics.android.ui.graph.ObjectIdentifier
import java.util.* import java.util.*
interface Timed : GraphUnderlyingEntry, Identifiable { interface GraphIdentifiableEntry : GraphUnderlyingEntry, Identifiable {
val objectIdentifier : ObjectIdentifier
}
interface Timed : GraphIdentifiableEntry {
fun startDate() : Date? fun startDate() : Date?
@ -30,6 +36,4 @@ interface Timed : GraphUnderlyingEntry, Identifiable {
val hourlyDuration: Double val hourlyDuration: Double
get() = this.netDuration / 3600000.0 get() = this.netDuration / 3600000.0
val objectIdentifier : ObjectIdentifier
} }

@ -46,7 +46,7 @@ import kotlin.collections.ArrayList
typealias BB = Double typealias BB = Double
open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed, open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed,
TimeFilterable, Filterable, DatedValue { TimeFilterable, Filterable, DatedGraphEntry {
enum class Type { enum class Type {
CASH_GAME, CASH_GAME,
@ -791,7 +791,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
} }
return NULL_TEXT return NULL_TEXT
} }
else -> throw UnmanagedRowRepresentableException("Unmanaged row = ${row}") else -> throw UnmanagedRowRepresentableException("Unmanaged row = $row")
} }
} }
@ -1138,7 +1138,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
DefaultLegendValues(this.entryTitle(context), left, right) DefaultLegendValues(this.entryTitle(context), left, right)
} }
else -> { else -> {
super.legendValues(stat, entry, style, groupName, context) super<Timed>.legendValues(stat, entry, style, groupName, context)
} }
} }
} }

@ -13,7 +13,7 @@ import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.* import net.pokeranalytics.android.model.interfaces.*
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.fragment.GraphFragment
import net.pokeranalytics.android.ui.graph.GraphUnderlyingEntry import net.pokeranalytics.android.ui.graph.ObjectIdentifier
import net.pokeranalytics.android.ui.view.DefaultLegendValues import net.pokeranalytics.android.ui.view.DefaultLegendValues
import net.pokeranalytics.android.ui.view.LegendContent import net.pokeranalytics.android.ui.view.LegendContent
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
@ -26,8 +26,8 @@ import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, TimeFilterable, Filterable, DatedValue, open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, TimeFilterable,
GraphUnderlyingEntry { Filterable, DatedGraphEntry {
companion object { companion object {
@ -134,7 +134,10 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo
return SaveValidityStatus.VALID return SaveValidityStatus.VALID
} }
// GraphUnderlyingEntry // GraphIdentifiableEntry
override val objectIdentifier: ObjectIdentifier
get() = ObjectIdentifier(this.id, Transaction::class.java)
override fun entryTitle(context: Context): String { override fun entryTitle(context: Context): String {
return DateFormat.getDateInstance(DateFormat.SHORT).format(this.date) return DateFormat.getDateInstance(DateFormat.SHORT).format(this.date)
@ -158,4 +161,5 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo
return DefaultLegendValues(this.entryTitle(context), entryValue, totalStatValue, leftName = leftName) return DefaultLegendValues(this.entryTitle(context), entryValue, totalStatValue, leftName = leftName)
} }
} }

@ -31,7 +31,10 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment
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
import net.pokeranalytics.android.ui.view.rowrepresentable.* import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollGraphRow
import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollMainRow
import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollTotalRow
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.util.extensions.sorted import net.pokeranalytics.android.util.extensions.sorted
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -110,15 +113,15 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
lastItemClickedPosition = position lastItemClickedPosition = position
when (row) { when (row) {
is BankrollGraphRow -> {
val lineDataSet = row.dataSet as LineDataSet
GraphActivity.newInstance(requireContext(), listOf(lineDataSet), title = getString(R.string.bankroll))
}
is BankrollRowRepresentable -> { is BankrollRowRepresentable -> {
BankrollReportManager.reportForBankroll(row.bankrollId) { bankrollReport -> BankrollReportManager.reportForBankroll(row.bankrollId) { bankrollReport ->
BankrollDetailsActivity.newInstanceForResult(this, bankrollReport, RequestCode.BANKROLL_DETAILS.value) BankrollDetailsActivity.newInstanceForResult(this, bankrollReport, RequestCode.BANKROLL_DETAILS.value)
} }
} }
is GraphRow -> {
val lineDataSet = row.dataSet as LineDataSet
GraphActivity.newInstance(requireContext(), listOf(lineDataSet), title = getString(R.string.bankroll))
}
} }
} }

@ -32,7 +32,7 @@ import kotlin.coroutines.CoroutineContext
class StatisticsFragment : FilterableFragment() { class StatisticsFragment : FilterableFragment() {
val coroutineContext: CoroutineContext private val coroutineContext: CoroutineContext
get() = Dispatchers.Main get() = Dispatchers.Main
private lateinit var tableReportFragment: ComposableTableReportFragment private lateinit var tableReportFragment: ComposableTableReportFragment

@ -3,13 +3,13 @@ package net.pokeranalytics.android.ui.graph
import android.content.Context import android.content.Context
import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.Entry
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.model.interfaces.GraphIdentifiableEntry
import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.fragment.GraphFragment
import net.pokeranalytics.android.ui.view.DefaultLegendValues import net.pokeranalytics.android.ui.view.DefaultLegendValues
import net.pokeranalytics.android.ui.view.LegendContent import net.pokeranalytics.android.ui.view.LegendContent
import net.pokeranalytics.android.util.TextFormat import net.pokeranalytics.android.util.TextFormat
class ObjectIdentifier(var id: String, var clazz: Class<out Timed>) { class ObjectIdentifier(var id: String, var clazz: Class<out GraphIdentifiableEntry>) {
} }

@ -428,8 +428,8 @@ enum class RowViewType(private var layoutRes: Int) {
/** /**
* Display a legend * Display a legend
*/ */
inner class LegendDefaultViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), inner class LegendDefaultViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
if (row is BankrollRowRepresentable) { if (row is BankrollRowRepresentable) {

Loading…
Cancel
Save