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. 2
      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) {
Timber.d("UserPreferences.defaultCurrency: ${UserDefaults.currency.symbol}")
this.createFakeSessions()
// this.createFakeSessions()
}
Patcher.patchAll(this.applicationContext)

@ -7,7 +7,8 @@ import io.realm.RealmResults
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.filter.Query
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.Filter
import net.pokeranalytics.android.model.realm.SessionSet
@ -196,7 +197,7 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu
/**
* 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) {
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 -> {
return TextFormat(value.formattedHourlyDuration())
} // 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
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,
STANDARD_DEVIATION_BB_PER_100_HANDS -> {
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.LineDataSet
import io.realm.Realm
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.filter.Query
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.Transaction
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
*/
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
*/
fun addDatedItems(items: Collection<DatedValue>) {
fun addDatedItems(items: Collection<DatedGraphEntry>) {
this.evolutionItems.addAll(items)
}
@ -143,7 +144,7 @@ class BankrollReport(var setup: BankrollReportSetup) {
bucket.addTransaction(transaction)
} ?: 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
this.evolutionItems.forEach {
total += it.amount
val point = BRGraphPoint(total, it.date, it)
val point = BRGraphPoint(total, it.date, it.objectIdentifier)
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) {
var variation: Double = 0.0
// var variation: Double = 0.0
}

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

@ -13,3 +13,5 @@ interface DatedValue : Dated {
var amount: Double
}
interface DatedGraphEntry : DatedValue, GraphIdentifiableEntry

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

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

@ -46,7 +46,7 @@ import kotlin.collections.ArrayList
typealias BB = Double
open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed,
TimeFilterable, Filterable, DatedValue {
TimeFilterable, Filterable, DatedGraphEntry {
enum class Type {
CASH_GAME,
@ -791,7 +791,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
}
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)
}
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.ui.adapter.StaticRowRepresentableDataSource
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.LegendContent
import net.pokeranalytics.android.ui.view.RowRepresentable
@ -26,8 +26,8 @@ import java.util.*
import kotlin.collections.ArrayList
open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, TimeFilterable, Filterable, DatedValue,
GraphUnderlyingEntry {
open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, TimeFilterable,
Filterable, DatedGraphEntry {
companion object {
@ -134,7 +134,10 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo
return SaveValidityStatus.VALID
}
// GraphUnderlyingEntry
// GraphIdentifiableEntry
override val objectIdentifier: ObjectIdentifier
get() = ObjectIdentifier(this.id, Transaction::class.java)
override fun entryTitle(context: Context): String {
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)
}
}

@ -31,7 +31,10 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment
import net.pokeranalytics.android.ui.view.RowRepresentable
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 java.util.*
import kotlin.collections.ArrayList
@ -110,15 +113,15 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
lastItemClickedPosition = position
when (row) {
is BankrollGraphRow -> {
val lineDataSet = row.dataSet as LineDataSet
GraphActivity.newInstance(requireContext(), listOf(lineDataSet), title = getString(R.string.bankroll))
}
is BankrollRowRepresentable -> {
BankrollReportManager.reportForBankroll(row.bankrollId) { bankrollReport ->
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() {
val coroutineContext: CoroutineContext
private val coroutineContext: CoroutineContext
get() = Dispatchers.Main
private lateinit var tableReportFragment: ComposableTableReportFragment

@ -3,13 +3,13 @@ package net.pokeranalytics.android.ui.graph
import android.content.Context
import com.github.mikephil.charting.data.Entry
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.view.DefaultLegendValues
import net.pokeranalytics.android.ui.view.LegendContent
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
*/
inner class LegendDefaultViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
inner class LegendDefaultViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
if (row is BankrollRowRepresentable) {

Loading…
Cancel
Save