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 43608d54..9abdfe1c 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 @@ -9,8 +9,6 @@ import net.pokeranalytics.android.model.realm.Session import java.util.* - - /** * Enum describing the way a query should be handled * Some queries requires a value to be checked upon through equals, in, more, less, between @@ -66,6 +64,8 @@ enum class QueryCondition(var operator: Operator? = null) { THIS_WEEK, THIS_MONTH, THIS_YEAR, + MORE_THAN_DURATION(Operator.MORE), + LESS_THAN_DURATION(Operator.LESS), CURRENCY, CURRENCY_CODE, 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 84476e86..e059aa6d 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 @@ -24,8 +24,10 @@ import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow +import net.pokeranalytics.android.util.extensions.toMinutes import timber.log.Timber import java.util.* +import kotlin.collections.ArrayList open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { @@ -64,9 +66,11 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta Timber.d("Row: $row") when (row) { - is FilterElementRow.ResultMoreThan -> { - val data = row.editingDescriptors(mapOf("defaultValue" to "")) - BottomSheetFragment.create(fragmentManager, row, this, data, null) + 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) } else -> { @@ -88,7 +92,6 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta selectedRows.add(row) } } - } } @@ -111,6 +114,13 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta rowRepresentableAdapter.refreshRow(row) } + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + is FilterElementRow.DurationMoreThan -> row.minutes.toMinutes(requireContext()) + else -> super.stringForRow(row) + } + } + override fun isSelected(row: RowRepresentable): Boolean { return selectedRows.contains(row) } @@ -118,7 +128,37 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta override fun onRowValueChanged(value: Any?, row: RowRepresentable) { super.onRowValueChanged(value, row) Timber.d("onRowValueChanged: $row $value") - selectedRows.add(row as FilterElementRow) + + when (row) { + is FilterElementRow.DurationMoreThan -> { + if (value is ArrayList<*>) { + val hours = try { + (value[0] as String? ?: "0").toInt() + } catch (e: Exception) { + 0 + } + val minutes = try { + (value[1] as String? ?: "0").toInt() + } catch (e: Exception) { + 0 + } + + row.minutes = hours * 60 + minutes + } else { + row.minutes = 0 + } + } + } + + //TODO: Update management like in onRowSelected + if (value != null) { + if (!selectedRows.contains(row)) { + selectedRows.add(row as FilterElementRow) + } + } else { + selectedRows.remove(row as FilterElementRow) + } + rowRepresentableAdapter.refreshRow(row) } @@ -155,8 +195,6 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta */ private fun initData() { - Timber.d("initData") - primaryKey?.let { currentFilter = Filter.getFilterBydId(getRealm(), it) } 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 f183236b..e35af122 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 @@ -1,12 +1,15 @@ package net.pokeranalytics.android.ui.view.rowrepresentable import android.content.Context +import android.text.InputType import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.realm.FilterCondition +import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType import java.util.* @@ -40,6 +43,10 @@ sealed class FilterElementRow : RowRepresentable { } } + open class QuantityFilterElementRow : FilterElementRow() + open class MoreFilterElementRow : QuantityFilterElementRow() + open class LessFilterElementRow : QuantityFilterElementRow() + open class SingleValueFilterElementRow(val value: Int) : FilterElementRow() data class Blind(var sb: Double? = null, var bb: Double? = null, var code: String? = null) : FilterElementRow() @@ -57,8 +64,11 @@ sealed class FilterElementRow : RowRepresentable { data class TournamentName(val tournamentName: Manageable) : DataFilterElementRow(tournamentName) data class AllTournamentFeature(val tournamentFeature: Manageable) : DataFilterElementRow(tournamentFeature) data class AnyTournamentFeature(val tournamentFeature: Manageable) : DataFilterElementRow(tournamentFeature) - data class ResultMoreThan(var value: Double) : FilterElementRow() - data class ResultLessThan(var value: Double) : FilterElementRow() + + data class ResultMoreThan(var value: Double) : MoreFilterElementRow() + data class ResultLessThan(var value: Double) : LessFilterElementRow() + data class DurationMoreThan(var minutes: Int) : MoreFilterElementRow() + data class DurationLessThan(var minutes: Int) : LessFilterElementRow() lateinit var filterSectionRow: FilterSectionRow @@ -85,9 +95,9 @@ sealed class FilterElementRow : RowRepresentable { is CurrentWeek -> QueryCondition.THIS_WEEK is CurrentMonth -> QueryCondition.THIS_MONTH is CurrentYear -> QueryCondition.THIS_YEAR - /* - is PastDays -> R.string.period_in_days - */ + /* + is PastDays -> R.string.period_in_days + */ is Limit -> QueryCondition.LIMIT is TableSize -> QueryCondition.TABLE_SIZE @@ -99,6 +109,8 @@ sealed class FilterElementRow : RowRepresentable { is AllTournamentFeature -> QueryCondition.ALL_TOURNAMENT_FEATURES is ResultMoreThan -> QueryCondition.MORE_THAN_NET_RESULT is ResultLessThan -> QueryCondition.LESS_THAN_NET_RESULT + is DurationMoreThan -> QueryCondition.MORE_THAN_DURATION + is DurationLessThan -> QueryCondition.LESS_THAN_DURATION else -> throw PokerAnalyticsException.UnknownQueryTypeForRow(this) } } @@ -138,8 +150,8 @@ sealed class FilterElementRow : RowRepresentable { is Day -> R.string.day_of_the_week is PastDays -> R.string.period_in_days is Blind -> R.string.blinds - is ResultMoreThan -> R.string.more_than - is ResultLessThan -> R.string.less_than + is ResultMoreThan, is DurationMoreThan -> R.string.more_than + is ResultLessThan, is DurationLessThan -> R.string.less_than else -> null } } @@ -147,11 +159,33 @@ sealed class FilterElementRow : RowRepresentable { override val viewType: Int get() { return when (this) { - is ResultMoreThan -> RowViewType.TITLE_VALUE_CHECK.ordinal + is DurationMoreThan, is DurationLessThan -> RowViewType.TITLE_VALUE_CHECK.ordinal else -> RowViewType.TITLE_CHECK.ordinal } } + override val bottomSheetType: BottomSheetType + get() { + return when (this) { + is DurationMoreThan, is DurationLessThan -> BottomSheetType.DOUBLE_EDIT_TEXT + else -> BottomSheetType.NONE + } + } + + override fun editingDescriptors(map: Map): ArrayList? { + return when (this) { + is DurationMoreThan, is DurationLessThan -> { + val hours: String? by map + val minutes: String? by map + arrayListOf( + RowRepresentableEditDescriptor(hours, R.string.hour, inputType = InputType.TYPE_CLASS_NUMBER), + RowRepresentableEditDescriptor(minutes, R.string.minute, inputType = InputType.TYPE_CLASS_NUMBER) + ) + } + else -> super.editingDescriptors(map) + } + } + override fun getDisplayName(): String { return when (this) { 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 19f4ed1d..d87a4d97 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 @@ -126,7 +126,7 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { MULTI_PLAYER -> arrayListOf() - SESSION_DURATION -> arrayListOf(ResultMoreThan(0.0), ResultLessThan(0.0)) + SESSION_DURATION -> arrayListOf(DurationMoreThan(0), DurationLessThan(0)) RANGE -> arrayListOf(From(Date()), To(Date())) VALUE -> arrayListOf()