Merge branch 'dev' of gitlab.com:stax-river/poker-analytics into dev

dev
Laurent 7 years ago
commit 8eaa5b0b94
  1. 10
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  2. 3
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  3. 6
      app/src/main/java/net/pokeranalytics/android/ui/activity/FilterDetailsActivity.kt
  4. 1
      app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersActivity.kt
  5. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt
  6. 20
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt
  7. 24
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt
  8. 137
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt
  9. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt
  10. 48
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/FilterableFragment.kt
  11. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt
  12. 17
      app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt
  13. 12
      app/src/main/res/layout/fragment_feed.xml
  14. 53
      app/src/main/res/layout/fragment_filters.xml
  15. 41
      app/src/main/res/layout/view_selected_filter.xml

@ -236,10 +236,16 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
} }
/** /**
* Remove the deleted entries from realm * Clean the entries if the type is not a list & remove the deleted entries from realm
*/ */
fun cleanDeletedEntries(realm: Realm) { fun cleanEntries(realm: Realm) {
realm.executeTransaction { realm.executeTransaction {
if (!isListType) {
entriesToDelete.addAll(entries)
entries.clear()
}
entriesToDelete.forEach { entriesToDelete.forEach {
realm.where<CustomFieldEntry>().equalTo("id", it.id).findFirst()?.deleteFromRealm() realm.where<CustomFieldEntry>().equalTo("id", it.id).findFirst()?.deleteFromRealm()
} }

@ -29,7 +29,8 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable {
fun newInstance(realm: Realm, filterableType:Int): Filter { fun newInstance(realm: Realm, filterableType:Int): Filter {
val filter = Filter() val filter = Filter()
filter.filterableTypeOrdinal = filterableType filter.filterableTypeOrdinal = filterableType
return realm.copyToRealm(filter) return filter
//return realm.copyToRealm(filter)
} }
// Get a queryWith by its id // Get a queryWith by its id

@ -5,6 +5,7 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.FilterDetailsFragment import net.pokeranalytics.android.ui.fragment.FilterDetailsFragment
@ -16,6 +17,7 @@ class FilterDetailsActivity : PokerAnalyticsActivity() {
} }
companion object { companion object {
/** /**
* Default constructor * Default constructor
*/ */
@ -29,7 +31,8 @@ class FilterDetailsActivity : PokerAnalyticsActivity() {
/** /**
* Create a new instance for result * Create a new instance for result
*/ */
fun newInstanceForResult(fragment: Fragment, filterId: String, filterCategoryOrdinal: Int, requestCode: Int) { fun newInstanceForResult(fragment: Fragment, filterId: String, filterCategoryOrdinal: Int, requestCode: Int, filter: Filter? = null) {
val intent = Intent(fragment.requireContext(), FilterDetailsActivity::class.java) val intent = Intent(fragment.requireContext(), FilterDetailsActivity::class.java)
intent.putExtra(IntentKey.FILTER_ID.keyName, filterId) intent.putExtra(IntentKey.FILTER_ID.keyName, filterId)
intent.putExtra(IntentKey.FILTER_CATEGORY_ORDINAL.keyName, filterCategoryOrdinal) intent.putExtra(IntentKey.FILTER_CATEGORY_ORDINAL.keyName, filterCategoryOrdinal)
@ -63,7 +66,6 @@ class FilterDetailsActivity : PokerAnalyticsActivity() {
fragmentTransaction.add(R.id.container, fragment) fragmentTransaction.add(R.id.container, fragment)
fragmentTransaction.commit() fragmentTransaction.commit()
fragment.setData(filterId, filterCategoryOrdinal) fragment.setData(filterId, filterCategoryOrdinal)
} }
} }

@ -5,7 +5,6 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.FiltersFragment import net.pokeranalytics.android.ui.fragment.FiltersFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode

@ -134,7 +134,6 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource
EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS) EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS)
} }
} }
} }
} }

