Use ViewModel for GraphFragment

od
Laurent 6 years ago
parent 91f8b11cce
commit 3f75898cc7
  1. 42
      app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt
  2. 5
      app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt
  3. 6
      app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt
  4. 69
      app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt
  5. 40
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt
  6. 90
      app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt
  7. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/PokerAnalyticsFragment.kt
  8. 15
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt
  9. 37
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt
  10. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt
  11. 56
      app/src/main/java/net/pokeranalytics/android/ui/viewmodel/GraphViewModel.kt
  12. 24
      app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportHolder.kt
  13. 31
      app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.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<LineDataSet>? = null
private var barDataSets: List<BarDataSet>? = 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<LineDataSet>? = null, barDataSets: List<BarDataSet>? = null,
style: GraphFragment.Style = GraphFragment.Style.LINE, title: String? = null
context: Context, lineDataSets: List<LineDataSet>? = null,
barDataSets: List<BarDataSet>? = 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 {
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(lineDataSets, barDataSets, it)
val graphFragment = GraphFragment.newInstance(style)
fragmentTransaction.add(R.id.container, graphFragment)
fragmentTransaction.commit()
}
lineDataSets = null
barDataSets = null
style = null
}
}

@ -55,11 +55,6 @@ abstract class ReportActivity : PokerAnalyticsActivity(), ViewModelHolder {
this.initViewModelWithParameters()
}
override fun onStart() {
super.onStart()
ReportViewModel.resetParameters()
}
private fun initViewModelWithParameters() {
ReportViewModel.parameters?.let {

@ -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()
}

@ -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<WeakReference<PokerAnalyticsFragment>>()
// private var weakReferences = SparseArray<WeakReference<PokerAnalyticsFragment>>()
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 getItemPosition(obj: Any): Int {
return PagerAdapter.POSITION_UNCHANGED
}
// 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
}
// /**
// * Return the fragment at the position key
// */
// fun getFragment(key: Int): PokerAnalyticsFragment? {
// if (weakReferences.get(key) != null) {
// return weakReferences.get(key).get()
// }
// return null
// }
}

@ -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<QueryCondition>().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<Stat> = 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)))
}

@ -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<LineDataSet>? = null, barDataSets: List<BarDataSet>? = 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<LineDataSet>? = null
private var barDataSetList: List<BarDataSet>? = 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<LineDataSet>, stat: Stat, axisFormatting: AxisFormatting = AxisFormatting.DEFAULT) {
this.lineDataSetList = lineDataSets
this.stat = stat
this.axisFormatting = axisFormatting
if (isAdded && !isDetached) {
loadGraph()
}
}
fun setBarData(barDataSets: List<BarDataSet>, stat: Stat, axisFormatting: AxisFormatting = AxisFormatting.DEFAULT) {
this.barDataSetList = barDataSets
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()
}
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,7 +113,14 @@ class GraphFragment : RealmFragment(), OnChartValueSelectedListener {
this.chartContainer.removeAllViews()
this.lineDataSetList?.let { dataSets ->
this.chartView = when (this.style) {
Style.LINE, Style.MULTILINE -> {
val dataSets = when (this.style) {
Style.LINE -> listOf(this.graphDataProvider.lineDataSet(requireContext()))
Style.MULTILINE -> this.graphDataProvider.multiLineDataSet(requireContext())
else -> throw PAIllegalStateException("Cannot happen")
}
val lineChart = LineChart(context)
lineChart.setOnChartValueSelectedListener(this)
@ -123,20 +128,21 @@ class GraphFragment : RealmFragment(), OnChartValueSelectedListener {
val lineData = LineData(dataSets)
lineChart.data = lineData
this.chartView = lineChart
dataSets.firstOrNull()?.let { dataSet ->
this.legendView.prepareWithStat(this.stat, dataSet.entryCount, this.style)
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)
this.legendView.prepareWithStat(stat, style = this.style)
val barChart = BarChart(context)
barChart.setOnChartValueSelectedListener(this)
@ -146,7 +152,6 @@ class GraphFragment : RealmFragment(), OnChartValueSelectedListener {
if (stat.graphShowsYAxisZero) {
barChart.axisLeft.axisMinimum = 0.0f
}
this.chartView = barChart
val barData = BarData(dataSets)
barChart.data = barData
@ -154,14 +159,17 @@ class GraphFragment : RealmFragment(), OnChartValueSelectedListener {
dataSets.firstOrNull()?.let {
if (it.entryCount > 0) {
val entry = it.getEntryForIndex(0)
this.chartView?.highlightValue(entry.x, 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())
}

@ -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")

@ -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) {

@ -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<AggregationType, Report> = hashMapOf()
private var reports: MutableMap<AggregationType, Report> = 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)
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)
}
if (ds is BarDataSet) {
graphFragment.setBarData(listOf(ds), stat, aggregationType.axisFormatting)
else -> throw PAIllegalStateException("unmanaged data set")
}
}

@ -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()

@ -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<LineDataSet> {
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
}
}

@ -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<LineDataSet>
fun barDataSet(context: Context) : BarDataSet
}

@ -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<LineDataSet> {
return this.report.multiLineEntries(context)
}
override fun barDataSet(context: Context): BarDataSet {
this.selectedBarDataSet?.let {
return it
} ?: run {
return this.report.barEntries(stat, context)
}
}
}
Loading…
Cancel
Save