diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 42daa73c..5268059e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -64,12 +64,12 @@ android:screenOrientation="portrait" /> @@ -123,6 +123,11 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> + + 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 c5ec9284..1f6612cf 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -29,7 +29,7 @@ class Calculator { */ class Options( var display: Display = Display.TABLE, - var evolutionValues: EvolutionValues = EvolutionValues.NONE, + evolutionValues: EvolutionValues = EvolutionValues.NONE, var stats: List = listOf(), var criterias: List = listOf(), query: Query = Query(), @@ -38,6 +38,14 @@ class Calculator { 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 _filter: Filter? = filter @@ -60,7 +68,7 @@ class Calculator { */ enum class Display : RowRepresentable { TABLE, - EVOLUTION, + PROGRESS, COMPARISON, MAP, POLYNOMIAL; @@ -69,7 +77,7 @@ class Calculator { get() { return when (this) { TABLE -> R.string.table - EVOLUTION -> R.string.curve + PROGRESS -> R.string.progress COMPARISON -> R.string.comparison MAP -> R.string.map POLYNOMIAL -> null @@ -101,9 +109,9 @@ class Calculator { } val computeLongestStreak: Boolean - get() { - return this.stats.contains(LONGEST_STREAKS) - } + get() { + return this.stats.contains(LONGEST_STREAKS) + } val shouldSortValues: Boolean get() { 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() rs.name = name @@ -136,6 +144,17 @@ class Calculator { 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 { diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt index 6875e9ad..431db5cf 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -146,7 +146,7 @@ enum class Stat : RowRepresentable { return TextFormat(value.toCurrency(currency), color) } // 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 return TextFormat(value.formatted(), color) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ReportDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt similarity index 80% rename from app/src/main/java/net/pokeranalytics/android/ui/activity/ReportDetailsActivity.kt rename to app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt index be1b5dd1..8d776327 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/ReportDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt @@ -6,11 +6,11 @@ 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 +import net.pokeranalytics.android.ui.fragment.report.ComparisonReportFragment -class ReportDetailsActivity : PokerAnalyticsActivity() { +class ComparisonReportActivity : PokerAnalyticsActivity() { companion object { @@ -25,7 +25,7 @@ class ReportDetailsActivity : PokerAnalyticsActivity() { //parameters = GraphParameters(stat, group, report) this.report = report this.reportTitle = reportTitle - val intent = Intent(context, ReportDetailsActivity::class.java) + val intent = Intent(context, ComparisonReportActivity::class.java) context.startActivity(intent) } @@ -44,7 +44,7 @@ class ReportDetailsActivity : PokerAnalyticsActivity() { report?.let { val fragmentTransaction = supportFragmentManager.beginTransaction() - val reportDetailsFragment = ReportDetailsFragment.newInstance(it, reportTitle) + val reportDetailsFragment = ComparisonReportFragment.newInstance(it, reportTitle) fragmentTransaction.add(R.id.reportDetailsContainer, reportDetailsFragment) fragmentTransaction.commit() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt similarity index 59% rename from app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt rename to app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt index ec737828..83c34102 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ProgressReportActivity.kt @@ -4,16 +4,15 @@ import android.content.Context import android.content.Intent import android.os.Bundle import net.pokeranalytics.android.R -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.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 { @@ -24,10 +23,10 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { /** * Default constructor */ - fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true, title: String? = null) { - parameters = StatisticsDetailsParameters(stat, group, report, title) + fun newInstance(context: Context, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String? = null) { + parameters = StatisticsDetailsParameters(stat, report, title) this.displayAggregationChoices = displayAggregationChoices - val intent = Intent(context, StatisticDetailsActivity::class.java) + val intent = Intent(context, ProgressReportActivity::class.java) context.startActivity(intent) } @@ -45,12 +44,12 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() { private fun initUI() { val fragmentTransaction = supportFragmentManager.beginTransaction() - val statisticDetailsFragment = StatisticDetailsFragment() + val statisticDetailsFragment = ProgressReportFragment() fragmentTransaction.add(R.id.statisticDetailsContainer, statisticDetailsFragment) fragmentTransaction.commit() parameters?.let { - statisticDetailsFragment.setData(it.stat, it.computableGroup, it.report, displayAggregationChoices, it.title) + statisticDetailsFragment.setData(it.stat, it.report, displayAggregationChoices, it.title) parameters = null } 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 cde22ea1..f8f24c51 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 @@ -3,15 +3,29 @@ package net.pokeranalytics.android.ui.activity import android.content.Context import android.content.Intent import android.os.Bundle +import androidx.fragment.app.Fragment import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity class ReportCreationActivity : PokerAnalyticsActivity() { - companion object { - fun newInstance(context: Context) { + enum class RequestCode { + 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) - context.startActivity(intent) + fragment.startActivityForResult(intent, RequestCode.NEW_REPORT.ordinal) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt new file mode 100644 index 00000000..bdb070f5 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt @@ -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 + } + } + +} \ No newline at end of file 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 index 9b17e9bc..76bd436b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt @@ -9,7 +9,7 @@ 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.TableReportFragment +import net.pokeranalytics.android.ui.fragment.report.TableReportFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import java.lang.ref.WeakReference diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index e4e52d9d..62b9ff3f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -20,7 +20,7 @@ import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.filter.Query 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.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -152,9 +152,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable is GraphRow -> { row.report?.let { report -> row.stat?.let { stat -> - report.results.firstOrNull()?.group?.let { computableGroup -> - StatisticDetailsActivity.newInstance(requireContext(), stat, computableGroup, report, false, row.title) - } + ProgressReportActivity.newInstance(requireContext(), stat, report, false, row.title) } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 383aa8d5..da922db1 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -25,7 +25,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.extensions.hideWithAnimation 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.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -36,7 +36,7 @@ import java.util.* import kotlin.coroutines.CoroutineContext -class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, +class CalendarFragment : ResultsObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { enum class TimeFilter { 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 50c6d8d9..5ddd5587 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 @@ -1,5 +1,7 @@ package net.pokeranalytics.android.ui.fragment +import android.app.Activity +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -12,6 +14,7 @@ import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.Criteria 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.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -53,8 +56,7 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR if (this.assistant.step == Assistant.Step.FINALIZE) { // launch report - val options = this.assistant.options - + this.finishActivityWithOptions(this.assistant.options) } else { 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() { @@ -214,6 +224,8 @@ class Assistant { Step.STAT } else if (this.display == Calculator.Options.Display.COMPARISON && this.comparators.isEmpty()) { Step.COMPARATOR + } else if (this.step == Step.FILTER) { + Step.FINALIZE } else if (this.useFilter == null) { Step.FILTER } else { @@ -238,12 +250,12 @@ class Assistant { return when (this.step) { Step.TYPE -> listOf( Calculator.Options.Display.TABLE, - Calculator.Options.Display.EVOLUTION, + Calculator.Options.Display.PROGRESS, Calculator.Options.Display.COMPARISON ) Step.STAT -> { when (this.display) { - Calculator.Options.Display.EVOLUTION -> Stat.evolutionValuesList + Calculator.Options.Display.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 17a39180..e9ae0cc6 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 @@ -1,5 +1,7 @@ package net.pokeranalytics.android.ui.fragment +import android.app.Activity +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -17,8 +19,10 @@ import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.Criteria 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.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.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -65,6 +69,17 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour 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 override fun adapterRows(): List? { @@ -79,7 +94,6 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour } } - // Business /** @@ -104,7 +118,7 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour } this.addButton.setOnClickListener { - ReportCreationActivity.newInstance(requireContext()) + ReportCreationActivity.newInstanceForResult(this, requireContext()) } } @@ -119,6 +133,20 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour return } + val requiredStats: List = 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() GlobalScope.launch { @@ -126,13 +154,6 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour 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, - criterias = criteriaList - ) - val report = Calculator.computeStats(realm, options = options) Timber.d("launchComputation: ${System.currentTimeMillis() - startDate.time}ms") @@ -140,12 +161,27 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour launch(Dispatchers.Main) { if (!isDetached) { 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() } } - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt index 20d820bd..6077d2fd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt @@ -3,18 +3,12 @@ package net.pokeranalytics.android.ui.fragment import android.app.Activity import android.content.Intent import android.os.Bundle -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem import android.view.View import io.realm.Realm -import io.realm.kotlin.where -import kotlinx.android.synthetic.main.activity_new_data.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async import kotlinx.coroutines.launch -import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.ComputableGroup 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.realm.Filter 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.FilterHandler import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable 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 java.util.* import kotlin.coroutines.CoroutineContext diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/SessionObserverFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ResultsObserverFragment.kt similarity index 62% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/components/SessionObserverFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ResultsObserverFragment.kt index 8f07818a..8578ce3d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/SessionObserverFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ResultsObserverFragment.kt @@ -7,16 +7,18 @@ import android.view.ViewGroup import io.realm.RealmResults import net.pokeranalytics.android.model.realm.ComputableResult -open class SessionObserverFragment : RealmFragment() { +open class ResultsObserverFragment : RealmFragment() { - private lateinit var endedSessions: RealmResults + private lateinit var computableResults: RealmResults override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = super.onCreateView(inflater, container, savedInstanceState) - this.endedSessions = getRealm().where(ComputableResult::class.java).findAll() // ComputableResult are existing only if sessions are ended - this.endedSessions.addChangeListener { _, _ -> + // ComputableResult are existing only if sessions are ended + this.computableResults = getRealm().where(ComputableResult::class.java).findAll() + + this.computableResults.addChangeListener { _, _ -> this.sessionsChanged() } @@ -25,7 +27,7 @@ open class SessionObserverFragment : RealmFragment() { override fun onDestroyView() { super.onDestroyView() - endedSessions.removeAllChangeListeners() + computableResults.removeAllChangeListeners() } open fun sessionsChanged() { 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 new file mode 100644 index 00000000..d772aa46 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt @@ -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) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt similarity index 87% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt index 0d09654f..372d3570 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.ui.fragment +package net.pokeranalytics.android.ui.fragment.report import android.os.Bundle import android.view.LayoutInflater @@ -13,13 +13,12 @@ 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() { +class ComparisonReportFragment : AbstractReportFragment() { companion object { - fun newInstance(report: Report?, reportTitle: String): ReportDetailsFragment { - val fragment = ReportDetailsFragment() + fun newInstance(report: Report?, reportTitle: String): ComparisonReportFragment { + val fragment = ComparisonReportFragment() fragment.reportTitle = reportTitle report?.let { fragment.selectedReport = it @@ -32,7 +31,6 @@ class ReportDetailsFragment : PokerAnalyticsFragment() { } private lateinit var parentActivity: PokerAnalyticsActivity - private lateinit var selectedReport: Report private var reports: MutableMap = hashMapOf() private var stat: Stat = Stat.NET_RESULT @@ -40,6 +38,7 @@ class ReportDetailsFragment : PokerAnalyticsFragment() { private var reportTitle: String = "" 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) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt similarity index 88% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt index dd374778..bf978c72 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.ui.fragment +package net.pokeranalytics.android.ui.fragment.report import android.os.Bundle import android.view.LayoutInflater @@ -16,27 +16,30 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch 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.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 net.pokeranalytics.android.ui.fragment.GraphFragment import timber.log.Timber import java.util.* -class StatisticDetailsFragment : PokerAnalyticsFragment() { +class ProgressReportFragment : AbstractReportFragment() { companion object { /** - * Create new instance + * Creates new instance */ - fun newInstance(): StatisticDetailsFragment { - val fragment = StatisticDetailsFragment() + fun newInstance(): ProgressReportFragment { + val fragment = ProgressReportFragment() val bundle = Bundle() fragment.arguments = bundle return fragment @@ -44,9 +47,7 @@ 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 title: String? = null private var reports: MutableMap = hashMapOf() @@ -54,6 +55,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { private var displayAggregationChoices: Boolean = true 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) } @@ -65,9 +67,8 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { /** * 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.computableGroup = computableGroup this.selectedReport = report this.displayAggregationChoices = displayAggregationChoices this.title = title @@ -91,7 +92,6 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) - val fragmentManager = parentActivity.supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() graphFragment = GraphFragment() @@ -168,7 +168,9 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { 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 realm.close() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/TableReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt similarity index 94% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/TableReportFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt index 4719d2b1..69f065a7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/TableReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.ui.fragment +package net.pokeranalytics.android.ui.fragment.report import android.os.Bundle import android.view.LayoutInflater @@ -12,12 +12,12 @@ import kotlinx.coroutines.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* 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.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate 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.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow @@ -26,7 +26,7 @@ import timber.log.Timber import java.util.* import kotlin.coroutines.CoroutineContext -open class TableReportFragment : SessionObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope, +open class TableReportFragment : ResultsObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope, RowRepresentableDelegate { override val coroutineContext: CoroutineContext @@ -199,7 +199,7 @@ open class TableReportFragment : SessionObserverFragment(), StaticRowRepresentab if (!isDetached) { hideLoader() report?.let { - StatisticDetailsActivity.newInstance(requireContext(), stat, computableGroup, it) + ProgressReportActivity.newInstance(requireContext(), stat, it) } } } diff --git a/app/src/main/res/drawable/ic_baseline_save.xml b/app/src/main/res/drawable/ic_baseline_save.xml new file mode 100644 index 00000000..1a3cbf91 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_save.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_table_report.xml b/app/src/main/res/layout/activity_table_report.xml new file mode 100644 index 00000000..918c64c0 --- /dev/null +++ b/app/src/main/res/layout/activity_table_report.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/toolbar_report.xml b/app/src/main/res/menu/toolbar_report.xml new file mode 100644 index 00000000..07c1fabc --- /dev/null +++ b/app/src/main/res/menu/toolbar_report.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1f1cd23d..a66bc65f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,6 +29,7 @@ Select one or more comparison criteria Select a filter or launch report Launch Report + Progress Address Naming suggestions