@ -1,6 +1,5 @@
package net.pokeranalytics.android.ui.fragment package net.pokeranalytics.android.ui.fragment
import android.app.Activity
import android.app.Activity.RESULT_OK import android.app.Activity.RESULT_OK
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
@ -28,11 +27,11 @@ import net.pokeranalytics.android.ui.adapter.FeedTransactionRowRepresentableAdap
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.FilterableFragment import net.pokeranalytics.android.ui.fragment.components.FilterableFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode
import net.pokeranalytics.android.ui.interfaces.FilterHandler
import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.interfaces.FilterableType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.Preferences
import timber.log.Timber
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
@ -85,7 +84,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
if (data.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false)) { if (data.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false)) {
deleteSelectedTransaction() deleteSelectedTransaction()
} }
} else if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal && resultCode == Activity.RESULT_OK) { } else if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal && resultCode == RESULT_OK) {
data?.let { data?.let {
this.saveFilter(this.requireContext(), it.getStringExtra(FiltersActivity.IntentKey.FILTER_ID.keyName)) this.saveFilter(this.requireContext(), it.getStringExtra(FiltersActivity.IntentKey.FILTER_ID.keyName))
} }
@ -99,15 +98,17 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
realmTransactions.removeAllChangeListeners() realmTransactions.removeAllChangeListeners()
} }
/*
override fun setUserVisibleHint(isVisibleToUser: Boolean) { override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser) super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser) { if (isVisibleToUser && view != null) {
if (FilterHandler.filterWasUpdated) { if (FilterHandler.filterWasUpdated) {
this.initData() this.initData()
FilterHandler.filterWasUpdated = false FilterHandler.filterWasUpdated = false
} }
} }
} }
*/
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) { when (row) {
@ -174,15 +175,14 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
val sdf = SimpleDateFormat("dd/M/yyyy hh:mm", Locale.getDefault()) val sdf = SimpleDateFormat("dd/M/yyyy hh:mm", Locale.getDefault())
betaLimitDate = sdf.parse("17/7/2019 10:00") betaLimitDate = sdf.parse("17/7/2019 10:00")
val filter : Filter? = this.currentFilter(this.requireContext(), getRealm())
this.loadSessions(filter)
this.loadTransactions(filter)
val viewManager = SmoothScrollLinearLayoutManager(requireContext()) val viewManager = SmoothScrollLinearLayoutManager(requireContext())
recyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager layoutManager = viewManager
adapter = feedSessionAdapter
} }
applyFilter()
} }
private fun loadSessions(filter : Filter? = null) { private fun loadSessions(filter : Filter? = null) {
@ -204,6 +204,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
val pendingSessions = sessionFilter?.let { getRealm().where<Session>().alwaysFalse().findAll() } ?: run { getRealm().where<Session>().isNull("year").isNull("month").findAll().sort("startDate", Sort.DESCENDING) } val pendingSessions = sessionFilter?.let { getRealm().where<Session>().alwaysFalse().findAll() } ?: run { getRealm().where<Session>().isNull("year").isNull("month").findAll().sort("startDate", Sort.DESCENDING) }
val distinctDateSessions = sessionFilter?.results("year", "month") ?: run { getRealm().where<Session>().distinct("year", "month").findAll() }.sort("startDate", Sort.DESCENDING) val distinctDateSessions = sessionFilter?.results("year", "month") ?: run { getRealm().where<Session>().distinct("year", "month").findAll() }.sort("startDate", Sort.DESCENDING)
this.feedSessionAdapter = FeedSessionRowRepresentableAdapter(this, realmSessions, pendingSessions, distinctDateSessions) this.feedSessionAdapter = FeedSessionRowRepresentableAdapter(this, realmSessions, pendingSessions, distinctDateSessions)
recyclerView.adapter = feedSessionAdapter
} }
private fun loadTransactions(filter : Filter? = null) { private fun loadTransactions(filter : Filter? = null) {
@ -287,6 +288,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
} }
override fun applyFilter() { override fun applyFilter() {
super.applyFilter()
Timber.d("applyFilter")
val filter: Filter? = this.currentFilter(this.requireContext(), getRealm()) val filter: Filter? = this.currentFilter(this.requireContext(), getRealm())
this.loadSessions(filter) this.loadSessions(filter)
this.loadTransactions(filter) this.loadTransactions(filter)
@ -300,6 +303,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
} }
override fun removeFilter() { override fun removeFilter() {
super.removeFilter()
this.loadSessions() this.loadSessions()
this.loadTransactions() this.loadTransactions()
if (currentFilterable== FilterableType.SESSION) { if (currentFilterable== FilterableType.SESSION) {

@ -5,7 +5,6 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@ -22,15 +21,11 @@ import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
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.RowRepresentableEditDescriptor
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.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
import net.pokeranalytics.android.util.extensions.shortDate
import net.pokeranalytics.android.util.extensions.shortTime
import net.pokeranalytics.android.util.extensions.toMinutes
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -45,10 +40,7 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataS
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()
private var filterMenu: Menu? = null
private val selectedRows = ArrayList<QueryCondition>() private val selectedRows = ArrayList<QueryCondition>()
private var isUpdating = false
private var shouldOpenKeyboard = true
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)
@ -70,15 +62,20 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataS
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
super.onRowSelected(position, row, fromAction) super.onRowSelected(position, row, fromAction)
Timber.d("Row: $row")
if (row.viewType == RowViewType.TITLE_CHECK.ordinal) { if (row.viewType == RowViewType.TITLE_CHECK.ordinal) {
updateRowsSelection(row) updateRowsSelection(row)
return return
} }
when (row) { when (row) {
is QueryCondition.DateQuery -> DateTimePickerManager.create(requireContext(), row, this, row.singleValue, onlyDate = !row.showTime, onlyTime = row.showTime) is QueryCondition.DateQuery -> DateTimePickerManager.create(
requireContext(),
row,
this,
row.singleValue,
onlyDate = !row.showTime,
onlyTime = row.showTime
)
is QueryCondition.Duration -> { is QueryCondition.Duration -> {
var hours: String? = null var hours: String? = null
var minutes: String? = null var minutes: String? = null
@ -189,8 +186,8 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataS
*/ */
private fun initData() { private fun initData() {
currentFilter = Filter.getFilterBydId(getRealm(), primaryKey) //currentFilter = Filter.getFilterBydId(getRealm(), primaryKey)
currentFilter = FiltersFragment.currentFilter
this.appBar.toolbar.title = filterCategoryRow.localizedTitle(requireContext()) this.appBar.toolbar.title = filterCategoryRow.localizedTitle(requireContext())
@ -257,7 +254,6 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataS
Timber.d("Condition: $it") Timber.d("Condition: $it")
} }
finishActivityWithResult(currentFilter?.id) finishActivityWithResult(currentFilter?.id)
} }

@ -12,7 +12,9 @@ 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.model.LiveData
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.DataListActivity
import net.pokeranalytics.android.ui.activity.FilterDetailsActivity import net.pokeranalytics.android.ui.activity.FilterDetailsActivity
import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
@ -20,6 +22,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource 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.interfaces.FilterActivityRequestCode
import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.interfaces.FilterableType
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.ui.view.rowrepresentable.FilterCategoryRow
@ -32,11 +35,13 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
companion object { companion object {
const val REQUEST_CODE_FILTER_DETAILS = 100 const val REQUEST_CODE_FILTER_DETAILS = 100
var currentFilter: Filter? = null
} }
private lateinit var rowRepresentableAdapter: RowRepresentableAdapter private lateinit var rowRepresentableAdapter: RowRepresentableAdapter
private var currentFilter: Filter? = null
private var filterCopy: Filter? = null private var filterCopy: Filter? = null
private var rows: ArrayList<RowRepresentable> = ArrayList() private var rows: ArrayList<RowRepresentable> = ArrayList()
@ -46,6 +51,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
private var selectedRow: RowRepresentable? = null private var selectedRow: RowRepresentable? = null
private var isUpdating = false private var isUpdating = false
private var isSaved = false
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)
@ -56,24 +62,38 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initUI() initUI()
initData() initData()
updateMostUsedFilters()
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
Timber.d("requestCode: $requestCode")
Timber.d("resultCode: $resultCode")
Timber.d("data: $data")
if (requestCode == REQUEST_CODE_FILTER_DETAILS && resultCode == RESULT_OK) { if (requestCode == REQUEST_CODE_FILTER_DETAILS && resultCode == RESULT_OK) {
// Update object
/* /*
Timber.d("onActivityResult: $requestCode") currentFilter?.id?.let { currentFilterId ->
if (data != null && data.hasExtra(FilterDetailsActivity.IntentKey.FILTER_ID.keyName)) { Filter.getFilterBydId(getRealm(), currentFilterId)?.let { filter ->
val filterId = data.getStringExtra(FilterDetailsActivity.IntentKey.FILTER_ID.keyName) currentFilter = filter
Timber.d("Updated queryWith: ${filterId}") }
} }
*/ */
selectedRow?.let { selectedRow?.let {
rowRepresentableAdapter.refreshRow(it) rowRepresentableAdapter.refreshRow(it)
} }
} else if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal) {
updateMostUsedFilters()
if (resultCode == RESULT_OK && data != null && data.hasExtra(FiltersActivity.IntentKey.FILTER_ID.keyName)) {
val filterId = data.getStringExtra(FiltersActivity.IntentKey.FILTER_ID.keyName)
finishActivityWithResult(filterId)
}
} }
} }
@ -96,7 +116,6 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
override fun onOptionsItemSelected(item: MenuItem?): Boolean { override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item!!.itemId) { when (item!!.itemId) {
R.id.save -> validateUpdates() R.id.save -> validateUpdates()
R.id.delete -> deleteFilter()
} }
return true return true
} }
@ -142,48 +161,9 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
layoutManager = viewManager layoutManager = viewManager
} }
val filters = getRealm().sorted(Filter::class.java) moreFilters.setOnClickListener {
val currentFilterId = Preferences.getActiveFilterId(requireContext()) DataListActivity.newSelectInstance(this, LiveData.FILTER.ordinal)
mostUsedFilters.removeAllViews()
filters.forEachIndexed { index, filter ->
if (index < 5) {
val chip = Chip(requireContext())
chip.id = View.generateViewId()
chip.tag = filter.id
chip.text = filter.getDisplayName(requireContext())
chip.chipStartPadding = 8f.px
chip.chipEndPadding = 8f.px
chip.isCloseIconVisible = true
chip.isChecked = filter.id == currentFilterId
chip.setOnCloseIconClickListener {
Preferences.removeActiveFilterId(requireContext())
chip.isChecked = false
}
chip.setOnClickListener {
deleteFilter(false)
finishActivityWithResult(filter.id)
}
mostUsedFilters.addView(chip)
}
}
/*
Limit.values().forEach {
val chip = Chip(requireContext())
chip.id = it.ordinal
chip.text = it.shortName
chip.chipStartPadding = 8f.px
chip.chipEndPadding = 8f.px
chip.isChecked = false
mostUsedFilters.addView(chip)
} }
mostUsedFilters.setOnCheckedChangeListener { _, i ->
}
*/
} }
/** /**
@ -198,18 +178,20 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
Timber.d("Filters: ${filters.size}") Timber.d("Filters: ${filters.size}")
primaryKey?.let { primaryKey?.let {
currentFilter = Filter.getFilterBydId(realm, it) currentFilter = realm.copyFromRealm(Filter.getFilterBydId(realm, it))
isUpdating = true isUpdating = true
} ?: run { } ?: run {
realm.beginTransaction() realm.beginTransaction()
currentFilter = Filter.newInstance(realm, this.filterableType.ordinal) currentFilter = Filter.newInstance(realm, this.filterableType.ordinal) //realm.copyFromRealm(Filter.newInstance(realm, this.filterableType.ordinal))
realm.commitTransaction() realm.commitTransaction()
} }
// Create a copy if the user cancels the updates // Create a copy if the user cancels the updates
currentFilter?.let { currentFilter?.let {
if (it.isValid && it.isManaged) {
filterCopy = getRealm().copyFromRealm(it) filterCopy = getRealm().copyFromRealm(it)
} }
}
rows.clear() rows.clear()
rows.addAll(FilterCategoryRow.values(this.filterableType)) rows.addAll(FilterCategoryRow.values(this.filterableType))
@ -219,12 +201,55 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
} }
/**
* Update the most used filters chips
*/
private fun updateMostUsedFilters() {
if (isUpdating) {
mostUsedFiltersLayout.visibility = View.GONE
return
}
val filters = getRealm().sorted(Filter::class.java)
val currentFilterId = Preferences.getActiveFilterId(requireContext())
mostUsedFilters.removeAllViews()
filters.forEachIndexed { index, filter ->
if (index < 3) {
val chip = Chip(requireContext())
chip.id = View.generateViewId()
chip.tag = filter.id
chip.text = filter.getDisplayName(requireContext())
chip.chipStartPadding = 8f.px
chip.chipEndPadding = 8f.px
chip.isChecked = filter.id == currentFilterId
chip.setOnCloseIconClickListener {
chip.isChecked = false
}
chip.setOnClickListener {
if (chip.isChecked) {
deleteFilter(false)
finishActivityWithResult(filter.id)
} else {
Preferences.removeActiveFilterId(requireContext())
deleteFilter(true)
}
}
mostUsedFilters.addView(chip)
}
}
}
/** /**
* Update menu UI * Update menu UI
*/ */
private fun updateMenuUI() { private fun updateMenuUI() {
filterMenu?.findItem(R.id.delete)?.isVisible = isUpdating
filterMenu?.findItem(R.id.save)?.isVisible = true filterMenu?.findItem(R.id.save)?.isVisible = true
filterMenu?.findItem(R.id.delete)?.isVisible = false
} }
/** /**
@ -232,6 +257,16 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
*/ */
private fun validateUpdates() { private fun validateUpdates() {
Timber.d("Validate queryWith updates") Timber.d("Validate queryWith updates")
val realm = getRealm()
realm.beginTransaction()
currentFilter?.let {
it.name = it.query.getName(requireContext())
Timber.d("name: ${it.name}")
realm.copyToRealmOrUpdate(it)
}
realm.commitTransaction()
val filterId = currentFilter?.id ?: "" val filterId = currentFilter?.id ?: ""
finishActivityWithResult(filterId) finishActivityWithResult(filterId)
} }
@ -258,10 +293,12 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
*/ */
private fun deleteFilter(closeActivity: Boolean = true) { private fun deleteFilter(closeActivity: Boolean = true) {
Timber.d("Delete queryWith") Timber.d("Delete queryWith")
if (currentFilter?.isValid == true && currentFilter?.isManaged == true) {
val realm = getRealm() val realm = getRealm()
realm.beginTransaction() realm.beginTransaction()
currentFilter?.deleteFromRealm() currentFilter?.deleteFromRealm()
realm.commitTransaction() realm.commitTransaction()
}
if (closeActivity) { if (closeActivity) {
finishActivityWithResult("") finishActivityWithResult("")

@ -15,8 +15,10 @@ import kotlinx.coroutines.launch
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Deletable
import net.pokeranalytics.android.model.interfaces.Identifiable 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.DataListActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import timber.log.Timber
/** /**
* Deletable Item Fragment * Deletable Item Fragment
@ -87,6 +89,8 @@ abstract class DeletableItemFragment : RealmFragment() {
val deletableItem = (itemToDelete as Deletable) val deletableItem = (itemToDelete as Deletable)
Timber.d("deletableItem: ${(deletableItem as Filter).getDisplayName(requireContext())}")
// Check if the object is valid for the deletion // Check if the object is valid for the deletion
if (deletableItem.isValidForDelete(this.getRealm())) { if (deletableItem.isValidForDelete(this.getRealm())) {
deletedItem = getRealm().copyFromRealm(itemToDelete) deletedItem = getRealm().copyFromRealm(itemToDelete)

@ -3,11 +3,16 @@ package net.pokeranalytics.android.ui.fragment.components
import android.os.Bundle import android.os.Bundle
import android.view.* import android.view.*
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import net.pokeranalytics.android.R import kotlinx.android.synthetic.main.view_selected_filter.view.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import net.pokeranalytics.android.ui.interfaces.FilterHandler import net.pokeranalytics.android.ui.interfaces.FilterHandler
import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.interfaces.FilterableType
import timber.log.Timber import timber.log.Timber
/** /**
* A class which define the fragment as Filterable * A class which define the fragment as Filterable
* - Add an filter icon menu * - Add an filter icon menu
@ -29,18 +34,18 @@ open class FilterableFragment: RealmFragment(), FilterHandler {
super.onCreateOptionsMenu(menu, inflater) super.onCreateOptionsMenu(menu, inflater)
Timber.d("onCreateOptionsMenu") Timber.d("onCreateOptionsMenu")
view?.findViewById<Toolbar>(R.id.toolbar)?.let { toolbar -> view?.findViewById<Toolbar>(net.pokeranalytics.android.R.id.toolbar)?.let { toolbar ->
Timber.d("toolbar menu ${toolbar.menu}") Timber.d("toolbar menu ${toolbar.menu}")
toolbar.menu.removeItem(R.id.menu_item_filter) toolbar.menu.removeItem(net.pokeranalytics.android.R.id.menu_item_filter)
filterMenuItem = toolbar.menu?.add(0, R.id.menu_item_filter, 0, R.string.filter) filterMenuItem = toolbar.menu?.add(0, net.pokeranalytics.android.R.id.menu_item_filter, 0, net.pokeranalytics.android.R.string.filter)
filterMenuItem?.setIcon(R.drawable.ic_outline_filter_list) filterMenuItem?.setIcon(net.pokeranalytics.android.R.drawable.ic_outline_filter_list)
filterMenuItem?.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) filterMenuItem?.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM)
} }
} }
override fun onOptionsItemSelected(item: MenuItem?): Boolean { override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item?.itemId) { when (item?.itemId) {
R.id.menu_item_filter -> { net.pokeranalytics.android.R.id.menu_item_filter -> {
manageFilters(this) manageFilters(this)
} }
} }
@ -51,9 +56,40 @@ open class FilterableFragment: RealmFragment(), FilterHandler {
} }
override fun applyFilter() { override fun applyFilter() {
displaySelectedFilter()
} }
override fun removeFilter() { override fun removeFilter() {
hideSelectedFilter()
}
private fun displaySelectedFilter() {
currentFilter(requireContext(), getRealm())?.let { filter ->
view?.findViewById<ViewGroup>(net.pokeranalytics.android.R.id.selectedFilter)?.let { viewGroup ->
val layoutCurrentFilter = LayoutInflater.from(requireContext()).inflate(net.pokeranalytics.android.R.layout.view_selected_filter, viewGroup, false)
layoutCurrentFilter.filterName.text = filter.getDisplayName(requireContext())
layoutCurrentFilter.deselectFilter.setOnClickListener {
saveFilter(requireContext(), "")
}
viewGroup.removeAllViews()
viewGroup.addView(layoutCurrentFilter)
GlobalScope.launch(Dispatchers.Main) {
delay(300)
viewGroup.visibility = View.VISIBLE
}
}
}
} }
private fun hideSelectedFilter() {
view?.findViewById<ViewGroup>(net.pokeranalytics.android.R.id.selectedFilter).let {
GlobalScope.launch(Dispatchers.Main) {
it?.visibility = View.GONE
}
}
}
} }

@ -202,7 +202,7 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa
override fun onDataSaved() { override fun onDataSaved() {
super.onDataSaved() super.onDataSaved()
customField.cleanDeletedEntries(getRealm()) customField.cleanEntries(getRealm())
} }
/** /**

@ -1,18 +1,12 @@
package net.pokeranalytics.android.ui.interfaces package net.pokeranalytics.android.ui.interfaces
import android.content.Context import android.content.Context
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import io.realm.Realm import io.realm.Realm
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.realm.Filter 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.ui.activity.FiltersActivity
import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.Preferences
import timber.log.Timber
enum class FilterActivityRequestCode { enum class FilterActivityRequestCode {
SELECT_FILTER, SELECT_FILTER,
@ -41,7 +35,11 @@ interface FilterHandler {
fun saveFilter(context: Context, filterId:String) { fun saveFilter(context: Context, filterId:String) {
Preferences.setActiveFilterId(filterId, context) Preferences.setActiveFilterId(filterId, context)
filterWasUpdated = true filterWasUpdated = true
if (filterId.isNotEmpty()) {
this.applyFilter() this.applyFilter()
} else {
this.removeFilter()
}
} }
fun currentFilter(context: Context, realm: Realm): Filter? { fun currentFilter(context: Context, realm: Realm): Filter? {
@ -62,6 +60,12 @@ interface FilterHandler {
val context = fragment.requireContext() val context = fragment.requireContext()
val filterId = Preferences.getActiveFilterId(context) val filterId = Preferences.getActiveFilterId(context)
FiltersActivity.newInstanceForResult(fragment = fragment, currentFilterable = currentFilterable)
/*
val filterSelected = filterId != null val filterSelected = filterId != null
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
@ -101,5 +105,6 @@ interface FilterHandler {
} }
builder.show() builder.show()
*/
} }
} }

