Add the possibility to apply a filter in stats fragment

Add a new query computed variable in Filter class which returns a Query object
dev
Razmig Sarkissian 7 years ago
parent 5e70a799eb
commit b8490a1207
  1. 10
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  2. 30
      app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt
  3. 46
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
  4. 72
      app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt
  5. 22
      app/src/main/java/net/pokeranalytics/android/util/Preferences.kt

@ -129,4 +129,14 @@ open class Filter : RealmObject() {
return realmQuery.findAll() return realmQuery.findAll()
} }
val query: Query
get() {
val query = Query()
this.filterConditions.forEach {
query.add(it.queryCondition)
}
return query
}
} }

@ -11,11 +11,13 @@ import androidx.appcompat.app.AlertDialog
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
import io.realm.RealmResults import io.realm.RealmResults
import kotlinx.android.synthetic.main.activity_home.* import kotlinx.android.synthetic.main.activity_home.*
import kotlinx.android.synthetic.main.bottom_sheet_sum.view.*
import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.BuildConfig
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Currency import net.pokeranalytics.android.model.realm.Currency
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.HomePagerAdapter import net.pokeranalytics.android.ui.adapter.HomePagerAdapter
import net.pokeranalytics.android.ui.interfaces.FilterHandler
import timber.log.Timber import timber.log.Timber
@ -206,32 +208,10 @@ class HomeActivity : PokerAnalyticsActivity() {
* Manage filters * Manage filters
*/ */
private fun manageFilters() { private fun manageFilters() {
val fragment = supportFragmentManager.fragments[viewPager.currentItem]
val filterSelected = false if (fragment is FilterHandler) {
fragment.manageFilters((fragment))
val choices = ArrayList<CharSequence>()
choices.add(getString(R.string.new_str))
if (filterSelected) {
choices.add(getString(R.string.modify_current_filter))
choices.add(getString(R.string.load_from_db))
choices.add(getString(R.string.remove_filter))
}
val builder = AlertDialog.Builder(this)
builder.setTitle(R.string.filter_selection)
.setCancelable(true)
.setItems(choices.toTypedArray()) { _, which ->
Timber.d("Click on $which")
when (which) {
0 -> FiltersActivity.newInstance(this@HomeActivity)
} }
} }
.setNegativeButton(R.string.cancel) { _, _ ->
Timber.d("Click on cancel")
}
builder.show()
}
} }

