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 5b2857f9..b565e213 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 @@ -4,7 +4,9 @@ import io.realm.MutableRealmInteger import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection import java.util.* //import net.pokeranalytics.android.FilterComponent @@ -25,31 +27,66 @@ open class Filter : RealmObject() { var components: RealmList = RealmList() fun componentsFrom(filterElements: ArrayList) { - components.clear() - - var sections = filterElements.mapNotNull { - it.filterSection - }.distinct() - - sections.forEach { section -> - var _filterElements = filterElements.filter { - it.filterSection?.let { _section -> - _section == section - } ?: run { - false - } + filterElements + .map { + it.filterSection } - - if (_filterElements.size == 1) { - var component : FilterComponent = FilterComponent(_filterElements.first()) - components.add(component) - } else { - var casted = arrayListOf() - casted.addAll(_filterElements) - var component : FilterComponent = FilterComponent(casted) - components.add(component) + .distinct() + .forEach { section -> + filterElements + .filter { + it.filterSection == section + } + .apply { + if (this.size == 1) { + components.add(FilterComponent(this.first())) + } else { + val casted = arrayListOf() + casted.addAll(this) + components.add(FilterComponent(casted)) + } + } } + } + + fun numberOfElementIn(filterCategory: FilterCategory) : Int { + val sections = FilterSection.filterSectionsFor(filterCategory) + return components.count { + sections.contains(FilterSection.valueOf(it.sectionName)) + } + } + + fun isFilterElementExists(filterElement:FilterElement) : Boolean { + + val filtered = components.filter { + it.filterType == filterElement.filterType + } + + if (filtered.isEmpty()) { + return false + } + + return when (filterElement) { + is FilterElement.Game -> filtered.filter { + it.ids?.contains(filterElement.game.id) ?: false + }.isNotEmpty() + is FilterElement.Year -> TODO() + is FilterElement.Month -> TODO() + is FilterElement.Day -> TODO() + is FilterElement.Limit -> TODO() + is FilterElement.TableSize -> TODO() + is FilterElement.Bankroll -> TODO() + is FilterElement.Location -> TODO() + is FilterElement.TournamentName -> TODO() + is FilterElement.TournamentFeature -> TODO() + + is FilterElement.From -> TODO() + is FilterElement.To -> TODO() + is FilterElement.PastDays -> TODO() + + + else -> return true } } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt index 75cda2ab..03b9cc27 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/FilterComponent.kt @@ -9,11 +9,9 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement.* import java.util.* import kotlin.collections.ArrayList -open class FilterComponent(filterName : String = "") : RealmObject() { +open class FilterComponent(var filterName : String = "", var sectionName: String = "") : RealmObject() { - var filterName : String = filterName - - constructor(filterElements: ArrayList) : this(filterElements.first().filterType.name) { + constructor(filterElements: ArrayList) : this(filterElements.first().filterType.name, filterElements.first().filterSection.name) { this.ids = when (FilterType.valueOf(this.filterName)) { FilterType.GAME -> { RealmList().apply { @@ -37,7 +35,7 @@ open class FilterComponent(filterName : String = "") : RealmObject() { } } - constructor(filterElement:FilterElement) : this(filterElement.filterType.name) { + constructor(filterElement:FilterElement) : this(filterElement.filterType.name, filterElement.filterSection.name) { when (filterElement) { is From -> date = filterElement.date is To -> date = filterElement.date 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 528bc30a..dea0edb8 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 @@ -10,6 +10,7 @@ import io.realm.RealmObject import kotlinx.android.synthetic.main.fragment_filter_details.* import kotlinx.android.synthetic.main.fragment_filter_details.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -151,6 +152,16 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta this.rows.clear() this.rowsForFilterSubcategory.clear() this.rows.addAll(it.filterElements) + + //TODO + /* + var filter = Filter() + this.rows.forEach {element -> + if (filter.isFilterElementExists(element as FilterElement)) { + this.selectedRows.add(element) + } + } + */ this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) this.recyclerView.adapter = rowRepresentableAdapter } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt index 4f859d0f..911a7771 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt @@ -8,6 +8,7 @@ import io.realm.RealmObject import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_filters.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.FilterDetailsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -34,6 +35,8 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat private var primaryKey: String? = null private var selectedRow: RowRepresentable? = null + private var filter: Filter? = null + var isUpdating = false override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -97,6 +100,13 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat } + //TODO + /* + override fun stringForRow(row: RowRepresentable): String { + return this.filter?.numberOfElementIn(row as FilterCategory).toString() + } + */ + override fun onRowValueChanged(value: Any?, row: RowRepresentable) { super.onRowValueChanged(value, row) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt index e7be8433..7e63ebb4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategory.kt @@ -26,7 +26,7 @@ enum class FilterCategory(override val resId: Int?, override val viewType: Int = } } - private val filterSections : List < FilterSectionDataSource > + private val filterSections : List < FilterSection > get() { return FilterSection.filterSectionsFor(this) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt index 89cdb7ac..230ec65e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt @@ -12,9 +12,8 @@ import java.lang.Exception import java.util.* sealed class FilterElement : RowRepresentable { - companion object { - fun filterElementsFor(filterSection: FilterSectionDataSource) : List { + fun filterElementsFor(filterSection: FilterSection) : List { return when (filterSection) { CASH_TOURNAMENT -> arrayListOf(Cash, Tournament) LIVE_ONLINE -> arrayListOf(Live, Online) @@ -77,6 +76,10 @@ sealed class FilterElement : RowRepresentable { VALUE -> arrayListOf() else -> throw Exception("unknown filtersection") //TODO create exception + }.apply { + this.forEach { + it.filterSection = filterSection + } } } } @@ -91,10 +94,11 @@ sealed class FilterElement : RowRepresentable { object CurrentWeek : FilterElement() object CurrentMonth : FilterElement() object CurrentYear: FilterElement() - data class From(var date: Date = Date()) : FilterElement() - data class To(var date: Date = Date()) : FilterElement() object Weekday: FilterElement() object Weekend : FilterElement() + + data class From(var date: Date = Date()) : FilterElement() + data class To(var date: Date = Date()) : FilterElement() data class Year(val day: Int) : FilterElement() data class Month(val day: Int) : FilterElement() data class Day(val day: Int) : FilterElement() @@ -107,7 +111,7 @@ sealed class FilterElement : RowRepresentable { data class TournamentName(val tournamentName: net.pokeranalytics.android.model.realm.TournamentName) : FilterElement() data class TournamentFeature(val tournamentFeature: net.pokeranalytics.android.model.realm.TournamentFeature) : FilterElement() - var filterSection: FilterSectionDataSource? = null + lateinit var filterSection: FilterSection val filterType : FilterType get() { @@ -187,21 +191,16 @@ sealed class FilterElement : RowRepresentable { val sectionToExclude : List < FilterSectionDataSource > ? get() { val excluded = arrayListOf() - this.filterSection?.let { - if (!it.allowMultiSelection) { - excluded.add(it) - } - it.exclusiveWith?.let { exclusives -> - excluded.addAll(exclusives) - } - - if (excluded.size > 0) { - return excluded - } - } ?: run { - return null + if (!this.filterSection.allowMultiSelection) { + excluded.add(this.filterSection) + } + this.filterSection.exclusiveWith?.let { exclusives -> + excluded.addAll(exclusives) } + if (excluded.size > 0) { + return excluded + } return null } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt index 92ccbab1..48b38674 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt @@ -12,8 +12,6 @@ interface FilterSectionDataSource : RowRepresentable { val allowMultiSelection : Boolean val exclusiveWith : List < FilterSectionDataSource > ? - val filterElementRows : List < FilterElement > - val filterElements : List < RowRepresentable > val selectionType : SelectionType } @@ -29,19 +27,6 @@ private interface DefaultFilterSectionDataSource : FilterSectionDataSource { override val selectionType: FilterSectionDataSource.SelectionType get() = FilterSectionDataSource.SelectionType.MULTIPLE - - override val filterElementRows: List < FilterElement > - get() = FilterElement.filterElementsFor(this) - - override val filterElements : List < RowRepresentable > - get() { - val elements = arrayListOf(this) - filterElementRows.forEach { - it.filterSection = this - elements.add(it) - } - return elements - } } enum class FilterSection(override val resId: Int?): DefaultFilterSectionDataSource, RowRepresentable { @@ -130,6 +115,11 @@ enum class FilterSection(override val resId: Int?): DefaultFilterSectionDataSour } } + val filterElements : List < RowRepresentable > + get() = arrayListOf(this).apply { + this.addAll(FilterElement.filterElementsFor(this@FilterSection)) + } + override val viewType: Int = RowViewType.HEADER_TITLE.ordinal override val selectionType: FilterSectionDataSource.SelectionType