diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4caf0748..37e6961f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -49,6 +49,11 @@
android:launchMode="singleTop"
android:screenOrientation="portrait" />
+
+
= listOf()
+ ) {
/**
* The way the stats are going to be displayed
@@ -42,9 +45,9 @@ class Calculator {
TIMED
}
- var display: Display = Display.TABLE
- var evolutionValues: EvolutionValues = EvolutionValues.NONE
- var displayedStats: List = listOf()
+ var display: Display = display
+ var evolutionValues: EvolutionValues = evolutionValues
+ var displayedStats: List = stats
/**
* This function determines whether the standard deviation should be computed
@@ -64,7 +67,36 @@ class Calculator {
companion object {
- fun computeStatsWithComparators(realm: Realm, comparators: List = listOf(), conditions: List = listOf(), options: Options): Report {
+ fun computeStatsWithEvolutionByAggregationType(
+ realm: Realm,
+ group: ComputableGroup,
+ aggregationType: AggregationType
+ ): Report {
+
+ val options = Options(evolutionValues = Options.EvolutionValues.STANDARD)
+ if (aggregationType == AggregationType.DURATION) {
+ options.evolutionValues = Options.EvolutionValues.TIMED
+ }
+
+ return when (aggregationType) {
+ AggregationType.SESSION, AggregationType.DURATION -> this.computeGroups(realm, listOf(group), options)
+ AggregationType.MONTH -> {
+ val comparators: List = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR)
+ this.computeStatsWithComparators(realm, comparators, group.conditions, options)
+ }
+ AggregationType.YEAR -> {
+ val comparators: List = listOf(Comparator.YEAR)
+ this.computeStatsWithComparators(realm, comparators, group.conditions, options)
+ }
+ }
+ }
+
+ fun computeStatsWithComparators(
+ realm: Realm,
+ comparators: List = listOf(),
+ conditions: List = listOf(),
+ options: Options
+ ): Report {
val computableGroups: MutableList = mutableListOf()
comparators.combined().forEach { comparatorConditions ->
@@ -86,18 +118,6 @@ class Calculator {
return this.computeGroups(realm, computableGroups, options)
}
- fun computeStatsWithFilters(realm: Realm, filters: List, options: Options): Report {
-
- val computableGroups: MutableList = mutableListOf()
- filters.forEach { filter ->
-
- val group = ComputableGroup(filter.name, filter.filterConditions.map { it.queryCondition })
- computableGroups.add(group)
-
- }
- return Calculator.computeGroups(realm, computableGroups, options)
- }
-
/**
* Computes all stats for list of Session sessionGroup
*/
@@ -257,7 +277,12 @@ class Calculator {
Options.EvolutionValues.TIMED -> {
results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT, sessionSet)
results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet)
- results.addEvolutionValue(tIndex.toDouble(), tHourlyDuration, NUMBER_OF_SETS, sessionSet)
+ results.addEvolutionValue(
+ tIndex.toDouble(),
+ tHourlyDuration,
+ NUMBER_OF_SETS,
+ sessionSet
+ )
results.addEvolutionValue(
sessionSet.netDuration.toDouble(),
tHourlyDuration,
@@ -273,7 +298,12 @@ class Calculator {
results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet)
Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 ->
- results.addEvolutionValue(netBB100, tHourlyDuration, NET_BB_PER_100_HANDS, sessionSet)
+ results.addEvolutionValue(
+ netBB100,
+ tHourlyDuration,
+ NET_BB_PER_100_HANDS,
+ sessionSet
+ )
}
}
}
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 8722f4f9..eba8afc5 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
@@ -30,7 +30,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
-import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRowRepresentable
+import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRow
import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow
import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.UserDefaults
@@ -584,7 +584,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency)
)
)
- rows.add(SeparatorRowRepresentable())
+ rows.add(SeparatorRow())
}
SessionState.PAUSED -> {
rows.add(
@@ -594,7 +594,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0, currency)
)
)
- rows.add(SeparatorRowRepresentable())
+ rows.add(SeparatorRow())
}
SessionState.FINISHED -> {
rows.add(
@@ -621,7 +621,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
// )
// )
// }
- rows.add(SeparatorRowRepresentable())
+ rows.add(SeparatorRow())
}
else -> {
}
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt
new file mode 100644
index 00000000..53563031
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt
@@ -0,0 +1,54 @@
+package net.pokeranalytics.android.ui.activity
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import net.pokeranalytics.android.R
+import net.pokeranalytics.android.calculus.Report
+import net.pokeranalytics.android.calculus.Stat
+import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
+import net.pokeranalytics.android.ui.fragment.GraphParameters
+
+
+class CalendarDetailsActivity : PokerAnalyticsActivity() {
+
+ private enum class IntentKey(val keyName: String) {
+ STAT("STAT"),
+ ENTRIES("ENTRIES"),
+ }
+
+ companion object {
+
+ // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects
+ var parameters: GraphParameters? = null
+
+ /**
+ * Default constructor
+ */
+ fun newInstance(context: Context) {
+ val intent = Intent(context, CalendarDetailsActivity::class.java)
+ context.startActivity(intent)
+ }
+
+ fun newInstance(context: Context, stat: Stat, report: Report) {
+ parameters = GraphParameters(stat, report)
+ val intent = Intent(context, CalendarDetailsActivity::class.java)
+ context.startActivity(intent)
+ }
+
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_calendar_details)
+ initUI()
+ }
+
+ /**
+ * Init UI
+ */
+ private fun initUI() {
+
+ }
+
+}
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt
new file mode 100644
index 00000000..04ae0170
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt
@@ -0,0 +1,80 @@
+package net.pokeranalytics.android.ui.fragment
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.github.mikephil.charting.data.Entry
+import kotlinx.android.synthetic.main.fragment_calendar_details.*
+import net.pokeranalytics.android.R
+import net.pokeranalytics.android.calculus.Stat
+import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
+import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
+
+class CalendarDetailsFragment : PokerAnalyticsFragment() {
+
+ companion object {
+ fun newInstance(context: Context) {
+ val intent = Intent(context, CalendarDetailsFragment::class.java)
+ context.startActivity(intent)
+ }
+ }
+
+ private lateinit var parentActivity: PokerAnalyticsActivity
+
+ //private var stat: Stat = Stat.NETRESULT
+ //private var entries: List = ArrayList()
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ return inflater.inflate(R.layout.fragment_calendar_details, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initUI()
+ }
+
+ /**
+ * Init UI
+ */
+ private fun initUI() {
+
+ parentActivity = activity as PokerAnalyticsActivity
+
+ // Avoid a bug during setting the title
+ toolbar.title = ""
+
+ parentActivity.setSupportActionBar(toolbar)
+ parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
+ setHasOptionsMenu(true)
+
+ /*
+ toolbar.title = stat.localizedTitle(requireContext())
+
+ val fragmentManager = parentActivity.supportFragmentManager
+ val fragmentTransaction = fragmentManager.beginTransaction()
+ val fragment = GraphFragment()
+
+ fragmentTransaction.add(R.id.container, fragment)
+ fragmentTransaction.commit()
+
+ StatisticDetailsActivity.parameters?.let {
+ fragment.setData(it.stat, it.report)
+ StatisticDetailsActivity.parameters = null
+ } ?: run {
+ throw Exception("Missing graph parameters")
+ }
+ */
+ }
+
+ /**
+ * Set data
+ */
+ fun setData(stat: Stat, entries: List) {
+ //this.stat = stat
+ //this.entries = entries
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt
index b11bb28f..48ddeb9a 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt
@@ -18,6 +18,7 @@ import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.comparison.Comparator
import net.pokeranalytics.android.model.comparison.combined
+import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
@@ -35,8 +36,6 @@ import java.util.*
import kotlin.coroutines.CoroutineContext
-
-
class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate {
private enum class SessionType {
@@ -69,6 +68,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
private var rows: ArrayList = ArrayList()
private var sortedMonthlyReports: SortedMap = HashMap().toSortedMap()
private var sortedYearlyReports: SortedMap = HashMap().toSortedMap()
+ private var datesForRows: HashMap = HashMap()
private var currentSessionType = SessionType.ALL
private var currentTimeFilter = TimeFilter.MONTH
@@ -93,7 +93,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
- //toast("Open $row")
+ Timber.d("Open ${datesForRows[row]}")
+ CalendarDetailsActivity.newInstance(requireContext())
}
override fun sessionsChanged() {
@@ -304,6 +305,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
val startDate = Date()
+ datesForRows.clear()
rows.clear()
when (currentTimeFilter) {
@@ -323,14 +325,16 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
}
sortedMonthlyReports[date]?.computedStat(currentStat)?.let { computedStat ->
- rows.add(
- CustomizableRowRepresentable(
- customViewType = RowViewType.TITLE_VALUE_ARROW,
- title = date.getDateMonth(),
- computedStat = computedStat,
- isSelectable = true
- )
+
+ val row = CustomizableRowRepresentable(
+ customViewType = RowViewType.TITLE_VALUE_ARROW,
+ title = date.getDateMonth(),
+ computedStat = computedStat,
+ isSelectable = true
)
+
+ rows.add(row)
+ datesForRows.put(row, date)
}
}
}
@@ -339,14 +343,15 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
TimeFilter.YEAR -> {
sortedYearlyReports.keys.forEach { date ->
sortedYearlyReports[date]?.computedStat(currentStat)?.let { computedStat ->
- rows.add(
- CustomizableRowRepresentable(
- customViewType = RowViewType.TITLE_VALUE_ARROW,
- title = date.getDateYear(),
- computedStat = computedStat,
- isSelectable = true
- )
+ val row = CustomizableRowRepresentable(
+ customViewType = RowViewType.TITLE_VALUE_ARROW,
+ title = date.getDateYear(),
+ computedStat = computedStat,
+ isSelectable = true
)
+
+ rows.add(row)
+ datesForRows.put(row, date)
}
}
}
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt
index 4a53d724..76d552e3 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt
@@ -16,7 +16,7 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
-import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRowRepresentable
+import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRow
import java.util.*
class CurrenciesFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate {
@@ -28,7 +28,7 @@ class CurrenciesFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataS
val rowRepresentation : List by lazy {
val rows = ArrayList()
rows.addAll(mostUsedCurrencies)
- rows.add(SeparatorRowRepresentable())
+ rows.add(SeparatorRow())
rows.addAll(availableCurrencies)
rows
}
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 6479fe10..9f3d5794 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
@@ -13,7 +13,9 @@ import com.github.mikephil.charting.highlight.Highlight
import com.github.mikephil.charting.listener.OnChartValueSelectedListener
import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
+import io.realm.Realm
import kotlinx.android.synthetic.main.fragment_evograph.*
+import kotlinx.coroutines.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
@@ -23,25 +25,32 @@ import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.graph.PALineDataSet
import net.pokeranalytics.android.ui.graph.setStyle
import net.pokeranalytics.android.ui.view.LegendView
+import timber.log.Timber
import java.text.DateFormat
+import java.util.*
+import kotlin.coroutines.CoroutineContext
class GraphParameters(var stat: Stat, var report: Report) {
}
-class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener {
+class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, CoroutineScope {
private lateinit var parentActivity: PokerAnalyticsActivity
private var stat: Stat = Stat.NETRESULT
- private var reports: Map = hashMapOf()
- private var entries: List = ArrayList()
+ private var reports: MutableMap = hashMapOf()
+
+ private var selectedReport: Report? = null
lateinit var legendView: LegendView
lateinit var chartView: BarLineChartBase<*>
private var aggregationTypes: List = listOf()
+ override val coroutineContext: CoroutineContext
+ get() = Dispatchers.Main
+
companion object {
}
@@ -50,10 +59,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener {
this.stat = stat
this.aggregationTypes = stat.aggregationTypes
-// this.report = report
- report.results.firstOrNull()?.defaultStatEntries(stat)?.let {
- this.entries = it
- }
+ this.reports[this.aggregationTypes.first()] = report
+ this.selectedReport = report
}
@@ -76,32 +83,10 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener {
this.legendView = LegendView(requireContext())
this.legendContainer.addView(this.legendView)
- this.legendView.prepareWithStat(this.stat, this.entries.size)
-
- val dataSet = PALineDataSet(this.entries, this.stat.name, requireContext())
- val colors = arrayOf(R.color.green_light).toIntArray()
- dataSet.setColors(colors, context)
- dataSet.setDrawCircles(false)
- val lineData = LineData(listOf(dataSet))
-
- this.chartView = when (stat.graphType) {
- GraphType.LINE -> {
- val lineChart = LineChart(context)
- lineChart.data = lineData
- lineChart
- }
- GraphType.BAR -> {
- val barChart = BarChart(context)
- barChart
- }
- }
- this.chartContainer.addView(this.chartView)
-
- this.chartView.setStyle(false, requireContext())
- this.chartView.setOnChartValueSelectedListener(this)
-
- this.chartView.highlightValue((this.entries.size - 1).toFloat(), 0)
+ this.selectedReport?.let {
+ this.loadGraph(it)
+ }
this.aggregationTypes.forEach { type ->
val chip = Chip(requireContext())
@@ -118,12 +103,85 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener {
override fun onCheckedChanged(group: ChipGroup, checkedId: Int) {
super.onCheckedChanged(group, checkedId)
val aggregationType = aggregationTypes[checkedId]
-// toast("Show: ${this.aggregationTypes[group.getChildAt(checkedId).id].name}")
+
+ reports[aggregationType]?.let {
+ loadGraph(it)
+ } ?: run {
+
+ }
+
}
})
}
+ private fun launchStatComputation() {
+
+ GlobalScope.launch(coroutineContext) {
+
+ var r: Report? = null
+ val test = GlobalScope.async {
+ val s = Date()
+ Timber.d(">>> start...")
+
+ val realm = Realm.getDefaultInstance()
+
+ val aggregationType = stat.aggregationTypes.first()
+// r = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType)
+
+ realm.close()
+
+ val e = Date()
+ val duration = (e.time - s.time) / 1000.0
+ Timber.d(">>> ended in $duration seconds")
+
+ }
+ test.await()
+
+ if (!isDetached) {
+ r?.let {
+ loadGraph(it)
+ }
+ }
+ }
+
+ }
+
+
+ fun loadGraph(report: Report) {
+
+ report.results.firstOrNull()?.defaultStatEntries(stat)?.let { entries ->
+
+ this.legendView.prepareWithStat(this.stat, entries.size)
+
+ val dataSet = PALineDataSet(entries, this.stat.name, requireContext())
+ val colors = arrayOf(R.color.green_light).toIntArray()
+ dataSet.setColors(colors, context)
+ dataSet.setDrawCircles(false)
+ val lineData = LineData(listOf(dataSet))
+
+ this.chartView = when (stat.graphType) {
+ GraphType.LINE -> {
+ val lineChart = LineChart(context)
+ lineChart.data = lineData
+ lineChart
+ }
+ GraphType.BAR -> {
+ val barChart = BarChart(context)
+ barChart
+ }
+ }
+
+ this.chartContainer.addView(this.chartView)
+
+ this.chartView.setStyle(false, requireContext())
+ this.chartView.setOnChartValueSelectedListener(this)
+
+ this.chartView.highlightValue((entries.size - 1).toFloat(), 0)
+ }
+
+ }
+
// OnChartValueSelectedListener
override fun onNothingSelected() {
@@ -133,19 +191,18 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener {
override fun onValueSelected(e: Entry?, h: Highlight?) {
e?.let { entry ->
- h?.let { highlight ->
- val identifier = entry.data as ObjectIdentifier
- val item = getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull()
- item?.let {
+ val identifier = entry.data as ObjectIdentifier
+ val item = getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull()
+ item?.let {
- val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate())
- val entryValue = it.formattedValue(this.stat, requireContext())
- val totalStatValue = this.stat.format(e.y.toDouble(), null, requireContext())
+ val formattedDate = DateFormat.getDateInstance(DateFormat.SHORT).format(it.startDate())
+ val entryValue = it.formattedValue(this.stat, requireContext())
+ val totalStatValue = this.stat.format(e.y.toDouble(), null, requireContext())
- this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue)
- }
+ this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue)
}
+
}
}
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
index 4c0c34e2..32e2b523 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
@@ -10,7 +10,7 @@ import kotlinx.android.synthetic.main.fragment_stats.*
import kotlinx.coroutines.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.*
-import net.pokeranalytics.android.model.StatRepresentable
+import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity
import net.pokeranalytics.android.ui.adapter.DisplayDescriptor
@@ -28,10 +28,10 @@ import kotlin.coroutines.CoroutineContext
class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope,
RowRepresentableDelegate {
- override val coroutineContext: CoroutineContext
- get() = Dispatchers.Main
+ override val coroutineContext: CoroutineContext
+ get() = Dispatchers.Main
- private var rowRepresentables: ArrayList = ArrayList()
+ private var rowRepresentables: ArrayList = ArrayList()
private var stringAll = ""
private var stringCashGame = ""
private var stringTournament = ""
@@ -74,7 +74,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
override fun contentDescriptorForRow(row: RowRepresentable): DisplayDescriptor? {
val dc = DisplayDescriptor()
dc.textFormat = TextFormat(NULL_TEXT)
- if (row is StatRepresentable) {
+ if (row is StatRow) {
context?.let { context ->
row.computedStat?.let {
dc.textFormat = it.format(context)
@@ -85,7 +85,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
}
override fun statFormatForRow(row: RowRepresentable): TextFormat {
- if (row is StatRepresentable) {
+ if (row is StatRow) {
context?.let { context ->
row.computedStat?.let { return it.format(context) }
}
@@ -133,73 +133,95 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
}
}
- private fun launchStatComputation() {
+ private fun launchStatComputation() {
- GlobalScope.launch(coroutineContext) {
-
- var r = Report()
- val test = GlobalScope.async {
- val s = Date()
- Timber.d(">>> start...")
-
- val realm = Realm.getDefaultInstance()
- r = createSessionGroupsAndStartCompute(realm)
- report = r
- realm.close()
-
- val e = Date()
- val duration = (e.time - s.time) / 1000.0
- Timber.d(">>> ended in $duration seconds")
+ GlobalScope.launch(coroutineContext) {
- }
- test.await()
+ var r = Report()
+ val test = GlobalScope.async {
+ val s = Date()
+ Timber.d(">>> start...")
- if (!isDetached) {
- showResults(r)
- }
- }
+ val realm = Realm.getDefaultInstance()
+ r = createSessionGroupsAndStartCompute(realm)
+ report = r
+ realm.close()
- }
+ val e = Date()
+ val duration = (e.time - s.time) / 1000.0
+ Timber.d(">>> ended in $duration seconds")
- private fun createSessionGroupsAndStartCompute(realm: Realm) : Report {
+ }
+ test.await()
- val allStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NUMBER_OF_SETS, Stat.AVERAGE_DURATION, Stat.DURATION)
- val allSessionGroup = ComputableGroup(stringAll, listOf(), allStats)
- val cgStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, Stat.AVERAGE, Stat.STANDARD_DEVIATION_HOURLY, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
- val cgSessionGroup = ComputableGroup(stringCashGame, listOf(QueryCondition.CASH), cgStats)
- val tStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
- val tSessionGroup = ComputableGroup(stringTournament, listOf(QueryCondition.TOURNAMENT), tStats)
+ if (!isDetached) {
+ showResults(r)
+ }
+ }
- Timber.d(">>>>> Start computations...")
+ }
- return Calculator.computeGroups(realm, listOf(allSessionGroup, cgSessionGroup, tSessionGroup), Calculator.Options())
+ private fun createSessionGroupsAndStartCompute(realm: Realm): Report {
+
+ val allStats: List = listOf(
+ Stat.NETRESULT,
+ Stat.HOURLY_RATE,
+ Stat.AVERAGE,
+ Stat.NUMBER_OF_SETS,
+ Stat.AVERAGE_DURATION,
+ Stat.DURATION
+ )
+ val allSessionGroup = ComputableGroup(stringAll, listOf(), allStats)
+ val cgStats: List = listOf(
+ Stat.NETRESULT,
+ Stat.HOURLY_RATE,
+ Stat.NET_BB_PER_100_HANDS,
+ Stat.HOURLY_RATE_BB,
+ Stat.AVERAGE,
+ Stat.STANDARD_DEVIATION_HOURLY,
+ Stat.WIN_RATIO,
+ Stat.NUMBER_OF_GAMES,
+ Stat.AVERAGE_BUYIN
+ )
+ val cgSessionGroup = ComputableGroup(stringCashGame, listOf(QueryCondition.CASH), cgStats)
+ val tStats: List =
+ listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
+ val tSessionGroup = ComputableGroup(stringTournament, listOf(QueryCondition.TOURNAMENT), tStats)
+
+ Timber.d(">>>>> Start computations...")
+
+ return Calculator.computeGroups(
+ realm,
+ listOf(allSessionGroup, cgSessionGroup, tSessionGroup),
+ Calculator.Options()
+ )
- }
+ }
- private fun showResults(report: Report) {
- this.rowRepresentables = this.convertReportIntoRepresentables(report)
+ private fun showResults(report: Report) {
+ this.rowRepresentables = this.convertReportIntoRepresentables(report)
statsAdapter.notifyDataSetChanged()
- }
+ }
- private fun convertReportIntoRepresentables(report: Report) : ArrayList {
+ private fun convertReportIntoRepresentables(report: Report): ArrayList {
- val rows: ArrayList = ArrayList()
+ val rows: ArrayList = ArrayList()
report.results.forEach { result ->
rows.add(CustomizableRowRepresentable(title = result.group.name))
result.group.stats?.forEach { stat ->
- rows.add(StatRepresentable(stat, result.computedStat(stat), result.group.name))
+ rows.add(StatRow(stat, result.computedStat(stat), result.group.name))
}
}
- return rows
- }
+ return rows
+ }
// RowRepresentableDelegate
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
- if (row is StatRepresentable && row.stat.hasEvolutionGraph) {
+ if (row is StatRow && row.stat.hasEvolutionGraph) {
// filter groups
val groupResults = this.report?.results?.filter {
@@ -223,10 +245,14 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
Timber.d(">>> start...")
val realm = Realm.getDefaultInstance()
- val options = Calculator.Options()
- options.evolutionValues = Calculator.Options.EvolutionValues.STANDARD
- options.displayedStats = listOf(stat)
- report = Calculator.computeGroups(realm, listOf(computableGroup), options)
+// val options = Calculator.Options()
+// options.evolutionValues = Calculator.Options.EvolutionValues.STANDARD
+// options.displayedStats = listOf(stat)
+
+ val aggregationType = stat.aggregationTypes.first()
+ report = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType)
+
+// report = Calculator.computeGroups(realm, listOf(computableGroup), options)
realm.close()
val e = Date()
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 387756b9..76254452 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
@@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.row_history_session.view.*
import kotlinx.android.synthetic.main.row_transaction.view.*
import net.pokeranalytics.android.R
-import net.pokeranalytics.android.model.StatRepresentable
+import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
@@ -236,7 +236,7 @@ enum class RowViewType(private var layoutRes: Int) {
}
}
- if (row is StatRepresentable) {
+ if (row is StatRow) {
itemView.findViewById(R.id.nextArrow)?.isVisible = row.stat.hasEvolutionGraph
}
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRow.kt
similarity index 75%
rename from app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRowRepresentable.kt
rename to app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRow.kt
index 7497d908..a45bfb04 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRowRepresentable.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SeparatorRow.kt
@@ -6,6 +6,6 @@ import net.pokeranalytics.android.ui.view.RowViewType
/**
* A class to display separator as row representable
*/
-class SeparatorRowRepresentable(customViewType: RowViewType? = RowViewType.SEPARATOR) : RowRepresentable {
+class SeparatorRow(customViewType: RowViewType? = RowViewType.SEPARATOR) : RowRepresentable {
override val viewType: Int = customViewType?.ordinal ?: RowViewType.SEPARATOR.ordinal
}
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt
index 27b2c73f..40a49efe 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt
@@ -68,7 +68,7 @@ enum class SessionRow : RowRepresentable {
POSITION,
PLAYERS,
TIPS,
- SeparatorRowRepresentable(),
+ SeparatorRow(),
GAME,
INITIAL_BUY_IN,
LOCATION,
@@ -77,7 +77,7 @@ enum class SessionRow : RowRepresentable {
TOURNAMENT_TYPE,
TOURNAMENT_NAME,
TOURNAMENT_FEATURE,
- SeparatorRowRepresentable(),
+ SeparatorRow(),
START_DATE,
END_DATE,
BREAK_TIME,
@@ -98,7 +98,7 @@ enum class SessionRow : RowRepresentable {
CASHED_OUT,
BUY_IN,
TIPS,
- SeparatorRowRepresentable(),
+ SeparatorRow(),
GAME,
BLINDS,
LOCATION,
@@ -112,7 +112,7 @@ enum class SessionRow : RowRepresentable {
} else {
arrayListOf(
NET_RESULT,
- SeparatorRowRepresentable(),
+ SeparatorRow(),
GAME,
BLINDS,
LOCATION,
diff --git a/app/src/main/java/net/pokeranalytics/android/model/StatRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt
similarity index 74%
rename from app/src/main/java/net/pokeranalytics/android/model/StatRepresentable.kt
rename to app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt
index 25829c3a..7dd06355 100644
--- a/app/src/main/java/net/pokeranalytics/android/model/StatRepresentable.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt
@@ -1,4 +1,4 @@
-package net.pokeranalytics.android.model
+package net.pokeranalytics.android.ui.view.rowrepresentable
import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat
@@ -6,7 +6,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
-class StatRepresentable(stat: Stat, computedStat: ComputedStat?, groupName: String = "") : RowRepresentable {
+class StatRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "") : RowRepresentable {
var stat: Stat = stat
var computedStat: ComputedStat? = computedStat
diff --git a/app/src/main/res/layout/activity_calendar_details.xml b/app/src/main/res/layout/activity_calendar_details.xml
new file mode 100644
index 00000000..5085b07e
--- /dev/null
+++ b/app/src/main/res/layout/activity_calendar_details.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_calendar_details.xml b/app/src/main/res/layout/fragment_calendar_details.xml
new file mode 100644
index 00000000..44e1e283
--- /dev/null
+++ b/app/src/main/res/layout/fragment_calendar_details.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+