From f290b21a31f04b3eaa8990571b2c92fa6a8a184e Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 16 May 2019 15:21:07 +0200 Subject: [PATCH 1/7] Adds ability to save & delete custom reports --- .../android/calculus/Calculator.kt | 40 ++-- .../pokeranalytics/android/model/LiveData.kt | 5 +- .../android/model/realm/ReportSetup.kt | 20 +- .../ui/activity/ComparisonReportActivity.kt | 45 +++-- .../ui/activity/ProgressReportActivity.kt | 11 +- .../ui/activity/TableReportActivity.kt | 52 +++--- .../ui/activity/components/ReportActivity.kt | 38 ++++ .../android/ui/fragment/BankrollFragment.kt | 7 +- .../android/ui/fragment/DataListFragment.kt | 9 +- .../android/ui/fragment/ReportsFragment.kt | 31 ++- .../components/DeletableItemFragment.kt | 10 +- .../ui/fragment/data/BankrollDataFragment.kt | 4 +- .../ui/fragment/data/DataManagerFragment.kt | 154 +++++++++++++++ .../ui/fragment/data/EditableDataFragment.kt | 176 +++--------------- .../ui/fragment/data/LocationDataFragment.kt | 2 +- .../fragment/report/AbstractReportFragment.kt | 100 ++++++---- .../report/ComparisonReportFragment.kt | 8 +- .../fragment/report/ProgressReportFragment.kt | 2 +- .../ui/fragment/report/TableReportFragment.kt | 5 +- app/src/main/res/layout/dialog_edit_text.xml | 21 +++ app/src/main/res/layout/fragment_bankroll.xml | 2 +- .../main/res/layout/fragment_data_list.xml | 2 +- app/src/main/res/layout/fragment_reports.xml | 2 +- app/src/main/res/values/strings.xml | 1 + build.gradle | 2 +- 25 files changed, 461 insertions(+), 288 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt create mode 100644 app/src/main/res/layout/dialog_edit_text.xml 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 223b1af4..0d1960d9 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -11,7 +11,6 @@ import net.pokeranalytics.android.model.filter.Query 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.ReportSetup import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.util.extensions.startOfDay @@ -35,7 +34,8 @@ class Calculator { query: Query = Query(), filter: Filter? = null, var aggregationType: AggregationType? = null, - var userGenerated: Boolean = false + var userGenerated: Boolean = false, + var reportSetupId: String? = null ) { var evolutionValues: EvolutionValues = evolutionValues @@ -47,17 +47,17 @@ class Calculator { } private var _query: Query = query - private var _filter: Filter? = filter + var filter: Filter? = filter init { - if (!this._query.conditions.isEmpty() && this._filter != null) { + if (!this._query.conditions.isEmpty() && this.filter != null) { throw IllegalStateException("Can't specify a query with conditions AND a filter") } } val query: Query get() { - this._filter?.let { + this.filter?.let { return it.query } return this._query @@ -134,21 +134,21 @@ class Calculator { } } - fun reportSetup(name: String): ReportSetup { - - val rs = ReportSetup() - rs.name = name - rs.display = this.display.ordinal - this.stats.forEach { - rs.statIds.add(it.uniqueIdentifier) - } - this.criterias.forEach { - rs.criteriaIds.add(it.uniqueIdentifier) - } - rs.filter = this._filter - - return rs - } +// fun reportSetup(name: String): ReportSetup { +// +// val rs = ReportSetup() +// rs.name = name +// rs.display = this.display.ordinal +// this.stats.forEach { +// rs.statIds.add(it.uniqueIdentifier) +// } +// this.criterias.forEach { +// rs.criteriaIds.add(it.uniqueIdentifier) +// } +// rs.filter = this.filter +// +// return rs +// } /** * Returns some default name diff --git a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt index 5a556290..8209cd7c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -24,7 +24,8 @@ enum class LiveData : Localizable { TRANSACTION, TRANSACTION_TYPE, FILTER, - CUSTOM_FIELD; + CUSTOM_FIELD, + REPORT_SETUP; fun items(realm: Realm, fieldName: String? = null, sortOrder: Sort? = null): RealmResults<*> { val results = realm.where(this.relatedEntity).findAll().sort(fieldName ?: this.sortingFieldName, sortOrder ?: this.sorting) @@ -105,6 +106,7 @@ enum class LiveData : Localizable { TRANSACTION_TYPE -> TransactionType::class.java FILTER -> Filter::class.java CUSTOM_FIELD -> CustomField::class.java + REPORT_SETUP -> ReportSetup::class.java } } @@ -148,6 +150,7 @@ enum class LiveData : Localizable { TRANSACTION_TYPE -> R.string.operation_types FILTER -> R.string.filter CUSTOM_FIELD -> R.string.custom_fields + REPORT_SETUP -> R.string.custom } } 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 b63a205c..82b996e8 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 @@ -1,6 +1,7 @@ package net.pokeranalytics.android.model.realm import android.content.Context +import io.realm.Realm import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.Ignore @@ -8,15 +9,17 @@ import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.Criteria +import net.pokeranalytics.android.model.interfaces.Deletable +import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import java.util.* -open class ReportSetup : RealmObject(), RowRepresentable { +open class ReportSetup : RealmObject(), RowRepresentable, Deletable { @PrimaryKey - var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // The name of the report var name: String = "" @@ -60,8 +63,19 @@ open class ReportSetup : RealmObject(), RowRepresentable { stats = stats, criterias = criteria, filter = this.filter, - userGenerated = true + userGenerated = true, + reportSetupId = this.id ) } + // Deletable + + override fun isValidForDelete(realm: Realm): Boolean { + return true + } + + override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt index 8d776327..d99ec3b4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt @@ -1,35 +1,32 @@ 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.activity.components.ReportActivity import net.pokeranalytics.android.ui.fragment.report.ComparisonReportFragment -class ComparisonReportActivity : PokerAnalyticsActivity() { - - companion object { - - // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects - private var report: Report? = null - private var reportTitle: String = "" - - /** - * Default constructor - */ - fun newInstance(context: Context, report: Report, reportTitle: String) { - //parameters = GraphParameters(stat, group, report) - this.report = report - this.reportTitle = reportTitle - val intent = Intent(context, ComparisonReportActivity::class.java) - context.startActivity(intent) - } - - } +class ComparisonReportActivity : ReportActivity() { + +// companion object { +// +// // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects +// private var report: Report? = null +// private var reportTitle: String = "" +// +// /** +// * Default constructor +// */ +// fun newInstance(context: Context, report: Report, reportTitle: String) { +// //parameters = GraphParameters(stat, group, report) +// this.report = report +// this.reportTitle = reportTitle +// val intent = Intent(context, ComparisonReportActivity::class.java) +// context.startActivity(intent) +// } +// +// } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) 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 dd61d2fe..edbee7d5 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 @@ -3,10 +3,12 @@ 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.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.activity.components.ReportActivity import net.pokeranalytics.android.ui.fragment.report.ProgressReportFragment @@ -24,12 +26,19 @@ class ProgressReportActivity : PokerAnalyticsActivity() { * Default constructor */ fun newInstance(context: Context, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String? = null) { - parameters = StatisticsDetailsParameters(stat, report, title) + this.parameters = StatisticsDetailsParameters(stat, report, title) this.displayAggregationChoices = displayAggregationChoices val intent = Intent(context, ProgressReportActivity::class.java) context.startActivity(intent) } + fun newInstanceForResult(fragment: Fragment, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String? = null) { + this.parameters = StatisticsDetailsParameters(stat, report, title) + this.displayAggregationChoices = displayAggregationChoices + val intent = Intent(fragment.context, ProgressReportActivity::class.java) + fragment.startActivityForResult(intent, ReportActivity.DEFAULT_REQUEST_CODE) + } + } override fun onCreate(savedInstanceState: Bundle?) { 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 index adc357a7..4f0153d0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt @@ -1,32 +1,38 @@ 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.activity.components.ReportActivity 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) - } - - } +class TableReportActivity : ReportActivity() { + +// companion object { +// const val DEFAULT_REQUEST_CODE = 1000 +// +// // 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) +// } +// +// fun newInstanceForResult(fragment: Fragment, report: Report, reportTitle: String) { +// this.report = report +// this.reportTitle = reportTitle +// +// val intent = Intent(fragment.requireContext(), TableReportActivity::class.java) +// fragment.startActivityForResult(intent, DEFAULT_REQUEST_CODE) +// } +// +// } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) 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 new file mode 100644 index 00000000..c2f30e16 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/ReportActivity.kt @@ -0,0 +1,38 @@ +package net.pokeranalytics.android.ui.activity.components + +import android.content.Context +import android.content.Intent +import androidx.fragment.app.Fragment +import net.pokeranalytics.android.calculus.Report + +abstract class ReportActivity : PokerAnalyticsActivity() { + + companion object { + + const val DEFAULT_REQUEST_CODE = 999 + + // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects + var report: Report? = null + var reportTitle: String = "" + + /** + * Default constructor + */ + fun newInstance(context: Context, report: Report, reportTitle: String) { + this.report = report + this.reportTitle = reportTitle + val intent = Intent(context, this::class.java) + context.startActivity(intent) + } + + fun newInstanceForResult(fragment: Fragment, clazz: Class<*>, report: Report, reportTitle: String) { + this.report = report + this.reportTitle = reportTitle + + val intent = Intent(fragment.requireContext(), clazz) + fragment.startActivityForResult(intent, DEFAULT_REQUEST_CODE) + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt index 6ca073e9..b68674d7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt @@ -85,13 +85,14 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_DETAILS && resultCode == Activity.RESULT_OK) { - val needToDeleteItem = data?.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false) ?: false - if (needToDeleteItem) { + val itemToDeleteId = data?.getStringExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName) + itemToDeleteId?.let { id -> GlobalScope.launch(Dispatchers.Main) { delay(300) - deleteItem(bankrollAdapter, LiveData.BANKROLL.items(getRealm()), lastItemClickedId) + deleteItem(bankrollAdapter, LiveData.BANKROLL.items(getRealm()), id) } } + } else if (requestCode == REQUEST_CODE_CREATE && resultCode == Activity.RESULT_OK) { //TODO: Refresh bankrolls initData() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index 4c537216..8e713078 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -108,14 +108,15 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_DETAILS && resultCode == Activity.RESULT_OK) { - val needToDeleteItem = - data?.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false) ?: false - if (needToDeleteItem) { + + val itemToDeleteId = data?.getStringExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName) + itemToDeleteId?.let { id -> GlobalScope.launch(Dispatchers.Main) { delay(300) - deleteItem(dataListAdapter, items, lastItemClickedId) + deleteItem(dataListAdapter, LiveData.BANKROLL.items(getRealm()), id) } } + } } 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 8ad564ff..aa757a5c 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 @@ -13,21 +13,21 @@ import io.realm.RealmResults import kotlinx.android.synthetic.main.fragment_data_list.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.Criteria +import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.realm.ReportSetup -import net.pokeranalytics.android.ui.activity.ComparisonReportActivity -import net.pokeranalytics.android.ui.activity.ProgressReportActivity -import net.pokeranalytics.android.ui.activity.ReportCreationActivity -import net.pokeranalytics.android.ui.activity.TableReportActivity +import net.pokeranalytics.android.ui.activity.* +import net.pokeranalytics.android.ui.activity.components.ReportActivity 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.RealmFragment +import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable @@ -35,7 +35,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.ReportRow import timber.log.Timber import java.util.* -class ReportsFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { +class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { private lateinit var reportsAdapter: RowRepresentableAdapter private lateinit var reportSetups: RealmResults @@ -77,9 +77,17 @@ class ReportsFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRe this.launchReportWithOptions(options, options.getName(requireContext())) } ReportCreationActivity.options = null + } else if (requestCode == ReportActivity.DEFAULT_REQUEST_CODE && resultCode == Activity.RESULT_OK) { + val itemToDeleteId = data?.getStringExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName) + itemToDeleteId?.let { id -> + GlobalScope.launch(Dispatchers.Main) { + delay(300) + deleteItem(reportsAdapter, LiveData.REPORT_SETUP.items(getRealm()), id) + } + } } - } + } // Business @@ -188,13 +196,16 @@ class ReportsFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRe when (options.display) { Calculator.Options.Display.TABLE -> { - TableReportActivity.newInstance(requireContext(), report, reportName) + ReportActivity.newInstanceForResult(this@ReportsFragment, TableReportActivity::class.java, report, reportName) +// TableReportActivity.newInstanceForResult(this@ReportsFragment, report, reportName) +// TableReportActivity.newInstance(requireContext(), report, reportName) } Calculator.Options.Display.PROGRESS -> { - ProgressReportActivity.newInstance(requireContext(), options.stats.first(), report) + ProgressReportActivity.newInstanceForResult(this@ReportsFragment, options.stats.first(), report) } Calculator.Options.Display.COMPARISON -> { - ComparisonReportActivity.newInstance(requireContext(), report, reportName) +// ComparisonReportActivity.newInstance(requireContext(), report, reportName) + ReportActivity.newInstanceForResult(this@ReportsFragment, ComparisonReportActivity::class.java, report, reportName) } else -> { Timber.d("Report type not handled at the moment") diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt index f824b3d1..50bff679 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt @@ -2,8 +2,8 @@ package net.pokeranalytics.android.ui.fragment.components import android.os.Bundle import android.view.View +import android.view.ViewGroup import androidx.appcompat.app.AlertDialog -import androidx.coordinatorlayout.widget.CoordinatorLayout import com.google.android.material.snackbar.Snackbar import io.realm.RealmObject import net.pokeranalytics.android.R @@ -20,12 +20,12 @@ open class DeletableItemFragment : RealmFragment() { private var deletedItem: RealmObject? = null private var lastDeletedItemPosition: Int = 0 private var dataListAdapter: RowRepresentableAdapter? = null - private var coordinatorLayout: CoordinatorLayout? = null + private var mainLayout: ViewGroup? = null private var snackBar: Snackbar? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - this.coordinatorLayout = view.findViewById(R.id.coordinatorLayout) + this.mainLayout = view.findViewById(R.id.mainLayout) } override fun onPause() { @@ -82,7 +82,7 @@ open class DeletableItemFragment : RealmFragment() { */ private fun showUndoSnackBar() { val message = String.format(getString(R.string.data_deleted)) - this.coordinatorLayout?.let { view -> + this.mainLayout?.let { view -> snackBar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE) snackBar?.setAction(R.string.cancel) { getRealm().executeTransaction { realm -> @@ -93,6 +93,8 @@ open class DeletableItemFragment : RealmFragment() { } } snackBar?.show() + } ?: run { + throw IllegalStateException("mainLayout is not defined") } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt index fc1735fe..ee3d7b51 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt @@ -157,11 +157,11 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS /** * Init data */ - private fun initData() { + override fun initData() { defaultCurrency = UserDefaults.currency - if (!isUpdating) { + if (!deleteButtonShouldAppear) { bankroll.currency = net.pokeranalytics.android.model.realm.Currency() bankroll.currency?.code = defaultCurrency.currencyCode bankroll.currency?.rate = 1.0 diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt new file mode 100644 index 00000000..645112b9 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt @@ -0,0 +1,154 @@ +package net.pokeranalytics.android.ui.fragment.data + +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 androidx.appcompat.app.AlertDialog +import io.realm.RealmObject +import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.ConfigurationException +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.interfaces.Deletable +import net.pokeranalytics.android.model.interfaces.Savable +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus +import net.pokeranalytics.android.ui.activity.DataListActivity +import net.pokeranalytics.android.ui.activity.EditableDataActivity +import net.pokeranalytics.android.ui.fragment.components.RealmFragment + +open class DataManagerFragment : RealmFragment() { + + lateinit var item: RealmObject + + lateinit var liveDataType: LiveData + protected var primaryKey: String? = null + + var deleteButtonShouldAppear = false + set(value) { + field = value + this.updateMenuUI() + } + + var saveButtonShouldAppear = true + set(value) { + field = value + this.updateMenuUI() + } + + protected var dataType: Int? = null + + private var editableMenu: Menu? = null + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + } + + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + menu?.clear() + inflater?.inflate(R.menu.toolbar_editable_data, menu) + this.editableMenu = menu + updateMenuUI() + super.onCreateOptionsMenu(menu, inflater) + } + + /** + * Update menu UI + */ + private fun updateMenuUI() { + editableMenu?.findItem(R.id.delete)?.isVisible = this.deleteButtonShouldAppear + editableMenu?.findItem(R.id.save)?.isVisible = this.saveButtonShouldAppear + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item!!.itemId) { + R.id.save -> saveData() + R.id.delete -> deleteData() + } + return true + } + + /** + * Init data + */ + protected open fun initData() { + + this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) + + } + + /** + * Save data + */ + protected open fun saveData() { + + val savable = this.item + when (savable) { + is Savable -> { + val status = savable.getSaveValidityStatus(realm = this.getRealm()) + when (status) { + SaveValidityStatus.VALID -> { + this.getRealm().executeTransaction { + val managedItem = it.copyToRealmOrUpdate(this.item) + if (managedItem is Savable) { + val uniqueIdentifier = (managedItem as Savable).id + finishActivityWithResult(uniqueIdentifier) + } + + } + } + else -> { + val message = savable.getFailedSaveMessage(status) + val builder = AlertDialog.Builder(requireContext()) + .setMessage(message) + .setNegativeButton(R.string.ok, null) + builder.show() + } + } + + } else -> { + throw ConfigurationException("Save action called on un-Savable object") + } + } + + } + + /** + * Delete data + */ + protected open fun deleteData() { + + val deletable = this.item as Deletable + val realm = this.getRealm() + + if (deletable.isValidForDelete(realm)) { + val intent = Intent() + intent.putExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, deletable.id) + activity?.setResult(Activity.RESULT_OK, intent) + activity?.finish() + } else { + val status = deletable.getDeleteStatus(realm) + val message = deletable.getFailedDeleteMessage(status) + val builder = AlertDialog.Builder(requireContext()) + .setMessage(message) + .setNegativeButton(R.string.ok, null) + builder.show() + } + } + + /** + * Finish the activity with a result + */ + private fun finishActivityWithResult(uniqueIdentifier: String) { + val intent = Intent() + intent.putExtra(EditableDataActivity.IntentKey.DATA_TYPE.keyName, dataType) + intent.putExtra(EditableDataActivity.IntentKey.PRIMARY_KEY.keyName, uniqueIdentifier) + activity?.setResult(Activity.RESULT_OK, intent) + activity?.finish() + } + + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index 5d3d6148..fe285215 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -1,44 +1,29 @@ package net.pokeranalytics.android.ui.fragment.data -import android.app.Activity.RESULT_OK -import android.content.Intent import android.os.Bundle -import android.view.* -import androidx.appcompat.app.AlertDialog +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import io.realm.RealmObject import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_editable_data.view.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.exceptions.ConfigurationException import net.pokeranalytics.android.model.LiveData -import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Editable -import net.pokeranalytics.android.model.interfaces.Savable -import net.pokeranalytics.android.model.interfaces.SaveValidityStatus -import net.pokeranalytics.android.ui.activity.DataListActivity -import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate -import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.view.RowRepresentable -open class EditableDataFragment : RealmFragment(), RowRepresentableDelegate { +open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegate { lateinit var parentActivity: PokerAnalyticsActivity - lateinit var item: RealmObject - lateinit var liveDataType: LiveData lateinit var rowRepresentableAdapter: RowRepresentableAdapter - private var editableMenu: Menu? = null - private var dataType: Int? = null - private var primaryKey: String? = null - - var isUpdating = false var shouldOpenKeyboard = true override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -49,24 +34,15 @@ open class EditableDataFragment : RealmFragment(), RowRepresentableDelegate { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initUI() - initData() - } - - override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { - menu?.clear() - inflater?.inflate(R.menu.toolbar_editable_data, menu) - this.editableMenu = menu - updateMenuUI() - super.onCreateOptionsMenu(menu, inflater) } - - override fun onOptionsItemSelected(item: MenuItem?): Boolean { - when (item!!.itemId) { - R.id.save -> saveData() - R.id.delete -> deleteData() - } - return true + /** + * Set fragment data + */ + fun setData(dataType: Int, primaryKey: String?) { + this.dataType = dataType + this.liveDataType = LiveData.values()[dataType] + this.primaryKey = primaryKey } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { @@ -90,6 +66,16 @@ open class EditableDataFragment : RealmFragment(), RowRepresentableDelegate { parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) + val proxyItem: RealmObject? = this.liveDataType.getData(this.getRealm(), primaryKey) + proxyItem?.let { + //TODO: Localize + this.appBar.toolbar.title = "Update ${this.liveDataType.localizedTitle(requireContext()).toLowerCase().capitalize()}" + deleteButtonShouldAppear = true + } ?: run { + //TODO: Localize + this.appBar.toolbar.title = this.liveDataType.newEntityLocalizedTitle(requireContext()) + } + val viewManager = LinearLayoutManager(requireContext()) recyclerView.apply { @@ -105,121 +91,21 @@ open class EditableDataFragment : RealmFragment(), RowRepresentableDelegate { return this.item as RowRepresentableDataSource } - /** - * Init data - */ - private fun initData() { - if (this.dataType != null) { - val proxyItem: RealmObject? = this.liveDataType.getData(this.getRealm(), primaryKey) - proxyItem?.let { - //TODO: Localize - this.appBar.toolbar.title = "Update ${this.liveDataType.localizedTitle(this.parentActivity).toLowerCase().capitalize()}" - isUpdating = true - } ?: run { - //TODO: Localize - this.appBar.toolbar.title = this.liveDataType.newEntityLocalizedTitle(requireContext()) - } - this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) - - val dataSource = getDataSource() - this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) - this.recyclerView.adapter = rowRepresentableAdapter - - // When creating an object, open automatically the keyboard for the first row - if (!isUpdating && shouldOpenKeyboard) { - val row = dataSource.adapterRows()?.firstOrNull() - row?.let { - onRowSelected(0, it) - } - } - } - } + override fun initData() { + super.initData() - /** - * Update menu UI - */ - private fun updateMenuUI() { - editableMenu?.findItem(R.id.delete)?.isVisible = isUpdating - editableMenu?.findItem(R.id.save)?.isVisible = true - } + val dataSource = getDataSource() + this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) + this.recyclerView.adapter = rowRepresentableAdapter - /** - * Save data - */ - fun saveData() { - - val savable = this.item - when (savable) { - is Savable -> { - val status = savable.getSaveValidityStatus(realm = this.getRealm()) - when (status) { - SaveValidityStatus.VALID -> { - this.getRealm().executeTransaction { - val managedItem = it.copyToRealmOrUpdate(this.item) - if (managedItem is Savable) { - val uniqueIdentifier = (managedItem as Savable).id - finishActivityWithResult(uniqueIdentifier) - } - - } - } - else -> { - val message = savable.getFailedSaveMessage(status) - val builder = AlertDialog.Builder(requireContext()) - .setMessage(message) - .setNegativeButton(R.string.ok, null) - builder.show() - } - } - - } else -> { - throw ConfigurationException("Save action called on un-Savable object") + // When creating an object, open automatically the keyboard for the first row + if (!deleteButtonShouldAppear && shouldOpenKeyboard) { + val row = dataSource.adapterRows()?.firstOrNull() + row?.let { + onRowSelected(0, it) } } } - /** - * Delete data - */ - private fun deleteData() { - - val deletable = this.item as Deletable - val realm = this.getRealm() - - if (deletable.isValidForDelete(realm)) { - val intent = Intent() - intent.putExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, true) - activity?.setResult(RESULT_OK, intent) - activity?.finish() - } else { - val status = deletable.getDeleteStatus(realm) - val message = deletable.getFailedDeleteMessage(status) - val builder = AlertDialog.Builder(requireContext()) - .setMessage(message) - .setNegativeButton(R.string.ok, null) - builder.show() - } - } - - /** - * Finish the activity with a result - */ - private fun finishActivityWithResult(uniqueIdentifier: String) { - val intent = Intent() - intent.putExtra(EditableDataActivity.IntentKey.DATA_TYPE.keyName, dataType) - intent.putExtra(EditableDataActivity.IntentKey.PRIMARY_KEY.keyName, uniqueIdentifier) - activity?.setResult(RESULT_OK, intent) - activity?.finish() - } - - /** - * Set fragment data - */ - fun setData(dataType: Int, primaryKey: String?) { - this.dataType = dataType - this.liveDataType = LiveData.values()[dataType] - this.primaryKey = primaryKey - } - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt index 61679a7c..5622c30e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt @@ -40,7 +40,7 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS shouldOpenKeyboard = false locationActivated = parentActivity.hasLocationPermissionGranted() - if (isUpdating) { + if (deleteButtonShouldAppear) { // If we update a location, we set the switch to the correct value locationActivated = location.latitude != null && location.longitude != null 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 ce526f85..024a8aba 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 @@ -1,37 +1,41 @@ package net.pokeranalytics.android.ui.fragment.report import android.os.Bundle -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem import android.view.View +import android.widget.EditText +import androidx.appcompat.app.AlertDialog +import kotlinx.android.synthetic.main.fragment_progress_report.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Report +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.realm.ReportSetup import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity -import net.pokeranalytics.android.ui.fragment.components.RealmFragment +import net.pokeranalytics.android.ui.fragment.data.DataManagerFragment -abstract class AbstractReportFragment : RealmFragment() { +abstract class AbstractReportFragment : DataManagerFragment() { - protected lateinit var selectedReport: Report + private lateinit var _selectedReport: Report + + val selectedReport: Report + get() { + return this._selectedReport + } + + fun setReport(report: Report) { + this._selectedReport = report + this.primaryKey = report.options.reportSetupId + } protected var reportTitle: String? = null - private var editableMenu: Menu? = null protected lateinit var parentActivity: PokerAnalyticsActivity - 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 onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - override fun onOptionsItemSelected(item: MenuItem?): Boolean { - when (item!!.itemId) { - R.id.save -> this.saveReportRequest() - } - return true + this.liveDataType = LiveData.REPORT_SETUP + this.saveButtonShouldAppear = this._selectedReport.options.userGenerated + this.deleteButtonShouldAppear = (this.primaryKey != null) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -39,25 +43,57 @@ abstract class AbstractReportFragment : RealmFragment() { parentActivity = activity as PokerAnalyticsActivity } - /** - * 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)) - } - } + override fun saveData() { - private fun saveReportRequest() { + activity?.let { + val builder = AlertDialog.Builder(it) + // Get the layout inflater + val inflater = requireActivity().layoutInflater; + + // Inflate and set the layout for the dialog + // Pass null as the parent view because its going in the dialog layout + val view = inflater.inflate(R.layout.dialog_edit_text, null) + val nameEditText = view.findViewById(R.id.reportName) + builder.setView(view) + // Add action buttons + .setPositiveButton(R.string.save) { dialog, id -> + saveReport(nameEditText.text.toString()) + dialog.dismiss() + } + .setNegativeButton(R.string.cancel) { dialog, id -> + dialog.cancel() + } + + val dialog = builder.create() + dialog.show() + + } ?: throw IllegalStateException("Activity cannot be null") } private fun saveReport(name: String) { - getRealm().executeTransaction { - val report = this.selectedReport.options.reportSetup(name) - it.insert(report) + getRealm().executeTransaction { realm -> + + val rs = this.item as ReportSetup + + val options = this._selectedReport.options + rs.name = name + rs.display = options.display.ordinal + options.stats.forEach { + rs.statIds.add(it.uniqueIdentifier) + } + options.criterias.forEach { + rs.criteriaIds.add(it.uniqueIdentifier) + } + rs.filter = options.filter + + this.item = rs + + this.deleteButtonShouldAppear = true + toolbar.title = name + realm.copyToRealmOrUpdate(rs) } + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt index ab4bc327..c8d85401 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt @@ -18,7 +18,7 @@ class ComparisonReportFragment : AbstractReportFragment() { val fragment = ComparisonReportFragment() fragment.reportTitle = reportTitle report?.let { - fragment.selectedReport = it + fragment.setReport(it) } val bundle = Bundle() fragment.arguments = bundle @@ -27,15 +27,11 @@ class ComparisonReportFragment : AbstractReportFragment() { } } -// private var reports: MutableMap = hashMapOf() -// private var stat: Stat = Stat.NET_RESULT -// private var displayAggregationChoices: Boolean = true - /** * Set data */ fun setData(report: Report) { - this.selectedReport = report + this.setReport(report) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt index 2ac17009..40c3f66b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt @@ -66,7 +66,7 @@ class ProgressReportFragment : AbstractReportFragment() { */ fun setData(stat: Stat, report: Report, displayAggregationChoices: Boolean, title: String? = null) { this.stat = stat - this.selectedReport = report + this.setReport(report) this.displayAggregationChoices = displayAggregationChoices this.reportTitle = title diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt index 1e55c8a4..80eb7595 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt @@ -14,14 +14,11 @@ class TableReportFragment : AbstractReportFragment() { companion object { - /** - * Create new instance - */ fun newInstance(report: Report? = null, title: String? = null): TableReportFragment { val fragment = TableReportFragment() fragment.reportTitle = title report?.let { - fragment.selectedReport = it + fragment.setReport(it) } val bundle = Bundle() fragment.arguments = bundle diff --git a/app/src/main/res/layout/dialog_edit_text.xml b/app/src/main/res/layout/dialog_edit_text.xml new file mode 100644 index 00000000..3c1b82ec --- /dev/null +++ b/app/src/main/res/layout/dialog_edit_text.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/main/res/layout/fragment_bankroll.xml b/app/src/main/res/layout/fragment_bankroll.xml index 6c8114a4..b4340482 100644 --- a/app/src/main/res/layout/fragment_bankroll.xml +++ b/app/src/main/res/layout/fragment_bankroll.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/layout/fragment_data_list.xml b/app/src/main/res/layout/fragment_data_list.xml index 03650077..034a120d 100644 --- a/app/src/main/res/layout/fragment_data_list.xml +++ b/app/src/main/res/layout/fragment_data_list.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/layout/fragment_reports.xml b/app/src/main/res/layout/fragment_reports.xml index 461dce4c..751d27b1 100644 --- a/app/src/main/res/layout/fragment_reports.xml +++ b/app/src/main/res/layout/fragment_reports.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a66bc65f..294ae6ba 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,6 +30,7 @@ Select a filter or launch report Launch Report Progress + Save Report Address Naming suggestions diff --git a/build.gradle b/build.gradle index 8a1c4fe4..0340e807 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' + classpath 'com.android.tools.build:gradle:3.4.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'io.realm:realm-gradle-plugin:5.8.0' classpath 'com.google.gms:google-services:4.2.0' From 6124358f0ce86ce60cf678ae3e9f4b8a7637271c Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 16 May 2019 15:37:02 +0200 Subject: [PATCH 2/7] Factorize code + cleanup --- .../ui/activity/ProgressReportActivity.kt | 7 ++-- .../ui/activity/TableReportActivity.kt | 37 +++---------------- .../ui/fragment/CalendarDetailsFragment.kt | 10 +++-- .../android/ui/fragment/ReportsFragment.kt | 4 +- .../fragment/report/AbstractReportFragment.kt | 11 ++++++ .../report/ComparisonReportFragment.kt | 18 ++------- .../report/ComposableTableReportFragment.kt | 3 +- .../fragment/report/ProgressReportFragment.kt | 10 +---- .../ui/fragment/report/TableReportFragment.kt | 16 +------- 9 files changed, 38 insertions(+), 78 deletions(-) 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 edbee7d5..a1896f2d 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 @@ -12,7 +12,7 @@ import net.pokeranalytics.android.ui.activity.components.ReportActivity import net.pokeranalytics.android.ui.fragment.report.ProgressReportFragment -class StatisticsDetailsParameters(var stat: Stat, var report: Report, var title: String? = null) +class StatisticsDetailsParameters(var stat: Stat, var report: Report, var title: String) class ProgressReportActivity : PokerAnalyticsActivity() { @@ -25,14 +25,14 @@ class ProgressReportActivity : PokerAnalyticsActivity() { /** * Default constructor */ - fun newInstance(context: Context, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String? = null) { + fun newInstance(context: Context, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String) { this.parameters = StatisticsDetailsParameters(stat, report, title) this.displayAggregationChoices = displayAggregationChoices val intent = Intent(context, ProgressReportActivity::class.java) context.startActivity(intent) } - fun newInstanceForResult(fragment: Fragment, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String? = null) { + fun newInstanceForResult(fragment: Fragment, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String) { this.parameters = StatisticsDetailsParameters(stat, report, title) this.displayAggregationChoices = displayAggregationChoices val intent = Intent(fragment.context, ProgressReportActivity::class.java) @@ -58,6 +58,7 @@ class ProgressReportActivity : PokerAnalyticsActivity() { fragmentTransaction.commit() parameters?.let { + statisticDetailsFragment.setData(it.stat, it.report, displayAggregationChoices, it.title) parameters = null } 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 index 4f0153d0..56351782 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt @@ -7,33 +7,6 @@ import net.pokeranalytics.android.ui.fragment.report.TableReportFragment class TableReportActivity : ReportActivity() { -// companion object { -// const val DEFAULT_REQUEST_CODE = 1000 -// -// // 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) -// } -// -// fun newInstanceForResult(fragment: Fragment, report: Report, reportTitle: String) { -// this.report = report -// this.reportTitle = reportTitle -// -// val intent = Intent(fragment.requireContext(), TableReportActivity::class.java) -// fragment.startActivityForResult(intent, DEFAULT_REQUEST_CODE) -// } -// -// } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_table_report) @@ -45,10 +18,12 @@ class TableReportActivity : ReportActivity() { */ private fun initUI() { - val fragmentTransaction = supportFragmentManager.beginTransaction() - val fragment = TableReportFragment.newInstance(report, reportTitle) - fragmentTransaction.add(R.id.reportDetailsContainer, fragment) - fragmentTransaction.commit() + report?.let { + val fragmentTransaction = supportFragmentManager.beginTransaction() + val fragment = TableReportFragment.newInstance(it, reportTitle) + fragmentTransaction.add(R.id.reportDetailsContainer, fragment) + fragmentTransaction.commit() + } report = null } 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 62b9ff3f..525f9a7f 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 @@ -150,10 +150,12 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (row) { is GraphRow -> { - row.report?.let { report -> - row.stat?.let { stat -> - ProgressReportActivity.newInstance(requireContext(), stat, report, false, row.title) - } + val report = row.report + val stat = row.stat + + if (report != null && stat != null) { + val title = row.title ?: stat.localizedTitle(requireContext()) + ProgressReportActivity.newInstance(requireContext(), stat, report, false, title) } } } 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 aa757a5c..88f39c7f 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 @@ -201,7 +201,9 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc // TableReportActivity.newInstance(requireContext(), report, reportName) } Calculator.Options.Display.PROGRESS -> { - ProgressReportActivity.newInstanceForResult(this@ReportsFragment, options.stats.first(), report) + val stat = options.stats.first() + val title = stat.localizedTitle(requireContext()) + ProgressReportActivity.newInstanceForResult(this@ReportsFragment, stat, report, title = title) } Calculator.Options.Display.COMPARISON -> { // ComparisonReportActivity.newInstance(requireContext(), report, reportName) 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 024a8aba..0b3b62a7 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 @@ -40,7 +40,18 @@ abstract class AbstractReportFragment : DataManagerFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + parentActivity = activity as PokerAnalyticsActivity + + // Avoid a bug during setting the titleResId + toolbar.title = "" + + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) + + toolbar.title = reportTitle + } override fun saveData() { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt index c8d85401..0b4b3c14 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.google.android.material.tabs.TabLayout -import kotlinx.android.synthetic.main.fragment_progress_report.toolbar import kotlinx.android.synthetic.main.fragment_report_details.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Report @@ -14,16 +13,14 @@ import net.pokeranalytics.android.ui.adapter.ReportPagerAdapter class ComparisonReportFragment : AbstractReportFragment() { companion object { - fun newInstance(report: Report?, reportTitle: String): ComparisonReportFragment { + + fun newInstance(report: Report, reportTitle: String): ComparisonReportFragment { val fragment = ComparisonReportFragment() fragment.reportTitle = reportTitle - report?.let { - fragment.setReport(it) - } + fragment.setReport(report) val bundle = Bundle() fragment.arguments = bundle return fragment - } } @@ -49,15 +46,6 @@ class ComparisonReportFragment : AbstractReportFragment() { */ private fun initUI() { - // Avoid a bug during setting the titleResId - toolbar.title = "" - - parentActivity.setSupportActionBar(toolbar) - parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - setHasOptionsMenu(true) - - toolbar.title = reportTitle - val reportPagerAdapter = ReportPagerAdapter(requireContext(), parentActivity.supportFragmentManager, selectedReport) viewPager.adapter = reportPagerAdapter viewPager.offscreenPageLimit = 3 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 9fc6c7a8..46f121f0 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 @@ -212,7 +212,8 @@ open class ComposableTableReportFragment : RealmFragment(), StaticRowRepresentab if (!isDetached) { hideLoader() report?.let { - ProgressReportActivity.newInstance(requireContext(), stat, it) + val title = stat.localizedTitle(requireContext()) + ProgressReportActivity.newInstance(requireContext(), stat, it, title = title) } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt index 40c3f66b..419a9262 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt @@ -64,7 +64,7 @@ class ProgressReportFragment : AbstractReportFragment() { /** * Set data */ - fun setData(stat: Stat, report: Report, displayAggregationChoices: Boolean, title: String? = null) { + fun setData(stat: Stat, report: Report, displayAggregationChoices: Boolean, title: String) { this.stat = stat this.setReport(report) this.displayAggregationChoices = displayAggregationChoices @@ -80,13 +80,6 @@ class ProgressReportFragment : AbstractReportFragment() { */ private fun initUI() { - // Avoid a bug during setting the titleResId - toolbar.title = "" - - parentActivity.setSupportActionBar(toolbar) - parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - setHasOptionsMenu(true) - val fragmentManager = parentActivity.supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() graphFragment = GraphFragment() @@ -100,7 +93,6 @@ class ProgressReportFragment : AbstractReportFragment() { } } - toolbar.title = this.reportTitle ?: stat.localizedTitle(requireContext()) val aggregationTypes = stat.aggregationTypes aggregationTypes.forEachIndexed { index, type -> diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt index 80eb7595..77cc36ba 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/TableReportFragment.kt @@ -4,7 +4,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import kotlinx.android.synthetic.main.fragment_progress_report.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Report @@ -14,12 +13,10 @@ class TableReportFragment : AbstractReportFragment() { companion object { - fun newInstance(report: Report? = null, title: String? = null): TableReportFragment { + fun newInstance(report: Report, title: String): TableReportFragment { val fragment = TableReportFragment() fragment.reportTitle = title - report?.let { - fragment.setReport(it) - } + fragment.setReport(report) val bundle = Bundle() fragment.arguments = bundle return fragment @@ -38,15 +35,6 @@ class TableReportFragment : AbstractReportFragment() { private fun initUI() { - // Avoid a bug during setting the titleResId - toolbar.title = "" - - parentActivity.setSupportActionBar(toolbar) - parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - setHasOptionsMenu(true) - - toolbar.title = reportTitle - val fragmentTransaction = parentActivity.supportFragmentManager.beginTransaction() val fragment = ComposableTableReportFragment.newInstance(this.selectedReport) fragmentTransaction.add(R.id.tableReportContainer, fragment) From c935df892fc73d2933bc7603e408497024e6f203 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 16 May 2019 16:17:34 +0200 Subject: [PATCH 3/7] Factorize and cleanup code --- .../android/calculus/Calculator.kt | 23 +++++++++++-- .../ui/activity/ComparisonReportActivity.kt | 32 +++++-------------- .../ui/activity/ProgressReportActivity.kt | 26 ++++++--------- .../ui/activity/TableReportActivity.kt | 11 +++++-- .../ui/activity/components/ReportActivity.kt | 23 ++++++------- .../ui/fragment/CalendarDetailsFragment.kt | 2 +- .../android/ui/fragment/ReportsFragment.kt | 24 ++------------ .../report/ComposableTableReportFragment.kt | 7 ++-- .../fragment/report/ProgressReportFragment.kt | 2 +- 9 files changed, 69 insertions(+), 81 deletions(-) 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 0d1960d9..4801aed6 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -12,6 +12,9 @@ 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.* @@ -84,6 +87,19 @@ class Calculator { } } + val activityClass: Class<*> + get() { + return when (this) { + TABLE -> TableReportActivity::class.java + PROGRESS -> ProgressReportActivity::class.java + COMPARISON -> ComparisonReportActivity::class.java + else -> throw IllegalStateException("undefined activity for report display") +// MAP -> R.string.map +// POLYNOMIAL -> null + + } + } + } /** @@ -172,8 +188,11 @@ class Calculator { stats: List? = null ): Report { - val options = Options(evolutionValues = Options.EvolutionValues.STANDARD, aggregationType = aggregationType) - options.stats = listOf(stat) + val options = Options(display = Options.Display.PROGRESS, + evolutionValues = Options.EvolutionValues.STANDARD, + stats = listOf(stat), + aggregationType = aggregationType) + if (aggregationType == AggregationType.DURATION) { options.evolutionValues = Options.EvolutionValues.TIMED } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt index d99ec3b4..8dda891b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonReportActivity.kt @@ -6,28 +6,8 @@ import net.pokeranalytics.android.ui.activity.components.ReportActivity import net.pokeranalytics.android.ui.fragment.report.ComparisonReportFragment - class ComparisonReportActivity : ReportActivity() { -// companion object { -// -// // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects -// private var report: Report? = null -// private var reportTitle: String = "" -// -// /** -// * Default constructor -// */ -// fun newInstance(context: Context, report: Report, reportTitle: String) { -// //parameters = GraphParameters(stat, group, report) -// this.report = report -// this.reportTitle = reportTitle -// val intent = Intent(context, ComparisonReportActivity::class.java) -// context.startActivity(intent) -// } -// -// } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_report_details) @@ -39,14 +19,18 @@ class ComparisonReportActivity : ReportActivity() { */ private fun initUI() { - report?.let { + parameters?.let { + + val report = it.report + val title = it.title + val fragmentTransaction = supportFragmentManager.beginTransaction() - val reportDetailsFragment = ComparisonReportFragment.newInstance(it, reportTitle) + val reportDetailsFragment = ComparisonReportFragment.newInstance(report, title) fragmentTransaction.add(R.id.reportDetailsContainer, reportDetailsFragment) fragmentTransaction.commit() - - report = null } + parameters = null + } } 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 a1896f2d..d11984a4 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 @@ -7,36 +7,29 @@ import androidx.fragment.app.Fragment import net.pokeranalytics.android.R 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.activity.components.ReportActivity +import net.pokeranalytics.android.ui.activity.components.ReportParameters import net.pokeranalytics.android.ui.fragment.report.ProgressReportFragment - -class StatisticsDetailsParameters(var stat: Stat, var report: Report, var title: String) - -class ProgressReportActivity : PokerAnalyticsActivity() { +class ProgressReportActivity : ReportActivity() { companion object { // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects - private var parameters: StatisticsDetailsParameters? = null - private var displayAggregationChoices: Boolean = true /** * Default constructor */ - fun newInstance(context: Context, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String) { - this.parameters = StatisticsDetailsParameters(stat, report, title) - this.displayAggregationChoices = displayAggregationChoices + fun newInstance(context: Context, report: Report, title: String, stat: Stat? = null, displayAggregationChoices: Boolean = true) { + parameters = ReportParameters(report, title, stat, showAggregationChoices = displayAggregationChoices) val intent = Intent(context, ProgressReportActivity::class.java) context.startActivity(intent) } - fun newInstanceForResult(fragment: Fragment, stat: Stat, report: Report, displayAggregationChoices: Boolean = true, title: String) { - this.parameters = StatisticsDetailsParameters(stat, report, title) - this.displayAggregationChoices = displayAggregationChoices + fun newInstanceForResult(fragment: Fragment, report: Report, title: String, stat: Stat? = null, displayAggregationChoices: Boolean = true) { + parameters = ReportParameters(report, title, stat, showAggregationChoices = displayAggregationChoices) val intent = Intent(fragment.context, ProgressReportActivity::class.java) - fragment.startActivityForResult(intent, ReportActivity.DEFAULT_REQUEST_CODE) + fragment.startActivityForResult(intent, DEFAULT_REQUEST_CODE) } } @@ -58,8 +51,9 @@ class ProgressReportActivity : PokerAnalyticsActivity() { fragmentTransaction.commit() parameters?.let { - - statisticDetailsFragment.setData(it.stat, it.report, displayAggregationChoices, it.title) + val report = it.report + val stat = it.stat ?: report.options.stats.first() + statisticDetailsFragment.setData(report, stat, it.showAggregationChoices, it.title) parameters = null } 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 index 56351782..96bc4ddd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/TableReportActivity.kt @@ -18,13 +18,18 @@ class TableReportActivity : ReportActivity() { */ private fun initUI() { - report?.let { + parameters?.let { + + val report = it.report + val title = it.title + val fragmentTransaction = supportFragmentManager.beginTransaction() - val fragment = TableReportFragment.newInstance(it, reportTitle) + val fragment = TableReportFragment.newInstance(report, title) fragmentTransaction.add(R.id.reportDetailsContainer, fragment) fragmentTransaction.commit() } - report = null + parameters = null + } } \ No newline at end of file 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 c2f30e16..6d2ea1be 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 @@ -4,6 +4,9 @@ import android.content.Context import android.content.Intent import androidx.fragment.app.Fragment import net.pokeranalytics.android.calculus.Report +import net.pokeranalytics.android.calculus.Stat + +class ReportParameters(var report: Report, var title: String, var stat: Stat? = null, var showAggregationChoices: Boolean = true) abstract class ReportActivity : PokerAnalyticsActivity() { @@ -12,24 +15,22 @@ abstract class ReportActivity : PokerAnalyticsActivity() { const val DEFAULT_REQUEST_CODE = 999 // Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects - var report: Report? = null - var reportTitle: String = "" + var parameters: ReportParameters? = null /** * Default constructor */ - fun newInstance(context: Context, report: Report, reportTitle: String) { - this.report = report - this.reportTitle = reportTitle - val intent = Intent(context, this::class.java) + fun newInstance(context: Context, report: Report, reportTitle: String, stat: Stat? = null) { + val options = report.options + this.parameters = ReportParameters(report, reportTitle, stat) + val intent = Intent(context, options.display.activityClass) context.startActivity(intent) } - fun newInstanceForResult(fragment: Fragment, clazz: Class<*>, report: Report, reportTitle: String) { - this.report = report - this.reportTitle = reportTitle - - val intent = Intent(fragment.requireContext(), clazz) + fun newInstanceForResult(fragment: Fragment, report: Report, reportTitle: String, stat: Stat? = null) { + val options = report.options + this.parameters = ReportParameters(report, reportTitle, stat) + val intent = Intent(fragment.requireContext(), options.display.activityClass) fragment.startActivityForResult(intent, DEFAULT_REQUEST_CODE) } 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 525f9a7f..f7cd4acc 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 @@ -155,7 +155,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable if (report != null && stat != null) { val title = row.title ?: stat.localizedTitle(requireContext()) - ProgressReportActivity.newInstance(requireContext(), stat, report, false, title) + ProgressReportActivity.newInstance(requireContext(), report, title, stat, false) } } } 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 88f39c7f..dca332b3 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 @@ -22,7 +22,8 @@ import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.realm.ReportSetup -import net.pokeranalytics.android.ui.activity.* +import net.pokeranalytics.android.ui.activity.DataListActivity +import net.pokeranalytics.android.ui.activity.ReportCreationActivity import net.pokeranalytics.android.ui.activity.components.ReportActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -193,26 +194,7 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc launch(Dispatchers.Main) { if (!isDetached) { hideLoader() - - when (options.display) { - Calculator.Options.Display.TABLE -> { - ReportActivity.newInstanceForResult(this@ReportsFragment, TableReportActivity::class.java, report, reportName) -// TableReportActivity.newInstanceForResult(this@ReportsFragment, report, reportName) -// TableReportActivity.newInstance(requireContext(), report, reportName) - } - Calculator.Options.Display.PROGRESS -> { - val stat = options.stats.first() - val title = stat.localizedTitle(requireContext()) - ProgressReportActivity.newInstanceForResult(this@ReportsFragment, stat, report, title = title) - } - Calculator.Options.Display.COMPARISON -> { -// ComparisonReportActivity.newInstance(requireContext(), report, reportName) - ReportActivity.newInstanceForResult(this@ReportsFragment, ComparisonReportActivity::class.java, report, reportName) - } - else -> { - Timber.d("Report type not handled at the moment") - } - } + ReportActivity.newInstanceForResult(this@ReportsFragment, report, reportName) } } realm.close() 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 46f121f0..734ed4b2 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,7 +12,7 @@ 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.ProgressReportActivity +import net.pokeranalytics.android.ui.activity.components.ReportActivity import net.pokeranalytics.android.ui.adapter.DisplayDescriptor import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -213,7 +213,10 @@ open class ComposableTableReportFragment : RealmFragment(), StaticRowRepresentab hideLoader() report?.let { val title = stat.localizedTitle(requireContext()) - ProgressReportActivity.newInstance(requireContext(), stat, it, title = title) + + ReportActivity.newInstance(requireContext(), it, title, stat) + +// ProgressReportActivity.newInstance(requireContext(), stat, it, title = title) } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt index 419a9262..b797d56a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt @@ -64,7 +64,7 @@ class ProgressReportFragment : AbstractReportFragment() { /** * Set data */ - fun setData(stat: Stat, report: Report, displayAggregationChoices: Boolean, title: String) { + fun setData(report: Report, stat: Stat, displayAggregationChoices: Boolean, title: String) { this.stat = stat this.setReport(report) this.displayAggregationChoices = displayAggregationChoices From b89ff5a51939f6bebfdffc5224d093369408b7e3 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 16 May 2019 16:30:56 +0200 Subject: [PATCH 4/7] Subscription pager takes all width --- app/src/main/res/layout/fragment_screen_slide_page.xml | 4 +++- app/src/main/res/layout/fragment_subscription.xml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/fragment_screen_slide_page.xml b/app/src/main/res/layout/fragment_screen_slide_page.xml index d0aec965..8cb9f677 100644 --- a/app/src/main/res/layout/fragment_screen_slide_page.xml +++ b/app/src/main/res/layout/fragment_screen_slide_page.xml @@ -7,11 +7,13 @@ android:layout_height="match_parent"> Date: Thu, 16 May 2019 16:33:44 +0200 Subject: [PATCH 5/7] Use AppCompat element --- app/src/main/res/layout/fragment_screen_slide_page.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_screen_slide_page.xml b/app/src/main/res/layout/fragment_screen_slide_page.xml index 8cb9f677..e207b4b7 100644 --- a/app/src/main/res/layout/fragment_screen_slide_page.xml +++ b/app/src/main/res/layout/fragment_screen_slide_page.xml @@ -22,7 +22,7 @@ android:layout_height="wrap_content" tools:text="Title"/> - Date: Thu, 16 May 2019 16:43:20 +0200 Subject: [PATCH 6/7] Fixes regression on data deletion --- .../net/pokeranalytics/android/ui/fragment/DataListFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index 8e713078..fa4d9203 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -113,7 +113,7 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource itemToDeleteId?.let { id -> GlobalScope.launch(Dispatchers.Main) { delay(300) - deleteItem(dataListAdapter, LiveData.BANKROLL.items(getRealm()), id) + deleteItem(dataListAdapter, items, id) } } From 6910745e5b563f77de57b7eacb20e7f3b836de5f Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 17 May 2019 11:25:24 +0200 Subject: [PATCH 7/7] Realm sorted extensions added + refactoring + cleanup --- .../pokeranalytics/android/model/LiveData.kt | 91 ++----------------- .../android/model/realm/Filter.kt | 5 +- .../android/model/realm/Session.kt | 12 +-- .../ui/activity/EditableDataActivity.kt | 5 +- .../ui/fragment/BankrollDetailsFragment.kt | 2 +- .../android/ui/fragment/BankrollFragment.kt | 30 +++--- .../android/ui/fragment/DataListFragment.kt | 70 ++++++-------- .../android/ui/fragment/FeedFragment.kt | 3 +- .../android/ui/fragment/ReportsFragment.kt | 18 ++-- .../android/ui/fragment/SessionFragment.kt | 2 +- .../components/DeletableItemFragment.kt | 44 +++++++-- .../bottomsheet/BottomSheetFragment.kt | 50 ++++------ .../BottomSheetMultiSelectionFragment.kt | 4 +- .../ui/fragment/data/DataManagerFragment.kt | 4 +- .../ui/fragment/data/EditableDataFragment.kt | 4 +- .../fragment/data/TransactionDataFragment.kt | 8 +- .../android/util/RealmExtensions.kt | 71 +++++++++++++++ 17 files changed, 219 insertions(+), 204 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/util/RealmExtensions.kt diff --git a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt index 8209cd7c..c4863212 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -2,13 +2,9 @@ package net.pokeranalytics.android.model import android.content.Context import io.realm.Realm -import io.realm.RealmObject -import io.realm.RealmResults -import io.realm.Sort -import io.realm.kotlin.where +import io.realm.RealmModel import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.interfaces.CountableUsage -import net.pokeranalytics.android.model.interfaces.Deletable +import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.ui.view.Localizable @@ -27,74 +23,7 @@ enum class LiveData : Localizable { CUSTOM_FIELD, REPORT_SETUP; - fun items(realm: Realm, fieldName: String? = null, sortOrder: Sort? = null): RealmResults<*> { - val results = realm.where(this.relatedEntity).findAll().sort(fieldName ?: this.sortingFieldName, sortOrder ?: this.sorting) - - if (results.size > 0) { - if (results.first() is CountableUsage) { - this.setUseCount(realm, results) - return results.sort("useCount", Sort.DESCENDING) - } - } - return results - } - - fun setUseCount(realm: Realm, realmResults: RealmResults<*>) { - realm.executeTransaction { - realmResults.forEach { countableUsage -> - - when (this) { - TOURNAMENT_FEATURE -> { - (countableUsage as CountableUsage).useCount = it.where().contains( - "tournamentFeatures.id", - countableUsage.id - ).count().toInt() - } - else -> { - (countableUsage as CountableUsage).useCount = it.where().equalTo( - "${relatedEntity.simpleName.decapitalize()}.id", - countableUsage.id - ).count().toInt() - } - } - - } - } - } - - /** - * Return a copy of a RealmResults - */ - fun itemsArray(realm: Realm, fieldName: String? = null, sortOrder: Sort? = null): ArrayList<*> { - val results: ArrayList = ArrayList() - results.addAll( - realm.copyFromRealm( - realm.where(this.relatedEntity).findAll().sort( - fieldName ?: this.sortingFieldName, sortOrder ?: this.sorting - ) - ) - ) - - return results - } - - private val sortingFieldName: String - get() { - return when (this) { - TRANSACTION -> "date" - else -> "name" - } - } - - private val sorting: Sort - get() { - return when (this) { - TRANSACTION -> Sort.DESCENDING - else -> Sort.ASCENDING - } - } - - private val relatedEntity: Class + val relatedEntity: Class get() { return when (this) { BANKROLL -> Bankroll::class.java @@ -110,12 +39,8 @@ enum class LiveData : Localizable { } } - fun deleteData(realm: Realm, data: Deletable) { - realm.where(this.relatedEntity).equalTo("id", data.id).findAll().deleteAllFromRealm() - } - - fun updateOrCreate(realm: Realm, primaryKey: String?): RealmObject { - val proxyItem: RealmObject? = this.getData(realm, primaryKey) + fun updateOrCreate(realm: Realm, primaryKey: String?): RealmModel { + val proxyItem: Identifiable? = this.getData(realm, primaryKey) proxyItem?.let { return realm.copyFromRealm(it) } ?: run { @@ -123,12 +48,12 @@ enum class LiveData : Localizable { } } - fun newEntity(): RealmObject { + private fun newEntity(): RealmModel{ return this.relatedEntity.newInstance() } - fun getData(realm: Realm, primaryKey: String?): RealmObject? { - var proxyItem: RealmObject? = null + fun getData(realm: Realm, primaryKey: String?): Identifiable? { + var proxyItem: Identifiable? = null primaryKey?.let { val t = realm.where(this.relatedEntity).equalTo("id", it).findFirst() t?.let { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index 8baf5a00..ce6d346f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -7,6 +7,7 @@ import io.realm.kotlin.where import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import java.util.* @@ -16,7 +17,7 @@ import java.util.* * It contains a list of [FilterCondition] describing the complete query to launch * The [Filter] is working closely with a [Filterable] interface providing the entity we want the query being launched on */ -open class Filter : RealmObject(), RowRepresentable { +open class Filter : RealmObject(), RowRepresentable, Identifiable { companion object { @@ -47,7 +48,7 @@ open class Filter : RealmObject(), RowRepresentable { } @PrimaryKey - var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // the queryWith name var name: String = "" diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 56d5b759..8b257246 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -18,7 +18,6 @@ import net.pokeranalytics.android.calculus.StatFormattingException import net.pokeranalytics.android.calculus.TextFormat import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.model.Limit -import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState @@ -39,6 +38,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.extensions.* +import net.pokeranalytics.android.util.sorted import java.text.DateFormat import java.util.* import java.util.Currency @@ -748,32 +748,32 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat SessionRow.BANKROLL -> row.editingDescriptors( mapOf( "defaultValue" to this.bankroll, - "data" to LiveData.BANKROLL.items(realm) + "data" to realm.sorted() // LiveData.BANKROLL.items(realm) ) ) SessionRow.GAME -> row.editingDescriptors( mapOf( "limit" to this.limit, "defaultValue" to this.game, - "data" to LiveData.GAME.items(realm) + "data" to realm.sorted() //LiveData.GAME.items(realm) ) ) SessionRow.LOCATION -> row.editingDescriptors( mapOf( "defaultValue" to this.location, - "data" to LiveData.LOCATION.items(realm) + "data" to realm.sorted() // LiveData.LOCATION.items(realm) ) ) SessionRow.TOURNAMENT_FEATURE -> row.editingDescriptors( mapOf( "defaultValue" to this.tournamentFeatures, - "data" to LiveData.TOURNAMENT_FEATURE.items(realm) + "data" to realm.sorted() //LiveData.TOURNAMENT_FEATURE.items(realm) ) ) SessionRow.TOURNAMENT_NAME -> row.editingDescriptors( mapOf( "defaultValue" to this.tournamentName, - "data" to LiveData.TOURNAMENT_NAME.items(realm) + "data" to realm.sorted() //LiveData.TOURNAMENT_NAME.items(realm) ) ) SessionRow.TOURNAMENT_TYPE -> row.editingDescriptors( diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt index b3ecc525..a8af3f8a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt @@ -10,6 +10,7 @@ import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.data.* class EditableDataActivity : PokerAnalyticsActivity() { + enum class IntentKey(val keyName: String) { DATA_TYPE("DATA_TYPE"), PRIMARY_KEY("PRIMARY_KEY"); @@ -31,9 +32,9 @@ class EditableDataActivity : PokerAnalyticsActivity() { /** * Create a new instance for result */ - fun newInstanceForResult(fragment: Fragment, dataType: Int, primaryKey: String? = null, requestCode: Int) { + fun newInstanceForResult(fragment: Fragment, dataType: LiveData, primaryKey: String? = null, requestCode: Int) { val intent = Intent(fragment.requireContext(), EditableDataActivity::class.java) - intent.putExtra(IntentKey.DATA_TYPE.keyName, dataType) + intent.putExtra(IntentKey.DATA_TYPE.keyName, dataType.ordinal) primaryKey?.let { intent.putExtra(IntentKey.PRIMARY_KEY.keyName, it) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt index 7d0e195c..08fde005 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt @@ -170,7 +170,7 @@ class BankrollDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable * Open Bankroll edit activity */ private fun editBankroll() { - EditableDataActivity.newInstanceForResult(this, LiveData.BANKROLL.ordinal, bankrollReport.setup.bankroll?.id, REQUEST_CODE_EDIT) + EditableDataActivity.newInstanceForResult(this, LiveData.BANKROLL, bankrollReport.setup.bankroll?.id, REQUEST_CODE_EDIT) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt index b68674d7..dcd74dff 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt @@ -37,6 +37,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.GraphRow +import net.pokeranalytics.android.util.sorted import timber.log.Timber import java.util.* import kotlin.collections.ArrayList @@ -60,7 +61,7 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour } private lateinit var parentActivity: PokerAnalyticsActivity - private lateinit var bankrollAdapter: RowRepresentableAdapter +// private lateinit var dataListAdapter: RowRepresentableAdapter private var rows: ArrayList = ArrayList() private var bankrollReportForRow: HashMap = HashMap() @@ -68,6 +69,12 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour private var lastItemClickedId: String = "" private var deletedRow: RowRepresentable? = null + private lateinit var bankrolls: RealmResults + + override fun deletableItems() : List { + return this.bankrolls + } + // Life Cycle override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -89,7 +96,7 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour itemToDeleteId?.let { id -> GlobalScope.launch(Dispatchers.Main) { delay(300) - deleteItem(bankrollAdapter, LiveData.BANKROLL.items(getRealm()), id) + deleteItem(dataListAdapter, bankrolls, id) } } @@ -129,6 +136,9 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour */ private fun initData() { + val realm = getRealm() + this.bankrolls = realm.sorted() + rows.clear() bankrollReportForRow.clear() @@ -153,7 +163,7 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour Timber.d("initData: ${System.currentTimeMillis() - startDate.time}ms") - val bankrolls = LiveData.BANKROLL.items(getRealm()) as RealmResults +// val bankrolls = LiveData.BANKROLL.items(getRealm()) as RealmResults bankrolls.forEach { bankroll -> val bankrollReportSetup = BankrollReportSetup(bankroll) @@ -168,7 +178,7 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour } if (!isDetached) { - bankrollAdapter.notifyDataSetChanged() + dataListAdapter.notifyDataSetChanged() } } } @@ -186,20 +196,18 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) - bankrollAdapter = RowRepresentableAdapter(this, this) + dataListAdapter = RowRepresentableAdapter(this, this) val viewManager = LinearLayoutManager(requireContext()) recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager - adapter = bankrollAdapter + adapter = dataListAdapter } addButton.setOnClickListener { - LiveData.BANKROLL?.let { - EditableDataActivity.newInstanceForResult(this@BankrollFragment, dataType = it.ordinal, primaryKey = null, requestCode = REQUEST_CODE_CREATE) - } + EditableDataActivity.newInstanceForResult(this@BankrollFragment, dataType = LiveData.BANKROLL, primaryKey = null, requestCode = REQUEST_CODE_CREATE) } } @@ -207,7 +215,7 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour lastItemClickedPosition = rows.indexOfFirst { if (it is Identifiable) it.id == lastItemClickedId else false } deletedRow = rows.find { if (it is Identifiable) it.id == lastItemClickedId else false } rows.removeAt(lastItemClickedPosition) - bankrollAdapter.notifyItemRemoved(lastItemClickedPosition) + dataListAdapter.notifyItemRemoved(lastItemClickedPosition) } override fun updateUIAfterUndoDeletion(newItem: RealmObject) { @@ -221,7 +229,7 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour bankrollReportForRow[row] = bankrollReport rows.add(lastItemClickedPosition, row) - bankrollAdapter.notifyItemInserted(lastItemClickedPosition) + dataListAdapter.notifyItemInserted(lastItemClickedPosition) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index fa4d9203..793491ac 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -10,15 +10,10 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import io.realm.RealmResults import kotlinx.android.synthetic.main.fragment_data_list.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.realm.Filter -import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity @@ -29,6 +24,8 @@ import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.util.sorted + class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { @@ -36,20 +33,28 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource const val REQUEST_CODE_DETAILS = 1000 } + private lateinit var identifiableClass: Class + private lateinit var dataType: LiveData - private lateinit var items: RealmResults<*> - private lateinit var dataListAdapter: RowRepresentableAdapter - private var lastItemClickedId: String = "" + private lateinit var items: RealmResults + + override fun deletableItems() : List { + return this.items + } /** * Set fragment data */ fun setData(dataType: Int) { + this.dataType = LiveData.values()[dataType] + this.identifiableClass = this.dataType.relatedEntity + + val realm = getRealm() + this.items = realm.sorted(this.identifiableClass) + this.toolbar.title = this.dataType.localizedTitle(requireContext()) - this.dataType?.let { - this.items = it.items(getRealm()) - } + } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -62,7 +67,6 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource initUI() } - /** * Init UI */ @@ -95,28 +99,11 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource } this.addButton.setOnClickListener { - this.dataType?.let { - EditableDataActivity.newInstance( - requireContext(), - dataType = it.ordinal, - primaryKey = null - ) - } - } - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_CODE_DETAILS && resultCode == Activity.RESULT_OK) { - - val itemToDeleteId = data?.getStringExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName) - itemToDeleteId?.let { id -> - GlobalScope.launch(Dispatchers.Main) { - delay(300) - deleteItem(dataListAdapter, items, id) - } - } - + EditableDataActivity.newInstance( + requireContext(), + dataType = this.dataType.ordinal, + primaryKey = null + ) } } @@ -139,21 +126,24 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource } override fun indexForRow(row: RowRepresentable): Int { - return this.items.indexOf(row) + return this.items.indexOf(row as Identifiable) } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - this.dataType?.let { - if (it == LiveData.FILTER) { + + when (this.dataType) { + LiveData.FILTER -> { val intent = Intent() intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) activity?.setResult(Activity.RESULT_OK, intent) activity?.finish() - } else { - lastItemClickedId = (row as Identifiable).id - EditableDataActivity.newInstanceForResult(this, it.ordinal, lastItemClickedId, REQUEST_CODE_DETAILS) + } + else -> { + val identifier = (row as Identifiable).id + EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS) } } + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt index c216bce8..3c7fb223 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt @@ -18,7 +18,6 @@ import io.realm.kotlin.where import kotlinx.android.synthetic.main.fragment_feed.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData -import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.interfaces.Editable import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session @@ -106,7 +105,7 @@ class FeedFragment : RealmFragment(), RowRepresentableDelegate, FilterHandler { is Transaction -> { selectedTransaction = row selectedTransactionPosition = position - EditableDataActivity.newInstanceForResult(this, LiveData.TRANSACTION.ordinal, row.id, REQUEST_CODE_TRANSACTION_DETAILS) + EditableDataActivity.newInstanceForResult(this, LiveData.TRANSACTION, row.id, REQUEST_CODE_TRANSACTION_DETAILS) } } } 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 dca332b3..00594ac2 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 @@ -19,8 +19,8 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.Criteria -import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.combined +import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.realm.ReportSetup import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.ReportCreationActivity @@ -38,10 +38,14 @@ import java.util.* class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { - private lateinit var reportsAdapter: RowRepresentableAdapter + // private lateinit var dataListAdapter: RowRepresentableAdapter private lateinit var reportSetups: RealmResults private var adapterRows = mutableListOf() + override fun deletableItems(): List { + return this.reportSetups + } + companion object { /** @@ -83,7 +87,7 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc itemToDeleteId?.let { id -> GlobalScope.launch(Dispatchers.Main) { delay(300) - deleteItem(reportsAdapter, LiveData.REPORT_SETUP.items(getRealm()), id) + deleteItem(dataListAdapter, reportSetups, id) } } } @@ -107,14 +111,14 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc */ private fun initUI() { - reportsAdapter = RowRepresentableAdapter(this, this) + dataListAdapter = RowRepresentableAdapter(this, this) val viewManager = LinearLayoutManager(requireContext()) recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager - adapter = reportsAdapter + adapter = dataListAdapter } this.addButton.setOnClickListener { @@ -125,14 +129,14 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc // Rows - fun updateRows() { + private fun updateRows() { this.adapterRows.clear() if (this.reportSetups.size > 0) { adapterRows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.custom)) adapterRows.addAll(this.reportSetups) } adapterRows.addAll(ReportRow.getRows()) - this.reportsAdapter.notifyDataSetChanged() + this.dataListAdapter.notifyDataSetChanged() } override fun adapterRows(): List? { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index f6aaa248..fdd43121 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -298,7 +298,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate { * Add new custom field */ private fun addNewCustomField() { - EditableDataActivity.newInstanceForResult(this, LiveData.CUSTOM_FIELD.ordinal, requestCode = REQUEST_CODE_NEW_CUSTOM_FIELD) + EditableDataActivity.newInstanceForResult(this, LiveData.CUSTOM_FIELD, requestCode = REQUEST_CODE_NEW_CUSTOM_FIELD) } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt index 50bff679..ef64c652 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt @@ -1,28 +1,43 @@ package net.pokeranalytics.android.ui.fragment.components +import android.app.Activity +import android.content.Intent import android.os.Bundle import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import com.google.android.material.snackbar.Snackbar import io.realm.RealmObject +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Identifiable +import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter /** * Deletable Item Fragment * Don't forget to add a CoordinatorLayout at the top of your XML if you want to display correctly the snack bar */ -open class DeletableItemFragment : RealmFragment() { +abstract class DeletableItemFragment : RealmFragment() { + + companion object { + const val REQUEST_CODE_DELETION = 1000 + } + + lateinit var dataListAdapter: RowRepresentableAdapter private var deletedItem: RealmObject? = null private var lastDeletedItemPosition: Int = 0 - private var dataListAdapter: RowRepresentableAdapter? = null + private var mainLayout: ViewGroup? = null private var snackBar: Snackbar? = null + abstract fun deletableItems() : List + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) this.mainLayout = view.findViewById(R.id.mainLayout) @@ -33,6 +48,21 @@ open class DeletableItemFragment : RealmFragment() { snackBar?.dismiss() } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_CODE_DELETION && resultCode == Activity.RESULT_OK) { + + val itemToDeleteId = data?.getStringExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName) + itemToDeleteId?.let { id -> + GlobalScope.launch(Dispatchers.Main) { + delay(300) + deleteItem(dataListAdapter, deletableItems(), id) + } + } + + } + } + /** * Delete item * [dataListAdapter]: Adapter to update @@ -40,7 +70,7 @@ open class DeletableItemFragment : RealmFragment() { * [itemId]: Id of the item to delete * [container]: View to display the Snackbar */ - fun deleteItem(dataListAdapter: RowRepresentableAdapter, items: List<*>, itemId: String) { + fun deleteItem(dataListAdapter: RowRepresentableAdapter, items: List, itemId: String) { if (isDetached || activity == null) { return @@ -49,8 +79,8 @@ open class DeletableItemFragment : RealmFragment() { this.dataListAdapter = dataListAdapter // Save the delete position & create a copy of the object - val itemPosition = items.indexOfFirst { (it as Identifiable).id == itemId } - val itemToDelete = items.find { (it as Identifiable).id == itemId } + val itemPosition = items.indexOfFirst { it.id == itemId } + val itemToDelete = items.find { it.id == itemId } if (itemToDelete is RealmObject && itemPosition != -1) { @@ -102,14 +132,14 @@ open class DeletableItemFragment : RealmFragment() { * Called once the object has been deleted */ open fun updateUIAfterDeletion(itemPosition: Int) { - dataListAdapter?.notifyItemRemoved(itemPosition) + dataListAdapter.notifyItemRemoved(itemPosition) } /** * Called once the object has been restored */ open fun updateUIAfterUndoDeletion(newItem: RealmObject) { - dataListAdapter?.notifyItemInserted(lastDeletedItemPosition) + dataListAdapter.notifyItemInserted(lastDeletedItemPosition) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt index f883c7f2..75a0425f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt @@ -12,7 +12,7 @@ import android.view.WindowManager import androidx.appcompat.view.ContextThemeWrapper import androidx.fragment.app.FragmentManager import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import io.realm.RealmObject +import io.realm.RealmModel import kotlinx.android.synthetic.main.fragment_bottom_sheet.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData @@ -79,7 +79,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { val primaryKey = data.getStringExtra(EditableDataActivity.IntentKey.PRIMARY_KEY.keyName) val pokerAnalyticsActivity = activity as PokerAnalyticsActivity val liveDataType = LiveData.values()[dataType] - val proxyItem: RealmObject? = liveDataType.getData(pokerAnalyticsActivity.getRealm(), primaryKey) + val proxyItem: RealmModel? = liveDataType.getData(pokerAnalyticsActivity.getRealm(), primaryKey) this.delegate.onRowValueChanged(proxyItem, this.row) dismiss() } @@ -112,38 +112,22 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { true } bottomSheetToolbar.menu.findItem(R.id.actionAdd).setOnMenuItemClickListener { - when (row) { - SessionRow.GAME -> EditableDataActivity.newInstanceForResult( - this, - LiveData.GAME.ordinal, - requestCode = REQUEST_CODE_ADD_NEW_OBJECT - ) - SessionRow.BANKROLL, TransactionRow.BANKROLL -> EditableDataActivity.newInstanceForResult( - this, - LiveData.BANKROLL.ordinal, - requestCode = REQUEST_CODE_ADD_NEW_OBJECT - ) - SessionRow.LOCATION -> EditableDataActivity.newInstanceForResult( - this, - LiveData.LOCATION.ordinal, - requestCode = REQUEST_CODE_ADD_NEW_OBJECT - ) - SessionRow.TOURNAMENT_NAME -> EditableDataActivity.newInstanceForResult( - this, - LiveData.TOURNAMENT_NAME.ordinal, - requestCode = REQUEST_CODE_ADD_NEW_OBJECT - ) - SessionRow.TOURNAMENT_FEATURE -> EditableDataActivity.newInstanceForResult( - this, - LiveData.TOURNAMENT_FEATURE.ordinal, - requestCode = REQUEST_CODE_ADD_NEW_OBJECT - ) - TransactionRow.TYPE -> EditableDataActivity.newInstanceForResult( - this, - LiveData.TRANSACTION_TYPE.ordinal, - requestCode = REQUEST_CODE_ADD_NEW_OBJECT - ) + val liveData = when (row) { + SessionRow.GAME -> LiveData.GAME + SessionRow.BANKROLL, TransactionRow.BANKROLL -> LiveData.BANKROLL + SessionRow.LOCATION -> LiveData.LOCATION + SessionRow.TOURNAMENT_NAME -> LiveData.TOURNAMENT_NAME + SessionRow.TOURNAMENT_FEATURE -> LiveData.TOURNAMENT_FEATURE + TransactionRow.TYPE -> LiveData.TRANSACTION_TYPE + else -> throw IllegalStateException("row $row does not have an associated LiveData value") } + + EditableDataActivity.newInstanceForResult( + this, + liveData, + requestCode = REQUEST_CODE_ADD_NEW_OBJECT + ) + true } bottomSheetToolbar.menu.findItem(R.id.actionCheck).setOnMenuItemClickListener { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt index 42872569..5798656c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt @@ -3,7 +3,7 @@ package net.pokeranalytics.android.ui.fragment.components.bottomsheet import android.app.Activity import android.content.Intent import io.realm.RealmList -import io.realm.RealmObject +import io.realm.RealmModel import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.activity.EditableDataActivity @@ -28,7 +28,7 @@ open class BottomSheetMultiSelectionFragment : BottomSheetListFragment() { val primaryKey = data.getStringExtra(EditableDataActivity.IntentKey.PRIMARY_KEY.keyName) val pokerAnalyticsActivity = activity as PokerAnalyticsActivity val liveDataType = LiveData.values()[dataType] - val proxyItem: RealmObject? = liveDataType.getData(pokerAnalyticsActivity.getRealm(), primaryKey) + val proxyItem: RealmModel? = liveDataType.getData(pokerAnalyticsActivity.getRealm(), primaryKey) selectedRows.add(proxyItem as RowRepresentable) dataAdapter.refreshRow(proxyItem as RowRepresentable) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt index 645112b9..1caa908d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt @@ -8,7 +8,7 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import androidx.appcompat.app.AlertDialog -import io.realm.RealmObject +import io.realm.RealmModel import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.ConfigurationException import net.pokeranalytics.android.model.LiveData @@ -21,7 +21,7 @@ import net.pokeranalytics.android.ui.fragment.components.RealmFragment open class DataManagerFragment : RealmFragment() { - lateinit var item: RealmObject + lateinit var item: RealmModel lateinit var liveDataType: LiveData protected var primaryKey: String? = null diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index fe285215..5b28b85d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -5,7 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager -import io.realm.RealmObject +import io.realm.RealmModel import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_editable_data.view.* import net.pokeranalytics.android.R @@ -66,7 +66,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) - val proxyItem: RealmObject? = this.liveDataType.getData(this.getRealm(), primaryKey) + val proxyItem: RealmModel? = this.liveDataType.getData(this.getRealm(), primaryKey) proxyItem?.let { //TODO: Localize this.appBar.toolbar.title = "Update ${this.liveDataType.localizedTitle(requireContext()).toLowerCase().capitalize()}" diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt index faf25b93..20ffcd89 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt @@ -6,8 +6,9 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Transaction +import net.pokeranalytics.android.model.realm.TransactionType import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.helpers.DateTimePickerManager @@ -17,6 +18,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.round import net.pokeranalytics.android.util.extensions.shortDate +import net.pokeranalytics.android.util.sorted import java.util.* /** @@ -56,8 +58,8 @@ class TransactionDataFragment : EditableDataFragment(), StaticRowRepresentableDa override fun editDescriptors(row: RowRepresentable): ArrayList? { return when (row) { - TransactionRow.BANKROLL -> row.editingDescriptors(mapOf("defaultValue" to this.transaction.bankroll, "data" to LiveData.BANKROLL.items(getRealm()))) - TransactionRow.TYPE -> row.editingDescriptors(mapOf("defaultValue" to this.transaction.type, "data" to LiveData.TRANSACTION_TYPE.items(getRealm()))) + TransactionRow.BANKROLL -> row.editingDescriptors(mapOf("defaultValue" to this.transaction.bankroll, "data" to getRealm().sorted() )) + TransactionRow.TYPE -> row.editingDescriptors(mapOf("defaultValue" to this.transaction.type, "data" to getRealm().sorted() )) TransactionRow.AMOUNT -> row.editingDescriptors(mapOf("defaultValue" to (if (this.transaction.amount != 0.0) this.transaction.amount.round() else ""))) TransactionRow.COMMENT -> row.editingDescriptors(mapOf("defaultValue" to this.transaction.comment)) else -> super.editDescriptors(row) diff --git a/app/src/main/java/net/pokeranalytics/android/util/RealmExtensions.kt b/app/src/main/java/net/pokeranalytics/android/util/RealmExtensions.kt new file mode 100644 index 00000000..5c458e7b --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/RealmExtensions.kt @@ -0,0 +1,71 @@ +package net.pokeranalytics.android.util + +import io.realm.Realm +import io.realm.RealmModel +import io.realm.RealmResults +import io.realm.Sort +import io.realm.kotlin.where +import net.pokeranalytics.android.model.interfaces.CountableUsage +import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.model.realm.TournamentFeature +import net.pokeranalytics.android.model.realm.Transaction + +/** + * Returns all entities of the [clazz] sorted with their default sorting + */ +fun Realm.sorted(clazz: Class) : RealmResults { + + if (clazz is CountableUsage) { + this.updateUsageCount(clazz) + } + + val sortField = when (clazz) { + is CountableUsage -> "useCount" + is Transaction -> "date" + else -> "name" + } + val resultSort = when (clazz) { + is CountableUsage -> Sort.DESCENDING + is Transaction -> Sort.DESCENDING + else -> Sort.ASCENDING + } + + return this.where(clazz).findAll().sort(sortField, resultSort) +} + +/** + * Returns all entities of the [clazz] sorted with their default sorting + */ +inline fun Realm.sorted() : RealmResults { + return this.sorted(C::class.java) +} + +/** + * Updates the useCount variable of the CountableUsage entity + */ +fun Realm.updateUsageCount(clazz: Class) { + + val results = this.where(clazz).findAll() + this.executeTransaction { + results.forEach { countableUsage -> + + val countable = (countableUsage as CountableUsage) + when (clazz) { + is TournamentFeature -> { + countable.useCount = it.where().contains( + "tournamentFeatures.id", + countable.id + ).count().toInt() + } + else -> { + countable.useCount = it.where().equalTo( + "${clazz.simpleName.decapitalize()}.id", + countable.id + ).count().toInt() + } + } + + } + } + +} \ No newline at end of file