Separate Report Display from Calculator.Options

split
Laurent 5 years ago
parent feb7ba5c1b
commit 1b486e0ae7
  1. 64
      app/src/main/java/net/pokeranalytics/android/calcul/ReportDisplay.kt
  2. 77
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  3. 8
      app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt
  4. 3
      app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/ui/activity/ReportCreationActivity.kt
  6. 20
      app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt
  7. 28
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt
  8. 21
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt
  9. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt
  10. 3
      app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComposableTableReportFragment.kt
  11. 4
      app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.kt

@ -0,0 +1,64 @@
package net.pokeranalytics.android.calcul
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.ui.activity.ComparisonReportActivity
import net.pokeranalytics.android.ui.activity.ProgressReportActivity
import net.pokeranalytics.android.ui.activity.TableReportActivity
import net.pokeranalytics.android.ui.view.RowRepresentable
/**
* The way the computed stats are going to be displayed
*/
enum class ReportDisplay : RowRepresentable {
TABLE,
PROGRESS,
COMPARISON,
MAP;
override val resId: Int?
get() {
return when (this) {
TABLE -> R.string.table
PROGRESS -> R.string.progress
COMPARISON -> R.string.comparison
MAP -> R.string.map
}
}
val activityClass: Class<*>
get() {
return when (this) {
TABLE -> TableReportActivity::class.java
PROGRESS -> ProgressReportActivity::class.java
COMPARISON -> ComparisonReportActivity::class.java
else -> throw PAIllegalStateException("undefined activity for report display")
}
}
val progressValues: Calculator.Options.ProgressValues
get() {
return when (this) {
PROGRESS, COMPARISON -> Calculator.Options.ProgressValues.STANDARD
else -> Calculator.Options.ProgressValues.NONE
}
}
// val requireProgressValues: Boolean
// get() {
// return when (this) {
// PROGRESS, COMPARISON -> true
// else -> false
// }
// }
val multipleStatSelection: Boolean
get() {
return when (this) {
PROGRESS -> false
else -> true
}
}
}

