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. 9
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  4. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt
  5. 44
      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 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<TournamentFeature>()
is TournamentNames -> comparison<TournamentName>()
is Locations -> comparison<Location>()
is TransactionTypes-> comparison<TransactionType>()
is SimpleCriteria -> comparison()
is Limits -> comparison<QueryCondition.AnyLimit, Int>()
is TournamentTypes -> comparison<QueryCondition.AnyTournamentType, Int>()

@ -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<Game>() {
override val entity: Class<Game> = Game::class.java
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() {
override fun labelForValue(value: Int): String {
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>()
this.filterConditions.map {
it.queryCondition
@ -136,6 +136,13 @@ open class Filter : RealmObject(), RowRepresentable {
realmQuery = it.queryWith(realmQuery)
}
if (firstField != null && secondField != null) {
return realmQuery.distinct(firstField, secondField).findAll()
}
if (firstField != null) {
return realmQuery.distinct(firstField).findAll()
}
return realmQuery.findAll()
}

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

@ -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,9 +86,14 @@ 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()
realmSessions.removeAllChangeListeners()
@ -149,18 +157,22 @@ class FeedFragment : RealmFragment(), RowRepresentableDelegate {
*/
private fun initData() {
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<Session>().findAll().sort("startDate", Sort.DESCENDING)
this.realmSessions = filter?.results() ?: run { getRealm().where<Session>().findAll() }.sort("startDate", Sort.DESCENDING)
this.realmSessions.addChangeListener { _, _ ->
this.feedSessionAdapter.refreshData()
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)
// 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
}

@ -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)
}
}
}

@ -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<QueryCondition>().apply {
addAll(QueryCondition.moreOrLess<QueryCondition.NetAmountWon>())
addAll(QueryCondition.moreOrLess<QueryCondition.NetAmountLost>())
}
TRANSACTION_TYPES -> arrayListOf<QueryCondition>().apply {
}
else -> arrayListOf()
}.apply {

Loading…
Cancel
Save