From 3f75898cc747d70f87857d158304db110c274406 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 27 Nov 2019 14:57:22 +0100 Subject: [PATCH] Use ViewModel for GraphFragment --- .../android/ui/activity/GraphActivity.kt | 46 ++++-- .../ui/activity/components/ReportActivity.kt | 5 - .../ui/adapter/ComparisonChartPagerAdapter.kt | 6 +- .../android/ui/adapter/ReportPagerAdapter.kt | 69 +++++---- .../ui/fragment/CalendarDetailsFragment.kt | 40 +++--- .../android/ui/fragment/GraphFragment.kt | 132 ++++++++++-------- .../components/PokerAnalyticsFragment.kt | 4 + .../report/ComparisonReportFragment.kt | 15 +- .../fragment/report/ProgressReportFragment.kt | 39 +++--- .../ui/fragment/report/TableReportFragment.kt | 2 +- .../android/ui/viewmodel/GraphViewModel.kt | 56 ++++++++ .../android/ui/viewmodel/ReportHolder.kt | 24 ++++ .../android/ui/viewmodel/ReportViewModel.kt | 31 +++- 13 files changed, 298 insertions(+), 171 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/viewmodel/GraphViewModel.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportHolder.kt diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt index 1eae0563..925de91a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt @@ -3,29 +3,39 @@ package net.pokeranalytics.android.ui.activity import android.content.Context import android.content.Intent import android.os.Bundle +import androidx.lifecycle.ViewModelProviders import com.github.mikephil.charting.data.BarDataSet import com.github.mikephil.charting.data.LineDataSet import kotlinx.android.synthetic.main.activity_graph.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.GraphFragment +import net.pokeranalytics.android.ui.viewmodel.GraphViewModel +import net.pokeranalytics.android.ui.viewmodel.ViewModelHolder -class GraphActivity : PokerAnalyticsActivity() { +class GraphActivity : PokerAnalyticsActivity(), ViewModelHolder { + + override val viewModel: GraphViewModel by lazy { + ViewModelProviders.of(this).get(GraphViewModel::class.java) + } companion object { private var lineDataSets: List? = null private var barDataSets: List? = null - private var style: GraphFragment.Style? = GraphFragment.Style.LINE + private var style: GraphFragment.Style = GraphFragment.Style.LINE private var activityTitle: String? = null /** * Default constructor */ fun newInstance( - context: Context, lineDataSets: List? = null, barDataSets: List? = null, - style: GraphFragment.Style = GraphFragment.Style.LINE, title: String? = null + context: Context, lineDataSets: List? = null, + barDataSets: List? = null, + style: GraphFragment.Style = GraphFragment.Style.LINE, + title: String? = null ) { this.lineDataSets = lineDataSets this.barDataSets = barDataSets @@ -48,23 +58,37 @@ class GraphActivity : PokerAnalyticsActivity() { */ private fun initUI() { - activityTitle?.let { + this.viewModel.title = activityTitle + + this.viewModel.title?.let { setSupportActionBar(toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) title = activityTitle activityTitle = null } - style?.let { - val fragmentTransaction = supportFragmentManager.beginTransaction() - val graphFragment = GraphFragment.newInstance(lineDataSets, barDataSets, it) - fragmentTransaction.add(R.id.container, graphFragment) - fragmentTransaction.commit() + barDataSets?.let { + if (it.size == 1) { + this.viewModel.setBarDataSet(it.first()) + } else { + throw PAIllegalStateException("Unexpected number of bar data sets") + } } + lineDataSets?.let { + if (it.size == 1) { + this.viewModel.setLineDataSet(it.first()) + } else { + throw PAIllegalStateException("Unexpected number of line data sets") + } + } + + val fragmentTransaction = supportFragmentManager.beginTransaction() + val graphFragment = GraphFragment.newInstance(style) + fragmentTransaction.add(R.id.container, graphFragment) + fragmentTransaction.commit() lineDataSets = null barDataSets = null - style = null } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt index 2970abfd..c447ead4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt @@ -55,11 +55,6 @@ abstract class ReportActivity : PokerAnalyticsActivity(), ViewModelHolder { this.initViewModelWithParameters() } - override fun onStart() { - super.onStart() - ReportViewModel.resetParameters() - } - private fun initViewModelWithParameters() { ReportViewModel.parameters?.let { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt index 71bb2b84..6c415618 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt @@ -7,8 +7,8 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.fragment.CalendarFragment -import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.fragment.FeedFragment +import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import java.lang.ref.WeakReference @@ -21,8 +21,8 @@ class ComparisonChartPagerAdapter(val context: Context, fragmentManager: Fragmen override fun getItem(position: Int): PokerAnalyticsFragment { return when (position) { - 0 -> GraphFragment() - 1 -> GraphFragment() + 0 -> GraphFragment.newInstance(GraphFragment.Style.BAR) + 1 -> GraphFragment.newInstance(GraphFragment.Style.MULTILINE) 2 -> CalendarFragment.newInstance() else -> FeedFragment.newInstance() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt index 4d20ee9d..e75d1b8a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt @@ -1,36 +1,33 @@ package net.pokeranalytics.android.ui.adapter import android.content.Context -import android.util.SparseArray -import android.view.ViewGroup import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentStatePagerAdapter -import androidx.viewpager.widget.PagerAdapter +import androidx.fragment.app.FragmentPagerAdapter import net.pokeranalytics.android.R -import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.ui.fragment.GraphFragment -import net.pokeranalytics.android.ui.fragment.report.ComposableTableReportFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment -import java.lang.ref.WeakReference +import net.pokeranalytics.android.ui.fragment.report.ComposableTableReportFragment +import net.pokeranalytics.android.ui.viewmodel.ReportHolder /** * Home Adapter */ -class ReportPagerAdapter(val context: Context, val fragmentManager: FragmentManager, private val report: Report) : FragmentStatePagerAdapter(fragmentManager) { +class ReportPagerAdapter(val context: Context, val fragmentManager: FragmentManager, private val reportHolder: ReportHolder) : FragmentPagerAdapter(fragmentManager) { - var weakReferences = SparseArray>() +// private var weakReferences = SparseArray>() override fun getItem(position: Int): PokerAnalyticsFragment { return when (position) { 0 -> { - val dataSetList = listOf(report.barEntries(null, context)) - GraphFragment.newInstance(barDataSets = dataSetList, style = GraphFragment.Style.BAR) +// val dataSetList = listOf(report.barEntries(null, context)) + GraphFragment.newInstance(style = GraphFragment.Style.BAR) } 1 -> { - val dataSetList = report.multiLineEntries(context = context) - GraphFragment.newInstance(lineDataSets = dataSetList, style = GraphFragment.Style.MULTILINE) +// val dataSetList = report.multiLineEntries(context = context) + GraphFragment.newInstance(style = GraphFragment.Style.MULTILINE) } 2 -> { + val report = this.reportHolder.report ComposableTableReportFragment.newInstance(report) } else -> PokerAnalyticsFragment() @@ -50,29 +47,29 @@ class ReportPagerAdapter(val context: Context, val fragmentManager: FragmentMana } } - 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 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 +// } - 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 - } +// /** +// * 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/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index a58d034b..d151a44a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -8,6 +8,8 @@ import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager +import com.github.mikephil.charting.data.BarDataSet +import com.github.mikephil.charting.data.LineDataSet import com.google.android.material.tabs.TabLayout import io.realm.Realm import kotlinx.android.synthetic.main.fragment_calendar_details.* @@ -20,7 +22,7 @@ import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.QueryCondition -import net.pokeranalytics.android.ui.activity.ProgressReportActivity +import net.pokeranalytics.android.ui.activity.GraphActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -142,7 +144,16 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable if (report != null && stat != null) { val title = row.title ?: stat.localizedTitle(requireContext()) - ProgressReportActivity.newInstance(requireContext(), report, title, stat, false) + + val dataSet = row.dataSet + when (dataSet) { + is LineDataSet-> { + GraphActivity.newInstance(requireContext(), listOf(dataSet), null, GraphFragment.Style.LINE, title) + } + is BarDataSet -> { + GraphActivity.newInstance(requireContext(), null, listOf(dataSet), GraphFragment.Style.BAR, title) + } + } } } } @@ -173,19 +184,6 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable QueryCondition.IsTournament -> query.add(QueryCondition.IsTournament) } -// val conditions = ArrayList().apply { -// addAll(computedResults.group.conditions) -// -// // Remove session type _conditions -// removeAll(Criteria.Cash.queryConditions) -// removeAll(Criteria.Tournament.queryConditions) -// -// when (sessionTypeCondition) { -// QueryCondition.IsCash -> addAll(Criteria.Cash.queryConditions) -// QueryCondition.IsTournament -> addAll(Criteria.Tournament.queryConditions) -// } -// } - val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED, Stat.STANDARD_DEVIATION_HOURLY) val options = Calculator.Options( progressValues = Calculator.Options.ProgressValues.STANDARD, @@ -199,19 +197,19 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable report.results.firstOrNull()?.let { // Create rows - val dataSet1 = report.results.firstOrNull()?.defaultStatEntries(Stat.NET_RESULT, requireContext()) - val dataSet2 = report.results.firstOrNull()?.defaultStatEntries(Stat.STANDARD_DEVIATION, requireContext()) - val dataSet3 = report.results.firstOrNull()?.defaultStatEntries(Stat.HOURLY_DURATION, requireContext()) + val netResultDataSet = report.results.firstOrNull()?.defaultStatEntries(Stat.NET_RESULT, requireContext()) + val stdDataSet = report.results.firstOrNull()?.defaultStatEntries(Stat.STANDARD_DEVIATION, requireContext()) + val durationDataSet = report.results.firstOrNull()?.defaultStatEntries(Stat.HOURLY_DURATION, requireContext()) rowRepresentables.clear() rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.net_result)) - rowRepresentables.add(GraphRow(dataSet1, report = report, stat = Stat.NET_RESULT)) + rowRepresentables.add(GraphRow(netResultDataSet, report = report, stat = Stat.NET_RESULT)) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.NET_RESULT), it.computedStat(Stat.HOURLY_RATE))) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.LOCATIONS_PLAYED), it.computedStat(Stat.LONGEST_STREAKS))) rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.distribution)) rowRepresentables.add( GraphRow( - dataSet2, + stdDataSet, requireContext().getString(R.string.distribution), report = report, stat = Stat.STANDARD_DEVIATION @@ -219,7 +217,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable ) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.WIN_RATIO), it.computedStat(Stat.MAXIMUM_NETRESULT))) rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.volume)) - rowRepresentables.add(GraphRow(dataSet3, report = report, stat = Stat.HOURLY_DURATION)) + rowRepresentables.add(GraphRow(durationDataSet, report = report, stat = Stat.HOURLY_DURATION)) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.HOURLY_DURATION), it.computedStat(Stat.AVERAGE_HOURLY_DURATION))) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.DAYS_PLAYED), it.computedStat(Stat.MAXIMUM_DURATION))) } 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 b20a78cd..e6c57ac1 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 @@ -7,26 +7,37 @@ import android.view.ViewGroup 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.data.BarData +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.data.LineData import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.interfaces.datasets.IBarLineScatterCandleBubbleDataSet import com.github.mikephil.charting.listener.OnChartValueSelectedListener import kotlinx.android.synthetic.main.fragment_graph.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.interfaces.ObjectIdentifier import net.pokeranalytics.android.ui.fragment.components.RealmFragment -import net.pokeranalytics.android.ui.graph.AxisFormatting import net.pokeranalytics.android.ui.graph.GraphUnderlyingEntry import net.pokeranalytics.android.ui.graph.setStyle import net.pokeranalytics.android.ui.view.LegendView import net.pokeranalytics.android.ui.view.MultiLineLegendView +import net.pokeranalytics.android.ui.viewmodel.GraphDataProvider +import net.pokeranalytics.android.ui.viewmodel.ViewModelHolder import net.pokeranalytics.android.util.extensions.findById import timber.log.Timber class GraphFragment : RealmFragment(), OnChartValueSelectedListener { + private lateinit var graphDataProvider: GraphDataProvider + + private val stat: Stat + get() { + return this.graphDataProvider.stat + } + enum class Style { LINE, BAR, @@ -38,12 +49,12 @@ class GraphFragment : RealmFragment(), OnChartValueSelectedListener { /** * Create new instance */ - fun newInstance(lineDataSets: List? = null, barDataSets: List? = null, style: Style = Style.LINE): GraphFragment { + fun newInstance(style: Style = Style.LINE): GraphFragment { val fragment = GraphFragment() - fragment.style = style - fragment.lineDataSetList = lineDataSets - fragment.barDataSetList = barDataSets +// fragment.lineDataSetList = lineDataSets +// fragment.barDataSetList = barDataSets val bundle = Bundle() + bundle.putSerializable(BundleKey.STYLE.value, style.ordinal) fragment.arguments = bundle return fragment } @@ -51,16 +62,11 @@ class GraphFragment : RealmFragment(), OnChartValueSelectedListener { } private var style: Style = Style.LINE - private lateinit var legendView: LegendView - private var lineDataSetList: List? = null - private var barDataSetList: List? = null + private lateinit var legendView: LegendView private var chartView: BarLineChartBase<*>? = null - private var stat: Stat = Stat.NET_RESULT - private var axisFormatting: AxisFormatting = AxisFormatting.DEFAULT - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater.inflate(R.layout.fragment_graph, container, false) @@ -68,31 +74,16 @@ class GraphFragment : RealmFragment(), OnChartValueSelectedListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + initData() initUI() loadGraph() } - /** - * Set data - */ - fun setLineData(lineDataSets: List, stat: Stat, axisFormatting: AxisFormatting = AxisFormatting.DEFAULT) { - this.lineDataSetList = lineDataSets - this.stat = stat - this.axisFormatting = axisFormatting + private fun initData() { + val styleOrdinal = this.arguments?.getInt(BundleKey.STYLE.value) ?: throw PAIllegalStateException("Missing style key in bundle") + this.style = Style.values()[styleOrdinal] - if (isAdded && !isDetached) { - loadGraph() - } - } - - fun setBarData(barDataSets: List, stat: Stat, axisFormatting: AxisFormatting = AxisFormatting.DEFAULT) { - this.barDataSetList = barDataSets - this.stat = stat - this.axisFormatting = axisFormatting - - if (isAdded && !isDetached) { - loadGraph() - } + this.graphDataProvider = (requireActivity() as ViewModelHolder).viewModel as GraphDataProvider } /** @@ -108,6 +99,13 @@ class GraphFragment : RealmFragment(), OnChartValueSelectedListener { this.legendContainer.addView(this.legendView) } + fun reload(style: Style) { + this.style = style + if (isAdded && !isDetached) { + loadGraph() + } + } + /** * Load graph */ @@ -115,53 +113,63 @@ class GraphFragment : RealmFragment(), OnChartValueSelectedListener { this.chartContainer.removeAllViews() - this.lineDataSetList?.let { dataSets -> + this.chartView = when (this.style) { + Style.LINE, Style.MULTILINE -> { - val lineChart = LineChart(context) - lineChart.setOnChartValueSelectedListener(this) + val dataSets = when (this.style) { + Style.LINE -> listOf(this.graphDataProvider.lineDataSet(requireContext())) + Style.MULTILINE -> this.graphDataProvider.multiLineDataSet(requireContext()) + else -> throw PAIllegalStateException("Cannot happen") + } - val lineData = LineData(dataSets) - lineChart.data = lineData + val lineChart = LineChart(context) + lineChart.setOnChartValueSelectedListener(this) - this.chartView = lineChart + val lineData = LineData(dataSets) + lineChart.data = lineData - dataSets.firstOrNull()?.let { dataSet -> - this.legendView.prepareWithStat(this.stat, dataSet.entryCount, this.style) - if (dataSet.entryCount > 0) { - val entry = dataSet.getEntryForIndex(dataSet.entryCount - 1) - this.selectValue(entry, dataSet) + dataSets.firstOrNull()?.let { dataSet -> + this.legendView.prepareWithStat(stat, dataSet.entryCount, this.style) + if (dataSet.entryCount > 0) { + val entry = dataSet.getEntryForIndex(dataSet.entryCount - 1) + this.selectValue(entry, dataSet) + } } + + lineChart } - } + Style.BAR -> { - this.barDataSetList?.let { dataSets -> + val dataSets = listOf(this.graphDataProvider.barDataSet(requireContext())) - this.legendView.prepareWithStat(this.stat, style = this.style) - val barChart = BarChart(context) - barChart.setOnChartValueSelectedListener(this) + this.legendView.prepareWithStat(stat, style = this.style) + val barChart = BarChart(context) + barChart.setOnChartValueSelectedListener(this) - if (stat.graphShowsXAxisZero) { - barChart.xAxis.axisMinimum = 0.0f - } - if (stat.graphShowsYAxisZero) { - barChart.axisLeft.axisMinimum = 0.0f - } - this.chartView = barChart + if (stat.graphShowsXAxisZero) { + barChart.xAxis.axisMinimum = 0.0f + } + if (stat.graphShowsYAxisZero) { + barChart.axisLeft.axisMinimum = 0.0f + } - val barData = BarData(dataSets) - barChart.data = barData + val barData = BarData(dataSets) + barChart.data = barData - dataSets.firstOrNull()?.let { - if (it.entryCount > 0) { - val entry = it.getEntryForIndex(0) - this.chartView?.highlightValue(entry.x, 0) + dataSets.firstOrNull()?.let { + if (it.entryCount > 0) { + val entry = it.getEntryForIndex(0) + barChart.highlightValue(entry.x, 0) + } } + + barChart } } this.chartContainer.addView(this.chartView) - this.chartView?.setStyle(false, axisFormatting, requireContext()) + this.chartView?.setStyle(false, this.graphDataProvider.axisFormatting, requireContext()) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/PokerAnalyticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/PokerAnalyticsFragment.kt index fa1a95cc..2d54081c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/PokerAnalyticsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/PokerAnalyticsFragment.kt @@ -14,6 +14,10 @@ open class PokerAnalyticsFragment : Fragment() { private var loaderDialogFragment: LoaderDialogFragment? = null var parentActivity: PokerAnalyticsActivity? = null + enum class BundleKey(val value: String) { + STYLE("style") + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Crashlytics.log("$this.localClassName onCreate") diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt index 0f77140c..89d88cec 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt @@ -36,13 +36,18 @@ class ComparisonReportFragment : AbstractReportFragment() { */ private fun initUI() { + viewPager.adapter = ReportPagerAdapter(requireContext(), requireActivity().supportFragmentManager, this.viewModel) + // setDisplayHomeAsUpEnabled(true) - parentActivity?.let { - val reportPagerAdapter = ReportPagerAdapter(requireContext(), it.supportFragmentManager, selectedReport) - viewPager.adapter = reportPagerAdapter - viewPager.offscreenPageLimit = 3 - } +// val reportPagerAdapter = +// viewPager.offscreenPageLimit = 3 + +// parentActivity?.let { +// val reportPagerAdapter = ReportPagerAdapter(requireContext(), it.supportFragmentManager, this.viewModel) +// viewPager.adapter = reportPagerAdapter +// viewPager.offscreenPageLimit = 3 +// } tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt index 08841c75..d57407be 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt @@ -20,6 +20,7 @@ import net.pokeranalytics.android.calculus.AggregationType import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.ui.extensions.ChipGroupExtension import net.pokeranalytics.android.ui.extensions.hideWithAnimation @@ -37,9 +38,12 @@ class ProgressReportFragment : AbstractReportFragment() { /** * Creates new instance */ - fun newInstance(): ProgressReportFragment { + fun newInstance(style: GraphFragment.Style? = null): ProgressReportFragment { val fragment = ProgressReportFragment() val bundle = Bundle() + style?.let { + bundle.putSerializable(BundleKey.STYLE.value, it.ordinal) + } fragment.arguments = bundle return fragment } @@ -47,7 +51,7 @@ class ProgressReportFragment : AbstractReportFragment() { private lateinit var graphFragment: GraphFragment - private var reports: MutableMap = hashMapOf() + private var reports: MutableMap = EnumMap(AggregationType::class.java) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) @@ -59,18 +63,6 @@ class ProgressReportFragment : AbstractReportFragment() { initUI() } - /** - * Set data - */ -// fun setData(report: Report, stat: Stat, displayAggregationChoices: Boolean, title: String) { -// this.stat = stat -// this.setReport(report) -// this.displayAggregationChoices = displayAggregationChoices -// this.reportTitle = title -// - -// } - /** * Init UI */ @@ -78,8 +70,7 @@ class ProgressReportFragment : AbstractReportFragment() { val fragmentManager = parentActivity?.supportFragmentManager val fragmentTransaction = fragmentManager?.beginTransaction() - graphFragment = GraphFragment() - + graphFragment = GraphFragment.newInstance(GraphFragment.Style.LINE) fragmentTransaction?.add(R.id.graphContainer, graphFragment) fragmentTransaction?.commit() @@ -193,11 +184,17 @@ class ProgressReportFragment : AbstractReportFragment() { } dataSet?.let { ds -> - if (ds is LineDataSet) { - graphFragment.setLineData(listOf(ds), stat, aggregationType.axisFormatting) - } - if (ds is BarDataSet) { - graphFragment.setBarData(listOf(ds), stat, aggregationType.axisFormatting) + this.viewModel.defineParameters(stat, aggregationType.axisFormatting) + when (ds) { + is LineDataSet -> { + this.viewModel.setLineDataSet(ds) + graphFragment.reload(GraphFragment.Style.LINE) + } + is BarDataSet -> { + this.viewModel.setBarDataSet(ds) + graphFragment.reload(GraphFragment.Style.BAR) + } + else -> throw PAIllegalStateException("unmanaged data set") } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt index 02de3181..4ef6f6ec 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt @@ -33,7 +33,7 @@ class TableReportFragment : AbstractReportFragment() { private fun initUI() { val fragmentTransaction = parentActivity?.supportFragmentManager?.beginTransaction() - val fragment = ComposableTableReportFragment.newInstance(this.selectedReport) + val fragment = ComposableTableReportFragment.newInstance() fragmentTransaction?.add(R.id.tableReportContainer, fragment) fragmentTransaction?.commit() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/GraphViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/GraphViewModel.kt new file mode 100644 index 00000000..0b382457 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/GraphViewModel.kt @@ -0,0 +1,56 @@ +package net.pokeranalytics.android.ui.viewmodel + +import android.content.Context +import androidx.lifecycle.ViewModel +import com.github.mikephil.charting.data.BarDataSet +import com.github.mikephil.charting.data.LineDataSet +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.ui.graph.AxisFormatting + +open class GraphViewModel : ViewModel(), GraphDataProvider { + + /*** + * The title + */ + var title: String? = null + + /*** + * The displayed stat + */ + override var stat: Stat = Stat.NET_RESULT + + /*** + * The axis formatting + */ + override var axisFormatting: AxisFormatting = AxisFormatting.DEFAULT + + protected var selectedLineDataSet: LineDataSet? = null + + fun setLineDataSet(lineDataSet: LineDataSet) { + this.selectedLineDataSet = lineDataSet + } + + override fun lineDataSet(context: Context): LineDataSet { + return this.selectedLineDataSet!! + } + + override fun multiLineDataSet(context: Context): List { + throw PAIllegalStateException("Multi line for graph not implemented") + } + + protected var selectedBarDataSet: BarDataSet? = null + override fun barDataSet(context: Context): BarDataSet { + return this.selectedBarDataSet!! + } + + fun setBarDataSet(barDataSet: BarDataSet) { + this.selectedBarDataSet = barDataSet + } + + fun defineParameters(stat: Stat, axisFormatting: AxisFormatting) { + this.stat = stat + this.axisFormatting = axisFormatting + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportHolder.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportHolder.kt new file mode 100644 index 00000000..cd060b64 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportHolder.kt @@ -0,0 +1,24 @@ +package net.pokeranalytics.android.ui.viewmodel + +import android.content.Context +import com.github.mikephil.charting.data.BarDataSet +import com.github.mikephil.charting.data.LineDataSet +import net.pokeranalytics.android.calculus.Report +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.ui.graph.AxisFormatting + + +interface ReportHolder { + var report: Report +} + +interface GraphDataProvider { + + var stat: Stat + var axisFormatting: AxisFormatting + + fun lineDataSet(context: Context) : LineDataSet + fun multiLineDataSet(context: Context) : List + fun barDataSet(context: Context) : BarDataSet + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.kt index 1e7a9a5e..f9dc20c3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.kt @@ -1,16 +1,16 @@ package net.pokeranalytics.android.ui.viewmodel -import androidx.lifecycle.ViewModel +import android.content.Context +import com.github.mikephil.charting.data.BarDataSet +import com.github.mikephil.charting.data.LineDataSet import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Report -import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.ReportParameters -class ReportViewModel : ViewModel() { - var report: Report = Report(Calculator.Options()) - var stat: Stat = Stat.NET_RESULT - var title: String = "" +class ReportViewModel : GraphViewModel(), ReportHolder, GraphDataProvider { + + override var report: Report = Report(Calculator.Options()) var showAggregationChoices: Boolean = true companion object { @@ -33,5 +33,24 @@ class ReportViewModel : ViewModel() { } + override fun lineDataSet(context: Context): LineDataSet { + this.selectedLineDataSet?.let { + return it + } ?: run { + return this.report.lineEntries(stat, context) + } + } + + override fun multiLineDataSet(context: Context): List { + return this.report.multiLineEntries(context) + } + + override fun barDataSet(context: Context): BarDataSet { + this.selectedBarDataSet?.let { + return it + } ?: run { + return this.report.barEntries(stat, context) + } + } } \ No newline at end of file