From 156ff4ce9898015612bf9ea137e593756a84c1a0 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 16:34:46 +0200 Subject: [PATCH 1/5] Fix string --- app/src/main/java/net/pokeranalytics/android/model/LiveData.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt index 7819c9b0..ac462a58 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -90,7 +90,7 @@ enum class LiveData : Localizable { * Return the update entity titleResId */ fun updateEntityLocalizedTitle(context: Context): String { - return "${context.getString(R.string.update_entity)} ${this.localizedTitle(context).toLowerCase()}" + return context.getString(R.string.update_entity, this.localizedTitle(context).toLowerCase()) } } From f70133a00e7fa82a89217647ec5eac4816ac3b75 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 16:48:24 +0200 Subject: [PATCH 2/5] Improve report creation --- .../android/ui/adapter/RowRepresentableAdapter.kt | 7 +++---- .../android/ui/fragment/ReportCreationFragment.kt | 4 +++- .../android/ui/fragment/data/EditableDataFragment.kt | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt index 29237a74..701a8a0f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt @@ -55,13 +55,12 @@ class RowRepresentableAdapter( return } - /* - val index = this.dataSource.indexForRow(row) + val index = this.dataSource.adapterRows()?.indexOf(row) ?: -1 if (index >= 0) { notifyItemChanged(index) } - */ - notifyDataSetChanged() + + //notifyDataSetChanged() } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt index 35ffa4b3..10adfdac 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt @@ -82,6 +82,7 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR setDisplayHomeAsUpEnabled(true) this.optionsAdapter = RowRepresentableAdapter(this, this) + this.optionsAdapter.setHasStableIds(true) val viewManager = LinearLayoutManager(requireContext()) recyclerView.apply { @@ -179,7 +180,7 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR this.updateUIWithCurrentStep() } else { this.next.isEnabled = this.assistant.nextEnabled - this.optionsAdapter.refreshRow(row) + this.optionsAdapter.notifyDataSetChanged() } } @@ -256,6 +257,7 @@ class Assistant { return when (this.step) { Step.STAT -> this.stats.contains(row as Stat) Step.COMPARATOR -> this.comparators.contains(row as Criteria) + Step.FILTER -> this.filter == row else -> false } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index abe4a9e5..4493bc52 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -89,6 +89,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat val dataSource = getDataSource() this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) + this.rowRepresentableAdapter.setHasStableIds(true) this.recyclerView.adapter = rowRepresentableAdapter // When creating an object, open automatically the keyboard for the first row From 2e302a53a6663c86f914095a249ea554d6accc46 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 24 May 2019 17:08:37 +0200 Subject: [PATCH 3/5] fix issue with realm sort, feed sessions & transactions sorting after adding filter fix issue with customfield unit test add a default name for filter & query add countableUsage interface to filter --- .../android/PokerAnalyticsApplication.kt | 14 +- .../android/model/filter/Query.kt | 9 + .../migrations/PokerAnalyticsMigration.kt | 239 +++++++++--------- .../android/model/realm/Filter.kt | 170 ++++++------- .../android/ui/fragment/DataListFragment.kt | 20 +- .../android/ui/fragment/FeedFragment.kt | 12 +- .../android/ui/interfaces/FilterHandler.kt | 12 + .../util/extensions/RealmExtensions.kt | 41 +-- 8 files changed, 270 insertions(+), 247 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 300616c1..da13bd7e 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -11,9 +11,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import net.pokeranalytics.android.model.migrations.Patcher import net.pokeranalytics.android.model.migrations.PokerAnalyticsMigration -import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.Session -import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.model.utils.Seed import net.pokeranalytics.android.util.FakeDataManager import net.pokeranalytics.android.util.PokerAnalyticsLogs @@ -42,13 +40,11 @@ class PokerAnalyticsApplication : Application() { .build() Realm.setDefaultConfiguration(realmConfiguration) - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - realm.where(Session::class.java).findAll().deleteAllFromRealm() - realm.where(ComputableResult::class.java).findAll().deleteAllFromRealm() - realm.where(SessionSet::class.java).findAll().deleteAllFromRealm() - } - realm.close() +// val realm = Realm.getDefaultInstance() +// realm.executeTransaction { +// realm.where(Session::class.java).findAll().deleteAllFromRealm() +// } +// realm.close() // Set up Crashlytics, disabled for debug builds val crashlyticsKit = Crashlytics.Builder() 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 6cb157d2..8e64dc1f 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 @@ -4,6 +4,7 @@ import android.content.Context import io.realm.RealmQuery import io.realm.kotlin.where import net.pokeranalytics.android.R +import net.pokeranalytics.android.util.NULL_TEXT fun List.mapFirstCondition() : List { return this.map { it.conditions.first() } @@ -41,6 +42,14 @@ class Query { this._conditions.addAll(queryConditions) } + val defaultName: String + get() { + return when (this._conditions.size) { + 0 -> NULL_TEXT + else -> this._conditions.joinToString("") { it.id.joinToString("") } + } + } + fun getName(context: Context): String { return when (this._conditions.size) { 0 -> context.getString(R.string.all_sessions) // @todo should be dependant of the underlying type, ie. Session, Transaction... diff --git a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt index 39f13fe0..bb59dd3c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt @@ -11,129 +11,132 @@ class PokerAnalyticsMigration : RealmMigration { override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) { - // DynamicRealm exposes an editable schema - val schema = realm.schema - - var currentVersion = oldVersion.toInt() - Timber.d("*** migrate from $oldVersion to $newVersion") - - // Migrate to version 1 - if (currentVersion == 0) { - Timber.d("*** Running migration 1") - - schema.get("Filter")?.addField("entityType", Int::class.java)?.setNullable("entityType", true) - schema.get("FilterElement")?.let { - it.setNullable("filterName", true) - it.setNullable("sectionName", true) - } - schema.get("FilterElementBlind")?.renameField("code", "currencyCode") - currentVersion++ - } - - // Migrate to version 2 - if (currentVersion == 1) { - Timber.d("*** Running migration ${currentVersion + 1}") - schema.rename("FilterElement", "FilterCondition") - - schema.get("Filter")?.renameField("filterElements", "filterConditions") - - schema.get("SessionSet")?.let { - it.addField("id", String::class.java).setRequired("id", true) - it.addPrimaryKey("id") - } - currentVersion++ - } - - // Migrate to version 3 - if (currentVersion == 2) { - Timber.d("*** Running migration ${currentVersion + 1}") - schema.rename("Report", "ReportSetup") - - schema.get("Filter")?.removeField("entityType") - - schema.get("Session")?.let { - it.addField("blinds", String::class.java).transform { - - } - } - - schema.get("FilterCondition")?.let { - it.removeField("blindValues") - it.removeField("numericValues") - - it.addField("operator", Integer::class.java) - it.addField("intValue", Integer::class.java) - it.addRealmListField("intValues", Integer::class.java) - it.addField("doubleValue", Double::class.java).setNullable("doubleValue", true) - it.addRealmListField("doubleValues", Double::class.java) - if (it.isRequired("doubleValues")) { - it.setRequired("doubleValues", false) - } - it.addField("stringValue", String::class.java) - } - - schema.get("ComputableResult")?.removeField("sessionSet") - - schema.get("Bankroll")?.addField("initialValue", Double::class.java) - - currentVersion++ - } - - // Migrate to version 4 - if (currentVersion == 3) { - Timber.d("*** Running migration ${currentVersion + 1}") - - schema.get("Result")?.addField("numberOfRebuy", Double::class.java)?.setNullable("numberOfRebuy", true) - currentVersion++ - } - - // Migrate to version 5 - if (currentVersion == 4) { - Timber.d("*** Running migration ${currentVersion + 1}") - schema.get("Bankroll")?.removeField("transactions") - currentVersion++ - } - - // Migrate to version 6 - if (currentVersion == 5) { - Timber.d("*** Running migration ${currentVersion + 1}") - schema.get("Transaction")?.let { - it.addField("dayOfWeek", Integer::class.java) - it.addField("month", Integer::class.java) - it.addField("year", Integer::class.java) - it.addField("dayOfMonth", Integer::class.java) - } - schema.create("CustomFieldEntry")?.let { - it.addField("id", String::class.java).setRequired("id", true) - it.addField("value", String::class.java).setNullable("value", false) - it.addField("order", Integer::class.java).setNullable("order", false) - it.addField("customField", CustomField::class.java).setNullable("customField", false) - } - schema.get("CustomField")?.let { - it.addField("type", Integer::class.java).setNullable("type", false) - it.addField("duplicateValue", Boolean::class.java) - it.addField("sortCondition", Integer::class.java) - it.addRealmListField("entries", CustomFieldEntry::class.java) - } - schema.get("ReportSetup")?.let { - it.addRealmListField("statIds", Int::class.java) - it.addRealmListField("criteriaIds", Int::class.java) - it.removeField("filters") - schema.get("Filter")?.let { filterSchema -> - it.addRealmObjectField("filter", filterSchema) - } - } + // DynamicRealm exposes an editable schema + val schema = realm.schema + + var currentVersion = oldVersion.toInt() + Timber.d("*** migrate from $oldVersion to $newVersion") + + // Migrate to version 1 + if (currentVersion == 0) { + Timber.d("*** Running migration 1") + + schema.get("Filter")?.addField("entityType", Int::class.java)?.setNullable("entityType", true) + schema.get("FilterElement")?.let { + it.setNullable("filterName", true) + it.setNullable("sectionName", true) + } + schema.get("FilterElementBlind")?.renameField("code", "currencyCode") + currentVersion++ + } + + // Migrate to version 2 + if (currentVersion == 1) { + Timber.d("*** Running migration ${currentVersion + 1}") + schema.rename("FilterElement", "FilterCondition") + + schema.get("Filter")?.renameField("filterElements", "filterConditions") + + schema.get("SessionSet")?.let { + it.addField("id", String::class.java).setRequired("id", true) + it.addPrimaryKey("id") + } + currentVersion++ + } + + // Migrate to version 3 + if (currentVersion == 2) { + Timber.d("*** Running migration ${currentVersion + 1}") + schema.rename("Report", "ReportSetup") + + schema.get("Filter")?.removeField("entityType") + schema.get("Session")?.let { - it.addField("startDateHourMinuteComponent", Double::class.java).setNullable("startDateHourMinuteComponent", true) - it.addField("endDateHourMinuteComponent", Double::class.java).setNullable("endDateHourMinuteComponent", true) - it.addRealmListField("customFieldEntries", CustomFieldEntry::class.java) + it.addField("blinds", String::class.java).transform { + + } } - schema.get("Filter")?.addField("filterableTypeOrdinal", Integer::class.java) + schema.get("FilterCondition")?.let { + it.removeField("blindValues") + it.removeField("numericValues") + + it.addField("operator", Integer::class.java) + it.addField("intValue", Integer::class.java) + it.addRealmListField("intValues", Integer::class.java) + it.addField("doubleValue", Double::class.java).setNullable("doubleValue", true) + it.addRealmListField("doubleValues", Double::class.java) + if (it.isRequired("doubleValues")) { + it.setRequired("doubleValues", false) + } + it.addField("stringValue", String::class.java) + } + + schema.get("ComputableResult")?.removeField("sessionSet") + + schema.get("Bankroll")?.addField("initialValue", Double::class.java) currentVersion++ - } - } + } + + // Migrate to version 4 + if (currentVersion == 3) { + Timber.d("*** Running migration ${currentVersion + 1}") + + schema.get("Result")?.addField("numberOfRebuy", Double::class.java)?.setNullable("numberOfRebuy", true) + currentVersion++ + } + + // Migrate to version 5 + if (currentVersion == 4) { + Timber.d("*** Running migration ${currentVersion + 1}") + schema.get("Bankroll")?.removeField("transactions") + currentVersion++ + } + + // Migrate to version 6 + if (currentVersion == 5) { + Timber.d("*** Running migration ${currentVersion + 1}") + schema.get("Transaction")?.let { + it.addField("dayOfWeek", Integer::class.java) + it.addField("month", Integer::class.java) + it.addField("year", Integer::class.java) + it.addField("dayOfMonth", Integer::class.java) + } + schema.create("CustomFieldEntry")?.let { + it.addField("id", String::class.java).setRequired("id", true) + it.addField("value", String::class.java).setNullable("value", false) + it.addField("order", Integer::class.java).setNullable("order", false) + it.addField("customField", CustomField::class.java).setNullable("customField", false) + } + schema.get("CustomField")?.let { + it.addField("type", Integer::class.java).setNullable("type", false) + it.addField("duplicateValue", Boolean::class.java) + it.addField("sortCondition", Integer::class.java) + it.addRealmListField("entries", CustomFieldEntry::class.java) + } + schema.get("ReportSetup")?.let { + it.addRealmListField("statIds", Int::class.java) + it.addRealmListField("criteriaIds", Int::class.java) + it.removeField("filters") + schema.get("Filter")?.let { filterSchema -> + it.addRealmObjectField("filter", filterSchema) + } + } + schema.get("Session")?.let { + it.addField("startDateHourMinuteComponent", Double::class.java) + .setNullable("startDateHourMinuteComponent", true) + it.addField("endDateHourMinuteComponent", Double::class.java) + .setNullable("endDateHourMinuteComponent", true) + it.addRealmListField("customFieldEntries", CustomFieldEntry::class.java) + } + + schema.get("Filter")?.addField("filterableTypeOrdinal", Integer::class.java) + schema.get("Filter")?.addField("useCount", Int::class.java) + schema.get("Filter")?.removeField("usageCount") + currentVersion++ + } + } override fun equals(other: Any?): Boolean { return other is RealmMigration diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index 02d35349..8f8ed502 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -8,15 +8,14 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.interfaces.CountableUsage import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.view.ImageDecorator import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow -import net.pokeranalytics.android.util.Preferences import java.util.* /** @@ -24,14 +23,14 @@ import java.util.* * It contains a list of [FilterCondition] describing the complete query to launch * The [Filter] is working closely with a [Filterable] interface providing the entity we want the query being launched on */ -open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, ImageDecorator { +open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, CountableUsage, ImageDecorator { companion object { // Create a new instance - fun newInstance(realm: Realm, filterableType: Int): Filter { + fun newInstance(realm: Realm, filterableType:Int): Filter { val filter = Filter() - filter.filterableTypeOrdinal = filterableType + filter.filterableTypeOrdinal = filterableType return filter //return realm.copyToRealm(filter) } @@ -41,26 +40,32 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Im return realm.where().equalTo("id", filterId).findFirst() } - inline fun queryOn(realm: Realm, query: Query, sortField: String? = null): RealmResults { - val realmQuery = realm.where() - sortField?.let { - return query.queryWith(realmQuery).sort(it).findAll() - } ?: run { - return query.queryWith(realmQuery).findAll() - } - } + inline fun queryOn(realm: Realm, query: Query, sortField: String? = null): RealmResults { + val realmQuery = realm.where() + sortField?.let { + return query.queryWith(realmQuery).sort(it).findAll() + } ?: run { + return query.queryWith(realmQuery).findAll() + } + } fun sortedByUsage(realm: Realm): RealmResults { return realm.where(Filter::class.java).findAll().sort("usageCount") } - } + } @PrimaryKey - override var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // the queryWith name var name: String = "" + get() { + if (field.isEmpty()) { + return this.query.defaultName + } + return field + } // the number of use of the queryWith, // for MutableRealmInteger, see https://realm.io/docs/java/latest/#counters @@ -69,121 +74,112 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Im var filterConditions: RealmList = RealmList() private set - private var filterableTypeOrdinal: Int? = null - - override val viewType: Int - get() = RowViewType.TITLE_VALUE_ACTION.ordinal - override val imageRes: Int? - get() = R.drawable.ic_outline_settings - override val imageTint: Int? - get() = R.color.green - override val imageClickable: Boolean? - get() = true - - val filterableType: FilterableType - get() { - this.filterableTypeOrdinal?.let { - return FilterableType.values()[it] - } - return FilterableType.ALL - } + private var filterableTypeOrdinal: Int? = null + + val filterableType: FilterableType + get() { + this.filterableTypeOrdinal?.let { + return FilterableType.values()[it] + } + return FilterableType.ALL + } fun createOrUpdateFilterConditions(filterConditionRows: ArrayList) { - println("list of querys saving: ${filterConditionRows.map { it.id }}") - println("list of querys previous: ${this.filterConditions.map { it.queryCondition.id }}") - filterConditionRows + println("list of querys saving: ${filterConditionRows.map { it.id }}") + println("list of querys previous: ${this.filterConditions.map { it.queryCondition.id }}") + filterConditionRows .map { it.groupId } .distinct() - .forEach { groupId -> + .forEach { groupId-> filterConditionRows .filter { it.groupId == groupId } .apply { - println("list of querys: ${this.map { it.id }}") - val casted = arrayListOf() - casted.addAll(this) - val newFilterCondition = FilterCondition(casted) - val previousCondition = filterConditions.filter { - it.filterName == newFilterCondition.filterName && it.operator == newFilterCondition.operator - } - filterConditions.removeAll(previousCondition) - filterConditions.add(newFilterCondition) - } + println("list of querys: ${this.map { it.id }}") + val casted = arrayListOf() + casted.addAll(this) + val newFilterCondition = FilterCondition(casted) + val previousCondition = filterConditions.filter { + it.filterName == newFilterCondition.filterName && it.operator == newFilterCondition.operator + } + filterConditions.removeAll(previousCondition) + filterConditions.add(newFilterCondition) + } } } - fun remove(filterCategoryRow: FilterCategoryRow) { - val sections = filterCategoryRow.filterSectionRows.map { it.name } - val savedSections = filterConditions.filter { sections.contains(it.sectionName) } - this.filterConditions.removeAll(savedSections) - } + fun remove(filterCategoryRow: FilterCategoryRow) { + val sections = filterCategoryRow.filterSectionRows.map { it.name } + val savedSections = filterConditions.filter { sections.contains(it.sectionName) } + this.filterConditions.removeAll(savedSections) + } fun countBy(filterCategoryRow: FilterCategoryRow): Int { val sections = filterCategoryRow.filterSectionRows.map { it.name } - println("list of sections $sections") - val savedSections = filterConditions.filter { sections.contains(it.sectionName) }.flatMap { it.queryCondition.id } - println("list of savedSections $savedSections") - return savedSections.size + println("list of sections $sections") + val savedSections = filterConditions.filter { sections.contains(it.sectionName) }.flatMap { it.queryCondition.id } + println("list of savedSections $savedSections") + return savedSections.size } fun contains(filterElementRow: QueryCondition): Boolean { - println("list of saved queries ${filterConditions.map { it.queryCondition.id }}") - println("list of contains ${filterElementRow.id}") - val contained = filterConditions.flatMap { it.queryCondition.id }.contains(filterElementRow.id.first()) - println("list of : $contained") - return contained + println("list of saved queries ${filterConditions.map { it.queryCondition.id }}") + println("list of contains ${filterElementRow.id}") + val contained = filterConditions.flatMap{ it.queryCondition.id }.contains(filterElementRow.id.first()) + println("list of : $contained") + return contained } /** * Get the saved value for the given [filterElementRow] */ - fun loadValueForElement(filterElementRow: QueryCondition) { + fun loadValueForElement(filterElementRow: QueryCondition) { val filtered = filterConditions.filter { it.queryCondition.id == filterElementRow.id } if (filtered.isNotEmpty()) { - return filterElementRow.updateValueBy(filtered.first()) + return filterElementRow.updateValueBy(filtered.first()) } } inline fun results(firstField: String? = null, secondField: String? = null): RealmResults { - val realmQuery = realm.where() + val realmQuery = realm.where() - if (firstField != null && secondField != null) { - return this.query.queryWith(realmQuery).distinct(firstField, secondField).findAll() - } + if (firstField != null && secondField != null) { + return this.query.queryWith(realmQuery).distinct(firstField, secondField).findAll() + } - if (firstField != null) { - return this.query.queryWith(realmQuery).distinct(firstField).findAll() - } + if (firstField != null) { + return this.query.queryWith(realmQuery).distinct(firstField).findAll() + } - return this.query.queryWith(realmQuery).findAll() - } + return this.query.queryWith(realmQuery).findAll() + } - val query: Query - get() { - val query = Query() - this.filterConditions.forEach { - query.add(it.queryCondition) - } - return query - } + val query: Query + get() { + val query = Query() + this.filterConditions.forEach { + query.add(it.queryCondition) + } + return query + } - override fun getDisplayName(context: Context): String { - if (name.isNotEmpty()) return name - return this.query.getName(context) - } + override fun getDisplayName(context: Context): String { + if (name.isNotEmpty()) return name + return this.query.getName(context) + } - override fun isValidForDelete(context: Context, realm: Realm): Boolean { - return id != Preferences.getActiveFilterId(context) + override fun isValidForDelete(realm: Realm): Boolean { + return true } override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int { - return R.string.filter_currently_selected + return R.string.relationship_error } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index 794dee0c..72156895 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -6,7 +6,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.view.isVisible import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import io.realm.RealmResults @@ -103,21 +102,18 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource return if (viewType != -1) viewType else RowViewType.DATA.ordinal } + override fun indexForRow(row: RowRepresentable): Int { + return this.items.indexOf(row as Identifiable) + } + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (this.dataType) { LiveData.FILTER -> { - if (fromAction) { - // Open filter params - val filter = row as Filter - FiltersActivity.newInstanceForResult(fragment = this, filterId = filter.id, currentFilterable = filter.filterableType) - } else { - // Select filter - val intent = Intent() - intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) - activity?.setResult(Activity.RESULT_OK, intent) - activity?.finish() - } + val intent = Intent() + intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) + activity?.setResult(Activity.RESULT_OK, intent) + activity?.finish() } else -> { val identifier = (row as Identifiable).id 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 ce23386b..ceb9282e 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 @@ -195,14 +195,16 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate { } // Sessions - this.realmSessions = sessionFilter?.results() ?: run { getRealm().where().findAll() }.sort("startDate", Sort.DESCENDING) + this.realmSessions = sessionFilter?.results() ?: run { getRealm().where().findAll() } + this.realmSessions = this.realmSessions.sort("startDate", Sort.DESCENDING) this.realmSessions.addChangeListener { _, _ -> this.feedSessionAdapter.refreshData() this.feedSessionAdapter.notifyDataSetChanged() } val pendingSessions = sessionFilter?.let { getRealm().where().alwaysFalse().findAll() } ?: run { getRealm().where().isNull("year").isNull("month").findAll().sort("startDate", Sort.DESCENDING) } - val distinctDateSessions = sessionFilter?.results("year", "month") ?: run { getRealm().where().distinct("year", "month").findAll() }.sort("startDate", Sort.DESCENDING) + var distinctDateSessions = sessionFilter?.results("year", "month") ?: run { getRealm().where().distinct("year", "month").findAll() } + distinctDateSessions = distinctDateSessions.sort("startDate", Sort.DESCENDING) this.feedSessionAdapter = FeedSessionRowRepresentableAdapter(this, realmSessions, pendingSessions, distinctDateSessions) } @@ -216,13 +218,15 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate { } // Transactions - this.realmTransactions = transactionFilter?.results() ?: run { getRealm().where().findAll()}.sort("date", Sort.DESCENDING) + this.realmTransactions = transactionFilter?.results() ?: run { getRealm().where().findAll()} + this.realmTransactions = this.realmTransactions.sort("date", Sort.DESCENDING) this.realmTransactions.addChangeListener { _, _ -> this.feedTransactionAdapter.refreshData() this.feedTransactionAdapter.notifyDataSetChanged() } - val distinctDateTransactions = transactionFilter?.results("year", "month") ?: run { getRealm().where().distinct("year", "month").findAll() }.sort("date", Sort.DESCENDING) + var distinctDateTransactions = transactionFilter?.results("year", "month") ?: run { getRealm().where().distinct("year", "month").findAll() } + distinctDateTransactions = distinctDateTransactions.sort("date", Sort.DESCENDING) this.feedTransactionAdapter = FeedTransactionRowRepresentableAdapter(this, realmTransactions, distinctDateTransactions) } 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 85b301d5..9868520c 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 @@ -36,6 +36,18 @@ interface FilterHandler { fun saveFilter(context: Context, filterId:String) { Preferences.setActiveFilterId(filterId, context) + + println("<<<< save filter") + val realm = Realm.getDefaultInstance() + realm.beginTransaction() + currentFilter(context, realm)?.let { + println("<<<< old ${it.useCount}") + it.useCount++ + println("<<<< new ${it.useCount}") + } + realm.commitTransaction() + realm.close() + // Send broadcast val intent = Intent() intent.action = INTENT_FILTER_UPDATE_FILTER_UI diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt index 6585d0c8..15b84375 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt @@ -7,6 +7,7 @@ import io.realm.Sort import io.realm.kotlin.where import net.pokeranalytics.android.model.interfaces.CountableUsage import net.pokeranalytics.android.model.interfaces.NameManageable +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.TournamentFeature import net.pokeranalytics.android.model.realm.Transaction @@ -29,24 +30,30 @@ inline fun Realm.getOrCreate(name: String) : T { /** * Returns all entities of the [clazz] sorted with their default sorting */ -fun Realm.sorted(clazz: Class) : RealmResults { +fun < T : RealmModel> Realm.sorted(clazz: Class) : RealmResults { + val items = this.where(clazz).findAll() + var sortField = arrayOf("name") + var resultSort = arrayOf(Sort.ASCENDING) - if (clazz is CountableUsage) { - this.updateUsageCount(clazz) - } - - val sortField = when (clazz) { - is CountableUsage -> "useCount" - is Transaction -> "date" - else -> "name" - } - val resultSort = when (clazz) { - is CountableUsage -> Sort.DESCENDING - is Transaction -> Sort.DESCENDING - else -> Sort.ASCENDING - } - - return this.where(clazz).findAll().sort(sortField, resultSort) + when (items.firstOrNull()) { + is Transaction -> { + println("<<<< is transaction") + sortField = arrayOf("date") + resultSort = arrayOf(Sort.DESCENDING) + } + is Filter -> { + println("<<<< is filter") + sortField = arrayOf("useCount", "name") + resultSort = arrayOf(Sort.DESCENDING, Sort.ASCENDING) + } + is CountableUsage -> { + println("<<<< is countable") + this.updateUsageCount(clazz) + sortField = arrayOf("useCount") + resultSort = arrayOf(Sort.DESCENDING) + } + } + return items.sort(sortField, resultSort) } /** From e9bb62f15b311ea4b1d0d574e8e41f20b7f8c38d Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 24 May 2019 17:14:39 +0200 Subject: [PATCH 4/5] post merge fix --- .../pokeranalytics/android/ui/fragment/DataListFragment.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index 72156895..eb7b5edf 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import io.realm.RealmResults @@ -102,10 +103,6 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource return if (viewType != -1) viewType else RowViewType.DATA.ordinal } - override fun indexForRow(row: RowRepresentable): Int { - return this.items.indexOf(row as Identifiable) - } - override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (this.dataType) { From 3a35f1968a6ac6c3b251ef729c7dba2e354693d7 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 24 May 2019 17:32:06 +0200 Subject: [PATCH 5/5] fix compilation issue following up the merge --- .../java/net/pokeranalytics/android/model/realm/Filter.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index 8f8ed502..a4b7e84b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -67,9 +67,7 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Co return field } - // the number of use of the queryWith, - // for MutableRealmInteger, see https://realm.io/docs/java/latest/#counters - val usageCount: MutableRealmInteger = MutableRealmInteger.valueOf(0) + override var useCount: Int = 0 var filterConditions: RealmList = RealmList() private set @@ -175,7 +173,7 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Co return this.query.getName(context) } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return true }