diff --git a/app/src/main/java/net/pokeranalytics/android/calcul/ReportDisplay.kt b/app/src/main/java/net/pokeranalytics/android/calcul/ReportDisplay.kt new file mode 100644 index 00000000..f74185ce --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/calcul/ReportDisplay.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 + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 887da831..c77b4117 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -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 = listOf(), var criterias: List = 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 = listOf(), criterias: List = 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) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt index 8d44f3df..d629b314 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt @@ -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, diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt index 8e1e3743..fb74ba3b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt @@ -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) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ReportCreationActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ReportCreationActivity.kt index 244d18ef..4be93839 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/ReportCreationActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ReportCreationActivity.kt @@ -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) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt index d971ac98..254396af 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt @@ -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 diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt index 8f174f24..b20990a7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt @@ -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() private var comparators = mutableListOf() 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 } } 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 801ac0bf..9ec25d9a 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 @@ -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 = 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() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt index 7dbf57cc..8b214d3d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt @@ -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) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComposableTableReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComposableTableReportFragment.kt index 0c5d3643..0c465ddb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComposableTableReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComposableTableReportFragment.kt @@ -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") } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.kt index db04a640..5e2bd226 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/ReportViewModel.kt @@ -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 {