From 75675d4d75edec6a2fa3c2fd762a4e29f9809887 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 14:59:32 +0200 Subject: [PATCH 1/7] Refactoring of StatisticDetails & Graph --- .../android/calculus/Calculator.kt | 7 +- .../ui/activity/StatisticDetailsActivity.kt | 11 ++ .../android/ui/fragment/GraphFragment.kt | 162 +++++------------- .../ui/fragment/StatisticDetailsFragment.kt | 127 ++++++++++++-- .../android/ui/fragment/StatsFragment.kt | 3 +- .../res/layout/activity_statistic_details.xml | 14 +- app/src/main/res/layout/fragment_evograph.xml | 25 +-- .../res/layout/fragment_statistic_details.xml | 45 ++++- 8 files changed, 230 insertions(+), 164 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 20c76063..c7fb7fd0 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -87,7 +87,8 @@ class Calculator { fun computeStatsWithEvolutionByAggregationType( realm: Realm, group: ComputableGroup, - aggregationType: AggregationType + aggregationType: AggregationType, + stats: List? = null ): Report { val options = Options(evolutionValues = Options.EvolutionValues.STANDARD) @@ -95,6 +96,10 @@ class Calculator { options.evolutionValues = Options.EvolutionValues.TIMED } + stats?.let { + options.displayedStats = stats + } + return when (aggregationType) { AggregationType.SESSION, AggregationType.DURATION -> this.computeGroups(realm, listOf(group), options) AggregationType.MONTH -> { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt index e7fa885e..a93369c5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt @@ -3,12 +3,14 @@ package net.pokeranalytics.android.ui.activity import android.content.Context import android.content.Intent import android.os.Bundle +import com.google.android.libraries.places.internal.it import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputableGroup 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 +import net.pokeranalytics.android.ui.fragment.StatisticDetailsFragment class StatisticDetailsActivity : PokerAnalyticsActivity() { @@ -47,6 +49,15 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { */ private fun initUI() { + val fragmentTransaction = supportFragmentManager.beginTransaction() + val statisticDetailsFragment = StatisticDetailsFragment() + fragmentTransaction.add(R.id.statisticDetailsContainer, statisticDetailsFragment) + fragmentTransaction.commit() + + parameters?.let { + statisticDetailsFragment.setData(it.stat, it.computableGroup, it.report) + } + } } 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 e0314d6a..7cd9184d 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 @@ -4,33 +4,27 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.view.isVisible import com.github.mikephil.charting.charts.BarChart import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.data.* 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 kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity -import net.pokeranalytics.android.ui.extensions.ChipGroupExtension -import net.pokeranalytics.android.ui.extensions.px 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.util.* import kotlin.coroutines.CoroutineContext -class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var report: Report) { +class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var report: Report) { } class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, CoroutineScope { @@ -49,15 +43,12 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } private lateinit var parentActivity: PokerAnalyticsActivity - private lateinit var computableGroup: ComputableGroup private lateinit var selectedReport: Report private lateinit var legendView: LegendView private lateinit var chartView: BarLineChartBase<*> private var stat: Stat = Stat.NET_RESULT - private var reports: MutableMap = hashMapOf() - private var aggregationTypes: List = listOf() - private var displayAggregationChoices: Boolean = true + private var aggregationType: AggregationType = AggregationType.SESSION override val coroutineContext: CoroutineContext get() = Dispatchers.Main @@ -70,26 +61,41 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initUI() + loadGraph() } - /** - * Set data - */ - fun setData(stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true) { - this.stat = report.options.displayedStats.first() - this.computableGroup = group + // OnChartValueSelectedListener + override fun onNothingSelected() { + // nothing to do + } - this.aggregationTypes = stat.aggregationTypes - this.reports[this.aggregationTypes.first()] = report - this.selectedReport = report - this.displayAggregationChoices = displayAggregationChoices + override fun onValueSelected(e: Entry?, h: Highlight?) { + e?.let { entry -> + val statEntry = when (entry.data) { + is ObjectIdentifier -> { + val identifier = entry.data as ObjectIdentifier + getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() + } + is StatEntry -> entry.data as StatEntry? + else -> null + } + statEntry?.let { + val formattedDate = it.entryTitle + val entryValue = it.formattedValue(this.stat, requireContext()) + val totalStatValue = this.stat.format(entry.y.toDouble(), currency = null, context = requireContext()) + + this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) + } + } } + /** * Init UI */ private fun initUI() { + Timber.d("initUI") parentActivity = activity as PokerAnalyticsActivity parentActivity.title = stat.localizedTitle(requireContext()) @@ -104,80 +110,20 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co this.chartView.setStyle(false, requireContext()) this.chartContainer.addView(this.chartView) - - this.loadGraph(this.aggregationTypes.first(), this.selectedReport) - - this.aggregationTypes.forEachIndexed { index, type -> - val chip = Chip(requireContext()) - chip.id = index - chip.text = requireContext().getString(type.resId) - chip.chipStartPadding = 8f.px - chip.chipEndPadding = 8f.px - this.chipGroup.addView(chip) - } - - this.chipGroup.isVisible = displayAggregationChoices - this.chipGroup.check(0) - - this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { - override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { - super.onCheckedChanged(group, checkedId) - val aggregationType = aggregationTypes[checkedId] - - reports[aggregationType]?.let { - loadGraph(aggregationType, it) - } ?: run { - launchStatComputation(aggregationType) - } - - } - }) - } - private fun launchStatComputation(aggregationType: AggregationType) { - - GlobalScope.launch(coroutineContext) { - - var r: Report? = null - val test = GlobalScope.async { - val s = Date() - Timber.d(">>> start...") - - val realm = Realm.getDefaultInstance() - - val report = - Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) - reports[aggregationType] = report - - r = report - - 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(aggregationType, it) - } - } - } - - } - - fun loadGraph(aggregationType: AggregationType, report: Report) { + /** + * Load graph + */ + private fun loadGraph() { + Timber.d("loadGraph") val graphEntries = when (aggregationType) { - AggregationType.SESSION, AggregationType.DURATION -> report.results.firstOrNull()?.defaultStatEntries(stat) + AggregationType.SESSION, AggregationType.DURATION -> selectedReport.results.firstOrNull()?.defaultStatEntries(stat) AggregationType.MONTH, AggregationType.YEAR -> { when (this.stat) { - Stat.NUMBER_OF_GAMES, Stat.NUMBER_OF_SETS -> report.barEntries(this.stat) - else -> report.lineEntries(this.stat) + Stat.NUMBER_OF_GAMES, Stat.NUMBER_OF_SETS -> selectedReport.barEntries(this.stat) + else -> selectedReport.lineEntries(this.stat) } } } @@ -216,32 +162,18 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } - // OnChartValueSelectedListener - - override fun onNothingSelected() { - // nothing to do - } - - override fun onValueSelected(e: Entry?, h: Highlight?) { - e?.let { entry -> - - val statEntry = when (entry.data) { - is ObjectIdentifier -> { - val identifier = entry.data as ObjectIdentifier - getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() - } - is StatEntry -> entry.data as StatEntry? - else -> null - } - - statEntry?.let { + /** + * Set data + */ + fun setData(report: Report, aggregationType: AggregationType) { + Timber.d("setData") - val formattedDate = it.entryTitle - val entryValue = it.formattedValue(this.stat, requireContext()) - val totalStatValue = this.stat.format(entry.y.toDouble(), currency = null, context = requireContext()) + this.selectedReport = report + this.aggregationType = aggregationType + this.stat = report.options.displayedStats.first() - this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) - } + if (isAdded && !isDetached) { + loadGraph() } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt index 16e9c3aa..efb19b62 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt @@ -6,13 +6,25 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.github.mikephil.charting.data.Entry +import androidx.core.view.isVisible +import com.google.android.material.chip.Chip +import com.google.android.material.chip.ChipGroup +import io.realm.Realm import kotlinx.android.synthetic.main.fragment_statistic_details.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import net.pokeranalytics.android.R -import net.pokeranalytics.android.calculus.Stat -import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity +import net.pokeranalytics.android.calculus.* +import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity.Companion.displayAggregationChoices import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.extensions.ChipGroupExtension +import net.pokeranalytics.android.ui.extensions.hideWithAnimation +import net.pokeranalytics.android.ui.extensions.px +import net.pokeranalytics.android.ui.extensions.showWithAnimation import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import timber.log.Timber +import java.util.* class StatisticDetailsFragment : PokerAnalyticsFragment() { @@ -24,9 +36,12 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { } private lateinit var parentActivity: PokerAnalyticsActivity + private lateinit var computableGroup: ComputableGroup + private lateinit var graphFragment: GraphFragment + private lateinit var selectedReport: Report + private var reports: MutableMap = hashMapOf() private var stat: Stat = Stat.NET_RESULT - private var entries: List = ArrayList() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_statistic_details, container, false) @@ -41,6 +56,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { * Init UI */ private fun initUI() { + Timber.d("initUI") parentActivity = activity as PokerAnalyticsActivity @@ -51,29 +67,120 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) - toolbar.title = stat.localizedTitle(requireContext()) val fragmentManager = parentActivity.supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() - val fragment = GraphFragment() + graphFragment = GraphFragment() - fragmentTransaction.add(R.id.container, fragment) + fragmentTransaction.add(R.id.graphContainer, graphFragment) fragmentTransaction.commit() + + stat.aggregationTypes.firstOrNull()?.let { aggregationType -> + reports[aggregationType]?.let { report -> + graphFragment.setData(report, aggregationType) + } + } + + toolbar.title = stat.localizedTitle(requireContext()) + val aggregationTypes = stat.aggregationTypes + + aggregationTypes.forEachIndexed { index, type -> + val chip = Chip(requireContext()) + chip.id = index + chip.text = requireContext().getString(type.resId) + chip.chipStartPadding = 8f.px + chip.chipEndPadding = 8f.px + this.chipGroup.addView(chip) + } + + this.chipGroup.isVisible = displayAggregationChoices + this.chipGroup.check(0) + + this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { + override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { + super.onCheckedChanged(group, checkedId) + val aggregationType = aggregationTypes[checkedId] + + reports[aggregationType]?.let { report -> + graphFragment.setData(report, aggregationType) + } ?: run { + launchStatComputation(aggregationType) + } + + } + }) + + /* StatisticDetailsActivity.parameters?.let { - fragment.setData(it.stat, it.computableGroup, it.report, StatisticDetailsActivity.displayAggregationChoices) + + //TODO: Set in the function setData + //stat = it.stat + + graphFragment.setData(report, aggregationType) + + //launchStatComputation(aggregationType) + //graphFragment.setData(it.stat, it.computableGroup, it.report, StatisticDetailsActivity.displayAggregationChoices) StatisticDetailsActivity.parameters = null } ?: run { throw Exception("Missing graph parameters") } + */ } + /** + * Launch stat computation + */ + private fun launchStatComputation(aggregationType: AggregationType) { + + graphContainer.hideWithAnimation() + progressBar.showWithAnimation() + + //TODO: Create loader here + Timber.d("launchStatComputation: $aggregationType") + + GlobalScope.launch { + + val s = Date() + Timber.d(">>> start...") + + val realm = Realm.getDefaultInstance() + + val requiredStats: List = listOf(stat) + + val report = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType, requiredStats) + reports[aggregationType] = report + + realm.close() + + val e = Date() + val duration = (e.time - s.time) / 1000.0 + Timber.d(">>> ended in $duration seconds") + + launch(Dispatchers.Main) { + graphFragment.setData(report, aggregationType) + progressBar.hideWithAnimation() + graphContainer.showWithAnimation() + } + + } + + } + + /** * Set data */ - fun setData(stat: Stat, entries: List) { + fun setData(stat: Stat, computableGroup: ComputableGroup, report: Report) { + Timber.d("setData") this.stat = stat - this.entries = entries + this.computableGroup = computableGroup + this.selectedReport = report + + stat.aggregationTypes.firstOrNull()?.let { + reports[it] = report + } + } } \ No newline at end of file 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 0ffd0696..192c35e3 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 @@ -246,8 +246,9 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc val realm = Realm.getDefaultInstance() + val requiredStats: List = listOf(stat) val aggregationType = stat.aggregationTypes.first() - report = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) + report = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType, requiredStats) realm.close() diff --git a/app/src/main/res/layout/activity_statistic_details.xml b/app/src/main/res/layout/activity_statistic_details.xml index 62d1cb20..401d6f55 100644 --- a/app/src/main/res/layout/activity_statistic_details.xml +++ b/app/src/main/res/layout/activity_statistic_details.xml @@ -1,15 +1,7 @@ - + android:id="@+id/statisticDetailsContainer"> - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_evograph.xml b/app/src/main/res/layout/fragment_evograph.xml index 63506299..8c937fd5 100644 --- a/app/src/main/res/layout/fragment_evograph.xml +++ b/app/src/main/res/layout/fragment_evograph.xml @@ -19,32 +19,9 @@ android:layout_height="0dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" - app:layout_constraintBottom_toTopOf="@id/chips" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/legendContainer" /> - - - - - - + app:layout_constraintTop_toBottomOf="@+id/legendContainer" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_statistic_details.xml b/app/src/main/res/layout/fragment_statistic_details.xml index 44e1e283..952dc2da 100644 --- a/app/src/main/res/layout/fragment_statistic_details.xml +++ b/app/src/main/res/layout/fragment_statistic_details.xml @@ -14,13 +14,54 @@ app:layout_constraintTop_toTopOf="parent" tools:title="@string/app_name" /> + + + + + + + + From 725c8d944985b28b82a99cbce78db02022375b7e Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 15:46:12 +0200 Subject: [PATCH 2/7] Clean code --- .../ui/activity/StatisticDetailsActivity.kt | 6 ++--- .../ui/fragment/StatisticDetailsFragment.kt | 24 +++---------------- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt index a93369c5..4b9a0955 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt @@ -3,7 +3,6 @@ package net.pokeranalytics.android.ui.activity import android.content.Context import android.content.Intent import android.os.Bundle -import com.google.android.libraries.places.internal.it import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.Report @@ -23,8 +22,8 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { 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 - var displayAggregationChoices: Boolean = true + private var parameters: GraphParameters? = null + private var displayAggregationChoices: Boolean = true /** * Default constructor @@ -56,6 +55,7 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { parameters?.let { statisticDetailsFragment.setData(it.stat, it.computableGroup, it.report) + parameters = null } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt index d9e1bc4a..3da8e638 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt @@ -16,7 +16,6 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* -import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity.Companion.displayAggregationChoices import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.extensions.ChipGroupExtension import net.pokeranalytics.android.ui.extensions.hideWithAnimation @@ -42,6 +41,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { private var reports: MutableMap = hashMapOf() private var stat: Stat = Stat.NET_RESULT + private var displayAggregationChoices: Boolean = true override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_statistic_details, container, false) @@ -56,7 +56,6 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { * Init UI */ private fun initUI() { - Timber.d("initUI") parentActivity = activity as PokerAnalyticsActivity @@ -110,22 +109,6 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { } }) - - /* - StatisticDetailsActivity.parameters?.let { - - //TODO: Set in the function setData - //stat = it.stat - - graphFragment.setData(report, aggregationType) - - //launchStatComputation(aggregationType) - //graphFragment.setData(it.stat, it.computableGroup, it.report, StatisticDetailsActivity.displayAggregationChoices) - StatisticDetailsActivity.parameters = null - } ?: run { - throw Exception("Missing graph parameters") - } - */ } /** @@ -167,16 +150,15 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { /** * Set data */ - fun setData(stat: Stat, computableGroup: ComputableGroup, report: Report) { - Timber.d("setData") + fun setData(stat: Stat, computableGroup: ComputableGroup, report: Report, displayAggregationChoices: Boolean) { this.stat = stat this.computableGroup = computableGroup this.selectedReport = report + this.displayAggregationChoices = displayAggregationChoices stat.aggregationTypes.firstOrNull()?.let { reports[it] = report } - } } \ No newline at end of file From 97ed573197c2c5998c784cdc7c258e604f01e410 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 15:46:36 +0200 Subject: [PATCH 3/7] Add missing parameter --- .../android/ui/activity/StatisticDetailsActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt index 4b9a0955..38871831 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt @@ -54,7 +54,7 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { fragmentTransaction.commit() parameters?.let { - statisticDetailsFragment.setData(it.stat, it.computableGroup, it.report) + statisticDetailsFragment.setData(it.stat, it.computableGroup, it.report, displayAggregationChoices) parameters = null } From 8b90152b0c0834e9d1f16fe677e40f1ffebb7bbf Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 16:04:27 +0200 Subject: [PATCH 4/7] Clean code --- .../android/ui/adapter/HomePagerAdapter.kt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt index 5e504fb1..e6dd1a95 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt @@ -17,12 +17,6 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda override fun getItem(position: Int): PokerAnalyticsFragment { return when (position) { - //CLEAN - /* - 0 -> HistoryFragment.newInstance() - 1 -> StatsFragment.newInstance() - 2 -> SettingsFragment.newInstance() - */ 0 -> HistoryFragment.newInstance() 1 -> StatsFragment.newInstance() 2 -> CalendarFragment.newInstance() @@ -49,12 +43,6 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda override fun getItemPosition(obj: Any): Int { return when (obj) { - //CLEAN - /* - HistoryFragment::class.java -> 0 - StatsFragment::class.java -> 1 - SettingsFragment::class.java -> 2 - */ HistoryFragment::class.java -> 0 StatsFragment::class.java -> 1 CalendarFragment::class.java -> 2 From 5881045de3b794c1d056aced2b5044b2ce172567 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 16:04:39 +0200 Subject: [PATCH 5/7] Clean code --- .../net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt index e6dd1a95..e1b32d35 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt @@ -27,7 +27,7 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda } override fun getCount(): Int { - return 5//3 + return 5 } override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { From 4ea758ad388a8892b04355f81aae0ad3535cf230 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 16:51:55 +0200 Subject: [PATCH 6/7] Add Report Details, improve Statistics & Graph --- app/src/main/AndroidManifest.xml | 5 + .../ui/activity/ReportDetailsActivity.kt | 55 +++++++ .../ui/activity/StatisticDetailsActivity.kt | 8 +- .../android/ui/adapter/ReportPagerAdapter.kt | 69 +++++++++ .../android/ui/fragment/GraphFragment.kt | 10 +- .../ui/fragment/ReportDetailsFragment.kt | 140 ++++++++++++++++++ .../android/ui/fragment/ReportsFragment.kt | 31 ++-- .../ui/fragment/StatisticDetailsFragment.kt | 1 + ...{HomeViewPager.kt => NoPagingViewPager.kt} | 4 +- app/src/main/res/layout/activity_home.xml | 2 +- .../res/layout/activity_report_details.xml | 7 + .../res/layout/fragment_report_details.xml | 62 ++++++++ 12 files changed, 368 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/ReportDetailsActivity.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt rename app/src/main/java/net/pokeranalytics/android/ui/view/{HomeViewPager.kt => NoPagingViewPager.kt} (81%) create mode 100644 app/src/main/res/layout/activity_report_details.xml create mode 100644 app/src/main/res/layout/fragment_report_details.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 37e6961f..8ef69191 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,11 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> + + >() + + override fun getItem(position: Int): PokerAnalyticsFragment { + return when (position) { + 0 -> GraphFragment.newInstance(report) + 1 -> GraphFragment.newInstance(report) + 2 -> GraphFragment.newInstance(report) + else -> GraphFragment.newInstance() + } + } + + override fun getCount(): Int { + return 3 + } + + override fun getPageTitle(position: Int): CharSequence? { + return when(position) { + 0 -> context.getString(R.string.bar) + 1 -> context.getString(R.string.line) + 2 -> context.getString(R.string.table) + else -> "" + } + } + + override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { + super.destroyItem(container, position, `object`) + weakReferences.remove(position) + } + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val fragment = super.instantiateItem(container, position) as PokerAnalyticsFragment + weakReferences.put(position, WeakReference(fragment)) + return fragment + } + + override fun getItemPosition(obj: Any): Int { + return PagerAdapter.POSITION_UNCHANGED + } + + /** + * Return the fragment at the position key + */ + fun getFragment(key: Int): PokerAnalyticsFragment? { + if (weakReferences.get(key) != null) { + return weakReferences.get(key).get() + } + return null + } + +} \ No newline at end of file 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 7cd9184d..69fe9938 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 @@ -24,9 +24,6 @@ import timber.log.Timber import kotlin.coroutines.CoroutineContext -class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var report: Report) { -} - class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, CoroutineScope { companion object { @@ -34,8 +31,13 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co /** * Create new instance */ - fun newInstance(): GraphFragment { + fun newInstance(report: Report? = null): GraphFragment { val fragment = GraphFragment() + + report?.let { + fragment.selectedReport = it + } + val bundle = Bundle() fragment.arguments = bundle return fragment diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt new file mode 100644 index 00000000..06ba58f6 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt @@ -0,0 +1,140 @@ +package net.pokeranalytics.android.ui.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.google.android.material.tabs.TabLayout +import kotlinx.android.synthetic.main.fragment_report_details.* +import kotlinx.android.synthetic.main.fragment_statistic_details.toolbar +import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.AggregationType +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.adapter.ReportPagerAdapter +import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment + +class ReportDetailsFragment : PokerAnalyticsFragment() { + + companion object { + fun newInstance(report: Report?, reportTitle: String): ReportDetailsFragment { + val fragment = ReportDetailsFragment() + fragment.reportTitle = reportTitle + report?.let { + fragment.selectedReport = it + } + val bundle = Bundle() + fragment.arguments = bundle + return fragment + + } + } + + private lateinit var parentActivity: PokerAnalyticsActivity + //private lateinit var computableGroup: ComputableGroup + //private lateinit var graphFragment: GraphFragment + private lateinit var selectedReport: Report + + private var reports: MutableMap = hashMapOf() + private var stat: Stat = Stat.NET_RESULT + private var displayAggregationChoices: Boolean = true + private var reportTitle: String = "" + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_report_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 = reportTitle + + val reportPagerAdapter = ReportPagerAdapter(requireContext(), parentActivity.supportFragmentManager, selectedReport) + viewPager.adapter = reportPagerAdapter + viewPager.offscreenPageLimit = 3 + + tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + viewPager.setCurrentItem(tab.position, false) + } + + override fun onTabUnselected(tab: TabLayout.Tab) { + } + + override fun onTabReselected(tab: TabLayout.Tab) { + } + }) + + /* + stat.aggregationTypes.firstOrNull()?.let { aggregationType -> + reports[aggregationType]?.let { report -> + graphFragment.setData(report, aggregationType) + } + } + + */ + + + /* + val aggregationTypes = stat.aggregationTypes + + aggregationTypes.forEachIndexed { index, type -> + val chip = Chip(requireContext()) + chip.id = index + chip.text = requireContext().getString(type.resId) + chip.chipStartPadding = 8f.px + chip.chipEndPadding = 8f.px + this.chipGroup.addView(chip) + } + + this.chipGroup.isVisible = displayAggregationChoices + this.chipGroup.check(0) + + this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { + override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { + super.onCheckedChanged(group, checkedId) + val aggregationType = aggregationTypes[checkedId] + + reports[aggregationType]?.let { report -> + graphFragment.setData(report, aggregationType) + } ?: run { + launchStatComputation(aggregationType) + } + + } + }) + */ + } + + + /** + * Set data + */ + fun setData(report: Report) { + this.selectedReport = report + + /* + stat.aggregationTypes.firstOrNull()?.let { + reports[it] = report + } + */ + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt index b8a8a4cd..ec862ad2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt @@ -7,12 +7,14 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.realm.Realm import kotlinx.android.synthetic.main.fragment_stats.* +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator +import net.pokeranalytics.android.ui.activity.ReportDetailsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -67,13 +69,9 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { super.onRowSelected(position, row, fromAction) - Timber.d("row: $row") - when (row) { - - ReportRow.DAY_OF_WEEKS -> { - //TODO: Open ComparisonChartActivity with correct data - //TODO: Calcul report before or after - } + if (row is ReportRow) { + val reportName = row.localizedTitle(requireContext()) + launchComputation(row.comparators, reportName) } } @@ -102,27 +100,28 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour } } - private fun launchComputation(comparators: List) { - + /** + * Launch computation + */ + private fun launchComputation(comparators: List, reportName: String) { GlobalScope.launch { val startDate = Date() - val realm = Realm.getDefaultInstance() val requiredStats: List = listOf(Stat.NET_RESULT) val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) val report = Calculator.computeStatsWithComparators(realm, comparators = comparators, options = options) + Timber.d("launchComputation: ${System.currentTimeMillis() - startDate.time}ms") - - - - + launch(Dispatchers.Main) { + if (!isDetached) { + ReportDetailsActivity.newInstance(requireContext(), report, reportName) + } + } } - - } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt index 3da8e638..37ac6e25 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt @@ -25,6 +25,7 @@ import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import timber.log.Timber import java.util.* + class StatisticDetailsFragment : PokerAnalyticsFragment() { companion object { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/NoPagingViewPager.kt similarity index 81% rename from app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/NoPagingViewPager.kt index 2802f2fb..bb7eac22 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/NoPagingViewPager.kt @@ -6,9 +6,9 @@ import android.view.MotionEvent import androidx.viewpager.widget.ViewPager /** - * Poker Analytics ViewPager + * ViewPager with paging disabled */ -class HomeViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) { +class NoPagingViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) { var enablePaging: Boolean = false diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index d5788e1c..4f76f96f 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -15,7 +15,7 @@ app:layout_constraintTop_toTopOf="parent" app:title="@string/app_name" /> - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_report_details.xml b/app/src/main/res/layout/fragment_report_details.xml new file mode 100644 index 00000000..73ad6108 --- /dev/null +++ b/app/src/main/res/layout/fragment_report_details.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + From 5206e1417347707a4cb76a17cc80bb0e2be1020e Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 16:54:29 +0200 Subject: [PATCH 7/7] Clean report details --- .../ui/fragment/ReportDetailsFragment.kt | 48 ------------------- 1 file changed, 48 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt index 06ba58f6..64475656 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt @@ -32,8 +32,6 @@ class ReportDetailsFragment : PokerAnalyticsFragment() { } private lateinit var parentActivity: PokerAnalyticsActivity - //private lateinit var computableGroup: ComputableGroup - //private lateinit var graphFragment: GraphFragment private lateinit var selectedReport: Report private var reports: MutableMap = hashMapOf() @@ -81,46 +79,6 @@ class ReportDetailsFragment : PokerAnalyticsFragment() { override fun onTabReselected(tab: TabLayout.Tab) { } }) - - /* - stat.aggregationTypes.firstOrNull()?.let { aggregationType -> - reports[aggregationType]?.let { report -> - graphFragment.setData(report, aggregationType) - } - } - - */ - - - /* - val aggregationTypes = stat.aggregationTypes - - aggregationTypes.forEachIndexed { index, type -> - val chip = Chip(requireContext()) - chip.id = index - chip.text = requireContext().getString(type.resId) - chip.chipStartPadding = 8f.px - chip.chipEndPadding = 8f.px - this.chipGroup.addView(chip) - } - - this.chipGroup.isVisible = displayAggregationChoices - this.chipGroup.check(0) - - this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { - override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { - super.onCheckedChanged(group, checkedId) - val aggregationType = aggregationTypes[checkedId] - - reports[aggregationType]?.let { report -> - graphFragment.setData(report, aggregationType) - } ?: run { - launchStatComputation(aggregationType) - } - - } - }) - */ } @@ -129,12 +87,6 @@ class ReportDetailsFragment : PokerAnalyticsFragment() { */ fun setData(report: Report) { this.selectedReport = report - - /* - stat.aggregationTypes.firstOrNull()?.let { - reports[it] = report - } - */ } } \ No newline at end of file