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" />
+
+
? = null
): Report {
val options = Options(evolutionValues = Options.EvolutionValues.STANDARD, aggregationType = aggregationType)
@@ -108,6 +109,10 @@ class Calculator {
options.evolutionValues = Options.EvolutionValues.TIMED
}
+ stats?.let {
+ options.displayedStats = stats
+ }
+
return when (aggregationType) {
AggregationType.SESSION, AggregationType.DURATION -> this.computeGroups(realm, listOf(group), options)
AggregationType.MONTH -> {
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ReportDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ReportDetailsActivity.kt
new file mode 100644
index 00000000..be1b5dd1
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ReportDetailsActivity.kt
@@ -0,0 +1,55 @@
+package net.pokeranalytics.android.ui.activity
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import net.pokeranalytics.android.R
+import net.pokeranalytics.android.calculus.Report
+import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
+import net.pokeranalytics.android.ui.fragment.ReportDetailsFragment
+
+
+
+class ReportDetailsActivity : PokerAnalyticsActivity() {
+
+ companion object {
+
+ // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects
+ private var report: Report? = null
+ private var reportTitle: String = ""
+
+ /**
+ * Default constructor
+ */
+ fun newInstance(context: Context, report: Report, reportTitle: String) {
+ //parameters = GraphParameters(stat, group, report)
+ this.report = report
+ this.reportTitle = reportTitle
+ val intent = Intent(context, ReportDetailsActivity::class.java)
+ context.startActivity(intent)
+ }
+
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_report_details)
+ initUI()
+ }
+
+ /**
+ * Init UI
+ */
+ private fun initUI() {
+
+ report?.let {
+ val fragmentTransaction = supportFragmentManager.beginTransaction()
+ val reportDetailsFragment = ReportDetailsFragment.newInstance(it, reportTitle)
+ fragmentTransaction.add(R.id.reportDetailsContainer, reportDetailsFragment)
+ fragmentTransaction.commit()
+
+ report = null
+ }
+ }
+
+}
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 e7fa885e..f5c838d3 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
@@ -8,9 +8,12 @@ import net.pokeranalytics.android.calculus.ComputableGroup
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.fragment.GraphParameters
+import net.pokeranalytics.android.ui.fragment.StatisticDetailsFragment
+class StatisticsDetailsParameters(var stat: Stat, var computableGroup: ComputableGroup, var report: Report) {
+}
+
class StatisticDetailsActivity : PokerAnalyticsActivity() {
private enum class IntentKey(val keyName: String) {
@@ -21,14 +24,14 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() {
companion object {
// 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
+ private var parameters: StatisticsDetailsParameters? = null
+ private var displayAggregationChoices: Boolean = true
/**
* Default constructor
*/
fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true) {
- parameters = GraphParameters(stat, group, report)
+ parameters = StatisticsDetailsParameters(stat, group, report)
this.displayAggregationChoices = displayAggregationChoices
val intent = Intent(context, StatisticDetailsActivity::class.java)
context.startActivity(intent)
@@ -47,6 +50,16 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() {
*/
private fun initUI() {
+ val fragmentTransaction = supportFragmentManager.beginTransaction()
+ val statisticDetailsFragment = StatisticDetailsFragment()
+ fragmentTransaction.add(R.id.statisticDetailsContainer, statisticDetailsFragment)
+ fragmentTransaction.commit()
+
+ parameters?.let {
+ statisticDetailsFragment.setData(it.stat, it.computableGroup, it.report, displayAggregationChoices)
+ parameters = null
+ }
+
}
}
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt
index 5e504fb1..e1b32d35 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt
@@ -17,12 +17,6 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda
override fun getItem(position: Int): PokerAnalyticsFragment {
return when (position) {
- //CLEAN
- /*
- 0 -> HistoryFragment.newInstance()
- 1 -> StatsFragment.newInstance()
- 2 -> SettingsFragment.newInstance()
- */
0 -> HistoryFragment.newInstance()
1 -> StatsFragment.newInstance()
2 -> CalendarFragment.newInstance()
@@ -33,7 +27,7 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda
}
override fun getCount(): Int {
- return 5//3
+ return 5
}
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
@@ -49,12 +43,6 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda
override fun getItemPosition(obj: Any): Int {
return when (obj) {
- //CLEAN
- /*
- HistoryFragment::class.java -> 0
- StatsFragment::class.java -> 1
- SettingsFragment::class.java -> 2
- */
HistoryFragment::class.java -> 0
StatsFragment::class.java -> 1
CalendarFragment::class.java -> 2
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
new file mode 100644
index 00000000..dcd058fa
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt
@@ -0,0 +1,69 @@
+package net.pokeranalytics.android.ui.adapter
+
+import android.content.Context
+import android.util.SparseArray
+import android.view.ViewGroup
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentStatePagerAdapter
+import androidx.viewpager.widget.PagerAdapter
+import net.pokeranalytics.android.R
+import net.pokeranalytics.android.calculus.Report
+import net.pokeranalytics.android.ui.fragment.GraphFragment
+import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
+import java.lang.ref.WeakReference
+
+/**
+ * Home Adapter
+ */
+class ReportPagerAdapter(val context: Context, val fragmentManager: FragmentManager, val report: Report) : FragmentStatePagerAdapter(fragmentManager) {
+
+ var weakReferences = SparseArray>()
+
+ 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 f2e1abc0..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
@@ -4,34 +4,25 @@ 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
import com.github.mikephil.charting.data.*
import com.github.mikephil.charting.highlight.Highlight
import com.github.mikephil.charting.listener.OnChartValueSelectedListener
-import com.google.android.material.chip.Chip
-import com.google.android.material.chip.ChipGroup
-import io.realm.Realm
import kotlinx.android.synthetic.main.fragment_evograph.*
-import kotlinx.coroutines.*
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
-import net.pokeranalytics.android.ui.extensions.ChipGroupExtension
-import net.pokeranalytics.android.ui.extensions.px
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.graph.PALineDataSet
import net.pokeranalytics.android.ui.graph.setStyle
import net.pokeranalytics.android.ui.view.LegendView
import timber.log.Timber
-import java.util.*
import kotlin.coroutines.CoroutineContext
-class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var report: Report) {
-
-}
class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, CoroutineScope {
@@ -40,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
@@ -49,15 +45,12 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co
}
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.NET_RESULT
- private var reports: MutableMap = hashMapOf()
- private var aggregationTypes: List = listOf()
- private var displayAggregationChoices: Boolean = true
+ private var aggregationType: AggregationType = AggregationType.SESSION
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main
@@ -70,26 +63,41 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initUI()
+ loadGraph()
}
- /**
- * Set data
- */
- fun setData(stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true) {
- this.stat = report.options.displayedStats.first()
- this.computableGroup = group
+ // OnChartValueSelectedListener
+ override fun onNothingSelected() {
+ // nothing to do
+ }
- this.aggregationTypes = stat.aggregationTypes
- this.reports[this.aggregationTypes.first()] = report
- this.selectedReport = report
- this.displayAggregationChoices = displayAggregationChoices
+ 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(entry.y.toDouble(), currency = null, context = requireContext())
+ this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue)
+ }
+ }
}
+
/**
* Init UI
*/
private fun initUI() {
+ Timber.d("initUI")
parentActivity = activity as PokerAnalyticsActivity
parentActivity.title = stat.localizedTitle(requireContext())
@@ -104,80 +112,20 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co
this.chartView.setStyle(false, requireContext())
this.chartContainer.addView(this.chartView)
-
- this.loadGraph(this.aggregationTypes.first(), this.selectedReport)
-
- this.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 {
- loadGraph(aggregationType, it)
- } ?: run {
- launchStatComputation(aggregationType)
- }
-
- }
- })
-
}
- private fun launchStatComputation(aggregationType: AggregationType) {
-
- GlobalScope.launch(coroutineContext) {
-
- var r: Report? = null
- val test = GlobalScope.async {
- val s = Date()
- Timber.d(">>> start...")
-
- val realm = Realm.getDefaultInstance()
-
- val report =
- Calculator.computeStatsWithEvolutionByAggregationType(realm, stat, computableGroup, aggregationType)
- reports[aggregationType] = report
-
- r = report
-
- realm.close()
-
- val e = Date()
- val duration = (e.time - s.time) / 1000.0
- Timber.d(">>> ended in $duration seconds")
-
- }
- test.await()
-
- if (!isDetached) {
- r?.let {
- loadGraph(aggregationType, it)
- }
- }
- }
-
- }
-
- fun loadGraph(aggregationType: AggregationType, report: Report) {
+ /**
+ * Load graph
+ */
+ private fun loadGraph() {
+ Timber.d("loadGraph")
val graphEntries = when (aggregationType) {
- AggregationType.SESSION, AggregationType.DURATION -> report.results.firstOrNull()?.defaultStatEntries(stat)
+ AggregationType.SESSION, AggregationType.DURATION -> selectedReport.results.firstOrNull()?.defaultStatEntries(stat)
AggregationType.MONTH, AggregationType.YEAR -> {
when (this.stat) {
- Stat.NUMBER_OF_GAMES, Stat.NUMBER_OF_SETS -> report.barEntries(this.stat)
- else -> report.lineEntries(this.stat)
+ Stat.NUMBER_OF_GAMES, Stat.NUMBER_OF_SETS -> selectedReport.barEntries(this.stat)
+ else -> selectedReport.lineEntries(this.stat)
}
}
}
@@ -216,32 +164,18 @@ 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 {
+ /**
+ * Set data
+ */
+ fun setData(report: Report, aggregationType: AggregationType) {
+ Timber.d("setData")
- val formattedDate = it.entryTitle
- val entryValue = it.formattedValue(this.stat, requireContext())
- val totalStatValue = this.stat.format(entry.y.toDouble(), currency = null, context = requireContext())
+ this.selectedReport = report
+ this.aggregationType = aggregationType
+ this.stat = report.options.displayedStats.first()
- this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue)
- }
+ if (isAdded && !isDetached) {
+ loadGraph()
}
}
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..64475656
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt
@@ -0,0 +1,92 @@
+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 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) {
+ }
+ })
+ }
+
+
+ /**
+ * Set data
+ */
+ fun setData(report: Report) {
+ this.selectedReport = 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 16e9c3aa..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
@@ -6,13 +6,25 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import com.github.mikephil.charting.data.Entry
+import androidx.core.view.isVisible
+import com.google.android.material.chip.Chip
+import com.google.android.material.chip.ChipGroup
+import io.realm.Realm
import kotlinx.android.synthetic.main.fragment_statistic_details.*
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
import net.pokeranalytics.android.R
-import net.pokeranalytics.android.calculus.Stat
-import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity
+import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
+import net.pokeranalytics.android.ui.extensions.ChipGroupExtension
+import net.pokeranalytics.android.ui.extensions.hideWithAnimation
+import net.pokeranalytics.android.ui.extensions.px
+import net.pokeranalytics.android.ui.extensions.showWithAnimation
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
+import timber.log.Timber
+import java.util.*
+
class StatisticDetailsFragment : PokerAnalyticsFragment() {
@@ -24,9 +36,13 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() {
}
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 entries: List = ArrayList()
+ private var displayAggregationChoices: Boolean = true
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_statistic_details, container, false)
@@ -51,29 +67,99 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() {
parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
setHasOptionsMenu(true)
- toolbar.title = stat.localizedTitle(requireContext())
val fragmentManager = parentActivity.supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
- val fragment = GraphFragment()
+ graphFragment = GraphFragment()
- fragmentTransaction.add(R.id.container, fragment)
+ fragmentTransaction.add(R.id.graphContainer, graphFragment)
fragmentTransaction.commit()
- StatisticDetailsActivity.parameters?.let {
- fragment.setData(it.stat, it.computableGroup, it.report, StatisticDetailsActivity.displayAggregationChoices)
- StatisticDetailsActivity.parameters = null
- } ?: run {
- throw Exception("Missing graph parameters")
+
+ stat.aggregationTypes.firstOrNull()?.let { aggregationType ->
+ reports[aggregationType]?.let { report ->
+ graphFragment.setData(report, aggregationType)
+ }
}
+
+ toolbar.title = stat.localizedTitle(requireContext())
+ 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)
+ }
+
+ }
+ })
}
+ /**
+ * Launch stat computation
+ */
+ private fun launchStatComputation(aggregationType: AggregationType) {
+
+ graphContainer.hideWithAnimation()
+ progressBar.showWithAnimation()
+
+ //TODO: Create loader here
+ Timber.d("launchStatComputation: $aggregationType")
+
+ GlobalScope.launch {
+
+ val s = Date()
+ Timber.d(">>> start...")
+
+ val realm = Realm.getDefaultInstance()
+
+ val report = Calculator.computeStatsWithEvolutionByAggregationType(realm, stat, computableGroup, aggregationType)
+ reports[aggregationType] = report
+
+ realm.close()
+
+ val e = Date()
+ val duration = (e.time - s.time) / 1000.0
+ Timber.d(">>> ended in $duration seconds")
+
+ launch(Dispatchers.Main) {
+ graphFragment.setData(report, aggregationType)
+ progressBar.hideWithAnimation()
+ graphContainer.showWithAnimation()
+ }
+ }
+ }
+
+
/**
* Set data
*/
- fun setData(stat: Stat, entries: List) {
+ fun setData(stat: Stat, computableGroup: ComputableGroup, report: Report, displayAggregationChoices: Boolean) {
this.stat = stat
- this.entries = entries
+ this.computableGroup = computableGroup
+ this.selectedReport = report
+ this.displayAggregationChoices = displayAggregationChoices
+
+ stat.aggregationTypes.firstOrNull()?.let {
+ reports[it] = report
+ }
}
}
\ No newline at end of file
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/activity_statistic_details.xml b/app/src/main/res/layout/activity_statistic_details.xml
index 62d1cb20..401d6f55 100644
--- a/app/src/main/res/layout/activity_statistic_details.xml
+++ b/app/src/main/res/layout/activity_statistic_details.xml
@@ -1,15 +1,7 @@
-
+ android:id="@+id/statisticDetailsContainer">
-
-
-
\ No newline at end of file
+
\ 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
index 63506299..8c937fd5 100644
--- a/app/src/main/res/layout/fragment_evograph.xml
+++ b/app/src/main/res/layout/fragment_evograph.xml
@@ -19,32 +19,9 @@
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
- app:layout_constraintBottom_toTopOf="@id/chips"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/legendContainer" />
-
-
-
-
-
-
+ app:layout_constraintTop_toBottomOf="@+id/legendContainer" />
\ 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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_statistic_details.xml b/app/src/main/res/layout/fragment_statistic_details.xml
index 44e1e283..952dc2da 100644
--- a/app/src/main/res/layout/fragment_statistic_details.xml
+++ b/app/src/main/res/layout/fragment_statistic_details.xml
@@ -14,13 +14,54 @@
app:layout_constraintTop_toTopOf="parent"
tools:title="@string/app_name" />
+
+
+
+
+
+
+
+