diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt index ad923e71..867fe330 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Report.kt @@ -11,6 +11,7 @@ import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.ui.graph.PALineDataSet +import net.pokeranalytics.android.util.ColorUtils import kotlin.math.abs /** @@ -76,8 +77,10 @@ class Report(var options: Calculator.Options) { val dataSets = mutableListOf() options.displayedStats.forEach { stat -> - this._results.forEach { result -> - dataSets.add(result.singleLineEntries(stat, context)) + this._results.forEachIndexed { index, result -> + val ds = result.singleLineEntries(stat, context) + ds.color = ColorUtils.almostRandomColor(index, context) + dataSets.add(ds) } } @@ -345,9 +348,8 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu fun defaultStatEntries(stat: Stat, context: Context): DataSet { return when (stat) { - Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES -> this.barEntries(stat, context = context) + Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES, Stat.HOURLY_DURATION -> this.barEntries(stat, context = context) Stat.STANDARD_DEVIATION -> this.distributionEntries(stat, context) - Stat.HOURLY_DURATION -> this.barEntries(stat, context) else -> this.singleLineEntries(stat, context) } } 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 71c6e377..a51fddce 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 @@ -24,11 +24,11 @@ class ReportPagerAdapter(val context: Context, val fragmentManager: FragmentMana return when (position) { 0 -> { val dataSetList = listOf(report.barEntries(null, context)) - GraphFragment.newInstance(dataSetList) + GraphFragment.newInstance(barDataSets = dataSetList) } 1 -> { val dataSetList = report.multiLineEntries(context = context) - GraphFragment.newInstance(dataSetList) + GraphFragment.newInstance(lineDataSets = dataSetList) } 2 -> { TableReportFragment.newInstance(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 f5e5b661..f179c7ee 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 @@ -30,18 +30,23 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { /** * Create new instance */ - fun newInstance(dataSetList: List>): GraphFragment { + fun newInstance(lineDataSets: List? = null, barDataSets: List? = null): GraphFragment { val fragment = GraphFragment() - fragment.dataSetList = dataSetList + fragment.lineDataSetList = lineDataSets + fragment.barDataSetList = barDataSets val bundle = Bundle() fragment.arguments = bundle return fragment } + } private lateinit var parentActivity: PokerAnalyticsActivity private lateinit var legendView: LegendView - private lateinit var dataSetList: List> + + private var lineDataSetList: List? = null + private var barDataSetList: List? = null + private var chartView: BarLineChartBase<*>? = null private var stat: Stat = Stat.NET_RESULT @@ -60,8 +65,18 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { /** * Set data */ - fun setData(dataSetList: List>, stat: Stat, axisFormatting: AxisFormatting = AxisFormatting.DEFAULT) { - this.dataSetList = dataSetList + fun setLineData(lineDataSets: List, stat: Stat, axisFormatting: AxisFormatting = AxisFormatting.DEFAULT) { + this.lineDataSetList = lineDataSets + this.stat = stat + this.axisFormatting = axisFormatting + + if (isAdded && !isDetached) { + loadGraph() + } + } + + fun setBarData(barDataSets: List, stat: Stat, axisFormatting: AxisFormatting = AxisFormatting.DEFAULT) { + this.barDataSetList = barDataSets this.stat = stat this.axisFormatting = axisFormatting @@ -90,53 +105,55 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { Timber.d("loadGraph") - dataSetList.firstOrNull()?.let { dataSet -> - - // initialize chart - this.chartContainer.removeAllViews() - this.chartView = when (dataSet) { - is LineDataSet -> { - this.legendView.prepareWithStat(this.stat, dataSet.entryCount) - LineChart(context) - } - is BarDataSet -> { - this.legendView.prepareWithStat(this.stat) - val barChart = BarChart(context) - if (stat.showXAxisZero) { - barChart.xAxis.axisMinimum = 0.0f - } - if (stat.showYAxisZero) { - barChart.axisLeft.axisMinimum = 0.0f - } - barChart - } - else -> null + this.chartContainer.removeAllViews() + + var lastEntry: Entry? = null + + this.lineDataSetList?.let { dataSets -> + + val lineChart = LineChart(context) + val lineData = LineData(dataSets) + lineChart.data = lineData + + this.chartView = lineChart + + dataSets.firstOrNull()?.let { + this.legendView.prepareWithStat(this.stat, it.entryCount) + lastEntry = it.getEntryForIndex(it.entryCount - 1) + } + + } + + this.barDataSetList?.let { dataSets -> + + this.legendView.prepareWithStat(this.stat) + val barChart = BarChart(context) + if (stat.showXAxisZero) { + barChart.xAxis.axisMinimum = 0.0f } - this.chartContainer.addView(this.chartView) - - when (dataSet) { - is LineDataSet -> { - val lineChart: LineChart = this.chartView as LineChart - val lineData = LineData(listOf(dataSet)) - lineChart.data = lineData - } - is BarDataSet -> { - val barChart = this.chartView as BarChart - val barData = BarData(listOf(dataSet)) - barChart.data = barData - } + if (stat.showYAxisZero) { + barChart.axisLeft.axisMinimum = 0.0f } + this.chartView = barChart - this.chartView?.let { - it.setStyle(false, axisFormatting, requireContext()) - it.setOnChartValueSelectedListener(this) + val barData = BarData(dataSets) + barChart.data = barData + + dataSets.firstOrNull()?.let { + lastEntry = it.getEntryForIndex(it.entryCount - 1) } + } - Timber.d("number of entries: ${dataSet.entryCount}, stat = ${this.stat.name}") - this.selectValue(dataSet.getEntryForIndex(dataSet.entryCount - 1)) + this.chartContainer.addView(this.chartView) + this.chartView?.let { + it.setStyle(false, axisFormatting, requireContext()) + it.setOnChartValueSelectedListener(this) } + lastEntry?.let { + this.selectValue(it) + } } 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 bf6229e0..3ed90ebe 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 @@ -5,6 +5,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible +import com.github.mikephil.charting.data.BarDataSet +import com.github.mikephil.charting.data.LineDataSet import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import io.realm.Realm @@ -152,7 +154,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { */ private fun setGraphData(report: Report, aggregationType: AggregationType) { - when (aggregationType) { + val dataSet = when (aggregationType) { AggregationType.SESSION -> report.results.firstOrNull()?.defaultStatEntries(stat, requireContext()) AggregationType.DURATION -> { report.results.firstOrNull()?.durationEntries(stat, requireContext()) @@ -163,9 +165,16 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { else -> report.lineEntries(this.stat, requireContext()) } } - }?.let { dataSet -> - val dataSetList = listOf(dataSet) - graphFragment.setData(dataSetList, stat, aggregationType.axisFormatting) + } + + 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) + } + } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/ColorUtils.kt b/app/src/main/java/net/pokeranalytics/android/util/ColorUtils.kt new file mode 100644 index 00000000..62ed25f3 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/ColorUtils.kt @@ -0,0 +1,35 @@ +package net.pokeranalytics.android.util + +import android.content.Context +import android.graphics.Color +import net.pokeranalytics.android.R +import java.util.* + +class ColorUtils { + + companion object { + + fun almostRandomColor(index: Int, context: Context) : Int { + + return when (index) { + 0 -> context.getColor(R.color.green_light) + 1 -> context.getColor(R.color.blue) + 2 -> context.getColor(R.color.red) + 3 -> context.getColor(R.color.purple) + 4 -> Color.CYAN + 5 -> Color.MAGENTA + 6 -> Color.YELLOW + else -> { + val rd = Random() + val r = 128 + rd.nextInt(127) + val g = 128 + rd.nextInt(127) + val b = 128 + rd.nextInt(127) + Color.argb(255, r, g, b) + } + } + + } + + } + +} \ No newline at end of file