From 4ea758ad388a8892b04355f81aae0ad3535cf230 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 18 Apr 2019 16:51:55 +0200 Subject: [PATCH] Add Report Details, improve Statistics & Graph --- app/src/main/AndroidManifest.xml | 5 + .../ui/activity/ReportDetailsActivity.kt | 55 +++++++ .../ui/activity/StatisticDetailsActivity.kt | 8 +- .../android/ui/adapter/ReportPagerAdapter.kt | 69 +++++++++ .../android/ui/fragment/GraphFragment.kt | 10 +- .../ui/fragment/ReportDetailsFragment.kt | 140 ++++++++++++++++++ .../android/ui/fragment/ReportsFragment.kt | 31 ++-- .../ui/fragment/StatisticDetailsFragment.kt | 1 + ...{HomeViewPager.kt => NoPagingViewPager.kt} | 4 +- app/src/main/res/layout/activity_home.xml | 2 +- .../res/layout/activity_report_details.xml | 7 + .../res/layout/fragment_report_details.xml | 62 ++++++++ 12 files changed, 368 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/ReportDetailsActivity.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt rename app/src/main/java/net/pokeranalytics/android/ui/view/{HomeViewPager.kt => NoPagingViewPager.kt} (81%) create mode 100644 app/src/main/res/layout/activity_report_details.xml create mode 100644 app/src/main/res/layout/fragment_report_details.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 37e6961f..8ef69191 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,11 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> + + >() + + override fun getItem(position: Int): PokerAnalyticsFragment { + return when (position) { + 0 -> GraphFragment.newInstance(report) + 1 -> GraphFragment.newInstance(report) + 2 -> GraphFragment.newInstance(report) + else -> GraphFragment.newInstance() + } + } + + override fun getCount(): Int { + return 3 + } + + override fun getPageTitle(position: Int): CharSequence? { + return when(position) { + 0 -> context.getString(R.string.bar) + 1 -> context.getString(R.string.line) + 2 -> context.getString(R.string.table) + else -> "" + } + } + + 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 + } + +} \ 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 7cd9184d..69fe9938 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 @@ -24,9 +24,6 @@ import timber.log.Timber import kotlin.coroutines.CoroutineContext -class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var report: Report) { -} - class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, CoroutineScope { companion object { @@ -34,8 +31,13 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co /** * Create new instance */ - fun newInstance(): GraphFragment { + fun newInstance(report: Report? = null): GraphFragment { val fragment = GraphFragment() + + report?.let { + fragment.selectedReport = it + } + val bundle = Bundle() fragment.arguments = bundle return fragment diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt new file mode 100644 index 00000000..06ba58f6 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt @@ -0,0 +1,140 @@ +package net.pokeranalytics.android.ui.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.google.android.material.tabs.TabLayout +import kotlinx.android.synthetic.main.fragment_report_details.* +import kotlinx.android.synthetic.main.fragment_statistic_details.toolbar +import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.AggregationType +import net.pokeranalytics.android.calculus.Report +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.adapter.ReportPagerAdapter +import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment + +class ReportDetailsFragment : PokerAnalyticsFragment() { + + companion object { + fun newInstance(report: Report?, reportTitle: String): ReportDetailsFragment { + val fragment = ReportDetailsFragment() + fragment.reportTitle = reportTitle + report?.let { + fragment.selectedReport = it + } + val bundle = Bundle() + fragment.arguments = bundle + return fragment + + } + } + + private lateinit var parentActivity: PokerAnalyticsActivity + //private lateinit var computableGroup: ComputableGroup + //private lateinit var graphFragment: GraphFragment + private lateinit var selectedReport: Report + + private var reports: MutableMap = hashMapOf() + private var stat: Stat = Stat.NET_RESULT + private var displayAggregationChoices: Boolean = true + private var reportTitle: String = "" + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_report_details, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initUI() + } + + /** + * Init UI + */ + private fun initUI() { + + parentActivity = activity as PokerAnalyticsActivity + + // Avoid a bug during setting the title + toolbar.title = "" + + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) + + toolbar.title = reportTitle + + val reportPagerAdapter = ReportPagerAdapter(requireContext(), parentActivity.supportFragmentManager, selectedReport) + viewPager.adapter = reportPagerAdapter + viewPager.offscreenPageLimit = 3 + + tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + viewPager.setCurrentItem(tab.position, false) + } + + override fun onTabUnselected(tab: TabLayout.Tab) { + } + + override fun onTabReselected(tab: TabLayout.Tab) { + } + }) + + /* + stat.aggregationTypes.firstOrNull()?.let { aggregationType -> + reports[aggregationType]?.let { report -> + graphFragment.setData(report, aggregationType) + } + } + + */ + + + /* + val aggregationTypes = stat.aggregationTypes + + aggregationTypes.forEachIndexed { index, type -> + val chip = Chip(requireContext()) + chip.id = index + chip.text = requireContext().getString(type.resId) + chip.chipStartPadding = 8f.px + chip.chipEndPadding = 8f.px + this.chipGroup.addView(chip) + } + + this.chipGroup.isVisible = displayAggregationChoices + this.chipGroup.check(0) + + this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { + override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { + super.onCheckedChanged(group, checkedId) + val aggregationType = aggregationTypes[checkedId] + + reports[aggregationType]?.let { report -> + graphFragment.setData(report, aggregationType) + } ?: run { + launchStatComputation(aggregationType) + } + + } + }) + */ + } + + + /** + * Set data + */ + fun setData(report: Report) { + this.selectedReport = report + + /* + stat.aggregationTypes.firstOrNull()?.let { + reports[it] = report + } + */ + } + +} \ No newline at end of file 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 b8a8a4cd..ec862ad2 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,12 +7,14 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.realm.Realm import kotlinx.android.synthetic.main.fragment_stats.* +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.comparison.Comparator +import net.pokeranalytics.android.ui.activity.ReportDetailsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -67,13 +69,9 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { super.onRowSelected(position, row, fromAction) - Timber.d("row: $row") - when (row) { - - ReportRow.DAY_OF_WEEKS -> { - //TODO: Open ComparisonChartActivity with correct data - //TODO: Calcul report before or after - } + if (row is ReportRow) { + val reportName = row.localizedTitle(requireContext()) + launchComputation(row.comparators, reportName) } } @@ -102,27 +100,28 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour } } - private fun launchComputation(comparators: List) { - + /** + * Launch computation + */ + private fun launchComputation(comparators: List, reportName: String) { GlobalScope.launch { val startDate = Date() - val realm = Realm.getDefaultInstance() val requiredStats: List = listOf(Stat.NET_RESULT) val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats) val report = Calculator.computeStatsWithComparators(realm, comparators = comparators, options = options) + Timber.d("launchComputation: ${System.currentTimeMillis() - startDate.time}ms") - - - - + launch(Dispatchers.Main) { + if (!isDetached) { + ReportDetailsActivity.newInstance(requireContext(), report, reportName) + } + } } - - } 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 3da8e638..37ac6e25 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 @@ -25,6 +25,7 @@ import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import timber.log.Timber import java.util.* + class StatisticDetailsFragment : PokerAnalyticsFragment() { companion object { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/NoPagingViewPager.kt similarity index 81% rename from app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/NoPagingViewPager.kt index 2802f2fb..bb7eac22 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/NoPagingViewPager.kt @@ -6,9 +6,9 @@ import android.view.MotionEvent import androidx.viewpager.widget.ViewPager /** - * Poker Analytics ViewPager + * ViewPager with paging disabled */ -class HomeViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) { +class NoPagingViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) { var enablePaging: Boolean = false diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index d5788e1c..4f76f96f 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -15,7 +15,7 @@ app:layout_constraintTop_toTopOf="parent" app:title="@string/app_name" /> - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_report_details.xml b/app/src/main/res/layout/fragment_report_details.xml new file mode 100644 index 00000000..73ad6108 --- /dev/null +++ b/app/src/main/res/layout/fragment_report_details.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + +