diff --git a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt index 3dc7bbe1..7501a1fc 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt @@ -71,7 +71,7 @@ enum class Comparator { BLIND -> { val blinds = arrayListOf() val realm = Realm.getDefaultInstance() - realm.where().distinct("blind", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { + realm.where().distinct("blinds", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { it.blinds?.let { stake -> blinds.add(QueryCondition.BLIND().apply { setBlind(stake, it.hasDefaultCurrency)}) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt index 52e4a81e..e7fa885e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt @@ -22,12 +22,14 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects var parameters: GraphParameters? = null + var displayAggregationChoices: Boolean = true /** * Default constructor */ - fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report) { + fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true) { parameters = GraphParameters(stat, group, report) + this.displayAggregationChoices = displayAggregationChoices val intent = Intent(context, StatisticDetailsActivity::class.java) context.startActivity(intent) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt index e7535db1..a067ebb3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt @@ -5,11 +5,13 @@ import android.content.Context import android.content.Intent import android.content.res.Resources import android.net.Uri +import android.view.View import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.AppCompatTextView import androidx.browser.customtabs.CustomTabsIntent import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.TextFormat @@ -107,4 +109,16 @@ fun showAlertDialog(context: Context, title: Int? = null, message: Int? = null) fun AppCompatTextView.setTextFormat(textFormat: TextFormat, context: Context) { this.setTextColor(textFormat.getColor(context)) this.text = textFormat.text +} + +fun View.hideWithAnimation() { + isVisible = true + animate().cancel() + animate().alpha(0f).withEndAction { isVisible = false }.start() +} + +fun View.showWithAnimation() { + isVisible = true + animate().cancel() + animate().alpha(1f).start() } \ 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 ddf831f2..bead1e0e 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 @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.tabs.TabLayout import io.realm.Realm @@ -72,7 +73,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable is GraphRow -> { //TODO: Open graph details row.report.results.firstOrNull()?.group?.let { computableGroup -> - StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report) + StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report, false) } } } @@ -146,6 +147,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable */ private fun launchStatComputation() { + progressBar.isVisible = true + progressBar.animate().alpha(1f).start() + recyclerView.animate().alpha(0f).start() + computedResults?.let { computedResults -> GlobalScope.launch { @@ -193,6 +198,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable launch(Dispatchers.Main) { statsAdapter.notifyDataSetChanged() + progressBar.animate().cancel() + progressBar.animate().alpha(0f).withEndAction { progressBar.isVisible = false }.start() + recyclerView.animate().cancel() + recyclerView.animate().alpha(1f).start() } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index d1ac4d8e..c6092dd4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -23,6 +23,8 @@ import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource +import net.pokeranalytics.android.ui.extensions.hideWithAnimation +import net.pokeranalytics.android.ui.extensions.showWithAnimation import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.CalendarTabs import net.pokeranalytics.android.ui.view.RowRepresentable @@ -219,6 +221,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep */ private fun launchStatComputation() { + progressBar?.showWithAnimation() + recyclerView?.hideWithAnimation() + GlobalScope.launch { val calendar = Calendar.getInstance() @@ -303,6 +308,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep } */ + realm.close() + GlobalScope.launch(Dispatchers.Main) { displayData() } @@ -373,6 +380,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep calendarAdapter.notifyDataSetChanged() + progressBar?.hideWithAnimation() + recyclerView?.showWithAnimation() + } } \ No newline at end of file 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 8fc0623e..d44e822e 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,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import com.github.mikephil.charting.charts.BarChart import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.charts.LineChart @@ -34,35 +35,33 @@ class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, CoroutineScope { + companion object { + + /** + * Create new instance + */ + fun newInstance(): GraphFragment { + val fragment = GraphFragment() + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + } + private lateinit var parentActivity: PokerAnalyticsActivity + private lateinit var computableGroup: ComputableGroup + private lateinit var selectedReport: Report + private lateinit var legendView: LegendView + private lateinit var chartView: BarLineChartBase<*> private var stat: Stat = Stat.NETRESULT private var reports: MutableMap = hashMapOf() - lateinit private var computableGroup: ComputableGroup - - lateinit private var selectedReport: Report - - lateinit var legendView: LegendView - lateinit var chartView: BarLineChartBase<*> - private var aggregationTypes: List = listOf() + private var displayAggregationChoices: Boolean = true override val coroutineContext: CoroutineContext get() = Dispatchers.Main - companion object { - - } - - fun setData(stat: Stat, group: ComputableGroup, report: Report) { - this.stat = stat - this.computableGroup = group - - this.aggregationTypes = stat.aggregationTypes - this.reports[this.aggregationTypes.first()] = report - this.selectedReport = report - - } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_evograph, container, false) @@ -73,6 +72,35 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co initUI() } + // OnChartValueSelectedListener + override fun onNothingSelected() { + // nothing to do + } + + override fun onValueSelected(e: Entry?, h: Highlight?) { + e?.let { entry -> + + val statEntry = when (entry.data) { + is ObjectIdentifier -> { + val identifier = entry.data as ObjectIdentifier + getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() + } + is StatEntry -> entry.data as StatEntry? + else -> null + } + + statEntry?.let { + + val formattedDate = it.entryTitle + val entryValue = it.formattedValue(this.stat, requireContext()) + val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext()) + + this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) + } + } + } + + /** * Init UI */ @@ -103,6 +131,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co this.chipGroup.addView(chip) } + this.chipGroup.isVisible = displayAggregationChoices this.chipGroup.check(this.stat.aggregationTypes.first().ordinal) this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { @@ -196,35 +225,17 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co } - // OnChartValueSelectedListener - - override fun onNothingSelected() { - // nothing to do - } - - override fun onValueSelected(e: Entry?, h: Highlight?) { - - e?.let { entry -> - - val statEntry = when (entry.data) { - is ObjectIdentifier -> { - val identifier = entry.data as ObjectIdentifier - getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull() - } - is StatEntry -> entry.data as StatEntry? - else -> null - } - - statEntry?.let { - - val formattedDate = it.entryTitle - val entryValue = it.formattedValue(this.stat, requireContext()) - val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext()) - - this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue) - } + /** + * Set data + */ + fun setData(stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true) { + this.stat = stat + this.computableGroup = group - } + this.aggregationTypes = stat.aggregationTypes + this.reports[this.aggregationTypes.first()] = report + this.selectedReport = report + this.displayAggregationChoices = displayAggregationChoices } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt index 406a0fa7..faa0d030 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt @@ -44,7 +44,7 @@ class MoreFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, // Life Cycle override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_calendar, container, false) + return inflater.inflate(R.layout.fragment_more, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt index 7883f75e..b8b5738a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt @@ -7,49 +7,49 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.fragment_stats.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.activity.ComparisonChartActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.ReportRow +import timber.log.Timber class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { - companion object { - - /** - * Create new instance - */ - fun newInstance(): ReportsFragment { - val fragment = ReportsFragment() - val bundle = Bundle() - fragment.arguments = bundle - return fragment - } - - val rowRepresentation: List by lazy { - val rows = ArrayList() - rows.addAll(ReportRow.getRows()) - rows - } - } + companion object { + + /** + * Create new instance + */ + fun newInstance(): ReportsFragment { + val fragment = ReportsFragment() + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + + val rowRepresentation: List by lazy { + val rows = ArrayList() + rows.addAll(ReportRow.getRows()) + rows + } + } private lateinit var reportsAdapter: RowRepresentableAdapter // Life Cycle - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_reports, container, false) - } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_reports, container, false) + } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initData() - initUI() - } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + initUI() + } // Rows @@ -59,17 +59,23 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { super.onRowSelected(position, row, fromAction) - ComparisonChartActivity.newInstance(requireContext()) + Timber.d("row: $row") + when (row) { + ReportRow.DAY_OF_WEEKS -> { + //TODO: Open ComparisonChartActivity with correct data + //TODO: Calcul report before or after + } + } } // Business - /** - * Init data - */ - private fun initData() { - } + /** + * Init data + */ + private fun initData() { + } /** * Init UI @@ -87,4 +93,5 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour } } + } \ No newline at end of file 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 26401474..8ea97620 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 @@ -61,7 +61,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { fragmentTransaction.commit() StatisticDetailsActivity.parameters?.let { - fragment.setData(it.stat, it.computableGroup, it.report) + fragment.setData(it.stat, it.computableGroup, it.report, StatisticDetailsActivity.displayAggregationChoices) StatisticDetailsActivity.parameters = null } ?: run { throw Exception("Missing graph parameters") 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 e5f6e8a9..68aa648f 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,31 +1,29 @@ package net.pokeranalytics.android.ui.graph import android.content.Context -import android.graphics.Typeface import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.components.XAxis import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.extensions.px + + fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { // X Axis this.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default) this.xAxis.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) - this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) - this.xAxis.labelCount = 4 this.xAxis.position = XAxis.XAxisPosition.BOTTOM - - this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) - this.xAxis.typeface = Typeface.DEFAULT - this.xAxis.labelCount = 4 - this.xAxis.position = XAxis.XAxisPosition.BOTTOM - this.xAxis.setDrawLabels(true) this.xAxis.setDrawGridLines(true) - this.xAxis.granularity = 1.0f this.xAxis.isGranularityEnabled = true + this.xAxis.granularity = 1.0f + this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) + this.xAxis.typeface = ResourcesCompat.getFont(context, R.font.roboto_medium) + this.xAxis.labelCount = 4 + this.xAxis.textSize = 12f this.xAxis.isEnabled = true // Y Axis @@ -41,13 +39,15 @@ fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { this.axisLeft.granularity = 1.0f this.axisLeft.textColor = ContextCompat.getColor(context, R.color.chart_default) - this.axisLeft.typeface = Typeface.DEFAULT - this.axisLeft.labelCount = - if (small) 1 else 7 // @todo not great if interval is [0..2] for number of records as we get decimals + this.axisLeft.typeface = ResourcesCompat.getFont(context, R.font.roboto_medium) + this.axisLeft.labelCount = if (small) 1 else 7 // @todo not great if interval is [0..2] for number of records as we get decimals + this.axisLeft.textSize = 12f this.axisRight.isEnabled = false this.legend.isEnabled = false + this.description.isEnabled = false + this.data?.isHighlightEnabled = !small // @todo // if timeYAxis { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 7a062a13..c36d8028 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -329,6 +329,7 @@ enum class RowViewType(private var layoutRes: Int) { val colors = arrayOf(R.color.green_light).toIntArray() dataSet.setColors(colors, context) dataSet.setDrawCircles(false) + dataSet.setDrawValues(false) val lineData = LineData(listOf(dataSet)) val chartView = when (row.stat.graphType) { @@ -348,7 +349,7 @@ enum class RowViewType(private var layoutRes: Int) { it.addView(chartView) } - chartView.setStyle(false, context) + chartView.setStyle(true, context) chartView.setTouchEnabled(false) chartView.highlightValue((entries.size - 1).toFloat(), 0) } diff --git a/app/src/main/res/layout-sw320dp/fragment_calendar.xml b/app/src/main/res/layout-sw320dp/fragment_calendar.xml index 1f773978..7bb22310 100644 --- a/app/src/main/res/layout-sw320dp/fragment_calendar.xml +++ b/app/src/main/res/layout-sw320dp/fragment_calendar.xml @@ -83,6 +83,22 @@ + + + android:orientation="horizontal" + android:padding="8dp"> + app:chipSpacing="8dp" + app:singleSelection="false"> + android:text="@string/month" /> + android:text="@string/year" /> @@ -51,27 +51,27 @@ android:id="@+id/filtersSession" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:singleSelection="false" - app:chipSpacing="6dp"> + app:chipSpacing="6dp" + app:singleSelection="false"> + android:text="@string/all" /> + android:text="@string/cash_game" /> + android:text="@string/tournament" /> @@ -87,6 +87,22 @@ + + + + + android:text="@string/all" /> + android:text="@string/cash_game" /> + android:text="@string/tournament" /> + + + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/appBar" /> diff --git a/app/src/main/res/layout/row_graph.xml b/app/src/main/res/layout/row_graph.xml index d4c78ac4..799076ec 100644 --- a/app/src/main/res/layout/row_graph.xml +++ b/app/src/main/res/layout/row_graph.xml @@ -2,17 +2,18 @@ + android:layout_height="wrap_content"> + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file