From b8490a1207de65f53b4bfa8961b5d9c684a55843 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 7 May 2019 16:15:36 +0200 Subject: [PATCH] Add the possibility to apply a filter in stats fragment Add a new query computed variable in Filter class which returns a Query object --- .../android/model/realm/Filter.kt | 10 +++ .../android/ui/activity/HomeActivity.kt | 34 ++------- .../android/ui/fragment/StatisticsFragment.kt | 46 ++++++++++-- .../android/ui/interfaces/FilterHandler.kt | 72 +++++++++++++++++++ .../android/util/Preferences.kt | 22 +++++- 5 files changed, 152 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt 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 d83b2e1e..c28474ac 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 @@ -129,4 +129,14 @@ open class Filter : RealmObject() { return realmQuery.findAll() } + val query: Query + get() { + val query = Query() + this.filterConditions.forEach { + query.add(it.queryCondition) + } + return query + } + + } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt index e0289090..ca43f1c4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt @@ -11,11 +11,13 @@ import androidx.appcompat.app.AlertDialog import com.google.android.material.bottomnavigation.BottomNavigationView import io.realm.RealmResults 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.R import net.pokeranalytics.android.model.realm.Currency import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.HomePagerAdapter +import net.pokeranalytics.android.ui.interfaces.FilterHandler import timber.log.Timber @@ -206,32 +208,10 @@ class HomeActivity : PokerAnalyticsActivity() { * Manage filters */ private fun manageFilters() { + val fragment = supportFragmentManager.fragments[viewPager.currentItem] - val filterSelected = false - - val choices = ArrayList() - 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() - } - + if (fragment is FilterHandler) { + fragment.manageFilters((fragment)) + } + } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt index 1298a41e..0d41cd6d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt @@ -1,26 +1,39 @@ package net.pokeranalytics.android.ui.fragment +import android.app.Activity +import android.content.Intent import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem import android.view.View import io.realm.Realm +import io.realm.kotlin.where +import kotlinx.android.synthetic.main.activity_new_data.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async import kotlinx.coroutines.launch +import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.ComputableGroup import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.filter.Query 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.CustomizableRowRepresentable 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 java.util.* import kotlin.coroutines.CoroutineContext -class StatisticsFragment : TableReportFragment() { +class StatisticsFragment : TableReportFragment(), FilterHandler { override val coroutineContext: CoroutineContext get() = Dispatchers.Main @@ -68,6 +81,27 @@ class StatisticsFragment : TableReportFragment() { 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 @@ -104,6 +138,8 @@ class StatisticsFragment : TableReportFragment() { */ private fun createSessionGroupsAndStartCompute(realm: Realm): Report { + val filter : Filter? = this.currentFilter(this.requireContext(), realm) + val allStats: List = listOf( Stat.NET_RESULT, Stat.HOURLY_RATE, @@ -112,7 +148,9 @@ class StatisticsFragment : TableReportFragment() { Stat.AVERAGE_HOURLY_DURATION, Stat.HOURLY_DURATION ) - val allSessionGroup = ComputableGroup(Query(), allStats) + + val query = filter?.query ?: run { Query() } + val allSessionGroup = ComputableGroup(query, allStats) val cgStats: List = listOf( Stat.NET_RESULT, @@ -125,10 +163,10 @@ class StatisticsFragment : TableReportFragment() { Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN ) - val cgSessionGroup = ComputableGroup(Query(QueryCondition.IsCash), cgStats) + val cgSessionGroup = ComputableGroup(Query(QueryCondition.IsCash).merge(query), cgStats) val tStats: List = 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...") diff --git a/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt b/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt new file mode 100644 index 00000000..04079320 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt @@ -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().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() + 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() + } +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt index cfc53b7f..e89ddfa6 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -10,7 +10,8 @@ class Preferences { CURRENCY_CODE("CurrencyCode"), LOCALE_CODE("LocaleCode"), FIRST_LAUNCH("firstLaunch"), - STOP_SHOWING_DISCLAIMER("stopShowingDisclaimer") + STOP_SHOWING_DISCLAIMER("stopShowingDisclaimer"), + ACTIVE_FILTER_ID("ActiveFilterId"), } @@ -23,6 +24,13 @@ class Preferences { 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? { val preferences = PreferenceManager.getDefaultSharedPreferences(context) return preferences.getString(key.identifier, null) @@ -45,6 +53,18 @@ class Preferences { 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? { return getString(Keys.CURRENCY_CODE, context) }