From a1688e515ac914d8fe624d3f3a5d57471988147e Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 11 Apr 2019 17:22:34 +0200 Subject: [PATCH] Update graph with legend and data --- .../pokeranalytics/android/calculus/Stat.kt | 38 +++++++++ .../android/ui/fragment/GraphFragment.kt | 52 ++++++++++-- .../android/ui/graph/GraphExtensions.kt | 19 ++--- .../android/ui/view/LegendView.kt | 66 ++++++++++++++++ app/src/main/res/layout/fragment_evograph.xml | 57 +++++++++++++ app/src/main/res/layout/fragment_graph.xml | 35 -------- .../main/res/layout/layout_legend_default.xml | 79 +++++++++++++++++++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/styles.xml | 55 ++++++++----- 9 files changed, 335 insertions(+), 68 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt create mode 100644 app/src/main/res/layout/fragment_evograph.xml delete mode 100644 app/src/main/res/layout/fragment_graph.xml create mode 100644 app/src/main/res/layout/layout_legend_default.xml diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt index b8ff79ef..066a2214 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -23,6 +23,28 @@ interface StatBase : RealmModel { } +enum class GraphType { + LINE, + BAR, +} + +enum class AggregationType { + SESSION, + MONTH, + YEAR, + DURATION; + + val resId: Int + get() { + return when (this) { + SESSION -> R.string.session + MONTH -> R.string.month + YEAR -> R.string.year + DURATION -> R.string.duration + } + } +} + /** * An enum representing all the types of Session statistics */ @@ -165,6 +187,22 @@ enum class Stat(var underlyingClass: Class? = null) : RowRepresentabl } } + val graphType: GraphType + get() { + return when (this) { + NUMBER_OF_SETS, NUMBER_OF_GAMES -> GraphType.BAR + else -> GraphType.LINE + } + } + + val aggregationTypes: List + get() { + return when (this) { + NETRESULT -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR, AggregationType.DURATION) + else -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR, AggregationType.DURATION) + } + } + override val viewType: Int = RowViewType.TITLE_VALUE.ordinal } 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 a5877680..be0ad466 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,17 +4,24 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View 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.Entry import com.github.mikephil.charting.data.LineData import com.github.mikephil.charting.data.LineDataSet import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.listener.OnChartValueSelectedListener -import kotlinx.android.synthetic.main.fragment_graph.* +import com.google.android.material.chip.Chip +import kotlinx.android.synthetic.main.fragment_evograph.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.GraphType import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.graph.setStyle +import net.pokeranalytics.android.ui.view.LegendView +import net.pokeranalytics.android.util.extensions.px interface GraphDataSource { @@ -29,6 +36,9 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { lateinit var stat: Stat lateinit var entries: List + lateinit var legendView: LegendView + lateinit var chartView: BarLineChartBase<*> + companion object { } @@ -39,7 +49,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_graph, container, false) + return inflater.inflate(R.layout.fragment_evograph, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -54,6 +64,10 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { parentActivity = activity as PokerAnalyticsActivity + this.legendView = LegendView(requireContext()) + this.legendContainer.addView(this.legendView) + this.legendView.prepareWithStat(this.stat) + // Avoid a bug during setting the title toolbar.title = "" @@ -69,10 +83,36 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { dataSet.setColors(colors, context) val lineData = LineData(listOf(dataSet)) - this.chart.setStyle() + this.chartView = when (stat.graphType) { + GraphType.LINE -> { + val lineChart = LineChart(context) + lineChart.data = lineData + lineChart + } + GraphType.BAR -> { + val barChart = BarChart(context) + barChart + } + } + + this.chartContainer.addView(this.chartView) - this.chart.data = lineData - this.chart.setOnChartValueSelectedListener(this) + this.chartView.setStyle(requireContext()) + this.chartView.setOnChartValueSelectedListener(this) + + this.stat.aggregationTypes.forEachIndexed { index, type -> + + val chip = Chip(requireContext()) + chip.text = requireContext().getString(type.resId) + chip.chipStartPadding = 8f.px + chip.chipEndPadding = 8f.px + chip.isChecked = index == 0 + this.chipGroup.addView(chip) + } + + this.chipGroup.setOnCheckedChangeListener { group, i -> + + } } @@ -101,7 +141,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { } - this.text.text = "" +// this.text.text = "" diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt index 56cd4dda..74cc898e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt @@ -1,24 +1,25 @@ package net.pokeranalytics.android.ui.graph -import com.github.mikephil.charting.charts.BarChart +import android.content.Context +import androidx.core.content.ContextCompat import com.github.mikephil.charting.charts.BarLineChartBase -import com.github.mikephil.charting.charts.LineChart +import net.pokeranalytics.android.R -fun BarChart.setStyle() { - GraphHelper.setStyle(this) -} +//fun BarChart.setStyle(context: Context) { +// GraphHelper.setStyle(this, context) +//} -fun LineChart.setStyle() { - GraphHelper.setStyle(this) +fun BarLineChartBase<*>.setStyle(context: Context) { + GraphHelper.setStyle(this, context) } class GraphHelper { companion object { - fun setStyle(chart: BarLineChartBase<*>) { + fun setStyle(chart: BarLineChartBase<*>, context: Context) { -// this.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.) ChartAppearance.defaultColor + chart.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default) // this.xAxis.axisLineWidth = ChartAppearance.lineWidth // this.xAxis.enableGridDashedLine(3.0f, 5.0f, 1.0f) // diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt new file mode 100644 index 00000000..038bcf03 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt @@ -0,0 +1,66 @@ +package net.pokeranalytics.android.ui.view + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import androidx.constraintlayout.widget.ConstraintLayout +import kotlinx.android.synthetic.main.layout_legend_default.view.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.model.realm.Session + + +/** + * Display a row session + */ +class LegendView : FrameLayout { + + private lateinit var legendLayout: ConstraintLayout + + /** + * Constructors + */ + constructor(context: Context) : super(context) { + init() + } + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + init() + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + init() + } + + /** + * Init + */ + private fun init() { + val layoutInflater = LayoutInflater.from(context) + legendLayout = layoutInflater.inflate(R.layout.layout_legend_default, this, false) as ConstraintLayout + val layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) + addView(legendLayout, layoutParams) + } + + fun prepareWithStat(stat: Stat) { + + this.stat1Name.text = stat.name + this.stat2Name.text = stat.cumulativeLabelResId(context) + + } + + /** + * Set the session data to the view + */ + fun setData(session: Session) { + + this.title.text = "" + this.title.text = "" + this.title.text = "" + this.title.text = "" + this.title.text = "" + + } + +} \ 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 new file mode 100644 index 00000000..94615634 --- /dev/null +++ b/app/src/main/res/layout/fragment_evograph.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_graph.xml b/app/src/main/res/layout/fragment_graph.xml deleted file mode 100644 index f7b11840..00000000 --- a/app/src/main/res/layout/fragment_graph.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/layout_legend_default.xml b/app/src/main/res/layout/layout_legend_default.xml new file mode 100644 index 00000000..8f11f151 --- /dev/null +++ b/app/src/main/res/layout/layout_legend_default.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b0cd3cbe..65d61cb7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -37,4 +37,6 @@ #8e35c8 + #5c7258 + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 43246d76..a925d56a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -107,24 +107,43 @@ @font/roboto - - - - - + + + + + + + + + + +