Filters added ViewModel and navigation refactoring to fix crash

hh
Laurent 6 years ago
parent 5848f7df22
commit 570cacdffe
  1. 5
      app/src/main/AndroidManifest.xml
  2. 5
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  3. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt
  4. 6
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt
  5. 70
      app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsActivity.kt
  6. 149
      app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsFragment.kt
  7. 76
      app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterViewModel.kt
  8. 63
      app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersActivity.kt
  9. 136
      app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt

@ -142,11 +142,6 @@
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.modules.filter.FilterDetailsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity <activity
android:name="net.pokeranalytics.android.ui.activity.GDPRActivity" android:name="net.pokeranalytics.android.ui.activity.GDPRActivity"
android:launchMode="singleTop" android:launchMode="singleTop"

@ -105,11 +105,8 @@ open class Filter : RealmObject(), RowRepresentable, Editable, Deletable, Counta
it.groupId == groupId it.groupId == groupId
} }
.apply { .apply {
Timber.d("list of querys: ${this.map { it.id }}") Timber.d("list of querys: ${this.map { it.id }}")
val casted = arrayListOf<QueryCondition>() val newFilterCondition = FilterCondition(this)
casted.addAll(this)
val newFilterCondition = FilterCondition(casted)
val previousCondition = filterConditions.filter { val previousCondition = filterConditions.filter {
it.filterName == newFilterCondition.filterName && it.operator == newFilterCondition.operator it.filterName == newFilterCondition.filterName && it.operator == newFilterCondition.operator
} }

@ -14,7 +14,7 @@ open class FilterCondition() : RealmObject() {
this.sectionName = sectionName this.sectionName = sectionName
} }
constructor(filterElementRows: ArrayList<QueryCondition>) : this(filterElementRows.first().baseId, filterElementRows.first().filterSectionRow.name) { constructor(filterElementRows: List<QueryCondition>) : this(filterElementRows.first().baseId, filterElementRows.first().filterSectionRow.name) {
val row = filterElementRows.first() val row = filterElementRows.first()
this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName
this.operator = row.operator.ordinal this.operator = row.operator.ordinal

@ -111,8 +111,10 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat
// When creating an object, open automatically the keyboard for the first row // When creating an object, open automatically the keyboard for the first row
if (!deleteButtonShouldAppear && shouldOpenKeyboard) { if (!deleteButtonShouldAppear && shouldOpenKeyboard) {
val index = indexOfFirstRowToSelect() val index = indexOfFirstRowToSelect()
dataSource.adapterRows()?.get(index)?.let { row -> dataSource.adapterRows()?.let { rows ->
onRowSelected(index, row) if (rows.size > index) {
onRowSelected(index, rows.get(index))
}
} }
} }
} }

@ -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)
}
}

@ -1,18 +1,16 @@
package net.pokeranalytics.android.ui.modules.filter package net.pokeranalytics.android.ui.modules.filter
import android.app.Activity.RESULT_OK
import android.content.Context import android.content.Context
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_filter_details.* import kotlinx.android.synthetic.main.fragment_filter_details.*
import kotlinx.android.synthetic.main.fragment_filter_details.view.* import kotlinx.android.synthetic.main.fragment_filter_details.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.filter.QueryCondition 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.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource 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.helpers.DateTimePickerManager
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType 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.FilterElementRow
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
@ -31,11 +28,13 @@ import kotlin.collections.ArrayList
open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { 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 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<RowRepresentable> = ArrayList() private var rows: ArrayList<RowRepresentable> = ArrayList()
private var rowsForFilterSubcategoryRow: HashMap<FilterSectionRow, ArrayList<RowRepresentable>> = HashMap() private var rowsForFilterSubcategoryRow: HashMap<FilterSectionRow, ArrayList<RowRepresentable>> = HashMap()
@ -55,6 +54,67 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataSo
override fun onBackPressed() { override fun onBackPressed() {
super.onBackPressed() super.onBackPressed()
saveData() 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) { 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 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 * Update rows selection
*/ */
@ -233,47 +251,42 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataSo
println("list of selected rows : $selectedRows") println("list of selected rows : $selectedRows")
// Update UI // Update UI
rowRepresentableAdapter.refreshRow(row) this.rowRepresentableAdapter.refreshRow(row)
} }
/** /**
* Save data * Save data
*/ */
private fun saveData() { private fun saveData() {
val currentFilter = this.model.currentFilter
//TODO: Save currentFilter details data //TODO: Save currentFilter details data
Timber.d("Save data for queryWith: ${currentFilter?.id}") Timber.d("Save data for queryWith: ${currentFilter?.id}")
selectedRows.forEach { this.selectedRows.forEach {
Timber.d("Selected rows: $it") Timber.d("Selected rows: $it")
} }
getRealm().executeTransaction { getRealm().executeTransaction {
currentFilter?.remove(filterCategoryRow) currentFilter?.remove(this.model.filterCategoryRow)
currentFilter?.createOrUpdateFilterConditions(selectedRows) currentFilter?.createOrUpdateFilterConditions(this.selectedRows)
} }
currentFilter?.filterConditions?.forEach { currentFilter?.filterConditions?.forEach {
Timber.d("Condition: $it") Timber.d("Condition: $it")
} }
finishActivityWithResult(currentFilter?.id) // finishActivityWithResult(currentFilter?.id)
} }
/** /**
* Finish the activity with a result * Finish the activity with a result
*/ */
private fun finishActivityWithResult(uniqueIdentifier: String?) { // private fun finishActivityWithResult(uniqueIdentifier: String?) {
val intent = Intent() // val intent = Intent()
intent.putExtra(FilterDetailsActivity.IntentKey.FILTER_ID.keyName, uniqueIdentifier) // intent.putExtra(FilterDetailsActivity.IntentKey.FILTER_ID.keyName, uniqueIdentifier)
activity?.setResult(RESULT_OK, intent) // activity?.setResult(RESULT_OK, intent)
activity?.finish() // activity?.finish()
} // }
/**
* Set fragment data
*/
fun setData(primaryKey: String, filterCategory: Int) {
this.primaryKey = primaryKey
this.filterCategoryRow = FilterCategoryRow.values()[filterCategory]
}
} }

