Custom reports launch + refactoring

dev
Laurent 7 years ago
parent c6833d2911
commit 3c26986a41
  1. 9
      app/src/main/AndroidManifest.xml
  2. 33
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  3. 2
      app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt
  4. 8
      app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt
  5. 17
      app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt
  6. 20
      app/src/main/java/net/pokeranalytics/android/ui/activity/ReportCreationActivity.kt
  7. 51
      app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt
  8. 2
      app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt
  9. 6
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt
  10. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt
  11. 20
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt
  12. 60
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt
  13. 9
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
  14. 12
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ResultsObserverFragment.kt
  15. 52
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt
  16. 11
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt
  17. 28
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt
  18. 10
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt
  19. 9
      app/src/main/res/drawable/ic_baseline_save.xml
  20. 7
      app/src/main/res/layout/activity_table_report.xml
  21. 12
      app/src/main/res/menu/toolbar_report.xml
  22. 1
      app/src/main/res/values/strings.xml

@ -64,12 +64,12 @@
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity <activity
android:name="net.pokeranalytics.android.ui.activity.StatisticDetailsActivity" android:name="net.pokeranalytics.android.ui.activity.ProgressReportActivity"
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity <activity
android:name="net.pokeranalytics.android.ui.activity.ReportDetailsActivity" android:name="net.pokeranalytics.android.ui.activity.ComparisonReportActivity"
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
@ -123,6 +123,11 @@
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.TableReportActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<meta-data <meta-data
android:name="preloaded_fonts" android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" /> android:resource="@array/preloaded_fonts" />

