From af897caa8a3bd6ea57d1a075aadab2c4e69622ac Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 17 May 2019 16:57:36 +0200 Subject: [PATCH] Removed ResultsObserverFragment and added the notification system inside RealmFragment --- .../android/ui/fragment/CalendarFragment.kt | 11 ++- .../android/ui/fragment/StatisticsFragment.kt | 99 ++++++++++--------- .../ui/fragment/components/RealmFragment.kt | 24 +++++ .../components/ResultsObserverFragment.kt | 37 ------- .../ui/fragment/data/BankrollDataFragment.kt | 2 +- .../ui/fragment/data/DataManagerFragment.kt | 6 +- .../ui/fragment/data/EditableDataFragment.kt | 4 +- 7 files changed, 92 insertions(+), 91 deletions(-) delete mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ResultsObserverFragment.kt diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 04e7087a..cb8c39ef 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.tabs.TabLayout import io.realm.Realm +import io.realm.RealmModel import kotlinx.android.synthetic.main.fragment_calendar.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -18,13 +19,15 @@ import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.filter.QueryCondition +import net.pokeranalytics.android.model.realm.ComputableResult +import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.extensions.hideWithAnimation import net.pokeranalytics.android.ui.extensions.showWithAnimation -import net.pokeranalytics.android.ui.fragment.components.ResultsObserverFragment +import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.view.CalendarTabs import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -35,7 +38,7 @@ import java.util.* import kotlin.coroutines.CoroutineContext -class CalendarFragment : ResultsObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, +class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { enum class TimeFilter { @@ -112,7 +115,9 @@ class CalendarFragment : ResultsObserverFragment(), CoroutineScope, StaticRowRep } } - override fun sessionsChanged() { + override val observedEntities: List> = listOf(ComputableResult::class.java) + + override fun entitiesChanged() { launchStatComputation() } 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 7cbc1f29..5baa3650 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 @@ -7,6 +7,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import io.realm.Realm +import io.realm.RealmModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async @@ -18,9 +19,10 @@ 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.ComputableResult import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.FiltersActivity -import net.pokeranalytics.android.ui.fragment.components.ResultsObserverFragment +import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.report.ComposableTableReportFragment import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterHandler @@ -29,39 +31,39 @@ import timber.log.Timber import java.util.* import kotlin.coroutines.CoroutineContext -class StatisticsFragment : ResultsObserverFragment(), FilterHandler { +class StatisticsFragment : RealmFragment(), FilterHandler { val coroutineContext: CoroutineContext get() = Dispatchers.Main private lateinit var tableReportFragment: ComposableTableReportFragment - companion object { + companion object { - /** - * Create new instance - */ - fun newInstance(): StatisticsFragment { - val fragment = StatisticsFragment() - val bundle = Bundle() - fragment.arguments = bundle - return fragment - } - } + /** + * Create new instance + */ + fun newInstance(): StatisticsFragment { + val fragment = StatisticsFragment() + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + } - // Life Cycle + // Life Cycle override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater.inflate(R.layout.fragment_stats, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - setFilterable(true) - initUI() - launchStatComputation() - } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setFilterable(true) + initUI() + launchStatComputation() + } private fun initUI() { val fragmentTransaction = requireFragmentManager().beginTransaction() @@ -71,7 +73,9 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler { this.tableReportFragment = fragment } - override fun sessionsChanged() { + override val observedEntities: List> = listOf(ComputableResult::class.java) + + override fun entitiesChanged() { this.launchStatComputation() } @@ -86,31 +90,31 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler { // return rows // } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - 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 onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal && 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. - } + // 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 applyFilter() { + this.entitiesChanged() + } - override fun removeFilter() { - this.sessionsChanged() - } + override fun removeFilter() { + this.entitiesChanged() + } - override var currentFilterable: FilterableType = FilterableType.SESSION + override var currentFilterable: FilterableType = FilterableType.SESSION - // Business + // Business /** * Launch stat computation @@ -148,7 +152,7 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler { */ private fun createSessionGroupsAndStartCompute(realm: Realm): Report { - val filter : Filter? = this.currentFilter(this.requireContext(), realm) + val filter: Filter? = this.currentFilter(this.requireContext(), realm) val allStats: List = listOf( Stat.NET_RESULT, @@ -159,7 +163,7 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler { Stat.HOURLY_DURATION ) - val query = filter?.query ?: Query() + val query = filter?.query ?: Query() val allSessionGroup = ComputableGroup(query, allStats) val cgStats: List = listOf( @@ -175,7 +179,14 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler { ) 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) + 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).merge(query), tStats) Timber.d(">>>>> Start computations...") diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt index 133d0946..ff65a89b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt @@ -5,18 +5,38 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import io.realm.Realm +import io.realm.RealmModel +import io.realm.RealmResults open class RealmFragment : PokerAnalyticsFragment() { private lateinit var realm: Realm + private var realmResultLists: MutableMap, RealmResults<*>> = mutableMapOf() + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { realm = Realm.getDefaultInstance() + + this.observedEntities.forEach { + val realmResults = realm.where(it).findAll() + + realmResults.addChangeListener { _,_ -> + this.entitiesChanged() + } + + this.realmResultLists[it] = realmResults + } + return super.onCreateView(inflater, container, savedInstanceState) } override fun onDestroyView() { super.onDestroyView() + + this.realmResultLists.values.forEach { + it.removeAllChangeListeners() + } + this.realm.close() } @@ -27,4 +47,8 @@ open class RealmFragment : PokerAnalyticsFragment() { return this.realm } + open val observedEntities: List> = listOf() + + open fun entitiesChanged() {} + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ResultsObserverFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ResultsObserverFragment.kt deleted file mode 100644 index 8578ce3d..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ResultsObserverFragment.kt +++ /dev/null @@ -1,37 +0,0 @@ -package net.pokeranalytics.android.ui.fragment.components - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import io.realm.RealmResults -import net.pokeranalytics.android.model.realm.ComputableResult - -open class ResultsObserverFragment : RealmFragment() { - - private lateinit var computableResults: RealmResults - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - - val view = super.onCreateView(inflater, container, savedInstanceState) - - // ComputableResult are existing only if sessions are ended - this.computableResults = getRealm().where(ComputableResult::class.java).findAll() - - this.computableResults.addChangeListener { _, _ -> - this.sessionsChanged() - } - - return view - } - - override fun onDestroyView() { - super.onDestroyView() - computableResults.removeAllChangeListeners() - } - - open fun sessionsChanged() { - // to override - } - -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt index b6cb7465..1db7f1da 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt @@ -157,7 +157,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS /** * Init data */ - override fun initData() { + override fun initData() { super.initData() defaultCurrency = UserDefaults.currency diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt index 47e3ea4a..938d9e09 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt @@ -44,7 +44,7 @@ open class DataManagerFragment : RealmFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() + loadItem() } override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { @@ -74,10 +74,10 @@ open class DataManagerFragment : RealmFragment() { /** * Init data */ - protected open fun initData() { + private fun loadItem() { - this.deleteButtonShouldAppear = this.primaryKey != null this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) + this.deleteButtonShouldAppear = this.primaryKey != null } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index fd04b1d1..a6fd75fa 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -11,7 +11,6 @@ import kotlinx.android.synthetic.main.fragment_editable_data.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Editable -import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -87,8 +86,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat return this.item as RowRepresentableDataSource } - override fun initData() { - super.initData() + open fun initData() { val dataSource = getDataSource() this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this)