From 570cacdffe2933ad5e50c6701afa558eb07012c1 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 1 Apr 2020 17:56:36 +0200 Subject: [PATCH] Filters added ViewModel and navigation refactoring to fix crash --- app/src/main/AndroidManifest.xml | 5 - .../android/model/realm/Filter.kt | 5 +- .../android/model/realm/FilterCondition.kt | 2 +- .../ui/fragment/data/EditableDataFragment.kt | 6 +- .../modules/filter/FilterDetailsActivity.kt | 70 -------- .../modules/filter/FilterDetailsFragment.kt | 149 ++++++++++-------- .../ui/modules/filter/FilterViewModel.kt | 76 +++++++++ .../ui/modules/filter/FiltersActivity.kt | 63 ++++++-- .../ui/modules/filter/FiltersFragment.kt | 140 ++++++---------- 9 files changed, 267 insertions(+), 249 deletions(-) delete mode 100644 app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsActivity.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterViewModel.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 648a853a..4945c459 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -142,11 +142,6 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> - - () - casted.addAll(this) - val newFilterCondition = FilterCondition(casted) + val newFilterCondition = FilterCondition(this) val previousCondition = filterConditions.filter { it.filterName == newFilterCondition.filterName && it.operator == newFilterCondition.operator } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt index 46c4fc5b..3a4f1538 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt @@ -14,7 +14,7 @@ open class FilterCondition() : RealmObject() { this.sectionName = sectionName } - constructor(filterElementRows: ArrayList) : this(filterElementRows.first().baseId, filterElementRows.first().filterSectionRow.name) { + constructor(filterElementRows: List) : this(filterElementRows.first().baseId, filterElementRows.first().filterSectionRow.name) { val row = filterElementRows.first() this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName this.operator = row.operator.ordinal 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 f3529b71..2fffab16 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 @@ -111,8 +111,10 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat // When creating an object, open automatically the keyboard for the first row if (!deleteButtonShouldAppear && shouldOpenKeyboard) { val index = indexOfFirstRowToSelect() - dataSource.adapterRows()?.get(index)?.let { row -> - onRowSelected(index, row) + dataSource.adapterRows()?.let { rows -> + if (rows.size > index) { + onRowSelected(index, rows.get(index)) + } } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsActivity.kt deleted file mode 100644 index 52e8d002..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsActivity.kt +++ /dev/null @@ -1,70 +0,0 @@ -package net.pokeranalytics.android.ui.modules.filter - -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.ui.activity.components.BaseActivity - -class FilterDetailsActivity : BaseActivity() { - - enum class IntentKey(val keyName: String) { - FILTER_ID("FILTER_ID"), - FILTER_CATEGORY_ORDINAL("FILTER_CATEGORY_ORDINAL") - } - - companion object { - - /** - * Default constructor - */ - fun newInstance(context: Context, filterId: String, filterCategoryOrdinal: Int) { - val intent = Intent(context, FilterDetailsActivity::class.java) - intent.putExtra(IntentKey.FILTER_ID.keyName, filterId) - intent.putExtra(IntentKey.FILTER_CATEGORY_ORDINAL.keyName, filterCategoryOrdinal) - context.startActivity(intent) - } - - /** - * Create a new instance for result - */ - fun newInstanceForResult(fragment: Fragment, filterId: String, filterCategoryOrdinal: Int, requestCode: Int) { - - val intent = Intent(fragment.requireContext(), FilterDetailsActivity::class.java) - intent.putExtra(IntentKey.FILTER_ID.keyName, filterId) - intent.putExtra(IntentKey.FILTER_CATEGORY_ORDINAL.keyName, filterCategoryOrdinal) - fragment.startActivityForResult(intent, requestCode) - } - } - - private lateinit var fragment: FilterDetailsFragment - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_filter_details) - initUI() - } - - override fun onBackPressed() { - fragment.onBackPressed() - } - - /** - * Init UI - */ - private fun initUI() { - - val fragmentManager = supportFragmentManager - val fragmentTransaction = fragmentManager.beginTransaction() - val filterId = intent.getStringExtra(IntentKey.FILTER_ID.keyName) - val filterCategoryOrdinal = intent.getIntExtra(IntentKey.FILTER_CATEGORY_ORDINAL.keyName, 0) - - fragment = - FilterDetailsFragment() - fragmentTransaction.add(R.id.container, fragment) - fragmentTransaction.commit() - fragment.setData(filterId, filterCategoryOrdinal) - } - -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsFragment.kt index a3eb2b18..2103f1c0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsFragment.kt @@ -1,18 +1,16 @@ package net.pokeranalytics.android.ui.modules.filter -import android.app.Activity.RESULT_OK import android.content.Context -import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.fragment_filter_details.* import kotlinx.android.synthetic.main.fragment_filter_details.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.filter.QueryCondition -import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -21,7 +19,6 @@ import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheet import net.pokeranalytics.android.ui.helpers.DateTimePickerManager import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import net.pokeranalytics.android.util.NULL_TEXT @@ -31,11 +28,13 @@ import kotlin.collections.ArrayList open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { + val model: FilterViewModel by lazy { + ViewModelProviders.of(requireActivity()).get(FilterViewModel::class.java) + } + private lateinit var rowRepresentableAdapter: RowRepresentableAdapter - private lateinit var primaryKey: String - private lateinit var filterCategoryRow: FilterCategoryRow - private var currentFilter: Filter? = null +// private var currentFilter: Filter? = null private var rows: ArrayList = ArrayList() private var rowsForFilterSubcategoryRow: HashMap> = HashMap() @@ -55,6 +54,67 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataSo override fun onBackPressed() { super.onBackPressed() saveData() +// requireFragmentManager().popBackStackImmediate("f1", 0) +// requireFragmentManager().popBackStackImmediate() + } + + + /** + * Init UI + */ + private fun initUI() { + + setDisplayHomeAsUpEnabled(true) + + this.appBar.toolbar.title = getString(R.string.filter) + + val viewManager = LinearLayoutManager(requireContext()) + + recyclerView.apply { + setHasFixedSize(true) + layoutManager = viewManager + } + } + + /** + * Init data + */ + private fun initData() { + +// this.arguments?.let { bundle -> +// +// bundle.getString(BundleKey.PRIMARY_KEY.value)?.let { filterId -> +// this.currentFilter = getRealm().findById(filterId) +// } +// +// val category = bundle.getInt(BundleKey.DATA_TYPE.value) +// this.filterCategoryRow = FilterCategoryRow.values()[category] +// +// } ?: throw PAIllegalStateException("Missing bundle") + + //currentFilter = Filter.getFilterBydId(getRealm(), primaryKey) +// currentFilter = FiltersFragment.currentFilter + + Timber.d(">> Filter = ${this.model.currentFilter}") + Timber.d("selectedRow = ${this.model.selectedCategoryRow}") + + val filterCategoryRow = this.model.filterCategoryRow + + this.appBar.toolbar.title = filterCategoryRow.localizedTitle(requireContext()) + + this.rows.clear() + this.rowsForFilterSubcategoryRow.clear() + this.rows.addAll(filterCategoryRow.filterElements) + + this.rows.forEach { element -> + if (element is QueryCondition && this.model.currentFilter?.contains(element) == true) { + this.model.currentFilter?.loadValueForElement(element) + this.selectedRows.add(element) + } + } + + this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) + this.recyclerView.adapter = rowRepresentableAdapter } override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { @@ -166,48 +226,6 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataSo return if (rowViewType != -1) rowViewType else RowViewType.TITLE_CHECK.ordinal } - /** - * Init UI - */ - private fun initUI() { - - setDisplayHomeAsUpEnabled(true) - - this.appBar.toolbar.title = getString(R.string.filter) - - val viewManager = LinearLayoutManager(requireContext()) - - recyclerView.apply { - setHasFixedSize(true) - layoutManager = viewManager - } - } - - /** - * Init data - */ - private fun initData() { - - //currentFilter = Filter.getFilterBydId(getRealm(), primaryKey) - currentFilter = FiltersFragment.currentFilter - - this.appBar.toolbar.title = filterCategoryRow.localizedTitle(requireContext()) - - this.rows.clear() - this.rowsForFilterSubcategoryRow.clear() - this.rows.addAll(filterCategoryRow.filterElements) - - this.rows.forEach { element -> - if (element is QueryCondition && currentFilter?.contains(element) == true) { - currentFilter?.loadValueForElement(element) - this.selectedRows.add(element) - } - } - - this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) - this.recyclerView.adapter = rowRepresentableAdapter - } - /** * Update rows selection */ @@ -233,47 +251,42 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataSo println("list of selected rows : $selectedRows") // Update UI - rowRepresentableAdapter.refreshRow(row) + this.rowRepresentableAdapter.refreshRow(row) } /** * Save data */ private fun saveData() { + + val currentFilter = this.model.currentFilter + //TODO: Save currentFilter details data Timber.d("Save data for queryWith: ${currentFilter?.id}") - selectedRows.forEach { + this.selectedRows.forEach { Timber.d("Selected rows: $it") } getRealm().executeTransaction { - currentFilter?.remove(filterCategoryRow) - currentFilter?.createOrUpdateFilterConditions(selectedRows) + currentFilter?.remove(this.model.filterCategoryRow) + currentFilter?.createOrUpdateFilterConditions(this.selectedRows) } currentFilter?.filterConditions?.forEach { Timber.d("Condition: $it") } - finishActivityWithResult(currentFilter?.id) +// finishActivityWithResult(currentFilter?.id) } /** * Finish the activity with a result */ - private fun finishActivityWithResult(uniqueIdentifier: String?) { - val intent = Intent() - intent.putExtra(FilterDetailsActivity.IntentKey.FILTER_ID.keyName, uniqueIdentifier) - activity?.setResult(RESULT_OK, intent) - activity?.finish() - } - - /** - * Set fragment data - */ - fun setData(primaryKey: String, filterCategory: Int) { - this.primaryKey = primaryKey - this.filterCategoryRow = FilterCategoryRow.values()[filterCategory] - } +// private fun finishActivityWithResult(uniqueIdentifier: String?) { +// val intent = Intent() +// intent.putExtra(FilterDetailsActivity.IntentKey.FILTER_ID.keyName, uniqueIdentifier) +// activity?.setResult(RESULT_OK, intent) +// activity?.finish() +// } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterViewModel.kt new file mode 100644 index 00000000..450c633a --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterViewModel.kt @@ -0,0 +1,76 @@ +package net.pokeranalytics.android.ui.modules.filter + +import android.content.Context +import androidx.lifecycle.ViewModel +import io.realm.Realm +import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.model.realm.Filter +import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow +import net.pokeranalytics.android.util.extensions.findById + +class FilterViewModel : ViewModel(), StaticRowRepresentableDataSource { + + var currentFilter: Filter? = null + + // Main + var filterableType: FilterableType? = null + + var filterCopy: Filter? = null + private var categoryRows: ArrayList = ArrayList() + var primaryKey: String? = null + var selectedCategoryRow: RowRepresentable? = null + var isUpdating = false + + // Details + val filterCategoryRow: FilterCategoryRow + get() { + return this.selectedCategoryRow as FilterCategoryRow + } + + fun init(realm: Realm) { + + if (this.currentFilter != null) { // can be called twice and we don't want that + return + } + + this.primaryKey?.let { + + val filter = realm.findById(it) ?: throw PAIllegalStateException("Can't find filter with id=$it") + this.currentFilter = realm.copyFromRealm(filter) + this.isUpdating = true + } ?: run { + this.filterableType?.uniqueIdentifier?.let { + this.currentFilter = Filter.newInstance(it) //realm.copyFromRealm(Filter.newInstanceForResult(realm, this.filterableType.ordinal)) + } + } + + // Create a copy if the user cancels the updates + this.currentFilter?.let { + if (it.isValid && it.isManaged) { + this.filterCopy = realm.copyFromRealm(it) + } + } + + this.categoryRows.clear() + + this.filterableType?.let { + this.categoryRows.addAll(FilterCategoryRow.values(it)) + } + + } + + // Data source + + override fun adapterRows(): List? { + return this.categoryRows + } + + override fun charSequenceForRow(row: RowRepresentable, context: Context, tag: Int): CharSequence { + // Return the number of selected filters for this category + val count = this.currentFilter?.countBy(row as FilterCategoryRow) ?: 0 + return if (count > 0) count.toString() else "" + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersActivity.kt index fbe0a135..28ec56ce 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersActivity.kt @@ -4,11 +4,17 @@ import android.content.Context import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProviders import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.components.BaseActivity +import net.pokeranalytics.android.ui.fragment.components.BaseFragment class FiltersActivity : BaseActivity() { + val model: FilterViewModel by lazy { + ViewModelProviders.of(this).get(FilterViewModel::class.java) + } + enum class IntentKey(val keyName: String) { FILTER_ID("FILTER_ID"), FILTERABLE_TYPE("FILTERABLE_TYPE"), @@ -16,7 +22,9 @@ class FiltersActivity : BaseActivity() { ; } - private lateinit var fragment: FiltersFragment +// private lateinit var fragment: FiltersFragment + + private var currentFragment: BaseFragment? = null companion object { /** @@ -51,7 +59,19 @@ class FiltersActivity : BaseActivity() { } override fun onBackPressed() { - fragment.onBackPressed() + this.currentFragment?.onBackPressed() + + if (supportFragmentManager.backStackEntryCount > 0) { + supportFragmentManager.popBackStack() + + val ff = supportFragmentManager.findFragmentByTag(Tag.CATEGORIES.identifier) as FiltersFragment + ff.refreshView() + this.currentFragment = ff + + } else { + this.finish() + } + } /** @@ -59,19 +79,44 @@ class FiltersActivity : BaseActivity() { */ private fun initUI() { - val fragmentManager = supportFragmentManager - val fragmentTransaction = fragmentManager.beginTransaction() val filterId = intent.getStringExtra(IntentKey.FILTER_ID.keyName) val uniqueIdentifier= intent.getIntExtra(IntentKey.FILTERABLE_TYPE.keyName, 0) val hideMostUsedFilters = intent.getBooleanExtra(IntentKey.HIDE_MOST_USED_FILTERS.keyName, false) - val filterableType = FilterableType.valueByIdentifier(uniqueIdentifier) +// val filterableType = FilterableType.valueByIdentifier(uniqueIdentifier) + + this.model.primaryKey = filterId + this.model.filterableType = FilterableType.valueByIdentifier(uniqueIdentifier) + + val filtersFragment = FiltersFragment() +// val bundle = Bundle() +// bundle.putString(BaseFragment.BundleKey.PRIMARY_KEY.value, filterId) +// bundle.putInt(BaseFragment.BundleKey.DATA_TYPE.value, uniqueIdentifier) +// fragment.arguments = bundle - fragment = FiltersFragment() - fragment.setData(filterId, filterableType) - fragmentTransaction.add(R.id.container, fragment) +// fragment.setData(filterId, filterableType) + val fragmentTransaction = this.supportFragmentManager.beginTransaction() + fragmentTransaction.add(R.id.container, filtersFragment, Tag.CATEGORIES.identifier) +// fragmentTransaction.addToBackStack(null) fragmentTransaction.commit() - fragment.updateMostUsedFiltersVisibility(!hideMostUsedFilters) + filtersFragment.updateMostUsedFiltersVisibility(!hideMostUsedFilters) + + } + + fun showDetailsFragment() { + + val detailsFragment = FilterDetailsFragment() + + val fragmentTransaction = this.supportFragmentManager.beginTransaction() + fragmentTransaction.replace(R.id.container, detailsFragment) + fragmentTransaction.addToBackStack(null) + fragmentTransaction.commit() + + this.currentFragment = detailsFragment + + } + enum class Tag(var identifier: String) { + CATEGORIES("categories"), } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt index 108ff1ca..1f9c1417 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt @@ -1,11 +1,11 @@ package net.pokeranalytics.android.ui.modules.filter import android.app.Activity.RESULT_OK -import android.content.Context import android.content.Intent import android.os.Bundle import android.view.* import androidx.core.view.isVisible +import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.chip.Chip import kotlinx.android.synthetic.main.fragment_editable_data.appBar @@ -13,53 +13,35 @@ import kotlinx.android.synthetic.main.fragment_editable_data.recyclerView import kotlinx.android.synthetic.main.fragment_filters.* import kotlinx.android.synthetic.main.fragment_filters.view.toolbar import net.pokeranalytics.android.R -import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.realm.Filter 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.extensions.px import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import net.pokeranalytics.android.util.Preferences -import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.sorted import timber.log.Timber -open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { +open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { + + val model: FilterViewModel by lazy { + ViewModelProviders.of(requireActivity()).get(FilterViewModel::class.java) + } companion object { const val REQUEST_CODE_FILTER_DETAILS = 100 const val MOST_USED_FILTERS_DISPLAYED = 6 - - var currentFilter: Filter? = null - } private lateinit var rowRepresentableAdapter: RowRepresentableAdapter - private var filterCopy: Filter? = null - - private var rows: ArrayList = ArrayList() private var filterMenu: Menu? = null - private var primaryKey: String? = null - private lateinit var filterableType: FilterableType - private var selectedRow: RowRepresentable? = null - private var isUpdating = false private var showMostUsedFiltersLayout = true - /** - * Set fragment data - */ - fun setData(primaryKey: String?, filterableType: FilterableType) { - this.primaryKey = primaryKey - this.filterableType = filterableType - } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater.inflate(R.layout.fragment_filters, container, false) @@ -76,19 +58,10 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_FILTER_DETAILS && resultCode == RESULT_OK) { - - // Update object - /* - currentFilter?.id?.let { currentFilterId -> - Filter.getFilterBydId(getRealm(), currentFilterId)?.let { filter -> - currentFilter = filter - } - } - */ - - selectedRow?.let { + this.model.selectedCategoryRow?.let { rowRepresentableAdapter.refreshRow(it) } + } else if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal) { updateMostUsedFilters() @@ -100,6 +73,15 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, } } + fun refreshView() { + this.model.selectedCategoryRow?.let { + rowRepresentableAdapter.refreshRow(it) + } + + +// this.rowRepresentableAdapter.notifyDataSetChanged() + } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { menu.clear() inflater.inflate(R.menu.toolbar_editable_data, menu) @@ -109,10 +91,10 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, } override fun onBackPressed() { - if (isUpdating) { + if (this.model.isUpdating) { cancelUpdates() } else { - activity?.finish() +// activity?.finish() } } @@ -123,37 +105,6 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, return true } - override fun adapterRows(): List? { - return rows - } - - override fun charSequenceForRow( - row: RowRepresentable, - context: Context, - tag: Int - ): CharSequence { - // Return the number of selected filters for this category - var selectedFilters = "" - if (row is FilterCategoryRow) { - currentFilter?.countBy(row)?.let { nbFilters -> - if (nbFilters > 0) { - selectedFilters = nbFilters.toString() - } - } - } - return selectedFilters - } - - override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { - super.onRowSelected(position, row, tag) - selectedRow = row - currentFilter?.id?.let { filterId -> - FilterDetailsActivity.newInstanceForResult(this, filterId, (row as FilterCategoryRow).ordinal, - REQUEST_CODE_FILTER_DETAILS - ) - } - } - /** * Init UI */ @@ -170,7 +121,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, } moreFilters.setOnClickListener { - LiveData.FILTER.subType = filterableType.uniqueIdentifier + LiveData.FILTER.subType = this.model.filterableType?.uniqueIdentifier FiltersListActivity.newSelectInstance(this, LiveData.FILTER.ordinal, false) } @@ -182,30 +133,34 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, */ private fun initData() { - val realm = getRealm() +// this.arguments?.let { bundle -> +// this.model.primaryKey = bundle.getString(BundleKey.PRIMARY_KEY.value) +// val type = bundle.getInt(BundleKey.DATA_TYPE.value) +// this.model.filterableType = FilterableType.valueByIdentifier(type) +// } ?: throw PAIllegalStateException("Missing bundle") - primaryKey?.let { + this.model.init(getRealm()) - val filter = realm.findById(it) ?: throw PAIllegalStateException("Can't find filter with id=$it") - currentFilter = realm.copyFromRealm(filter) - isUpdating = true - } ?: run { - currentFilter = Filter.newInstance(this.filterableType.uniqueIdentifier) //realm.copyFromRealm(Filter.newInstanceForResult(realm, this.filterableType.ordinal)) - } + this.rowRepresentableAdapter = RowRepresentableAdapter(this.model, this) + this.recyclerView.adapter = rowRepresentableAdapter - // Create a copy if the user cancels the updates - currentFilter?.let { - if (it.isValid && it.isManaged) { - filterCopy = getRealm().copyFromRealm(it) - } - } + } + + override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { + super.onRowSelected(position, row, tag) - rows.clear() - rows.addAll(FilterCategoryRow.values(this.filterableType)) + this.model.selectedCategoryRow = row + this.model.currentFilter?.id?.let { filterId -> - this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) - this.recyclerView.adapter = rowRepresentableAdapter + (activity as FiltersActivity).showDetailsFragment() + +// this.model.filterCategoryRow = row as FilterCategoryRow +// FilterDetailsActivity.newInstanceForResult( +// this, filterId, (row as FilterCategoryRow).ordinal, +// REQUEST_CODE_FILTER_DETAILS +// ) + } } /** @@ -214,10 +169,10 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, private fun updateMostUsedFilters() { var nbChips = 0 - val filters = getRealm().sorted(Filter::class.java, editableOnly = false, filterableTypeUniqueIdentifier = this.filterableType.uniqueIdentifier) + val filters = getRealm().sorted(Filter::class.java, editableOnly = false, filterableTypeUniqueIdentifier = this.model.filterableType?.uniqueIdentifier) val currentFilterId = Preferences.getActiveFilterId(requireContext()) - if (isUpdating || filters.isEmpty() || (filters.size == 1 && filters.first()?.id == currentFilterId)) { + if (this.model.isUpdating || filters.isEmpty() || (filters.size == 1 && filters.first()?.id == currentFilterId)) { mostUsedFiltersLayout.visibility = View.GONE return } @@ -265,7 +220,9 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, * Validate the updates of the queryWith */ private fun validateUpdates() { - getRealm().executeTransaction { realm -> + val currentFilter = this.model.currentFilter + + getRealm().executeTransaction { realm -> currentFilter?.let { it.name = it.query.getName(requireContext()) realm.copyToRealmOrUpdate(it) @@ -280,6 +237,9 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, * Cancel the latest updates of the queryWith */ private fun cancelUpdates() { + + val filterCopy = this.model.filterCopy + val filterId = filterCopy?.id ?: "" getRealm().executeTransaction { realm -> filterCopy?.let {