Merge branch 'dev' of gitlab.com:stax-river/poker-analytics into dev

dev
Aurelien Hubert 7 years ago
commit 880014f7bb
  1. 11
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt
  2. 89
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
  3. 36
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/RealmFragment.kt
  4. 37
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/ResultsObserverFragment.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt
  6. 6
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt
  7. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt

@ -7,6 +7,7 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import io.realm.Realm import io.realm.Realm
import io.realm.RealmModel
import kotlinx.android.synthetic.main.fragment_calendar.* import kotlinx.android.synthetic.main.fragment_calendar.*
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -19,13 +20,15 @@ import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.Criteria
import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.combined
import net.pokeranalytics.android.model.filter.QueryCondition 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.activity.CalendarDetailsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.extensions.hideWithAnimation import net.pokeranalytics.android.ui.extensions.hideWithAnimation
import net.pokeranalytics.android.ui.extensions.showWithAnimation 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.CalendarTabs
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
@ -36,7 +39,7 @@ import java.util.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
class CalendarFragment : ResultsObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentableDataSource,
RowRepresentableDelegate { RowRepresentableDelegate {
enum class TimeFilter { enum class TimeFilter {
@ -113,7 +116,9 @@ class CalendarFragment : ResultsObserverFragment(), CoroutineScope, StaticRowRep
} }
} }
override fun sessionsChanged() { override val observedEntities: List<Class<out RealmModel>> = listOf(ComputableResult::class.java)
override fun entitiesChanged() {
launchStatComputation() launchStatComputation()
} }

