Adds multi lines datasets

feature/top10
Laurent 7 years ago
parent 80bb0a97cd
commit aa79217c12
  1. 10
      app/src/main/java/net/pokeranalytics/android/calculus/Report.kt
  2. 4
      app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt
  3. 105
      app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt
  4. 17
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt
  5. 35
      app/src/main/java/net/pokeranalytics/android/util/ColorUtils.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<LineDataSet>()
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<out Entry> {
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)
}
}

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

@ -30,18 +30,23 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener {
/**
* Create new instance
*/
fun newInstance(dataSetList: List<DataSet<*>>): GraphFragment {
fun newInstance(lineDataSets: List<LineDataSet>? = null, barDataSets: List<BarDataSet>? = 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<DataSet<*>>
private var lineDataSetList: List<LineDataSet>? = null
private var barDataSetList: List<BarDataSet>? = 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<DataSet<out Entry>>, stat: Stat, axisFormatting: AxisFormatting = AxisFormatting.DEFAULT) {
this.dataSetList = dataSetList
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
@ -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)
}
}

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

@ -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)
}
}
}
}
}
Loading…
Cancel
Save