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 09028e38..526f9733 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 @@ -297,7 +297,7 @@ enum class QueryCondition(var operator: Operator? = null) { return } - this.operator?.let { subType -> + this.operator?.let { valueMap = mapOf("value" to filterCondition.value) return } 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 b4b9f584..dbbba9bc 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 @@ -68,22 +68,18 @@ open class Filter : RealmObject() { filterConditions.clear() filterConditionRows .map { - it.filterSectionRow + it.filterName } .distinct() - .forEach { section -> + .forEach { filterName-> filterConditionRows .filter { - it.filterSectionRow == section + it.filterName == filterName } .apply { - if (this.size == 1) { - filterConditions.add(FilterCondition(this.first())) - } else { - val casted = arrayListOf() - casted.addAll(this) - filterConditions.add(FilterCondition(casted)) - } + val casted = arrayListOf() + casted.addAll(this) + filterConditions.add(FilterCondition(casted)) } } } @@ -116,8 +112,7 @@ open class Filter : RealmObject() { filterElementRow.lastDays = values.first() as Int } } - is FilterElementRow.From -> filterElementRow.date = getSavedValueForElement(filterElementRow) as Date? ?: Date() - is FilterElementRow.To -> filterElementRow.date = getSavedValueForElement(filterElementRow) as Date? ?: Date() + is FilterElementRow.DateFilterElementRow -> filterElementRow.dateValue = getSavedValueForElement(filterElementRow) as Date? ?: Date() } } 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 db893d78..afada902 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 @@ -16,95 +16,37 @@ open class FilterCondition() : RealmObject() { } constructor(filterElementRows: ArrayList) : this(filterElementRows.first().filterName, filterElementRows.first().filterSectionRow.name) { + val row = filterElementRows.first() + this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName - - - - val filterName : String = this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName - this.stringValues = when (QueryCondition.valueOf(filterName)) { - QueryCondition.GAME, QueryCondition.BANKROLL, QueryCondition.TOURNAMENT_NAME, QueryCondition.ALL_TOURNAMENT_FEATURES, QueryCondition.ANY_TOURNAMENT_FEATURES, QueryCondition.LOCATION -> { - RealmList().apply { - this.addAll(filterElementRows.map { - (it as DataFilterElementRow).id - }) - } - } - QueryCondition.LIMIT, QueryCondition.TABLE_SIZE -> { - RealmList().apply { - this.addAll(filterElementRows.map { - (it as StaticDataFilterElementRow).id - }) - } - } - else -> null - } - - - this.numericValues = when (QueryCondition.valueOf(filterName)) { - QueryCondition.LIMIT -> { - RealmList().apply { - this.addAll(filterElementRows.map { - (it as FilterElementRow.Limit).limit.ordinal.toDouble() - }) - } - } - QueryCondition.TABLE_SIZE -> { - RealmList().apply { - this.addAll(filterElementRows.map { - (it as FilterElementRow.TableSize).tableSize.numberOfPlayer.toDouble() - }) - } + when (row) { + is DateFilterElementRow -> { + this.dateValue = row.dateValue } - QueryCondition.YEAR, QueryCondition.MONTH, QueryCondition.DAY_OF_WEEK -> { - RealmList().apply { + is StringFilterElementRow -> { + this.stringValues = RealmList().apply { this.addAll(filterElementRows.map { - (it as SingleValueFilterElementRow).value.toDouble() + (it as StringFilterElementRow).stringValue }) } } - QueryCondition.LESS_THAN_NET_RESULT -> { - RealmList().apply { + is NumericFilterElementRow -> { + this.numericValues = RealmList().apply { this.addAll(filterElementRows.map { - (it as ResultLessThan).value + (it as NumericFilterElementRow).doubleValue }) } } - QueryCondition.MORE_THAN_NET_RESULT -> { - RealmList().apply { - this.addAll(filterElementRows.map { - (it as ResultMoreThan).value - }) - } - } - QueryCondition.PAST_DAYS -> { - RealmList().apply { - this.addAll(filterElementRows.map { - (it as FilterElementRow.PastDays).lastDays.toDouble() - }) - } - } - else -> null - } - - this.blindValues = when (QueryCondition.valueOf(filterName)) { - QueryCondition.BLINDS -> { - RealmList().apply { + is FilterElementBlind -> { + this.blindValues = RealmList().apply { this.addAll(filterElementRows.map { FilterElementBlind((it as FilterElementRow.Blind).sb, it.bb, it.code) }) } } - else -> null } } - constructor(filterElementRow: FilterElementRow) : this(arrayListOf(filterElementRow)) { - when (filterElementRow) { - is From -> dateValue = filterElementRow.date - is To -> dateValue = filterElementRow.date - } - } - var filterName: String? = null var sectionName: String? = null 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 62849a70..3ed89afe 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 @@ -69,8 +69,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta Timber.d("Row: $row") when (row) { - is FilterElementRow.From -> DateTimePickerManager.create(requireContext(), row, this, row.date, onlyDate = true) - is FilterElementRow.To -> DateTimePickerManager.create(requireContext(), row, this, row.date, onlyDate = true) + is FilterElementRow.DateFilterElementRow -> DateTimePickerManager.create(requireContext(), row, this, row.dateValue, onlyDate = true) is FilterElementRow.PastDays -> { val pastDays = if (row.lastDays > 0) row.lastDays.toString() else "" val data = row.editingDescriptors(mapOf("pastDays" to pastDays)) @@ -86,13 +85,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta val data = row.editingDescriptors(mapOf("lastSessions" to lastSessions)) BottomSheetFragment.create(fragmentManager, row, this, data, true) } - is FilterElementRow.DurationMoreThan -> { - val hours = if (row.minutes / 60 > 0) (row.minutes / 60).toString() else "" - val minutes = if (row.minutes % 60 > 0) (row.minutes % 60).toString() else "" - val data = row.editingDescriptors(mapOf("hours" to hours, "minutes" to minutes)) - BottomSheetFragment.create(fragmentManager, row, this, data, true) - } - is FilterElementRow.DurationLessThan -> { + is FilterElementRow.DurationFilterElement -> { val hours = if (row.minutes / 60 > 0) (row.minutes / 60).toString() else "" val minutes = if (row.minutes % 60 > 0) (row.minutes % 60).toString() else "" val data = row.editingDescriptors(mapOf("hours" to hours, "minutes" to minutes)) @@ -109,11 +102,13 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta is FilterElementRow.PastDays -> if (row.lastDays > 0) row.lastDays.toString() else NULL_TEXT is FilterElementRow.LastGames -> if (row.lastGames > 0) row.lastGames.toString() else NULL_TEXT is FilterElementRow.LastSessions -> if (row.lastSessions > 0) row.lastSessions.toString() else NULL_TEXT - is FilterElementRow.ReBuyLessThan -> if (row.value > 0) row.value.toString() else NULL_TEXT - is FilterElementRow.ReBuyMoreThan -> if (row.value > 0) row.value.toString() else NULL_TEXT - is FilterElementRow.From -> row.date.shortDate() - is FilterElementRow.To -> row.date.shortDate() - is FilterElementRow.TimeFilterElementRow -> row.minutes.toMinutes(requireContext()) + is FilterElementRow.DateFilterElementRow -> row.dateValue.shortDate() + is FilterElementRow.DurationFilterElement -> row.minutes.toMinutes(requireContext()) + + // TODO: Refactor that + is FilterElementRow.ReBuyLessThan -> if (row.amount > 0) row.amount.toString() else NULL_TEXT + is FilterElementRow.ReBuyMoreThan -> if (row.amount > 0) row.amount.toString() else NULL_TEXT + else -> super.stringForRow(row) } } @@ -127,14 +122,16 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta Timber.d("onRowValueChanged: $row $value") when (row) { - is FilterElementRow.From -> row.date = if (value != null && value is Date) value else Date() - is FilterElementRow.To -> row.date = if (value != null && value is Date) value else Date() + is FilterElementRow.DateFilterElementRow -> row.dateValue = if (value != null && value is Date) value else Date() is FilterElementRow.PastDays -> row.lastDays = if (value != null && value is String) value.toInt() else 0 is FilterElementRow.LastGames -> row.lastGames = if (value != null && value is String) value.toInt() else 0 is FilterElementRow.LastSessions -> row.lastSessions = if (value != null && value is String) value.toInt() else 0 - is FilterElementRow.ReBuyLessThan -> row.value = if (value != null && value is String) value.toDouble() else 0.0 - is FilterElementRow.ReBuyMoreThan -> row.value = if (value != null && value is String) value.toDouble() else 0.0 - is FilterElementRow.TimeFilterElementRow -> { + + // TODO: Refactor that + is FilterElementRow.ReBuyLessThan -> row.amount = if (value != null && value is String) value.toDouble() else 0.0 + is FilterElementRow.ReBuyMoreThan -> row.amount = if (value != null && value is String) value.toDouble() else 0.0 + + is FilterElementRow.DurationFilterElement -> { if (value is ArrayList<*>) { val hours = try { (value[0] as String? ?: "0").toInt() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt index ab5b1978..fe03cf52 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt @@ -16,73 +16,111 @@ import java.util.* sealed class FilterElementRow : RowRepresentable { - // Objects - - object Cash : FilterElementRow() - object Tournament : FilterElementRow() - object Live : FilterElementRow() - object Online : FilterElementRow() - object Today : FilterElementRow() - object Yesterday : FilterElementRow() - object TodayAndYesterday : FilterElementRow() - object CurrentWeek : FilterElementRow() - object CurrentMonth : FilterElementRow() - object CurrentYear : FilterElementRow() - object Weekday : FilterElementRow() - object Weekend : FilterElementRow() - - object ResultMoreThan : MoreFilterElementRow() - object ResultLessThan : LessFilterElementRow() - object ReBuyMoreThan: MoreFilterElementRow() - object ReBuyLessThan: LessFilterElementRow() - object DurationMoreThan : MoreTimeFilterElementRow() - object DurationLessThan : LessTimeFilterElementRow() - - // Subclasses - - open class SingleValueFilterElementRow(val value: Int) : FilterElementRow() - - open class DataFilterElementRow(data: Manageable) : FilterElementRow() { - val id: String = data.id - val name: String = (data as RowRepresentable).getDisplayName() - } - - open class StaticDataFilterElementRow(var row: RowRepresentable, var id: String) : FilterElementRow() { - - override val resId: Int? = row.resId - val name: String = row.getDisplayName() - - fun getDataLocalizedTitle(context: Context): String { - return row.localizedTitle(context) - } - } - - open class QuantityFilterElementRow(var value: Double = 0.0) : FilterElementRow() - open class TimeFilterElementRow : QuantityFilterElementRow() { - var minutes = value.toInt() - } - - open class MoreFilterElementRow : QuantityFilterElementRow() - open class LessFilterElementRow : QuantityFilterElementRow() - open class MoreTimeFilterElementRow : TimeFilterElementRow() - open class LessTimeFilterElementRow : TimeFilterElementRow() - - // Data classes + interface Duration { + var minutes : Int + } + + interface Operator + interface MoreOperator : Operator + interface LessOperator : Operator + + open class BoolFilterElementRow : FilterElementRow() + open class DateFilterElementRow(var dateValue: Date = Date()) : FilterElementRow() + open class NumericFilterElementRow(open val doubleValue : Double = 0.0 ) : FilterElementRow() + open class StringFilterElementRow(val stringValue : String = "") : FilterElementRow() + + // Subclasses + open class SingleValueFilterElementRow(open val intValue: Int) : NumericFilterElementRow() { + override val doubleValue : Double + get() { + return intValue.toDouble() + } + } + + open class DataFilterElementRow(data: Manageable) : StringFilterElementRow(data.id) { + val id: String = data.id + val name: String = (data as RowRepresentable).getDisplayName() + } + + open class StaticDataFilterElementRow(var row: RowRepresentable, var id: Int) : NumericFilterElementRow(id.toDouble()) { + + override val resId: Int? = row.resId + val name: String = row.getDisplayName() + + fun getDataLocalizedTitle(context: Context): String { + return row.localizedTitle(context) + } + } + + open class DurationFilterElement : NumericFilterElementRow(), Duration { + override var minutes: Int = 0 + override val doubleValue : Double + get() { + return minutes.toDouble() + } + } + + open class AmountFilterElement : NumericFilterElementRow() { + var amount: Double = 0.0 + override val doubleValue : Double + get() { + return amount + } + } + + object Cash : BoolFilterElementRow() + object Tournament : BoolFilterElementRow() + object Live : BoolFilterElementRow() + object Online : BoolFilterElementRow() + object Today : BoolFilterElementRow() + object Yesterday : BoolFilterElementRow() + object TodayAndYesterday : BoolFilterElementRow() + object CurrentWeek : BoolFilterElementRow() + object CurrentMonth : BoolFilterElementRow() + object CurrentYear : BoolFilterElementRow() + object Weekday : BoolFilterElementRow() + object Weekend : BoolFilterElementRow() + + // Data classes - holding value + object ResultMoreThan : AmountFilterElement(), MoreOperator + object ResultLessThan : AmountFilterElement(), LessOperator + object DurationMoreThan : DurationFilterElement(), MoreOperator + object DurationLessThan : DurationFilterElement(), LessOperator + object ReBuyMoreThan: AmountFilterElement(), MoreOperator + object ReBuyLessThan: AmountFilterElement(), LessOperator data class Blind(var sb: Double? = null, var bb: Double? = null, var code: String? = null) : FilterElementRow() - data class From(var date: Date = Date()) : FilterElementRow() - data class To(var date: Date = Date()) : FilterElementRow() + object From : DateFilterElementRow() + object To : DateFilterElementRow() + data class Year(val year: Int) : SingleValueFilterElementRow(year) data class Month(val month: Int) : SingleValueFilterElementRow(month) data class Day(val day: Int) : SingleValueFilterElementRow(day) //TODO: Refactor? - data class PastDays(var lastDays: Int = 0) : FilterElementRow() - data class LastGames(var lastGames: Int) : FilterElementRow() - data class LastSessions(var lastSessions: Int) : FilterElementRow() + data class PastDays(var lastDays: Int = 0) : SingleValueFilterElementRow(lastDays) { + override val intValue: Int + get() { + return lastDays + } + } + + data class LastGames(var lastGames: Int) : SingleValueFilterElementRow(lastGames) { + override val intValue: Int + get() { + return lastGames + } + } + data class LastSessions(var lastSessions: Int) : SingleValueFilterElementRow(lastSessions) { + override val intValue: Int + get() { + return lastSessions + } + } + + data class Limit(val limit: net.pokeranalytics.android.model.Limit) : StaticDataFilterElementRow(limit, limit.ordinal) + data class TableSize(val tableSize: net.pokeranalytics.android.model.TableSize) : StaticDataFilterElementRow(tableSize, tableSize.numberOfPlayer) - data class Limit(val limit: net.pokeranalytics.android.model.Limit) : StaticDataFilterElementRow(limit, limit.longName) - data class TableSize(val tableSize: net.pokeranalytics.android.model.TableSize) : StaticDataFilterElementRow(tableSize, tableSize.numberOfPlayer.toString()) data class Bankroll(val bankroll: Manageable) : DataFilterElementRow(bankroll) data class Game(val game: Manageable) : DataFilterElementRow(game) data class Location(val location: Manageable) : DataFilterElementRow(location) @@ -140,14 +178,11 @@ sealed class FilterElementRow : RowRepresentable { fun contains(filterConditions: List): Boolean { return when (this) { is SingleValueFilterElementRow -> filterConditions.any { - it.values.contains(this.value) + it.values.contains(this.intValue) } is DataFilterElementRow -> filterConditions.any { it.ids.contains(this.id) } - is StaticDataFilterElementRow -> filterConditions.any { - it.ids.contains(this.id) - } else -> true } } @@ -174,10 +209,8 @@ sealed class FilterElementRow : RowRepresentable { is Blind -> R.string.blinds is LastGames -> R.string.last_records is LastSessions -> R.string.last_sessions - is ReBuyMoreThan -> R.string.maximum - is ReBuyLessThan -> R.string.minimum - is MoreFilterElementRow, is MoreTimeFilterElementRow -> R.string.more_than - is LessFilterElementRow, is LessTimeFilterElementRow -> R.string.less_than + is MoreOperator -> R.string.more_than + is LessOperator -> R.string.less_than else -> null } } @@ -220,6 +253,7 @@ sealed class FilterElementRow : RowRepresentable { RowRepresentableEditDescriptor(lastSessions, R.string.last_sessions, inputType = InputType.TYPE_CLASS_NUMBER) ) } + is ReBuyMoreThan -> { val reBuyMore: String? by map arrayListOf( @@ -232,8 +266,8 @@ sealed class FilterElementRow : RowRepresentable { RowRepresentableEditDescriptor(reBuyLess, R.string.minimum, inputType = InputType.TYPE_CLASS_NUMBER) ) } - is DurationMoreThan, is DurationLessThan -> { - val hours: String? by map + + is DurationFilterElement -> { val hours: String? by map val minutes: String? by map arrayListOf( RowRepresentableEditDescriptor(hours, R.string.hour, inputType = InputType.TYPE_CLASS_NUMBER), @@ -248,9 +282,9 @@ sealed class FilterElementRow : RowRepresentable { return when (this) { is SingleValueFilterElementRow -> { when (this) { - is Day -> DateFormatSymbols.getInstance(Locale.getDefault()).weekdays[this.value] - is Month -> DateFormatSymbols.getInstance(Locale.getDefault()).months[this.value] - else -> "${this.value}" + is Day -> DateFormatSymbols.getInstance(Locale.getDefault()).weekdays[this.intValue] + is Month -> DateFormatSymbols.getInstance(Locale.getDefault()).months[this.intValue] + else -> "${this.intValue}" } } is DataFilterElementRow -> this.name 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 61223a17..322bbdbb 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 @@ -93,8 +93,8 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { CurrentMonth, CurrentYear ) - FIXED_DATE -> arrayListOf(From(), To()) - DURATION -> arrayListOf(PastDays()) + FIXED_DATE -> arrayListOf(From, To) + DURATION -> arrayListOf(PastDays(0)) YEAR -> { val years = arrayListOf() val realm = Realm.getDefaultInstance() @@ -180,8 +180,8 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { MULTI_PLAYER -> arrayListOf() - SESSION_DURATION -> arrayListOf(DurationMoreThan, DurationLessThan) - RANGE -> arrayListOf(From(Date()), To(Date())) + SESSION_DURATION -> arrayListOf(DurationMoreThan as FilterElementRow, DurationLessThan as FilterElementRow) + RANGE -> arrayListOf(From, To) SESSIONS -> arrayListOf(LastGames(0), LastSessions(0))