From 3b240bee4f151caa2af6f53b1890447057f08d48 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 21 May 2019 11:07:01 +0200 Subject: [PATCH] handle filter refresh update getDisplayName management for query condition --- .../android/model/filter/Query.kt | 2 +- .../android/model/filter/QueryCondition.kt | 182 ++++++++++++------ .../android/model/realm/CustomField.kt | 5 +- .../android/model/realm/FilterCondition.kt | 4 + .../android/model/realm/Session.kt | 3 +- .../android/ui/fragment/FeedFragment.kt | 11 ++ .../ui/fragment/FilterDetailsFragment.kt | 24 +-- .../android/ui/fragment/StatisticsFragment.kt | 10 + .../android/ui/interfaces/FilterHandler.kt | 5 + .../view/rowrepresentable/FilterSectionRow.kt | 16 ++ 10 files changed, 191 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt index c81dcfd3..7663317e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt @@ -68,7 +68,7 @@ class Query { } } - println("<<<<<< ${realmQuery.description}") + //println("<<<<<< ${realmQuery.description}") val queryLast = this.conditions.filter { it is QueryCondition.Last }.firstOrNull() diff --git a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt index b180f37e..b85ad0e2 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt @@ -114,17 +114,29 @@ sealed class QueryCondition : FilterElementRow { abstract var listOfValues: ArrayList 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): 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: ListOfValues() where T:Comparable { @@ -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() { 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() @@ -198,10 +201,7 @@ sealed class QueryCondition : FilterElementRow { abstract class SingleInt: SingleValue() { 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 CustomFieldQuery() : QueryDataCondition() { + override var entity: Class = CustomField::class.java + constructor(customField: CustomField): this() { + this.setObject(customField) + } } - class CustomFieldNumberQuery() : ListOfString(), CustomFieldQuery { + 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(), CustomFieldQuery { + class CustomFieldAmountQuery : CustomFieldNumberQuery() { + override fun labelForValue(value: String, context: Context): String { + return value.toDouble().toCurrency(UserDefaults.currency) + } + } + + class CustomFieldListQuery() : QueryDataCondition(), CustomFieldRelated { override var entity: Class = 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(CustomFieldQuery::class.java)?.let { + realmQuery.equalTo(it, customFieldId) + } } return when (operator) { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt index 7a204e7c..ee0ace73 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt @@ -77,8 +77,11 @@ 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 { + + override fun localizedTitle(context: Context): String { return this.name } 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 432de572..35e8fba9 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 @@ -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 }) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index af15f84b..a8636a63 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -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 } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt index fa6d129e..9f4393ba 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt @@ -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) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index 6e114f1e..1d6a480e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -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,14 +100,12 @@ 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() - else -> super.stringForRow(row) - }?: NULL_TEXT - } + is QueryCondition.ListOfValues<*> -> row.firstValue(context) + else -> super.stringForRow(row) + } ?: NULL_TEXT + } override fun isSelected(row: RowRepresentable): Boolean { return selectedRows.contains(row) @@ -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,7 +147,10 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataS is QueryCondition.ListOfInt-> row.listOfValues = arrayListOf().apply { if (value != null && value is String) this.add(value.toInt()) } - } + is QueryCondition.ListOfString-> row.listOfValues = arrayListOf().apply { + if (value != null && value is String) this.add(value) + } + } // Remove the row before updating the selected rows list selectedRows.remove(row as FilterElementRow) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt index dee2be17..f4419aaf 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt @@ -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) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt b/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt index a2068f3b..cbfdd6a7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt @@ -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() } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt index 4428b680..414a73bc 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt @@ -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().apply { + this.forEach { + it.customFieldId = this@FilterSectionRow.customField.id + } + } } else { QueryCondition.moreOrLess().apply { this.forEach {