@ -3,6 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container" android:id="@+id/container"
android:animateLayoutChanges="true"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.activity.HomeActivity"> tools:context=".ui.activity.HomeActivity">
@ -47,6 +48,15 @@
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/selectedFilter"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBar" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="0dp" android:layout_width="0dp"
@ -54,7 +64,7 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBar" app:layout_constraintTop_toBottomOf="@+id/selectedFilter"
tools:listitem="@layout/row_feed_session" /> tools:listitem="@layout/row_feed_session" />
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView

@ -19,17 +19,6 @@
app:title="Poker Analytics" app:title="Poker Analytics"
app:titleTextColor="@color/white" /> app:titleTextColor="@color/white" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/mostUsedFilters"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:chipSpacing="8dp"
app:singleSelection="true" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
@ -47,11 +36,51 @@
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toTopOf="@+id/mostUsedFiltersLayout"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/mostUsedFiltersLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:elevation="4dp"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.chip.ChipGroup
android:id="@+id/mostUsedFilters"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="8dp"
app:chipSpacing="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/moreFilters"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:singleSelection="true" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/moreFilters"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:fontFamily="@font/roboto_bold"
android:gravity="center"
android:padding="8dp"
android:text="@string/all"
android:textAllCaps="true"
android:textColor="@color/green"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/green_lighter_gradient">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/filterName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="16dp"
android:fontFamily="@font/roboto_medium"
android:textColor="@color/kaki_lighter"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/deselectFilter"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Cash Live" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/deselectFilter"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:background="?selectableItemBackgroundBorderless"
android:padding="4dp"
android:src="@drawable/ic_close"
android:tint="@color/kaki_lighter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save