From f5855cda4a214d3fbd2d31ad2db8f2078353c45d Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 7 May 2019 17:41:27 +0200 Subject: [PATCH] Implement open & modify filter handler options --- .../pokeranalytics/android/model/LiveData.kt | 7 ++-- .../android/model/realm/Filter.kt | 20 +++++++++-- .../android/ui/activity/DataListActivity.kt | 20 ++++++++--- .../android/ui/activity/FiltersActivity.kt | 20 ++++++----- .../android/ui/fragment/DataListFragment.kt | 36 +++++++++++-------- .../android/ui/fragment/SettingsFragment.kt | 2 +- .../android/ui/fragment/StatisticsFragment.kt | 3 +- .../android/ui/interfaces/FilterHandler.kt | 25 ++++++++++--- 8 files changed, 95 insertions(+), 38 deletions(-) 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 b59df116..c22c78d1 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -22,10 +22,11 @@ enum class LiveData : Localizable { TOURNAMENT_NAME, TOURNAMENT_FEATURE, TRANSACTION, - TRANSACTION_TYPE; + TRANSACTION_TYPE, + FILTER; fun items(realm: Realm, fieldName: String? = null, sortOrder: Sort? = null): RealmResults<*> { - var results = realm.where(this.relatedEntity).findAll().sort(fieldName ?: this.sortingFieldName, sortOrder ?: this.sorting) + val results = realm.where(this.relatedEntity).findAll().sort(fieldName ?: this.sortingFieldName, sortOrder ?: this.sorting) if (results.size > 0) { if (results.first() is CountableUsage) { @@ -101,6 +102,7 @@ enum class LiveData : Localizable { TOURNAMENT_FEATURE -> TournamentFeature::class.java TRANSACTION -> Transaction::class.java TRANSACTION_TYPE -> TransactionType::class.java + FILTER -> Filter::class.java } } @@ -142,6 +144,7 @@ enum class LiveData : Localizable { TOURNAMENT_FEATURE -> R.string.tournament_feature TRANSACTION -> R.string.operations TRANSACTION_TYPE -> R.string.operation_types + FILTER -> R.string.filter } } 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 c28474ac..b9c1121a 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 @@ -3,10 +3,20 @@ package net.pokeranalytics.android.model.realm import io.realm.* import io.realm.annotations.PrimaryKey import io.realm.kotlin.where +import net.pokeranalytics.android.R 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.CountableUsage +import net.pokeranalytics.android.model.interfaces.NameManageable +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus +import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow +import net.pokeranalytics.android.ui.view.rowrepresentable.GameRow +import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow +import net.pokeranalytics.android.util.NULL_TEXT import timber.log.Timber import java.util.* @@ -15,7 +25,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() { +open class Filter : RealmObject(), RowRepresentable { companion object { @@ -44,10 +54,10 @@ open class Filter : RealmObject() { } @PrimaryKey - var id = UUID.randomUUID().toString() + var id = UUID.randomUUID().toString() // the queryWith name - var name: String = "" + var name: String = "" // the number of use of the queryWith, // for MutableRealmInteger, see https://realm.io/docs/java/latest/#counters @@ -139,4 +149,8 @@ open class Filter : RealmObject() { } + override fun getDisplayName(): String { + if (name.isNotEmpty()) return name + return this.query.name + } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt index bc712d81..e73ae0bc 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt @@ -3,25 +3,37 @@ package net.pokeranalytics.android.ui.activity import android.content.Context import android.content.Intent import android.os.Bundle +import androidx.fragment.app.Fragment import kotlinx.android.synthetic.main.activity_data_list.* import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.DataListFragment +import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode class DataListActivity : PokerAnalyticsActivity() { enum class IntentKey(val keyName: String) { DATA_TYPE("DATA_TYPE"), + LIVE_DATA_TYPE("LIVE_DATA_TYPE"), ITEM_DELETED("ITEM_DELETED") } companion object { fun newInstance(context: Context, dataType: Int) { - val intent = Intent(context, DataListActivity::class.java) - intent.putExtra(IntentKey.DATA_TYPE.keyName, dataType) - context.startActivity(intent) + context.startActivity(getIntent(context, dataType)) } - } + + fun newSelectInstance(fragment: Fragment, dataType: Int) { + val context = fragment.requireContext() + fragment.startActivityForResult(getIntent(context, dataType), FilterActivityRequestCode.SELECT_FILTER.ordinal) + } + + private fun getIntent(context:Context, dataType:Int) : Intent { + val intent = Intent(context, DataListActivity::class.java) + intent.putExtra(IntentKey.DATA_TYPE.keyName, dataType) + return intent + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersActivity.kt index afd9f49f..e28cac11 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersActivity.kt @@ -7,6 +7,7 @@ import androidx.fragment.app.Fragment import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.FiltersFragment +import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode class FiltersActivity : PokerAnalyticsActivity() { @@ -21,20 +22,23 @@ class FiltersActivity : PokerAnalyticsActivity() { * Default constructor */ fun newInstance(context: Context, filterId: String? = null) { - val intent = Intent(context, FiltersActivity::class.java) - filterId?.let { - intent.putExtra(IntentKey.FILTER_ID.keyName, it) - } - context.startActivity(intent) + context.startActivity(getIntent(context, filterId)) } /** * Create a new instance for result */ - fun newInstanceForResult(fragment: Fragment, requestCode: Int) { - val intent = Intent(fragment.requireContext(), FiltersActivity::class.java) - fragment.startActivityForResult(intent, requestCode) + fun newInstanceForResult(fragment: Fragment, filterId: String? = null) { + fragment.startActivityForResult(getIntent(fragment.requireContext(), filterId), FilterActivityRequestCode.SELECT_FILTER.ordinal) } + + private fun getIntent(context:Context, filterId:String?) : Intent { + val intent = Intent(context, FiltersActivity::class.java) + filterId?.let { + intent.putExtra(IntentKey.FILTER_ID.keyName, it) + } + return intent + } } override fun onCreate(savedInstanceState: Bundle?) { 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 9a56d355..d9fea442 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 @@ -18,10 +18,13 @@ 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.Deletable 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 import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -30,8 +33,6 @@ import net.pokeranalytics.android.ui.fragment.components.RealmFragment 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.ui.view.rowrepresentable.SettingRow - class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { @@ -39,7 +40,7 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep const val REQUEST_CODE_DETAILS = 1000 } - private lateinit var dataType: SettingRow + private lateinit var dataType: LiveData private lateinit var items: RealmResults<*> private lateinit var dataListAdapter: RowRepresentableAdapter @@ -93,14 +94,21 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - this.dataType.relatedResultsRepresentable?.let { - lastItemClickedPosition = position - EditableDataActivity.newInstanceForResult( - this, - it.ordinal, - (row as Identifiable).id, - REQUEST_CODE_DETAILS - ) + this.dataType?.let { + if (it == 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 { + lastItemClickedPosition = position + EditableDataActivity.newInstanceForResult( + this, + it.ordinal, + (row as Identifiable).id, + REQUEST_CODE_DETAILS + ) + } } } @@ -135,7 +143,7 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep } this.addButton.setOnClickListener { - this.dataType.relatedResultsRepresentable?.let { + this.dataType?.let { EditableDataActivity.newInstance( requireContext(), dataType = it.ordinal, @@ -199,9 +207,9 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep * Set fragment data */ fun setData(dataType: Int) { - this.dataType = SettingRow.values()[dataType] + this.dataType = LiveData.values()[dataType] this.toolbar.title = this.dataType.localizedTitle(requireContext()) - this.dataType.relatedResultsRepresentable?.let { + this.dataType?.let { this.items = it.items(getRealm()) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index b396874f..d847f850 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -116,7 +116,7 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta } row.relatedResultsRepresentable?.let { - DataListActivity.newInstance(requireContext(), (row as SettingRow).ordinal) + DataListActivity.newInstance(requireContext(), it.ordinal) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt index 0d41cd6d..b565b4bb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt @@ -23,6 +23,7 @@ import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.FiltersActivity +import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterHandler import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable @@ -83,7 +84,7 @@ class StatisticsFragment : TableReportFragment(), FilterHandler { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (requestCode == 0 && resultCode == Activity.RESULT_OK) { + if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal && resultCode == Activity.RESULT_OK) { data?.let { this.saveFilter(this.requireContext(), it.getStringExtra(FiltersActivity.IntentKey.FILTER_ID.keyName)) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt b/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt index 04079320..c839a791 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt @@ -6,11 +6,19 @@ import androidx.fragment.app.Fragment import io.realm.Realm import io.realm.kotlin.where import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.realm.Filter +import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.util.Preferences import timber.log.Timber +enum class FilterActivityRequestCode { + SELECT_FILTER, + CREATE_FILTER, + ; +} + interface FilterHandler { fun createFilter() @@ -36,15 +44,22 @@ interface FilterHandler { fun manageFilters(fragment: Fragment) { val context = fragment.requireContext() + val filterId = Preferences.getActiveFilterId(context) + val filterSelected = filterId != null - val filterSelected = Preferences.getActiveFilterId(context) != null + val realm = Realm.getDefaultInstance() + val count = realm.where().count().toInt() + realm.close() val choices = ArrayList() choices.add(fragment.getString(R.string.new_str)) + if (count > 0) { + choices.add(fragment.getString(R.string.load_from_db)) + } + if (filterSelected) { choices.add(fragment.getString(R.string.modify_current_filter)) - choices.add(fragment.getString(R.string.load_from_db)) choices.add(fragment.getString(R.string.remove_filter)) } @@ -54,9 +69,9 @@ interface FilterHandler { .setItems(choices.toTypedArray()) { _, which -> Timber.d("Click on $which") when (which) { - 0 -> FiltersActivity.newInstanceForResult(fragment = fragment, requestCode = 0) - 1 -> FiltersActivity.newInstanceForResult(fragment = fragment, requestCode = 0) - 2 -> FiltersActivity.newInstanceForResult(fragment = fragment, requestCode = 0) + 0 -> FiltersActivity.newInstanceForResult(fragment = fragment) + 1 -> DataListActivity.newSelectInstance(fragment, LiveData.FILTER.ordinal) + 2 -> FiltersActivity.newInstanceForResult(fragment = fragment, filterId = filterId) 3 -> { Preferences.removeActiveFilterId(context) removeFilter()