@ -7,6 +7,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import io.realm.Realm import io.realm.Realm
import io.realm.RealmModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async import kotlinx.coroutines.async
@ -18,9 +19,10 @@ 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.ComputableResult
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.FiltersActivity 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.fragment.report.ComposableTableReportFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode
import net.pokeranalytics.android.ui.interfaces.FilterHandler import net.pokeranalytics.android.ui.interfaces.FilterHandler
@ -29,27 +31,27 @@ import timber.log.Timber
import java.util.* import java.util.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
class StatisticsFragment : ResultsObserverFragment(), FilterHandler { class StatisticsFragment : RealmFragment(), FilterHandler {
val coroutineContext: CoroutineContext val coroutineContext: CoroutineContext
get() = Dispatchers.Main get() = Dispatchers.Main
private lateinit var tableReportFragment: ComposableTableReportFragment private lateinit var tableReportFragment: ComposableTableReportFragment
companion object { companion object {
/** /**
* Create new instance * Create new instance
*/ */
fun newInstance(): StatisticsFragment { fun newInstance(): StatisticsFragment {
val fragment = StatisticsFragment() val fragment = StatisticsFragment()
val bundle = Bundle() val bundle = Bundle()
fragment.arguments = bundle fragment.arguments = bundle
return fragment return fragment
} }
} }
// Life Cycle // Life Cycle
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState) super.onCreateView(inflater, container, savedInstanceState)
@ -70,7 +72,9 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler {
this.tableReportFragment = fragment this.tableReportFragment = fragment
} }
override fun sessionsChanged() { override val observedEntities: List<Class<out RealmModel>> = listOf(ComputableResult::class.java)
override fun entitiesChanged() {
this.launchStatComputation() this.launchStatComputation()
} }
@ -85,31 +89,31 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler {
// return rows // return rows
// } // }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal && resultCode == Activity.RESULT_OK) { if (requestCode == FilterActivityRequestCode.SELECT_FILTER.ordinal && resultCode == Activity.RESULT_OK) {
data?.let { data?.let {
this.saveFilter(this.requireContext(), it.getStringExtra(FiltersActivity.IntentKey.FILTER_ID.keyName)) this.saveFilter(this.requireContext(), it.getStringExtra(FiltersActivity.IntentKey.FILTER_ID.keyName))
} }
} }
} }
// Filter Handler // Filter Handler
override fun createFilter() { override fun createFilter() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates. TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
override fun applyFilter() { override fun applyFilter() {
this.sessionsChanged() this.entitiesChanged()
} }
override fun removeFilter() { override fun removeFilter() {
this.sessionsChanged() this.entitiesChanged()
} }
override var currentFilterable: FilterableType = FilterableType.SESSION override var currentFilterable: FilterableType = FilterableType.SESSION
// Business // Business
/** /**
* Launch stat computation * Launch stat computation
@ -147,7 +151,7 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler {
*/ */
private fun createSessionGroupsAndStartCompute(realm: Realm): Report { 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<Stat> = listOf( val allStats: List<Stat> = listOf(
Stat.NET_RESULT, Stat.NET_RESULT,
@ -158,7 +162,7 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler {
Stat.HOURLY_DURATION Stat.HOURLY_DURATION
) )
val query = filter?.query ?: Query() val query = filter?.query ?: Query()
val allSessionGroup = ComputableGroup(query, allStats) val allSessionGroup = ComputableGroup(query, allStats)
val cgStats: List<Stat> = listOf( val cgStats: List<Stat> = listOf(
@ -174,7 +178,14 @@ class StatisticsFragment : ResultsObserverFragment(), FilterHandler {
) )
val cgSessionGroup = ComputableGroup(Query(QueryCondition.IsCash).merge(query), 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).merge(query), tStats) val tSessionGroup = ComputableGroup(Query(QueryCondition.IsTournament).merge(query), tStats)
Timber.d(">>>>> Start computations...") Timber.d(">>>>> Start computations...")

@ -5,18 +5,44 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import io.realm.Realm import io.realm.Realm
import io.realm.RealmModel
import io.realm.RealmResults
open class RealmFragment : PokerAnalyticsFragment() { open class RealmFragment : PokerAnalyticsFragment() {
/**
* A realm instance
*/
private lateinit var realm: Realm private lateinit var realm: Realm
/**
* A List of observed RealmResults
*/
private var observedRealmResults: MutableList<RealmResults<*>> = mutableListOf()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
realm = Realm.getDefaultInstance() realm = Realm.getDefaultInstance()
this.observedEntities.forEach {
val realmResults = realm.where(it).findAll()
realmResults.addChangeListener { _,_ ->
this.entitiesChanged()
}
this.observedRealmResults.add(realmResults)
}
return super.onCreateView(inflater, container, savedInstanceState) return super.onCreateView(inflater, container, savedInstanceState)
} }
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
this.observedRealmResults.forEach {
it.removeAllChangeListeners()
}
this.realm.close() this.realm.close()
} }
@ -27,4 +53,14 @@ open class RealmFragment : PokerAnalyticsFragment() {
return this.realm return this.realm
} }
/**
* A list of RealmModel classes to observe
*/
open val observedEntities: List<Class<out RealmModel>> = listOf()
/**
* The method called when a change happened in any RealmResults
*/
open fun entitiesChanged() {}
} }

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

@ -157,7 +157,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
/** /**
* Init data * Init data
*/ */
override fun initData() { override fun initData() {
super.initData() super.initData()
defaultCurrency = UserDefaults.currency defaultCurrency = UserDefaults.currency

@ -44,7 +44,7 @@ open class DataManagerFragment : RealmFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initData() loadItem()
} }
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
@ -74,10 +74,10 @@ open class DataManagerFragment : RealmFragment() {
/** /**
* Init data * Init data
*/ */
protected open fun initData() { private fun loadItem() {
this.deleteButtonShouldAppear = this.primaryKey != null
this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey)
this.deleteButtonShouldAppear = this.primaryKey != null
} }

@ -11,7 +11,6 @@ import kotlinx.android.synthetic.main.fragment_editable_data.view.*
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.interfaces.Editable 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.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
@ -87,8 +86,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat
return this.item as RowRepresentableDataSource return this.item as RowRepresentableDataSource
} }
override fun initData() { open fun initData() {
super.initData()
val dataSource = getDataSource() val dataSource = getDataSource()
this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this)

Loading…
Cancel
Save