add filtering in feed view controller

create transaction type query condition
dev
Razmig Sarkissian 7 years ago
parent 98e547b248
commit 0905781830
  1. 2
      app/src/main/java/net/pokeranalytics/android/model/Criteria.kt
  2. 9
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  3. 11
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  4. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt
  5. 52
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt
  6. 17
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt
  7. 6
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt

@ -122,6 +122,7 @@ sealed class Criteria {
object TournamentNames: RealmCriteria() object TournamentNames: RealmCriteria()
object Locations: RealmCriteria() object Locations: RealmCriteria()
object TournamentFeatures: RealmCriteria() object TournamentFeatures: RealmCriteria()
object TransactionTypes: RealmCriteria()
object Limits: ListCriteria() object Limits: ListCriteria()
object TableSizes: ListCriteria() object TableSizes: ListCriteria()
object TournamentTypes: ListCriteria() object TournamentTypes: ListCriteria()
@ -185,6 +186,7 @@ sealed class Criteria {
is TournamentFeatures -> comparison<TournamentFeature>() is TournamentFeatures -> comparison<TournamentFeature>()
is TournamentNames -> comparison<TournamentName>() is TournamentNames -> comparison<TournamentName>()
is Locations -> comparison<Location>() is Locations -> comparison<Location>()
is TransactionTypes-> comparison<TransactionType>()
is SimpleCriteria -> comparison() is SimpleCriteria -> comparison()
is Limits -> comparison<QueryCondition.AnyLimit, Int>() is Limits -> comparison<QueryCondition.AnyLimit, Int>()
is TournamentTypes -> comparison<QueryCondition.AnyTournamentType, Int>() is TournamentTypes -> comparison<QueryCondition.AnyTournamentType, Int>()

@ -49,6 +49,7 @@ sealed class QueryCondition : FilterElementRow {
Bankroll::class.java -> AnyBankroll() Bankroll::class.java -> AnyBankroll()
Game::class.java -> AnyGame() Game::class.java -> AnyGame()
Location::class.java -> AnyLocation() Location::class.java -> AnyLocation()
TransactionType::class.java -> AnyTransactionType()
TournamentName::class.java -> AnyTournamentName() TournamentName::class.java -> AnyTournamentName()
TournamentFeature::class.java -> AnyTournamentFeature() TournamentFeature::class.java -> AnyTournamentFeature()
else -> throw PokerAnalyticsException.QueryTypeUnhandled else -> throw PokerAnalyticsException.QueryTypeUnhandled
@ -254,6 +255,7 @@ sealed class QueryCondition : FilterElementRow {
this.setObject(bankroll) this.setObject(bankroll)
} }
} }
class AnyGame(): QueryDataCondition<Game>() { class AnyGame(): QueryDataCondition<Game>() {
override val entity: Class<Game> = Game::class.java override val entity: Class<Game> = Game::class.java
constructor(game: Game): this() { constructor(game: Game): this() {
@ -290,6 +292,13 @@ sealed class QueryCondition : FilterElementRow {
} }
} }
class AnyTransactionType(): QueryDataCondition<TransactionType>() {
override val entity: Class<TransactionType> = TransactionType::class.java
constructor(transactionType: TransactionType): this() {
this.setObject(transactionType)
}
}
class AnyLimit: ListOfInt() { class AnyLimit: ListOfInt() {
override fun labelForValue(value: Int): String { override fun labelForValue(value: Int): String {
return Limit.values()[value].getDisplayName() return Limit.values()[value].getDisplayName()

@ -128,7 +128,7 @@ open class Filter : RealmObject(), RowRepresentable {
} }
} }
inline fun <reified T : Filterable> results(): RealmResults<T> { inline fun <reified T : Filterable> results(firstField: String? = null, secondField: String? = null): RealmResults<T> {
var realmQuery = realm.where<T>() var realmQuery = realm.where<T>()
this.filterConditions.map { this.filterConditions.map {
it.queryCondition it.queryCondition
@ -136,7 +136,14 @@ open class Filter : RealmObject(), RowRepresentable {
realmQuery = it.queryWith(realmQuery) 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 val query: Query

@ -34,7 +34,9 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo
fun fieldNameForQueryType(queryCondition: Class<out QueryCondition>): String? { fun fieldNameForQueryType(queryCondition: Class<out QueryCondition>): String? {
return when (queryCondition) { 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" QueryCondition.StartedFromDate::class.java, QueryCondition.StartedToDate::class.java -> "date"
else -> null else -> null
} }

@ -1,5 +1,6 @@
package net.pokeranalytics.android.ui.fragment package net.pokeranalytics.android.ui.fragment
import android.app.Activity
import android.app.Activity.RESULT_OK import android.app.Activity.RESULT_OK
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
@ -17,17 +18,19 @@ import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_feed.* import kotlinx.android.synthetic.main.fragment_feed.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData 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.interfaces.Editable
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.*
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.adapter.FeedSessionRowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.FeedSessionRowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.FeedTransactionRowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.FeedTransactionRowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.RealmFragment 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.RowRepresentable
import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.Preferences
@ -35,7 +38,7 @@ import java.text.SimpleDateFormat
import java.util.* import java.util.*
class FeedFragment : RealmFragment(), RowRepresentableDelegate { class FeedFragment : RealmFragment(), RowRepresentableDelegate, FilterHandler {
companion object { companion object {
@ -83,8 +86,13 @@ class FeedFragment : RealmFragment(), RowRepresentableDelegate {
if (data.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false)) { if (data.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false)) {
deleteSelectedTransaction() 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() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
@ -149,18 +157,22 @@ class FeedFragment : RealmFragment(), RowRepresentableDelegate {
*/ */
private fun initData() { 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") betaLimitDate = sdf.parse("17/7/2019 10:00")
val filter : Filter? = this.currentFilter(this.requireContext(), getRealm())
// Sessions // Sessions
this.realmSessions = getRealm().where<Session>().findAll().sort("startDate", Sort.DESCENDING) this.realmSessions = filter?.results() ?: run { getRealm().where<Session>().findAll() }.sort("startDate", Sort.DESCENDING)
this.realmSessions.addChangeListener { _, _ -> this.realmSessions.addChangeListener { _, _ ->
this.feedSessionAdapter.refreshData() this.feedSessionAdapter.refreshData()
this.feedSessionAdapter.notifyDataSetChanged() this.feedSessionAdapter.notifyDataSetChanged()
} }
val pendingSessions = getRealm().where<Session>().isNull("year").isNull("month").findAll().sort("startDate", Sort.DESCENDING)
val distinctDateSessions = getRealm().where<Session>().distinct("year", "month").findAll().sort("startDate", Sort.DESCENDING) val pendingSessions = filter?.let { getRealm().where<Session>().alwaysFalse().findAll() } ?: run { getRealm().where<Session>().isNull("year").isNull("month").findAll().sort("startDate", Sort.DESCENDING) }
val distinctDateSessions = filter?.results("year", "month") ?: run { getRealm().where<Session>().distinct("year", "month").findAll() }.sort("startDate", Sort.DESCENDING)
this.feedSessionAdapter = FeedSessionRowRepresentableAdapter(this, realmSessions, pendingSessions, distinctDateSessions) this.feedSessionAdapter = FeedSessionRowRepresentableAdapter(this, realmSessions, pendingSessions, distinctDateSessions)
// Transactions // 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() 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
} }

@ -21,7 +21,7 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In
TOURNAMENT(R.string.tournament), TOURNAMENT(R.string.tournament),
ONLINE(R.string.online), ONLINE(R.string.online),
RESULT(R.string.result), RESULT(R.string.result),
//TRANSACTION_TYPES(R.string.operation_types), TRANSACTION_TYPES(R.string.operation_types),
LOCATIONS(R.string.locations), LOCATIONS(R.string.locations),
BANKROLLS(R.string.bankrolls), BANKROLLS(R.string.bankrolls),
//PLAYERS(R.string.players), //PLAYERS(R.string.players),
@ -41,7 +41,18 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In
fun isAllowed(filterableType:FilterableType): Boolean { fun isAllowed(filterableType:FilterableType): Boolean {
return when (filterableType) { 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 -> { else -> {
when (this) { when (this) {
DATE -> true DATE -> true
@ -108,7 +119,7 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In
NUMBER_OF_REBUY NUMBER_OF_REBUY
) )
//TRANSACTION_TYPES -> arrayListOf() TRANSACTION_TYPES -> arrayListOf(FilterSectionRow.TRANSACTION_TYPES)
} }
} }
} }

@ -39,7 +39,8 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
BANKROLL(R.string.bankrolls), BANKROLL(R.string.bankrolls),
NUMBER_OF_PLAYERS(R.string.number_of_players), NUMBER_OF_PLAYERS(R.string.number_of_players),
MULTI_PLAYER(R.string.multiplayer), 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 { private enum class SelectionType {
@ -111,6 +112,9 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
VALUE -> arrayListOf<QueryCondition>().apply { VALUE -> arrayListOf<QueryCondition>().apply {
addAll(QueryCondition.moreOrLess<QueryCondition.NetAmountWon>()) addAll(QueryCondition.moreOrLess<QueryCondition.NetAmountWon>())
addAll(QueryCondition.moreOrLess<QueryCondition.NetAmountLost>()) addAll(QueryCondition.moreOrLess<QueryCondition.NetAmountLost>())
}
TRANSACTION_TYPES -> arrayListOf<QueryCondition>().apply {
} }
else -> arrayListOf() else -> arrayListOf()
}.apply { }.apply {

Loading…
Cancel
Save