diff --git a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt index 0a33cc1a..4066ec1a 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Criteria.kt @@ -122,6 +122,7 @@ sealed class Criteria { object TournamentNames: RealmCriteria() object Locations: RealmCriteria() object TournamentFeatures: RealmCriteria() + object TransactionTypes: RealmCriteria() object Limits: ListCriteria() object TableSizes: ListCriteria() object TournamentTypes: ListCriteria() @@ -185,6 +186,7 @@ sealed class Criteria { is TournamentFeatures -> comparison() is TournamentNames -> comparison() is Locations -> comparison() + is TransactionTypes-> comparison() is SimpleCriteria -> comparison() is Limits -> comparison() is TournamentTypes -> comparison() 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 4ad1d0cd..88be28b0 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 @@ -49,6 +49,7 @@ sealed class QueryCondition : FilterElementRow { Bankroll::class.java -> AnyBankroll() Game::class.java -> AnyGame() Location::class.java -> AnyLocation() + TransactionType::class.java -> AnyTransactionType() TournamentName::class.java -> AnyTournamentName() TournamentFeature::class.java -> AnyTournamentFeature() else -> throw PokerAnalyticsException.QueryTypeUnhandled @@ -254,6 +255,7 @@ sealed class QueryCondition : FilterElementRow { this.setObject(bankroll) } } + class AnyGame(): QueryDataCondition() { override val entity: Class = Game::class.java constructor(game: Game): this() { @@ -290,6 +292,13 @@ sealed class QueryCondition : FilterElementRow { } } + class AnyTransactionType(): QueryDataCondition() { + override val entity: Class = TransactionType::class.java + constructor(transactionType: TransactionType): this() { + this.setObject(transactionType) + } + } + class AnyLimit: ListOfInt() { override fun labelForValue(value: Int): String { return Limit.values()[value].getDisplayName() 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 b9c1121a..33c6de0a 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 @@ -128,7 +128,7 @@ open class Filter : RealmObject(), RowRepresentable { } } - inline fun results(): RealmResults { + inline fun results(firstField: String? = null, secondField: String? = null): RealmResults { var realmQuery = realm.where() this.filterConditions.map { it.queryCondition @@ -136,7 +136,14 @@ open class Filter : RealmObject(), RowRepresentable { realmQuery = it.queryWith(realmQuery) } - return realmQuery.findAll() + if (firstField != null && secondField != null) { + return realmQuery.distinct(firstField, secondField).findAll() + } + + if (firstField != null) { + return realmQuery.distinct(firstField).findAll() + } + return realmQuery.findAll() } val query: Query diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt index d45b3b51..c37db354 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt @@ -34,7 +34,9 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo fun fieldNameForQueryType(queryCondition: Class): String? { return when (queryCondition) { - QueryCondition.AnyBankroll::class.java -> "bankroll.id" + + QueryCondition.AnyBankroll::class.java -> "bankroll.id" + QueryCondition.AnyTransactionType::class.java -> "type" QueryCondition.StartedFromDate::class.java, QueryCondition.StartedToDate::class.java -> "date" 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 e5fe9e29..c216bce8 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 @@ -1,5 +1,6 @@ package net.pokeranalytics.android.ui.fragment +import android.app.Activity import android.app.Activity.RESULT_OK import android.content.Intent import android.os.Bundle @@ -17,17 +18,19 @@ import io.realm.kotlin.where import kotlinx.android.synthetic.main.fragment_feed.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.interfaces.Editable +import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction -import net.pokeranalytics.android.ui.activity.DataListActivity -import net.pokeranalytics.android.ui.activity.EditableDataActivity -import net.pokeranalytics.android.ui.activity.NewDataMenuActivity -import net.pokeranalytics.android.ui.activity.SessionActivity +import net.pokeranalytics.android.ui.activity.* import net.pokeranalytics.android.ui.adapter.FeedSessionRowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.FeedTransactionRowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.RealmFragment +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 import net.pokeranalytics.android.util.Preferences @@ -35,7 +38,7 @@ import java.text.SimpleDateFormat import java.util.* -class FeedFragment : RealmFragment(), RowRepresentableDelegate { +class FeedFragment : RealmFragment(), RowRepresentableDelegate, FilterHandler { companion object { @@ -83,8 +86,13 @@ class FeedFragment : RealmFragment(), RowRepresentableDelegate { if (data.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false)) { deleteSelectedTransaction() } - } - } + } else if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal && resultCode == Activity.RESULT_OK) { + data?.let { + this.saveFilter(this.requireContext(), it.getStringExtra(FiltersActivity.IntentKey.FILTER_ID.keyName)) + } + } + + } override fun onDestroyView() { super.onDestroyView() @@ -149,18 +157,22 @@ class FeedFragment : RealmFragment(), RowRepresentableDelegate { */ private fun initData() { - val sdf = SimpleDateFormat("dd/M/yyyy hh:mm", Locale.getDefault()) + + val sdf = SimpleDateFormat("dd/M/yyyy hh:mm", Locale.getDefault()) betaLimitDate = sdf.parse("17/7/2019 10:00") + val filter : Filter? = this.currentFilter(this.requireContext(), getRealm()) + // Sessions - this.realmSessions = getRealm().where().findAll().sort("startDate", Sort.DESCENDING) - this.realmSessions.addChangeListener { _, _ -> + this.realmSessions = filter?.results() ?: run { getRealm().where().findAll() }.sort("startDate", Sort.DESCENDING) + this.realmSessions.addChangeListener { _, _ -> this.feedSessionAdapter.refreshData() this.feedSessionAdapter.notifyDataSetChanged() } - val pendingSessions = getRealm().where().isNull("year").isNull("month").findAll().sort("startDate", Sort.DESCENDING) - val distinctDateSessions = getRealm().where().distinct("year", "month").findAll().sort("startDate", Sort.DESCENDING) + + val pendingSessions = filter?.let { getRealm().where().alwaysFalse().findAll() } ?: run { getRealm().where().isNull("year").isNull("month").findAll().sort("startDate", Sort.DESCENDING) } + val distinctDateSessions = filter?.results("year", "month") ?: run { getRealm().where().distinct("year", "month").findAll() }.sort("startDate", Sort.DESCENDING) this.feedSessionAdapter = FeedSessionRowRepresentableAdapter(this, realmSessions, pendingSessions, distinctDateSessions) // Transactions @@ -233,4 +245,20 @@ class FeedFragment : RealmFragment(), RowRepresentableDelegate { Toast.makeText(context, "Beta has ended. Thanks a lot for your participation! Please update with the Google Play version to continue using the app", Toast.LENGTH_LONG).show() } + + // Filter Handler + + override fun createFilter() { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun applyFilter() { + initData() + } + + override fun removeFilter() { + initData() + } + + override var currentFilterable: FilterableType = FilterableType.SESSION } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt index 42f73322..cca2e114 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt @@ -21,7 +21,7 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In TOURNAMENT(R.string.tournament), ONLINE(R.string.online), RESULT(R.string.result), - //TRANSACTION_TYPES(R.string.operation_types), + TRANSACTION_TYPES(R.string.operation_types), LOCATIONS(R.string.locations), BANKROLLS(R.string.bankrolls), //PLAYERS(R.string.players), @@ -41,7 +41,18 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In fun isAllowed(filterableType:FilterableType): Boolean { return when (filterableType) { - FilterableType.SESSION -> { true } + FilterableType.SESSION -> { + when (this) { + TRANSACTION_TYPES -> false + else -> true + } + } + FilterableType.TRANSACTION -> { + when (this) { + DATE, TRANSACTION_TYPES -> true + else -> false + } + } else -> { when (this) { DATE -> true @@ -108,7 +119,7 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In NUMBER_OF_REBUY ) - //TRANSACTION_TYPES -> arrayListOf() + TRANSACTION_TYPES -> arrayListOf(FilterSectionRow.TRANSACTION_TYPES) } } } 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 f5ada853..831e4f8a 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 @@ -39,7 +39,8 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { BANKROLL(R.string.bankrolls), NUMBER_OF_PLAYERS(R.string.number_of_players), MULTI_PLAYER(R.string.multiplayer), - NUMBER_OF_REBUY(R.string.number_of_buyins) + NUMBER_OF_REBUY(R.string.number_of_buyins), + TRANSACTION_TYPES(R.string.operation_types), ; private enum class SelectionType { @@ -111,6 +112,9 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable { VALUE -> arrayListOf().apply { addAll(QueryCondition.moreOrLess()) addAll(QueryCondition.moreOrLess()) + } + TRANSACTION_TYPES -> arrayListOf().apply { + } else -> arrayListOf() }.apply {