@ -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<RowRepresentable> = 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<Filter>(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<RowRepresentable>? {
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 ""
}
}

@ -4,11 +4,17 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.activity.components.BaseActivity import net.pokeranalytics.android.ui.activity.components.BaseActivity
import net.pokeranalytics.android.ui.fragment.components.BaseFragment
class FiltersActivity : BaseActivity() { class FiltersActivity : BaseActivity() {
val model: FilterViewModel by lazy {
ViewModelProviders.of(this).get(FilterViewModel::class.java)
}
enum class IntentKey(val keyName: String) { enum class IntentKey(val keyName: String) {
FILTER_ID("FILTER_ID"), FILTER_ID("FILTER_ID"),
FILTERABLE_TYPE("FILTERABLE_TYPE"), 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 { companion object {
/** /**
@ -51,7 +59,19 @@ class FiltersActivity : BaseActivity() {
} }
override fun onBackPressed() { 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() { private fun initUI() {
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
val filterId = intent.getStringExtra(IntentKey.FILTER_ID.keyName) val filterId = intent.getStringExtra(IntentKey.FILTER_ID.keyName)
val uniqueIdentifier= intent.getIntExtra(IntentKey.FILTERABLE_TYPE.keyName, 0) val uniqueIdentifier= intent.getIntExtra(IntentKey.FILTERABLE_TYPE.keyName, 0)
val hideMostUsedFilters = intent.getBooleanExtra(IntentKey.HIDE_MOST_USED_FILTERS.keyName, false) 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)
fragment.setData(filterId, filterableType) val fragmentTransaction = this.supportFragmentManager.beginTransaction()
fragmentTransaction.add(R.id.container, fragment) fragmentTransaction.add(R.id.container, filtersFragment, Tag.CATEGORIES.identifier)
// fragmentTransaction.addToBackStack(null)
fragmentTransaction.commit() 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"),
} }
} }

@ -1,11 +1,11 @@
package net.pokeranalytics.android.ui.modules.filter package net.pokeranalytics.android.ui.modules.filter
import android.app.Activity.RESULT_OK import android.app.Activity.RESULT_OK
import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.* import android.view.*
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import kotlinx.android.synthetic.main.fragment_editable_data.appBar 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.*
import kotlinx.android.synthetic.main.fragment_filters.view.toolbar import kotlinx.android.synthetic.main.fragment_filters.view.toolbar
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate 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.extensions.px
import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.view.RowRepresentable 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.Preferences
import net.pokeranalytics.android.util.extensions.findById
import net.pokeranalytics.android.util.extensions.sorted import net.pokeranalytics.android.util.extensions.sorted
import timber.log.Timber 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 { companion object {
const val REQUEST_CODE_FILTER_DETAILS = 100 const val REQUEST_CODE_FILTER_DETAILS = 100
const val MOST_USED_FILTERS_DISPLAYED = 6 const val MOST_USED_FILTERS_DISPLAYED = 6
var currentFilter: Filter? = null
} }
private lateinit var rowRepresentableAdapter: RowRepresentableAdapter private lateinit var rowRepresentableAdapter: RowRepresentableAdapter
private var filterCopy: Filter? = null
private var rows: ArrayList<RowRepresentable> = ArrayList()
private var filterMenu: Menu? = null 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 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? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState) super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.fragment_filters, container, false) return inflater.inflate(R.layout.fragment_filters, container, false)
@ -76,19 +58,10 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_FILTER_DETAILS && resultCode == RESULT_OK) { if (requestCode == REQUEST_CODE_FILTER_DETAILS && resultCode == RESULT_OK) {
this.model.selectedCategoryRow?.let {
// Update object
/*
currentFilter?.id?.let { currentFilterId ->
Filter.getFilterBydId(getRealm(), currentFilterId)?.let { filter ->
currentFilter = filter
}
}
*/
selectedRow?.let {
rowRepresentableAdapter.refreshRow(it) rowRepresentableAdapter.refreshRow(it)
} }
} else if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal) { } else if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal) {
updateMostUsedFilters() 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) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
menu.clear() menu.clear()
inflater.inflate(R.menu.toolbar_editable_data, menu) inflater.inflate(R.menu.toolbar_editable_data, menu)
@ -109,10 +91,10 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
} }
override fun onBackPressed() { override fun onBackPressed() {
if (isUpdating) { if (this.model.isUpdating) {
cancelUpdates() cancelUpdates()
} else { } else {
activity?.finish() // activity?.finish()
} }
} }
@ -123,37 +105,6 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
return true return true
} }
override fun adapterRows(): List<RowRepresentable>? {
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 * Init UI
*/ */
@ -170,7 +121,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
} }
moreFilters.setOnClickListener { moreFilters.setOnClickListener {
LiveData.FILTER.subType = filterableType.uniqueIdentifier LiveData.FILTER.subType = this.model.filterableType?.uniqueIdentifier
FiltersListActivity.newSelectInstance(this, LiveData.FILTER.ordinal, false) FiltersListActivity.newSelectInstance(this, LiveData.FILTER.ordinal, false)
} }
@ -182,30 +133,34 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
*/ */
private fun initData() { 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<Filter>(it) ?: throw PAIllegalStateException("Can't find filter with id=$it") this.rowRepresentableAdapter = RowRepresentableAdapter(this.model, this)
currentFilter = realm.copyFromRealm(filter) this.recyclerView.adapter = rowRepresentableAdapter
isUpdating = true
} ?: run {
currentFilter = Filter.newInstance(this.filterableType.uniqueIdentifier) //realm.copyFromRealm(Filter.newInstanceForResult(realm, this.filterableType.ordinal))
}
// Create a copy if the user cancels the updates
currentFilter?.let {
if (it.isValid && it.isManaged) {
filterCopy = getRealm().copyFromRealm(it)
}
} }
rows.clear() override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) {
rows.addAll(FilterCategoryRow.values(this.filterableType)) super.onRowSelected(position, row, tag)
this.model.selectedCategoryRow = row
this.model.currentFilter?.id?.let { filterId ->
this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) (activity as FiltersActivity).showDetailsFragment()
this.recyclerView.adapter = rowRepresentableAdapter
// 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() { private fun updateMostUsedFilters() {
var nbChips = 0 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()) 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 mostUsedFiltersLayout.visibility = View.GONE
return return
} }
@ -265,6 +220,8 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
* Validate the updates of the queryWith * Validate the updates of the queryWith
*/ */
private fun validateUpdates() { private fun validateUpdates() {
val currentFilter = this.model.currentFilter
getRealm().executeTransaction { realm -> getRealm().executeTransaction { realm ->
currentFilter?.let { currentFilter?.let {
it.name = it.query.getName(requireContext()) it.name = it.query.getName(requireContext())
@ -280,6 +237,9 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
* Cancel the latest updates of the queryWith * Cancel the latest updates of the queryWith
*/ */
private fun cancelUpdates() { private fun cancelUpdates() {
val filterCopy = this.model.filterCopy
val filterId = filterCopy?.id ?: "" val filterId = filterCopy?.id ?: ""
getRealm().executeTransaction { realm -> getRealm().executeTransaction { realm ->
filterCopy?.let { filterCopy?.let {

Loading…
Cancel
Save