@ -29,7 +29,7 @@ class Calculator {
*/ */
class Options( class Options(
var display: Display = Display.TABLE, var display: Display = Display.TABLE,
var evolutionValues: EvolutionValues = EvolutionValues.NONE, evolutionValues: EvolutionValues = EvolutionValues.NONE,
var stats: List<Stat> = listOf(), var stats: List<Stat> = listOf(),
var criterias: List<Criteria> = listOf(), var criterias: List<Criteria> = listOf(),
query: Query = Query(), query: Query = Query(),
@ -38,6 +38,14 @@ class Calculator {
var userGenerated: Boolean = false var userGenerated: Boolean = false
) { ) {
var evolutionValues: EvolutionValues = evolutionValues
get() {
if (field == EvolutionValues.NONE && this.display == Display.PROGRESS) {
return EvolutionValues.STANDARD
}
return field
}
private var _query: Query = query private var _query: Query = query
private var _filter: Filter? = filter private var _filter: Filter? = filter
@ -60,7 +68,7 @@ class Calculator {
*/ */
enum class Display : RowRepresentable { enum class Display : RowRepresentable {
TABLE, TABLE,
EVOLUTION, PROGRESS,
COMPARISON, COMPARISON,
MAP, MAP,
POLYNOMIAL; POLYNOMIAL;
@ -69,7 +77,7 @@ class Calculator {
get() { get() {
return when (this) { return when (this) {
TABLE -> R.string.table TABLE -> R.string.table
EVOLUTION -> R.string.curve PROGRESS -> R.string.progress
COMPARISON -> R.string.comparison COMPARISON -> R.string.comparison
MAP -> R.string.map MAP -> R.string.map
POLYNOMIAL -> null POLYNOMIAL -> null
@ -101,9 +109,9 @@ class Calculator {
} }
val computeLongestStreak: Boolean val computeLongestStreak: Boolean
get() { get() {
return this.stats.contains(LONGEST_STREAKS) return this.stats.contains(LONGEST_STREAKS)
} }
val shouldSortValues: Boolean val shouldSortValues: Boolean
get() { get() {
return this.evolutionValues != EvolutionValues.NONE || this.computeLongestStreak return this.evolutionValues != EvolutionValues.NONE || this.computeLongestStreak
@ -126,7 +134,7 @@ class Calculator {
} }
} }
fun reportSetup(name: String) : ReportSetup { fun reportSetup(name: String): ReportSetup {
val rs = ReportSetup() val rs = ReportSetup()
rs.name = name rs.name = name
@ -136,6 +144,17 @@ class Calculator {
return rs return rs
} }
/**
* Returns some default generated name
*/
val defaultName: String
get() {
val statName = this.stats.firstOrNull()?.let {
it.getDisplayName()
}
return statName ?: this.query.name
}
} }
companion object { companion object {

@ -146,7 +146,7 @@ enum class Stat : RowRepresentable {
return TextFormat(value.toCurrency(currency), color) return TextFormat(value.toCurrency(currency), color)
} }
// Red/green numericValues // Red/green numericValues
HOURLY_RATE_BB, AVERAGE_NET_BB, NET_BB_PER_100_HANDS -> { HOURLY_RATE_BB, AVERAGE_NET_BB, NET_BB_PER_100_HANDS, BB_NET_RESULT -> {
val color = if (value >= this.threshold) R.color.green else R.color.red val color = if (value >= this.threshold) R.color.green else R.color.red
return TextFormat(value.formatted(), color) return TextFormat(value.formatted(), color)
} }

@ -6,11 +6,11 @@ import android.os.Bundle
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.ReportDetailsFragment import net.pokeranalytics.android.ui.fragment.report.ComparisonReportFragment
class ReportDetailsActivity : PokerAnalyticsActivity() { class ComparisonReportActivity : PokerAnalyticsActivity() {
companion object { companion object {
@ -25,7 +25,7 @@ class ReportDetailsActivity : PokerAnalyticsActivity() {
//parameters = GraphParameters(stat, group, report) //parameters = GraphParameters(stat, group, report)
this.report = report this.report = report
this.reportTitle = reportTitle this.reportTitle = reportTitle
val intent = Intent(context, ReportDetailsActivity::class.java) val intent = Intent(context, ComparisonReportActivity::class.java)
context.startActivity(intent) context.startActivity(intent)
} }
@ -44,7 +44,7 @@ class ReportDetailsActivity : PokerAnalyticsActivity() {
report?.let { report?.let {
val fragmentTransaction = supportFragmentManager.beginTransaction() val fragmentTransaction = supportFragmentManager.beginTransaction()
val reportDetailsFragment = ReportDetailsFragment.newInstance(it, reportTitle) val reportDetailsFragment = ComparisonReportFragment.newInstance(it, reportTitle)
fragmentTransaction.add(R.id.reportDetailsContainer, reportDetailsFragment) fragmentTransaction.add(R.id.reportDetailsContainer, reportDetailsFragment)
fragmentTransaction.commit() fragmentTransaction.commit()

@ -4,16 +4,15 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.ComputableGroup
import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.StatisticDetailsFragment import net.pokeranalytics.android.ui.fragment.report.ProgressReportFragment
class StatisticsDetailsParameters(var stat: Stat, var computableGroup: ComputableGroup, var report: Report, var title: String? = null) class StatisticsDetailsParameters(var stat: Stat, var report: Report, var title: String? = null)
class StatisticDetailsActivity : PokerAnalyticsActivity() { class ProgressReportActivity : PokerAnalyticsActivity() {
companion object { companion object {
@ -24,10 +23,10 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() {
/** /**
* Default constructor * Default constructor
*/ */
fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true, title: String? = null) { fun newInstance(context: Context, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String? = null) {
parameters = StatisticsDetailsParameters(stat, group, report, title) parameters = StatisticsDetailsParameters(stat, report, title)
this.displayAggregationChoices = displayAggregationChoices this.displayAggregationChoices = displayAggregationChoices
val intent = Intent(context, StatisticDetailsActivity::class.java) val intent = Intent(context, ProgressReportActivity::class.java)
context.startActivity(intent) context.startActivity(intent)
} }
@ -45,12 +44,12 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() {
private fun initUI() { private fun initUI() {
val fragmentTransaction = supportFragmentManager.beginTransaction() val fragmentTransaction = supportFragmentManager.beginTransaction()
val statisticDetailsFragment = StatisticDetailsFragment() val statisticDetailsFragment = ProgressReportFragment()
fragmentTransaction.add(R.id.statisticDetailsContainer, statisticDetailsFragment) fragmentTransaction.add(R.id.statisticDetailsContainer, statisticDetailsFragment)
fragmentTransaction.commit() fragmentTransaction.commit()
parameters?.let { parameters?.let {
statisticDetailsFragment.setData(it.stat, it.computableGroup, it.report, displayAggregationChoices, it.title) statisticDetailsFragment.setData(it.stat, it.report, displayAggregationChoices, it.title)
parameters = null parameters = null
} }

@ -3,15 +3,29 @@ package net.pokeranalytics.android.ui.activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
class ReportCreationActivity : PokerAnalyticsActivity() { class ReportCreationActivity : PokerAnalyticsActivity() {
companion object { enum class RequestCode {
fun newInstance(context: Context) { NEW_REPORT
}
companion object {
var options: Calculator.Options? = null
// fun newInstance(context: Context) {
// val intent = Intent(context, ReportCreationActivity::class.java)
// context.startActivity(intent)
// }
fun newInstanceForResult(fragment: Fragment, context: Context) {
val intent = Intent(context, ReportCreationActivity::class.java) val intent = Intent(context, ReportCreationActivity::class.java)
context.startActivity(intent) fragment.startActivityForResult(intent, RequestCode.NEW_REPORT.ordinal)
} }
} }

@ -0,0 +1,51 @@
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.report.TableReportFragment
class TableReportActivity : 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) {
this.report = report
this.reportTitle = reportTitle
val intent = Intent(context, TableReportActivity::class.java)
context.startActivity(intent)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_table_report)
initUI()
}
/**
* Init UI
*/
private fun initUI() {
report?.let {
val fragmentTransaction = supportFragmentManager.beginTransaction()
val fragment = TableReportFragment.newInstance(it)
fragmentTransaction.add(R.id.reportDetailsContainer, fragment)
fragmentTransaction.commit()
report = null
}
}
}

@ -9,7 +9,7 @@ import androidx.viewpager.widget.PagerAdapter
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.fragment.GraphFragment
import net.pokeranalytics.android.ui.fragment.TableReportFragment import net.pokeranalytics.android.ui.fragment.report.TableReportFragment
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import java.lang.ref.WeakReference import java.lang.ref.WeakReference

@ -20,7 +20,7 @@ import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity import net.pokeranalytics.android.ui.activity.ProgressReportActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
@ -152,9 +152,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable
is GraphRow -> { is GraphRow -> {
row.report?.let { report -> row.report?.let { report ->
row.stat?.let { stat -> row.stat?.let { stat ->
report.results.firstOrNull()?.group?.let { computableGroup -> ProgressReportActivity.newInstance(requireContext(), stat, report, false, row.title)
StatisticDetailsActivity.newInstance(requireContext(), stat, computableGroup, report, false, row.title)
}
} }
} }
} }

@ -25,7 +25,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.extensions.hideWithAnimation import net.pokeranalytics.android.ui.extensions.hideWithAnimation
import net.pokeranalytics.android.ui.extensions.showWithAnimation import net.pokeranalytics.android.ui.extensions.showWithAnimation
import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.fragment.components.ResultsObserverFragment
import net.pokeranalytics.android.ui.view.CalendarTabs import net.pokeranalytics.android.ui.view.CalendarTabs
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
@ -36,7 +36,7 @@ import java.util.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, class CalendarFragment : ResultsObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource,
RowRepresentableDelegate { RowRepresentableDelegate {
enum class TimeFilter { enum class TimeFilter {

@ -1,5 +1,7 @@
package net.pokeranalytics.android.ui.fragment package net.pokeranalytics.android.ui.fragment
import android.app.Activity
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -12,6 +14,7 @@ import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.Criteria
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.ReportCreationActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
@ -53,8 +56,7 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR
if (this.assistant.step == Assistant.Step.FINALIZE) { if (this.assistant.step == Assistant.Step.FINALIZE) {
// launch report // launch report
val options = this.assistant.options this.finishActivityWithOptions(this.assistant.options)
} else { } else {
this.updateUIWithCurrentStep() this.updateUIWithCurrentStep()
@ -63,7 +65,15 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR
} }
} }
}
private fun finishActivityWithOptions(options: Calculator.Options) {
ReportCreationActivity.options = options // temp object
val intent = Intent()
activity?.setResult(Activity.RESULT_OK, intent)
activity?.finish()
} }
private fun updateUIWithCurrentStep() { private fun updateUIWithCurrentStep() {
@ -214,6 +224,8 @@ class Assistant {
Step.STAT Step.STAT
} else if (this.display == Calculator.Options.Display.COMPARISON && this.comparators.isEmpty()) { } else if (this.display == Calculator.Options.Display.COMPARISON && this.comparators.isEmpty()) {
Step.COMPARATOR Step.COMPARATOR
} else if (this.step == Step.FILTER) {
Step.FINALIZE
} else if (this.useFilter == null) { } else if (this.useFilter == null) {
Step.FILTER Step.FILTER
} else { } else {
@ -238,12 +250,12 @@ class Assistant {
return when (this.step) { return when (this.step) {
Step.TYPE -> listOf( Step.TYPE -> listOf(
Calculator.Options.Display.TABLE, Calculator.Options.Display.TABLE,
Calculator.Options.Display.EVOLUTION, Calculator.Options.Display.PROGRESS,
Calculator.Options.Display.COMPARISON Calculator.Options.Display.COMPARISON
) )
Step.STAT -> { Step.STAT -> {
when (this.display) { when (this.display) {
Calculator.Options.Display.EVOLUTION -> Stat.evolutionValuesList Calculator.Options.Display.PROGRESS -> Stat.evolutionValuesList
else -> Stat.userSelectableList else -> Stat.userSelectableList
} }
} }

@ -1,5 +1,7 @@
package net.pokeranalytics.android.ui.fragment package net.pokeranalytics.android.ui.fragment
import android.app.Activity
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -17,8 +19,10 @@ import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.Criteria
import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.combined
import net.pokeranalytics.android.ui.activity.ComparisonReportActivity
import net.pokeranalytics.android.ui.activity.ReportCreationActivity import net.pokeranalytics.android.ui.activity.ReportCreationActivity
import net.pokeranalytics.android.ui.activity.ReportDetailsActivity import net.pokeranalytics.android.ui.activity.ProgressReportActivity
import net.pokeranalytics.android.ui.activity.TableReportActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
@ -65,6 +69,17 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
initUI() initUI()
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == ReportCreationActivity.RequestCode.NEW_REPORT.ordinal && resultCode == Activity.RESULT_OK) {
ReportCreationActivity.options?.let { options ->
this.launchReportWithOptions(options, options.defaultName)
}
ReportCreationActivity.options = null
}
}
// Rows // Rows
override fun adapterRows(): List<RowRepresentable>? { override fun adapterRows(): List<RowRepresentable>? {
@ -79,7 +94,6 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
} }
} }
// Business // Business
/** /**
@ -104,7 +118,7 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
} }
this.addButton.setOnClickListener { this.addButton.setOnClickListener {
ReportCreationActivity.newInstance(requireContext()) ReportCreationActivity.newInstanceForResult(this, requireContext())
} }
} }
@ -119,6 +133,20 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
return return
} }
val requiredStats: List<Stat> = listOf(Stat.NET_RESULT)
val options = Calculator.Options(
display = Calculator.Options.Display.COMPARISON,
evolutionValues = Calculator.Options.EvolutionValues.STANDARD,
stats = requiredStats,
criterias = criteriaList
)
this.launchReportWithOptions(options, reportName)
}
private fun launchReportWithOptions(options: Calculator.Options, reportName: String) {
showLoader() showLoader()
GlobalScope.launch { GlobalScope.launch {
@ -126,13 +154,6 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
val startDate = Date() val startDate = Date()
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val requiredStats: List<Stat> = listOf(Stat.NET_RESULT)
val options = Calculator.Options(
evolutionValues = Calculator.Options.EvolutionValues.STANDARD,
stats = requiredStats,
criterias = criteriaList
)
val report = Calculator.computeStats(realm, options = options) val report = Calculator.computeStats(realm, options = options)
Timber.d("launchComputation: ${System.currentTimeMillis() - startDate.time}ms") Timber.d("launchComputation: ${System.currentTimeMillis() - startDate.time}ms")
@ -140,12 +161,27 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
if (!isDetached) { if (!isDetached) {
hideLoader() hideLoader()
ReportDetailsActivity.newInstance(requireContext(), report, reportName)
when (options.display) {
Calculator.Options.Display.TABLE -> {
TableReportActivity.newInstance(requireContext(), report, reportName)
}
Calculator.Options.Display.PROGRESS -> {
ProgressReportActivity.newInstance(requireContext(), options.stats.first(), report)
}
Calculator.Options.Display.COMPARISON -> {
ComparisonReportActivity.newInstance(requireContext(), report, reportName)
}
else -> {
Timber.d("Report type not handled at the moment")
}
}
} }
} }
realm.close() realm.close()
} }
} }
} }

@ -3,18 +3,12 @@ package net.pokeranalytics.android.ui.fragment
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View import android.view.View
import io.realm.Realm import io.realm.Realm
import io.realm.kotlin.where
import kotlinx.android.synthetic.main.activity_new_data.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.ComputableGroup
import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Report
@ -23,14 +17,13 @@ import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.ui.fragment.report.TableReportFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode
import net.pokeranalytics.android.ui.interfaces.FilterHandler import net.pokeranalytics.android.ui.interfaces.FilterHandler
import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.interfaces.FilterableType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow
import net.pokeranalytics.android.util.Preferences
import net.pokeranalytics.android.util.UserDefaults
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext

@ -7,16 +7,18 @@ import android.view.ViewGroup
import io.realm.RealmResults import io.realm.RealmResults
import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.ComputableResult
open class SessionObserverFragment : RealmFragment() { open class ResultsObserverFragment : RealmFragment() {
private lateinit var endedSessions: RealmResults<ComputableResult> private lateinit var computableResults: RealmResults<ComputableResult>
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState) val view = super.onCreateView(inflater, container, savedInstanceState)
this.endedSessions = getRealm().where(ComputableResult::class.java).findAll() // ComputableResult are existing only if sessions are ended // ComputableResult are existing only if sessions are ended
this.endedSessions.addChangeListener { _, _ -> this.computableResults = getRealm().where(ComputableResult::class.java).findAll()
this.computableResults.addChangeListener { _, _ ->
this.sessionsChanged() this.sessionsChanged()
} }
@ -25,7 +27,7 @@ open class SessionObserverFragment : RealmFragment() {
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
endedSessions.removeAllChangeListeners() computableResults.removeAllChangeListeners()
} }
open fun sessionsChanged() { open fun sessionsChanged() {

@ -0,0 +1,52 @@
package net.pokeranalytics.android.ui.fragment.report
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.ui.fragment.components.RealmFragment
abstract class AbstractReportFragment : RealmFragment() {
protected lateinit var selectedReport: Report
private var editableMenu: Menu? = null
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
menu?.clear()
inflater?.inflate(R.menu.toolbar_report, menu)
this.editableMenu = menu
updateMenuUI()
super.onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item!!.itemId) {
R.id.save -> this.saveReportRequest()
}
return true
}
/**
* Update menu UI
*/
private fun updateMenuUI() {
editableMenu?.findItem(R.id.save)?.let {
it.isVisible = this.selectedReport.options.userGenerated
it.icon.setTint(requireContext().getColor(R.color.white))
}
}
private fun saveReportRequest() {
}
private fun saveReport(name: String) {
getRealm().executeTransaction {
val report = this.selectedReport.options.reportSetup(name)
it.insert(report)
}
}
}

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment package net.pokeranalytics.android.ui.fragment.report
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -13,13 +13,12 @@ import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.ReportPagerAdapter import net.pokeranalytics.android.ui.adapter.ReportPagerAdapter
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
class ReportDetailsFragment : PokerAnalyticsFragment() { class ComparisonReportFragment : AbstractReportFragment() {
companion object { companion object {
fun newInstance(report: Report?, reportTitle: String): ReportDetailsFragment { fun newInstance(report: Report?, reportTitle: String): ComparisonReportFragment {
val fragment = ReportDetailsFragment() val fragment = ComparisonReportFragment()
fragment.reportTitle = reportTitle fragment.reportTitle = reportTitle
report?.let { report?.let {
fragment.selectedReport = it fragment.selectedReport = it
@ -32,7 +31,6 @@ class ReportDetailsFragment : PokerAnalyticsFragment() {
} }
private lateinit var parentActivity: PokerAnalyticsActivity private lateinit var parentActivity: PokerAnalyticsActivity
private lateinit var selectedReport: Report
private var reports: MutableMap<AggregationType, Report> = hashMapOf() private var reports: MutableMap<AggregationType, Report> = hashMapOf()
private var stat: Stat = Stat.NET_RESULT private var stat: Stat = Stat.NET_RESULT
@ -40,6 +38,7 @@ class ReportDetailsFragment : PokerAnalyticsFragment() {
private var reportTitle: String = "" private var reportTitle: String = ""
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.fragment_report_details, container, false) return inflater.inflate(R.layout.fragment_report_details, container, false)
} }

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment package net.pokeranalytics.android.ui.fragment.report
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -16,27 +16,30 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.calculus.AggregationType
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.combined
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.extensions.ChipGroupExtension import net.pokeranalytics.android.ui.extensions.ChipGroupExtension
import net.pokeranalytics.android.ui.extensions.hideWithAnimation import net.pokeranalytics.android.ui.extensions.hideWithAnimation
import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.extensions.px
import net.pokeranalytics.android.ui.extensions.showWithAnimation import net.pokeranalytics.android.ui.extensions.showWithAnimation
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.GraphFragment
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
class StatisticDetailsFragment : PokerAnalyticsFragment() { class ProgressReportFragment : AbstractReportFragment() {
companion object { companion object {
/** /**
* Create new instance * Creates new instance
*/ */
fun newInstance(): StatisticDetailsFragment { fun newInstance(): ProgressReportFragment {
val fragment = StatisticDetailsFragment() val fragment = ProgressReportFragment()
val bundle = Bundle() val bundle = Bundle()
fragment.arguments = bundle fragment.arguments = bundle
return fragment return fragment
@ -44,9 +47,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() {
} }
private lateinit var parentActivity: PokerAnalyticsActivity private lateinit var parentActivity: PokerAnalyticsActivity
private lateinit var computableGroup: ComputableGroup
private lateinit var graphFragment: GraphFragment private lateinit var graphFragment: GraphFragment
private lateinit var selectedReport: Report
private var title: String? = null private var title: String? = null
private var reports: MutableMap<AggregationType, Report> = hashMapOf() private var reports: MutableMap<AggregationType, Report> = hashMapOf()
@ -54,6 +55,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() {
private var displayAggregationChoices: Boolean = true private var displayAggregationChoices: Boolean = true
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.fragment_statistic_details, container, false) return inflater.inflate(R.layout.fragment_statistic_details, container, false)
} }
@ -65,9 +67,8 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() {
/** /**
* Set data * Set data
*/ */
fun setData(stat: Stat, computableGroup: ComputableGroup, report: Report, displayAggregationChoices: Boolean, title: String? = null) { fun setData(stat: Stat, report: Report, displayAggregationChoices: Boolean, title: String? = null) {
this.stat = stat this.stat = stat
this.computableGroup = computableGroup
this.selectedReport = report this.selectedReport = report
this.displayAggregationChoices = displayAggregationChoices this.displayAggregationChoices = displayAggregationChoices
this.title = title this.title = title
@ -91,7 +92,6 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() {
parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
setHasOptionsMenu(true) setHasOptionsMenu(true)
val fragmentManager = parentActivity.supportFragmentManager val fragmentManager = parentActivity.supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction() val fragmentTransaction = fragmentManager.beginTransaction()
graphFragment = GraphFragment() graphFragment = GraphFragment()
@ -168,7 +168,9 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
val report = Calculator.computeStatsWithEvolutionByAggregationType(realm, stat, computableGroup, aggregationType) val group = selectedReport.results.first().group
val report = Calculator.computeStatsWithEvolutionByAggregationType(realm, stat, group, aggregationType)
reports[aggregationType] = report reports[aggregationType] = report
realm.close() realm.close()

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment package net.pokeranalytics.android.ui.fragment.report
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -12,12 +12,12 @@ import kotlinx.coroutines.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity import net.pokeranalytics.android.ui.activity.ProgressReportActivity
import net.pokeranalytics.android.ui.adapter.DisplayDescriptor import net.pokeranalytics.android.ui.adapter.DisplayDescriptor
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.fragment.components.ResultsObserverFragment
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow
@ -26,7 +26,7 @@ import timber.log.Timber
import java.util.* import java.util.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
open class TableReportFragment : SessionObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope, open class TableReportFragment : ResultsObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope,
RowRepresentableDelegate { RowRepresentableDelegate {
override val coroutineContext: CoroutineContext override val coroutineContext: CoroutineContext
@ -199,7 +199,7 @@ open class TableReportFragment : SessionObserverFragment(), StaticRowRepresentab
if (!isDetached) { if (!isDetached) {
hideLoader() hideLoader()
report?.let { report?.let {
StatisticDetailsActivity.newInstance(requireContext(), stat, computableGroup, it) ProgressReportActivity.newInstance(requireContext(), stat, it)
} }
} }
} }

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z"/>
</vector>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/reportDetailsContainer">
</FrameLayout>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/save"
android:icon="@drawable/ic_baseline_save"
android:title="@string/save"
android:iconTint="@color/white"
app:showAsAction="ifRoom" />
</menu>

@ -29,6 +29,7 @@
<string name="new_report_step_comparator">Select one or more comparison criteria</string> <string name="new_report_step_comparator">Select one or more comparison criteria</string>
<string name="new_report_step_filter">Select a filter or launch report</string> <string name="new_report_step_filter">Select a filter or launch report</string>
<string name="launch_report">Launch Report</string> <string name="launch_report">Launch Report</string>
<string name="progress">Progress</string>
<string name="address">Address</string> <string name="address">Address</string>
<string name="suggestions">Naming suggestions</string> <string name="suggestions">Naming suggestions</string>

Loading…
Cancel
Save