@ -2,7 +2,6 @@ package net.pokeranalytics.android.calculus
import android.content.Context
import io.realm.Realm
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Stat.*
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.Criteria
@ -13,10 +12,6 @@ import net.pokeranalytics.android.model.filter.filter
import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.model.realm.SessionSet
import net.pokeranalytics.android.ui.activity.ComparisonReportActivity
import net.pokeranalytics.android.ui.activity.ProgressReportActivity
import net.pokeranalytics.android.ui.activity.TableReportActivity
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.util.extensions.startOfDay
import java.util.*
import kotlin.math.max
@ -33,8 +28,7 @@ class Calculator {
* The options used for calculations and display
*/
class Options(
var display: Display = Display.TABLE,
progressValues: ProgressValues = ProgressValues.NONE,
var progressValues: ProgressValues = ProgressValues.NONE,
var stats: List<Stat> = listOf(),
var criterias: List<Criteria> = listOf(),
var query: Query = Query(),
@ -44,7 +38,7 @@ class Calculator {
var reportSetupId: String? = null
) {
constructor(display: Display = Display.TABLE,
constructor(
progressValues: ProgressValues = ProgressValues.NONE,
stats: List<Stat> = listOf(),
criterias: List<Criteria> = listOf(),
@ -52,18 +46,18 @@ class Calculator {
aggregationType: AggregationType? = null,
userGenerated: Boolean = false,
reportSetupId: String? = null) :
this(display, progressValues, stats, criterias, filter?.query ?: Query(), filter?.id, aggregationType, userGenerated, reportSetupId)
this(progressValues, stats, criterias, filter?.query ?: Query(), filter?.id, aggregationType, userGenerated, reportSetupId)
/**
* Specifies whether progress values should be added and their kind
*/
var progressValues: ProgressValues = progressValues
get() {
if (field == ProgressValues.NONE && this.display.requireProgressValues) {
return ProgressValues.STANDARD
}
return field
}
// var progressValues: ProgressValues = progressValues
// get() {
// if (field == ProgressValues.NONE && this.display.requireProgressValues) {
// return ProgressValues.STANDARD
// }
// return field
// }
init {
this.aggregationType?.let {
@ -71,52 +65,6 @@ class Calculator {
}
}
/**
* The way the computed stats are going to be displayed
*/
enum class Display : RowRepresentable {
TABLE,
PROGRESS,
COMPARISON,
MAP;
override val resId: Int?
get() {
return when (this) {
TABLE -> R.string.table
PROGRESS -> R.string.progress
COMPARISON -> R.string.comparison
MAP -> R.string.map
}
}
val activityClass: Class<*>
get() {
return when (this) {
TABLE -> TableReportActivity::class.java
PROGRESS -> ProgressReportActivity::class.java
COMPARISON -> ComparisonReportActivity::class.java
else -> throw PAIllegalStateException("undefined activity for report display")
}
}
val requireProgressValues: Boolean
get() {
return when (this) {
PROGRESS, COMPARISON -> true
else -> false
}
}
val multipleStatSelection: Boolean
get() {
return when (this) {
PROGRESS -> false
else -> true
}
}
}
/**
* The type of evolution numericValues
@ -205,7 +153,6 @@ class Calculator {
): Report {
val options = Options(
display = Options.Display.PROGRESS,
progressValues = Options.ProgressValues.STANDARD,
stats = listOf(stat),
aggregationType = aggregationType
@ -504,10 +451,6 @@ class Calculator {
)
results.addEvolutionValue(tHourlyRateBB, stat = HOURLY_RATE_BB, data = sessionSet)
// Stat.netBBPer100Hands(tBBSum, tTotalHands)?.let { netBB100 ->
// results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = sessionSet)
// }
}
Options.ProgressValues.TIMED -> {
results.addEvolutionValue(tRatedNetSum, tHourlyDuration, NET_RESULT, sessionSet)

@ -6,6 +6,7 @@ import io.realm.RealmList
import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.calcul.ReportDisplay
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.Criteria
@ -30,7 +31,7 @@ open class ReportSetup : RealmObject(), RowRepresentable, Deletable {
var name: String = ""
// The type of display of the report
var display: Int = Calculator.Options.Display.TABLE.ordinal
var display: Int = ReportDisplay.TABLE.ordinal
/**
* A list of statIds to compute
@ -64,7 +65,7 @@ open class ReportSetup : RealmObject(), RowRepresentable, Deletable {
/**
* Returns the Options based on the ReportSetup parameters
*/
fun options(realm: Realm): Calculator.Options {
fun options(realm: Realm, reportDisplay: ReportDisplay): Calculator.Options {
val stats = this.statIds.map { Stat.valueByIdentifier(it) }
@ -79,10 +80,9 @@ open class ReportSetup : RealmObject(), RowRepresentable, Deletable {
allCriteria.addAll(criteria)
allCriteria.addAll(cfCriteria)
return Calculator.Options(
display = Calculator.Options.Display.values()[this.display],
stats = stats,
progressValues = reportDisplay.progressValues,
criterias = allCriteria,
filter = this.filter,
userGenerated = true,

@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calcul.ReportDisplay
import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.ui.activity.components.ReportActivity
@ -20,7 +21,7 @@ class ProgressReportActivity : ReportActivity() {
*/
fun newInstance(context: Context, report: Report, title: String, stat: Stat? = null, displayAggregationChoices: Boolean = true) {
val parameters = ReportParameters(report, title, stat, showAggregationChoices = displayAggregationChoices)
val parameters = ReportParameters(report, ReportDisplay.PROGRESS, title, stat, showAggregationChoices = displayAggregationChoices)
ReportViewModel.defineParameters(parameters)
val intent = Intent(context, ProgressReportActivity::class.java)
context.startActivity(intent)

@ -5,6 +5,7 @@ import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calcul.ReportDisplay
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.ui.activity.components.BaseActivity
import net.pokeranalytics.android.ui.activity.components.RequestCode
@ -14,6 +15,7 @@ class ReportCreationActivity : BaseActivity() {
companion object {
var options: Calculator.Options? = null
var reportDisplay: ReportDisplay? = null
fun newInstanceForResult(fragment: Fragment, context: Context) {
val intent = Intent(context, ReportCreationActivity::class.java)

@ -5,12 +5,13 @@ import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import net.pokeranalytics.android.calcul.ReportDisplay
import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.ui.viewmodel.ReportViewModel
import net.pokeranalytics.android.ui.viewmodel.ViewModelHolder
class ReportParameters(var report: Report, var title: String, var stat: Stat? = null, var showAggregationChoices: Boolean = true)
class ReportParameters(var report: Report, var reportDisplay: ReportDisplay, var title: String, var stat: Stat? = null, var showAggregationChoices: Boolean = true)
abstract class ReportActivity : BaseActivity(), ViewModelHolder {
@ -23,19 +24,19 @@ abstract class ReportActivity : BaseActivity(), ViewModelHolder {
/**
* Default constructor
*/
fun newInstance(context: Context, report: Report, reportTitle: String, stat: Stat? = null) {
val options = report.options
val parameters = ReportParameters(report, reportTitle, stat)
fun newInstance(context: Context, report: Report, reportDisplay: ReportDisplay, reportTitle: String, stat: Stat? = null) {
// val options = report.options
val parameters = ReportParameters(report, reportDisplay, reportTitle, stat)
ReportViewModel.defineParameters(parameters)
val intent = Intent(context, options.display.activityClass)
val intent = Intent(context, reportDisplay.activityClass)
context.startActivity(intent)
}
fun newInstanceForResult(fragment: Fragment, report: Report, reportTitle: String, stat: Stat? = null) {
val options = report.options
val parameters = ReportParameters(report, reportTitle, stat)
fun newInstanceForResult(fragment: Fragment, report: Report, reportDisplay: ReportDisplay, reportTitle: String, stat: Stat? = null) {
// val options = report.options
val parameters = ReportParameters(report, reportDisplay, reportTitle, stat)
ReportViewModel.defineParameters(parameters)
val intent = Intent(fragment.requireContext(), options.display.activityClass)
val intent = Intent(fragment.requireContext(), reportDisplay.activityClass)
fragment.startActivityForResult(intent, RequestCode.DEFAULT.value)
}
@ -50,6 +51,7 @@ abstract class ReportActivity : BaseActivity(), ViewModelHolder {
ReportViewModel.parameters?.let {
this.model.report = it.report
this.model.reportDisplay = it.reportDisplay
this.model.title = it.title
val stat = it.stat ?: it.report.options.stats.first()
this.model.stat = stat

@ -7,6 +7,7 @@ import android.view.*
import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.Realm
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calcul.ReportDisplay
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.databinding.FragmentReportCreationBinding
@ -123,7 +124,7 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR
// }
// launch report
this.finishActivityWithOptions(this.assistant.options)
this.finishActivityWithOptions(this.assistant.options, this.assistant.reportDisplay)
} else {
this.updateUIWithCurrentStep()
@ -158,8 +159,9 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR
/**
* Finish activity
*/
private fun finishActivityWithOptions(options: Calculator.Options) {
private fun finishActivityWithOptions(options: Calculator.Options, reportDisplay: ReportDisplay) {
ReportCreationActivity.options = options // temp object
ReportCreationActivity.reportDisplay = reportDisplay
val intent = Intent()
activity?.setResult(Activity.RESULT_OK, intent)
activity?.finish()
@ -220,7 +222,10 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR
class Assistant {
var step: Step = Step.TYPE
private var display: Calculator.Options.Display = Calculator.Options.Display.TABLE
var reportDisplay: ReportDisplay = ReportDisplay.TABLE
private set
private var stats = mutableListOf<Stat>()
private var comparators = mutableListOf<Criteria>()
private var useFilter: Boolean? = null
@ -229,7 +234,6 @@ class Assistant {
val options: Calculator.Options
get() {
return Calculator.Options(
this.display,
stats = this.stats,
criterias = this.comparators,
filter = this.filter,
@ -255,13 +259,13 @@ class Assistant {
when (this.step) {
Step.TYPE -> {
this.display = this.dataSource[position] as Calculator.Options.Display
this.reportDisplay = this.dataSource[position] as ReportDisplay
this.nextStep()
}
Step.STAT -> {
val stat = this.dataSource[position] as Stat
when (this.display.multipleStatSelection) {
when (this.reportDisplay.multipleStatSelection) {
true -> {
if (this.stats.contains(stat)) {
this.stats.remove(stat)
@ -336,7 +340,7 @@ class Assistant {
get() {
return if (this.stats.isEmpty()) {
Step.STAT
} else if (this.display == Calculator.Options.Display.COMPARISON && this.comparators.isEmpty()) {
} else if (this.reportDisplay == ReportDisplay.COMPARISON && this.comparators.isEmpty()) {
Step.COMPARATOR
} else if (this.step == Step.FILTER) {
Step.FINALIZE
@ -363,13 +367,13 @@ class Assistant {
get() {
return when (this.step) {
Step.TYPE -> listOf(
Calculator.Options.Display.TABLE,
Calculator.Options.Display.PROGRESS,
Calculator.Options.Display.COMPARISON
ReportDisplay.TABLE,
ReportDisplay.PROGRESS,
ReportDisplay.COMPARISON
)
Step.STAT -> {
when (this.display) {
Calculator.Options.Display.PROGRESS -> Stat.evolutionValuesList
when (this.reportDisplay) {
ReportDisplay.PROGRESS -> Stat.evolutionValuesList
else -> Stat.userSelectableList
}
}

@ -15,6 +15,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calcul.ReportDisplay
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.databinding.FragmentReportsBinding
@ -86,10 +87,16 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == RequestCode.NEW_REPORT.value && resultCode == Activity.RESULT_OK) {
ReportCreationActivity.options?.let { options ->
this.launchReportWithOptions(options, options.getName(requireContext()))
}
ReportCreationActivity.reportDisplay?.let { display ->
options.progressValues = display.progressValues
this.launchReportWithOptions(options, display, options.getName(requireContext()))
} ?: run { Timber.d("no display to run the report") }
} ?: run { Timber.d("no options to run the report") }
ReportCreationActivity.options = null
ReportCreationActivity.reportDisplay = null
} else if (requestCode == RequestCode.DEFAULT.value && resultCode == Activity.RESULT_OK) {
val itemToDeleteId = data?.getStringExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName)
itemToDeleteId?.let { id ->
@ -164,7 +171,8 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc
launchComputation(row.criteria, reportName)
}
is ReportSetup -> {
launchReportWithOptions(row.options(getRealm()), row.name)
val display = ReportDisplay.values()[row.display]
launchReportWithOptions(row.options(getRealm(), display), display, row.name)
}
}
}
@ -181,20 +189,19 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc
val requiredStats: List<Stat> = listOf(Stat.NET_RESULT)
val options = Calculator.Options(
display = Calculator.Options.Display.COMPARISON,
progressValues = Calculator.Options.ProgressValues.STANDARD,
stats = requiredStats,
criterias = criteriaList
)
this.launchReportWithOptions(options, reportName)
this.launchReportWithOptions(options, ReportDisplay.COMPARISON, reportName)
}
/**
* Launch and display a report with some [options] and a [reportName]
*/
private fun launchReportWithOptions(options: Calculator.Options, reportName: String) {
private fun launchReportWithOptions(options: Calculator.Options, reportDisplay: ReportDisplay, reportName: String) {
showLoader()
@ -211,7 +218,7 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc
launch(Dispatchers.Main) {
if (!isDetached) {
hideLoader()
ReportActivity.newInstanceForResult(this@ReportsFragment, report, reportName)
ReportActivity.newInstanceForResult(this@ReportsFragment, report, reportDisplay, reportName)
}
}
realm.close()

@ -117,7 +117,7 @@ abstract class AbstractReportFragment : DataManagerFragment() {
if (firstSave) {
val options = this.selectedReport.options
rs.name = name
rs.display = options.display.ordinal
rs.display = this.reportViewModel.reportDisplay?.ordinal ?: throw PAIllegalStateException("Display not set")
options.stats.forEach {
rs.statIds.add(it.uniqueIdentifier)
}

@ -12,6 +12,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calcul.ReportDisplay
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.ComputableGroup
import net.pokeranalytics.android.calculus.Report
@ -237,7 +238,7 @@ open class ComposableTableReportFragment : RealmFragment(), StaticRowRepresentab
hideLoader()
report?.let {
val title = stat.localizedTitle(requireContext())
ReportActivity.newInstance(requireContext(), it, title, stat)
ReportActivity.newInstance(requireContext(), it, ReportDisplay.PROGRESS, title, stat)
} ?: run {
throw PAIllegalStateException("Report should never be null here")
}

@ -3,6 +3,7 @@ package net.pokeranalytics.android.ui.viewmodel
import android.content.Context
import com.github.mikephil.charting.data.BarDataSet
import com.github.mikephil.charting.data.LineDataSet
import net.pokeranalytics.android.calcul.ReportDisplay
import net.pokeranalytics.android.calcul.barEntries
import net.pokeranalytics.android.calcul.lineEntries
import net.pokeranalytics.android.calcul.multiLineEntries
@ -14,6 +15,9 @@ import net.pokeranalytics.android.ui.activity.components.ReportParameters
class ReportViewModel : GraphViewModel(), ReportHolder, GraphDataProvider {
override var report: Report = Report(Calculator.Options())
var reportDisplay: ReportDisplay? = null
var showAggregationChoices: Boolean = true
companion object {

Loading…
Cancel
Save