@ -1,26 +1,39 @@
package net.pokeranalytics.android.ui.fragment package net.pokeranalytics.android.ui.fragment
import android.app.Activity
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View import android.view.View
import io.realm.Realm import io.realm.Realm
import io.realm.kotlin.where
import kotlinx.android.synthetic.main.activity_new_data.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.ComputableGroup
import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.ui.interfaces.FilterHandler
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow
import net.pokeranalytics.android.util.Preferences
import net.pokeranalytics.android.util.UserDefaults
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
class StatisticsFragment : TableReportFragment() { class StatisticsFragment : TableReportFragment(), FilterHandler {
override val coroutineContext: CoroutineContext override val coroutineContext: CoroutineContext
get() = Dispatchers.Main get() = Dispatchers.Main
@ -68,6 +81,27 @@ class StatisticsFragment : TableReportFragment() {
return rows return rows
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 0 && resultCode == Activity.RESULT_OK) {
data?.let {
this.saveFilter(this.requireContext(), it.getStringExtra(FiltersActivity.IntentKey.FILTER_ID.keyName))
}
}
}
// Filter Handler
override fun createFilter() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun applyFilter() {
this.sessionsChanged()
}
override fun removeFilter() {
this.sessionsChanged()
}
// Business // Business
@ -104,6 +138,8 @@ class StatisticsFragment : TableReportFragment() {
*/ */
private fun createSessionGroupsAndStartCompute(realm: Realm): Report { private fun createSessionGroupsAndStartCompute(realm: Realm): Report {
val filter : Filter? = this.currentFilter(this.requireContext(), realm)
val allStats: List<Stat> = listOf( val allStats: List<Stat> = listOf(
Stat.NET_RESULT, Stat.NET_RESULT,
Stat.HOURLY_RATE, Stat.HOURLY_RATE,
@ -112,7 +148,9 @@ class StatisticsFragment : TableReportFragment() {
Stat.AVERAGE_HOURLY_DURATION, Stat.AVERAGE_HOURLY_DURATION,
Stat.HOURLY_DURATION Stat.HOURLY_DURATION
) )
val allSessionGroup = ComputableGroup(Query(), allStats)
val query = filter?.query ?: run { Query() }
val allSessionGroup = ComputableGroup(query, allStats)
val cgStats: List<Stat> = listOf( val cgStats: List<Stat> = listOf(
Stat.NET_RESULT, Stat.NET_RESULT,
@ -125,10 +163,10 @@ class StatisticsFragment : TableReportFragment() {
Stat.NUMBER_OF_GAMES, Stat.NUMBER_OF_GAMES,
Stat.AVERAGE_BUYIN Stat.AVERAGE_BUYIN
) )
val cgSessionGroup = ComputableGroup(Query(QueryCondition.IsCash), cgStats) val cgSessionGroup = ComputableGroup(Query(QueryCondition.IsCash).merge(query), cgStats)
val tStats: List<Stat> = val tStats: List<Stat> =
listOf(Stat.NET_RESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) listOf(Stat.NET_RESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN)
val tSessionGroup = ComputableGroup(Query(QueryCondition.IsTournament), tStats) val tSessionGroup = ComputableGroup(Query(QueryCondition.IsTournament).merge(query), tStats)
Timber.d(">>>>> Start computations...") Timber.d(">>>>> Start computations...")

@ -0,0 +1,72 @@
package net.pokeranalytics.android.ui.interfaces
import android.content.Context
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment
import io.realm.Realm
import io.realm.kotlin.where
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.util.Preferences
import timber.log.Timber
interface FilterHandler {
fun createFilter()
fun applyFilter()
fun removeFilter()
fun saveFilter(context: Context, filterId:String) {
Preferences.setActiveFilterId(filterId, context)
this.applyFilter()
}
fun currentFilter(context: Context, realm: Realm): Filter? {
return Preferences.getActiveFilterId(context)?.let {
realm.where<Filter>().equalTo("id", it).findFirst()
} ?: run {
null
}
}
/**
* Manage filters
*/
fun manageFilters(fragment: Fragment) {
val context = fragment.requireContext()
val filterSelected = Preferences.getActiveFilterId(context) != null
val choices = ArrayList<CharSequence>()
choices.add(fragment.getString(R.string.new_str))
if (filterSelected) {
choices.add(fragment.getString(R.string.modify_current_filter))
choices.add(fragment.getString(R.string.load_from_db))
choices.add(fragment.getString(R.string.remove_filter))
}
val builder = AlertDialog.Builder(context)
builder.setTitle(R.string.filter_selection)
.setCancelable(true)
.setItems(choices.toTypedArray()) { _, which ->
Timber.d("Click on $which")
when (which) {
0 -> FiltersActivity.newInstanceForResult(fragment = fragment, requestCode = 0)
1 -> FiltersActivity.newInstanceForResult(fragment = fragment, requestCode = 0)
2 -> FiltersActivity.newInstanceForResult(fragment = fragment, requestCode = 0)
3 -> {
Preferences.removeActiveFilterId(context)
removeFilter()
}
}
}
.setNegativeButton(R.string.cancel) { _, _ ->
Timber.d("Click on cancel")
}
builder.show()
}
}

@ -10,7 +10,8 @@ class Preferences {
CURRENCY_CODE("CurrencyCode"), CURRENCY_CODE("CurrencyCode"),
LOCALE_CODE("LocaleCode"), LOCALE_CODE("LocaleCode"),
FIRST_LAUNCH("firstLaunch"), FIRST_LAUNCH("firstLaunch"),
STOP_SHOWING_DISCLAIMER("stopShowingDisclaimer") STOP_SHOWING_DISCLAIMER("stopShowingDisclaimer"),
ACTIVE_FILTER_ID("ActiveFilterId"),
} }
@ -23,6 +24,13 @@ class Preferences {
editor.apply() editor.apply()
} }
private fun removeKey(key: Keys, context: Context) {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
val editor = preferences.edit()
editor.remove(key.identifier)
editor.apply()
}
fun getString(key: Keys, context: Context) : String? { fun getString(key: Keys, context: Context) : String? {
val preferences = PreferenceManager.getDefaultSharedPreferences(context) val preferences = PreferenceManager.getDefaultSharedPreferences(context)
return preferences.getString(key.identifier, null) return preferences.getString(key.identifier, null)
@ -45,6 +53,18 @@ class Preferences {
UserDefaults.setCurrencyValues(context) UserDefaults.setCurrencyValues(context)
} }
fun setActiveFilterId(filterId: String, context: Context) {
setString(Keys.ACTIVE_FILTER_ID, filterId, context)
}
fun getActiveFilterId(context: Context) : String? {
return getString(Keys.ACTIVE_FILTER_ID, context)
}
fun removeActiveFilterId(context: Context) {
removeKey(Keys.ACTIVE_FILTER_ID, context)
}
private fun getCurrencyCode(context: Context) : String? { private fun getCurrencyCode(context: Context) : String? {
return getString(Keys.CURRENCY_CODE, context) return getString(Keys.CURRENCY_CODE, context)
} }

Loading…
Cancel
Save