handle filter refresh

update getDisplayName management for query condition
dev
Razmig Sarkissian 7 years ago
parent dd1529cbc3
commit 3b240bee4f
  1. 2
      app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt
  2. 182
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  3. 3
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  4. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt
  5. 3
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  6. 11
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt
  7. 16
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt
  8. 10
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
  9. 5
      app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt
  10. 16
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt

@ -68,7 +68,7 @@ class Query {
}
}
println("<<<<<< ${realmQuery.description}")
//println("<<<<<< ${realmQuery.description}")
val queryLast = this.conditions.filter {
it is QueryCondition.Last
}.firstOrNull()

@ -114,17 +114,29 @@ sealed class QueryCondition : FilterElementRow {
abstract var listOfValues: ArrayList<T>
abstract fun labelForValue(value:T, context: Context): String
open fun entityName(context: Context): String {
return baseId
}
override fun getDisplayName(context: Context): String {
val prefix = this.resId?.let {
context.getString(it)+" "
} ?: ""
return when (listOfValues.size) {
0 -> return NULL_TEXT
1,2 -> listOfValues.map { labelForValue(it, context) }.joinToString(", ")
else -> "${listOfValues.size} $baseId"
1,2 -> prefix+ listOfValues.map { labelForValue(it, context) }.joinToString(", ")
else -> "${listOfValues.size} $prefix ${entityName(context)}"
}
}
override fun compareTo(other: ListOfValues<T>): Int {
return listOfValues.sorted().first().compareTo(other.listOfValues.sorted().first())
}
fun firstValue(context:Context): String? {
return this.listOfValues.firstOrNull()?.let { this.labelForValue(it, context) }
}
}
abstract class SingleValue<T>: ListOfValues<T>() where T:Comparable<T> {
@ -141,10 +153,7 @@ sealed class QueryCondition : FilterElementRow {
listOfValues = filterCondition.getValues()
}
override fun labelForValue(value: Double, context: Context): String {
val prefix = this.resId?.let {
context.getString(it)+" "
} ?: ""
return prefix+value.toCurrency(UserDefaults.currency)
return value.toCurrency(UserDefaults.currency)
}
}
@ -156,10 +165,7 @@ sealed class QueryCondition : FilterElementRow {
listOfValues = filterCondition.getValues()
}
override fun labelForValue(value: Int, context: Context): String {
val prefix = this.resId?.let {
context.getString(it)+" "
} ?: ""
return prefix+value.toString()
return value.toString()
}
}
@ -175,10 +181,7 @@ sealed class QueryCondition : FilterElementRow {
abstract class SingleDate: SingleValue<Date>() {
override fun labelForValue(value: Date, context: Context): String {
val prefix = this.resId?.let {
context.getString(it)+" "
} ?: ""
return prefix+value.shortDate()
return value.shortDate()
}
override var listOfValues = ArrayList<Date>()
@ -198,10 +201,7 @@ sealed class QueryCondition : FilterElementRow {
abstract class SingleInt: SingleValue<Int>() {
override fun labelForValue(value: Int, context: Context): String {
val prefix = this.resId?.let {
context.getString(it)+" "
} ?: ""
return prefix+value.toString()
return value.toString()
}
override var singleValue: Int?
@ -236,17 +236,22 @@ sealed class QueryCondition : FilterElementRow {
override fun getDisplayName(context: Context): String {
val realm = Realm.getDefaultInstance()
val entityName = entityName(realm)
val completeLabel = when (listOfValues.size) {
0 -> return NULL_TEXT
0 -> NULL_TEXT
1,2 -> {
return listOfValues.map { labelForValue(realm, it) }.joinToString(", ")
listOfValues.map { labelForValue(realm, it) }.joinToString(", ")
}
else -> "${listOfValues.size} $baseId"
else -> "${listOfValues.size} $entityName"
}
realm.close()
return completeLabel
}
open fun entityName(realm: Realm): String {
return baseId
}
private fun labelForValue(realm:Realm, value:String): String {
val query = realm.where(entity)
return query.equalTo("id", value).findFirst()?.name ?: NULL_TEXT
@ -261,6 +266,15 @@ sealed class QueryCondition : FilterElementRow {
abstract class DateQuery: SingleDate(), DateTime {
override val showTime: Boolean = false
override fun labelForValue(value: Date, context: Context): String {
return singleValue?.let {
if (showTime) {
it.shortTime()
} else {
it.shortDate()
}
} ?: NULL_TEXT
}
}
abstract class TimeQuery: DateQuery() {
@ -359,10 +373,11 @@ sealed class QueryCondition : FilterElementRow {
class NumberOfTable: ListOfInt() {
override fun labelForValue(value: Int, context: Context): String {
val prefix = this.resId?.let {
context.getString(it) + " "
} ?: ""
return prefix + value.toString() + " " + context.getString(R.string.tables)
return value.toString()
}
override fun entityName(context: Context): String {
return context.getString(R.string.number_of_tables)
}
}
@ -373,10 +388,7 @@ sealed class QueryCondition : FilterElementRow {
}
override fun labelForValue(value: Double, context: Context): String {
val prefix = this.resId?.let {
context.getString(it) + " "
} ?: ""
return prefix + value.toString()
return value.toString()
}
}
@ -387,11 +399,8 @@ sealed class QueryCondition : FilterElementRow {
}
override fun labelForValue(value: Int, context: Context): String {
val prefix = this.resId?.let {
context.getString(it) + " "
} ?: ""
val nf = RuleBasedNumberFormat(Locale.getDefault(), RuleBasedNumberFormat.ORDINAL)
return prefix + nf.format(value)
return nf.format(value)
}
}
@ -402,10 +411,11 @@ sealed class QueryCondition : FilterElementRow {
class TournamentNumberOfPlayer: ListOfInt() {
override fun labelForValue(value: Int, context: Context): String {
val prefix = this.resId?.let {
context.getString(it) + " "
} ?: ""
return prefix + value.toString() + context.getString(R.string.number_of_players)
return value.toString()
}
override fun entityName(context: Context): String {
return context.getString(R.string.number_of_players)
}
}
@ -451,10 +461,7 @@ sealed class QueryCondition : FilterElementRow {
class TournamentFee: ListOfDouble() {
override fun labelForValue(value: Double, context: Context): String {
val prefix = this.resId?.let {
context.getString(it)+" "
} ?: ""
return prefix+value.toCurrency(UserDefaults.currency)
return value.toCurrency(UserDefaults.currency)
}
}
@ -463,10 +470,13 @@ sealed class QueryCondition : FilterElementRow {
override val viewType: Int = RowViewType.TITLE_VALUE_CHECK.ordinal
override fun labelForValue(value: Int, context: Context): String {
val suffix = this.resId?.let {
return value.toString()
}
override fun entityName(context: Context): String {
return this.resId?.let {
" "+context.getString(it)
} ?: ""
return value.toString() + suffix
}
}
@ -478,42 +488,100 @@ sealed class QueryCondition : FilterElementRow {
override val viewType: Int = RowViewType.TITLE_VALUE_CHECK.ordinal
override val bottomSheetType: BottomSheetType = BottomSheetType.DOUBLE_EDIT_TEXT
override fun labelForValue(value: Int, context: Context): String {
val nf = RuleBasedNumberFormat(Locale.getDefault(), RuleBasedNumberFormat.DURATION)
return nf.format(value.toDouble())
}
}
class StartedFromTime(startTime:Date = Date().startOfDay()): TimeQuery() {
class StartedFromTime: TimeQuery() {
override var operator = Operator.MORE
init {
this.listOfValues = arrayListOf()
}
}
class EndedToTime(endTime:Date = Date().endOfDay()): TimeQuery() {
class EndedToTime: TimeQuery() {
override var operator = Operator.LESS
init {
this.listOfValues = arrayListOf()
}
}
interface CustomFieldQuery {
interface CustomFieldRelated {
var customFieldId : String?
fun customFieldName(realm: Realm): String {
val query = realm.where(CustomField::class.java)
val name = query.equalTo("id", customFieldId).findFirst()?.name
return name?.let {
"$it "
} ?: run { "" }
}
}
class CustomFieldNumberQuery() : ListOfString(), CustomFieldQuery {
class CustomFieldQuery() : QueryDataCondition<CustomField>() {
override var entity: Class<CustomField> = CustomField::class.java
constructor(customField: CustomField): this() {
this.setObject(customField)
}
}
open class CustomFieldNumberQuery() : ListOfString(), CustomFieldRelated {
override var customFieldId : String? = null
override var operator: Operator = Operator.EQUALS
constructor(customFieldId: String, value: Double): this() {
this.listOfValues = arrayListOf(value.toString())
this.customFieldId = customFieldId
}
override fun getDisplayName(context: Context): String {
val realm = Realm.getDefaultInstance()
val name = customFieldName(realm)
val prefix = this.resId?.let {
context.getString(it)+" "
} ?: ""
val completeLabel = when (listOfValues.size) {
0 -> return NULL_TEXT
1,2 -> {
return name+prefix+listOfValues.map { labelForValue(it, context) }.joinToString(", ")
}
else -> "${listOfValues.size} $prefix $name"
}
realm.close()
return completeLabel
}
override fun labelForValue(value: String, context: Context): String {
return value
}
override fun updateValueBy(filterCondition: FilterCondition) {
super.updateValueBy(filterCondition)
listOfValues = filterCondition.getValues()
customFieldId = filterCondition.stringValue
}
}
class CustomFieldListQuery() : QueryDataCondition<CustomFieldEntry>(), CustomFieldQuery {
class CustomFieldAmountQuery : CustomFieldNumberQuery() {
override fun labelForValue(value: String, context: Context): String {
return value.toDouble().toCurrency(UserDefaults.currency)
}
}
class CustomFieldListQuery() : QueryDataCondition<CustomFieldEntry>(), CustomFieldRelated {
override var entity: Class<CustomFieldEntry> = CustomFieldEntry::class.java
override var customFieldId : String? = null
constructor(customFieldEntry: CustomFieldEntry): this() {
this.setObject(customFieldEntry)
this.customFieldId = customFieldEntry.customField?.id
}
override fun entityName(realm: Realm): String {
return customFieldName(realm)
}
override fun updateValueBy(filterCondition: FilterCondition) {
super.updateValueBy(filterCondition)
listOfValues = filterCondition.getValues()
customFieldId = filterCondition.stringValue
}
}
/**
@ -608,8 +676,10 @@ sealed class QueryCondition : FilterElementRow {
}
}
if (this is CustomFieldQuery) {
realmQuery.equalTo("customFieldEntries.customField.id", customFieldId)
if (this is CustomFieldRelated) {
FilterHelper.fieldNameForQueryType<T>(CustomFieldQuery::class.java)?.let {
realmQuery.equalTo(it, customFieldId)
}
}
return when (operator) {

@ -77,6 +77,9 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
val isListType: Boolean
get() { return this.type == Type.LIST.uniqueIdentifier }
val isAmountType: Boolean
get() { return this.type == Type.AMOUNT.uniqueIdentifier }
override fun localizedTitle(context: Context): String {
return this.name

@ -19,6 +19,10 @@ open class FilterCondition() : RealmObject() {
this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName
this.operator = row.operator.ordinal
when (row) {
is QueryCondition.CustomFieldRelated -> {
this.setValues(filterElementRows.flatMap { (it as QueryCondition.ListOfString).listOfValues })
this.stringValue = row.customFieldId
}
is QueryCondition.SingleInt -> this.setValue(row.singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing)
is QueryCondition.SingleDate -> this.setValue(row.singleValue?:throw PokerAnalyticsException.FilterElementExpectedValueMissing)
is QueryCondition.ListOfDouble -> this.setValues(filterElementRows.flatMap { (it as QueryCondition.ListOfDouble).listOfValues })

@ -95,7 +95,8 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
EndedToTime::class.java -> "endDateHourMinuteComponent"
Duration::class.java -> "netDuration"
CustomFieldListQuery::class.java -> "customFieldEntries.id"
CustomFieldNumberQuery::class.java -> "customFieldEntries.value"
CustomFieldAmountQuery::class.java, CustomFieldNumberQuery::class.java -> "customFieldEntries.value"
CustomFieldQuery::class.java -> "customFieldEntries.customField.id"
else -> null
}
}

@ -28,6 +28,7 @@ import net.pokeranalytics.android.ui.adapter.FeedTransactionRowRepresentableAdap
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.FilterableFragment
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.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
@ -98,6 +99,16 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
realmTransactions.removeAllChangeListeners()
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser) {
if (FilterHandler.filterWasUpdated) {
this.initData()
FilterHandler.filterWasUpdated = false
}
}
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) {
is Session -> SessionActivity.newInstance(requireContext(), sessionId = (row as Editable).id)

@ -1,6 +1,7 @@
package net.pokeranalytics.android.ui.fragment
import android.app.Activity.RESULT_OK
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
@ -99,11 +100,9 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataS
}
}
override fun stringForRow(row: RowRepresentable): String {
override fun stringForRow(row: RowRepresentable, context: Context): String {
return when (row) {
is QueryCondition.DateQuery -> if (row.showTime) row.singleValue?.shortTime() else row.singleValue?.shortDate()
is QueryCondition.Duration -> row.minutes?.toMinutes(requireContext())
is QueryCondition.ListOfValues<*> -> row.listOfValues.firstOrNull()?.toString()
is QueryCondition.ListOfValues<*> -> row.firstValue(context)
else -> super.stringForRow(row)
} ?: NULL_TEXT
}
@ -132,11 +131,9 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataS
}
if (hours != null && minutes != null) {
row.minutes = hours * 60 + minutes
}
if (hours != null) {
} else if (hours != null) {
row.minutes = hours * 60
}
if (minutes != null) {
} else if (minutes != null) {
row.minutes = minutes
}
} else {
@ -150,6 +147,9 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataS
is QueryCondition.ListOfInt-> row.listOfValues = arrayListOf<Int>().apply {
if (value != null && value is String) this.add(value.toInt())
}
is QueryCondition.ListOfString-> row.listOfValues = arrayListOf<String>().apply {
if (value != null && value is String) this.add(value)
}
}
// Remove the row before updating the selected rows list

@ -64,6 +64,16 @@ class StatisticsFragment : FilterableFragment(), FilterHandler {
launchStatComputation()
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser) {
if (FilterHandler.filterWasUpdated) {
this.launchStatComputation()
FilterHandler.filterWasUpdated = false
}
}
}
private fun initUI() {
val fragmentTransaction = requireFragmentManager().beginTransaction()
val fragment = ComposableTableReportFragment.newInstance(null)

@ -30,6 +30,9 @@ enum class FilterableType {
}
interface FilterHandler {
companion object {
var filterWasUpdated: Boolean = false
}
fun createFilter()
fun applyFilter()
@ -37,6 +40,7 @@ interface FilterHandler {
fun saveFilter(context: Context, filterId:String) {
Preferences.setActiveFilterId(filterId, context)
filterWasUpdated = true
this.applyFilter()
}
@ -87,6 +91,7 @@ interface FilterHandler {
2 -> FiltersActivity.newInstanceForResult(fragment = fragment, filterId = filterId, currentFilterable = currentFilterable)
3 -> {
Preferences.removeActiveFilterId(context)
filterWasUpdated = true
removeFilter()
}
}

@ -1,5 +1,6 @@
package net.pokeranalytics.android.ui.view.rowrepresentable
import android.content.Context
import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.Criteria
@ -57,6 +58,15 @@ sealed class FilterSectionRow(override val resId: Int?) : RowRepresentable {
open val name = this::class.simpleName ?: throw PokerAnalyticsException.FilterElementUnknownName
override fun getDisplayName(context: Context): String {
when (this) {
is CustomField -> {
return customField.name
}
}
return name
}
val allowMultiSelection: Boolean
get() = (this.selectionType == SelectionType.MULTIPLE)
@ -124,6 +134,12 @@ sealed class FilterSectionRow(override val resId: Int?) : RowRepresentable {
is CustomField -> {
if (this@FilterSectionRow.customField.isListType) {
Criteria.ListCustomFields(this@FilterSectionRow.customField).queryConditions.mapFirstCondition()
} else if (this@FilterSectionRow.customField.isAmountType) {
QueryCondition.moreOrLess<QueryCondition.CustomFieldAmountQuery>().apply {
this.forEach {
it.customFieldId = this@FilterSectionRow.customField.id
}
}
} else {
QueryCondition.moreOrLess<QueryCondition.CustomFieldNumberQuery>().apply {
this.forEach {

Loading…
Cancel
Save