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