diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 70977686..ec7cabd2 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -6,18 +6,17 @@ import io.realm.RealmConfiguration import io.realm.RealmResults import io.realm.kotlin.where import net.pokeranalytics.android.model.Limit -import net.pokeranalytics.android.model.realm.* -import net.pokeranalytics.android.model.realm.Currency +import net.pokeranalytics.android.model.realm.Game +import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.utils.Seed import net.pokeranalytics.android.util.PokerAnalyticsLogs -import net.pokeranalytics.android.util.Preferences import timber.log.Timber import java.util.* class PokerAnalyticsApplication : Application() { - var sessions: RealmResults? = null + var sessions: RealmResults? = null // private val listener: OrderedRealmCollectionChangeListener> = // OrderedRealmCollectionChangeListener() { realmResults: RealmResults, changeSet: OrderedCollectionChangeSet -> @@ -33,120 +32,123 @@ class PokerAnalyticsApplication : Application() { // // } - override fun onCreate() { - super.onCreate() - - // Realm - Realm.init(this) - val realmConfiguration = RealmConfiguration.Builder() - .name(Realm.DEFAULT_REALM_NAME) - .deleteRealmIfMigrationNeeded() - .initialData(Seed(this)) - .build() - Realm.setDefaultConfiguration(realmConfiguration) - - val realm: Realm = Realm.getDefaultInstance() - // Add observer on session time frame changes - this.sessions = realm.where(Session::class.java).findAll() // monitor session deletions + override fun onCreate() { + super.onCreate() + + // Realm + Realm.init(this) + val realmConfiguration = RealmConfiguration.Builder() + .name(Realm.DEFAULT_REALM_NAME) + .deleteRealmIfMigrationNeeded() + .initialData(Seed(this)) + .build() + Realm.setDefaultConfiguration(realmConfiguration) + + val realm: Realm = Realm.getDefaultInstance() + // Add observer on session time frame changes + this.sessions = realm.where(Session::class.java).findAll() // monitor session deletions // this.endedSessions?.addChangeListener { _, changeSet -> - /* - val deletedSessions = - realm.where(Session::class.java).`in`("id", changeSet.deletions.toTypedArray()).findAll() - deletedSessions.forEach { it.cleanup() } - */ + /* + val deletedSessions = + realm.where(Session::class.java).`in`("id", changeSet.deletions.toTypedArray()).findAll() + deletedSessions.forEach { it.cleanup() } + */ // } - if (BuildConfig.DEBUG) { - // Logs - Timber.plant(PokerAnalyticsLogs()) - } else { - //Fabric.with(this, Crashlytics()) - } + if (BuildConfig.DEBUG) { + // Logs + Timber.plant(PokerAnalyticsLogs()) + } else { + //Fabric.with(this, Crashlytics()) + } - if (BuildConfig.DEBUG) { - this.createFakeSessions() // debug - } + if (BuildConfig.DEBUG) { + this.createFakeSessions() // debug + } - } + } - private fun createFakeSessions() { + private fun createFakeSessions() { - val realm = Realm.getDefaultInstance() + val buyinList = arrayListOf(100.0, 200.0, 300.0, 500.0, 1000.0, 2000.0) + val resultsList = arrayListOf( + -2500.0, -2000.0, -1500.0, -1000.0, -500.0, 200.0, 1000.0, 1500.0, 2500.0 + ) - // Test endedSessions - val sessions = realm.where().findAll() - if (sessions.size < 10) { + Thread().run() { - val numberOfSessions = 50 - Timber.d("> Start creating ${numberOfSessions} fake sessions...") + try { - val s = Date() + val realm = Realm.getDefaultInstance() + val games = realm.where().findAll() - for (index in 0..numberOfSessions) { + // Test endedSessions + val sessions = realm.where().findAll() + if (sessions.size < 10) { - realm.executeTransaction { - val session = Session.newInstance(realm, false) -// session.id = UUID.randomUUID().toString() + val numberOfSessions = 10000 + Timber.d("*** Start creating ${numberOfSessions} fake sessions...") - val calendar = Calendar.getInstance() - calendar.set( - (2017..2018).random(), - (0..11).random(), - (0..28).random(), - (0..23).random(), - (0..59).random() - ) + val s = Date() - val startDate = calendar.time - calendar.add(Calendar.HOUR_OF_DAY, (2..12).random()) - calendar.add(Calendar.MINUTE, (0..59).random()) - val endDate = calendar.time + realm.beginTransaction() + + for (index in 0..numberOfSessions) { + + if (index % 1000 == 999) { + Timber.d("****** committing at ${index} sessions...") + realm.commitTransaction() + realm.beginTransaction() + } + + val session = Session.newInstance(realm, false) + + val calendar = Calendar.getInstance() + calendar.set( + (2017..2018).random(), + (0..11).random(), + (0..28).random(), + (0..23).random(), + (0..59).random() + ) + + val startDate = calendar.time + calendar.add(Calendar.HOUR_OF_DAY, (2..12).random()) + calendar.add(Calendar.MINUTE, (0..59).random()) + val endDate = calendar.time // val timeFrame = TimeFrame() - session.startDate = startDate - session.endDate = endDate + session.startDate = startDate + session.endDate = endDate + session.creationDate = startDate -// session.timeFrame?.let { -// // it.startDate = startDate -//// it.endDate = endDate -// it.setDate(startDate, endDate) -// } + session.limit = Limit.values().random().ordinal + session.game = games.random() -// session.timeFrame = timeFrame - session.creationDate = startDate + session.result?.let { result -> + result.buyin = buyinList.random() + result.netResult = resultsList.random() + } - session.limit = Limit.values().random().ordinal - session.game = realm.where().findAll().random() + } - session.result?.let { result -> - result.buyin = arrayListOf(100, 200, 300, 500, 1000, 2000).random().toDouble() - result.netResult = arrayListOf( - -2500.0, -2000.0, -1500.0, -1000.0, -500.0, 200.0, 1000.0, 1500.0, - 2500.0 - ).random() - } + realm.commitTransaction() - realm.copyToRealmOrUpdate(session) - } - } - val e = Date() - val duration = (e.time - s.time) / 1000.0 - Timber.d("> ended in ${duration} seconds") + val e = Date() + val duration = (e.time - s.time) / 1000.0 + Timber.d("*** ended in ${duration} seconds") - } + } + realm.close() -// val sets = realm.where(SessionSet::class.java).findAll() -// -// Timber.d("sets = ${sets.size}") -// -// sets.forEach { set -> -// Timber.d("set sd = : ${set.timeFrame?.startDate}, ed = ${set.timeFrame?.endDate}") -// } + } catch (e: Exception) { + Timber.e(e) + } - realm.close() + } - } + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt index af446bb4..d7326fa9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt @@ -6,7 +6,10 @@ import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.fragment_stats.* -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.model.StatRepresentable @@ -20,8 +23,12 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentabl import net.pokeranalytics.android.util.NULL_TEXT import timber.log.Timber import java.util.* +import kotlin.coroutines.CoroutineContext -class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource { +class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope { + + override val coroutineContext: CoroutineContext + get() = Dispatchers.Main private var rowRepresentables: ArrayList = ArrayList() @@ -87,7 +94,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc // Override override fun sessionsChanged() { - this.launchStatComputation() +// this.launchStatComputation() this.statsAdapter.notifyDataSetChanged() } @@ -97,45 +104,54 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc * Init data */ private fun initData() { + + this.statsAdapter = RowRepresentableAdapter(this) this.launchStatComputation() } private fun launchStatComputation() { - var results = listOf() - val s = Date() Timber.d(">>> start...") - runBlocking { - val cgSessions = mutableListOf() - val tSessions = mutableListOf() + GlobalScope.launch(context = this.coroutineContext) { + val results = compute() + showResults(results) + } - super.endedSessions.forEach { session -> - if (session.isCashGame()) { - cgSessions.add(session) - } else { - tSessions.add(session) - } - } + val e = Date() + val duration = (e.time - s.time) / 1000.0 + Timber.d(">>> ended in ${duration} seconds") + + } - val allStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NUMBER_OF_SETS, Stat.AVERAGE_DURATION, Stat.DURATION) - val allSessionGroup = SessionGroup(getString(R.string.all), super.endedSessions, allStats) - val cgStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, Stat.AVERAGE, Stat.STANDARD_DEVIATION_HOURLY, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) - val cgSessionGroup = SessionGroup(getString(R.string.cash_game), cgSessions, cgStats) - val tStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) - val tSessionGroup = SessionGroup(getString(R.string.tournament), tSessions, tStats) + private fun compute() : List { - results = Calculator.computeGroups(listOf(allSessionGroup, cgSessionGroup, tSessionGroup), Calculator.Options()) + val cgSessions = mutableListOf() + val tSessions = mutableListOf() + super.endedSessions.forEach { session -> + if (session.isCashGame()) { + cgSessions.add(session) + } else { + tSessions.add(session) + } } - val e = Date() - val duration = (e.time - s.time) / 1000.0 - Timber.d(">>> ended in ${duration} seconds") - this.rowRepresentables = this.convertResultsIntoRepresentables(results) + val allStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NUMBER_OF_SETS, Stat.AVERAGE_DURATION, Stat.DURATION) + val allSessionGroup = SessionGroup(getString(R.string.all), super.endedSessions, allStats) + val cgStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, Stat.AVERAGE, Stat.STANDARD_DEVIATION_HOURLY, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) + val cgSessionGroup = SessionGroup(getString(R.string.cash_game), cgSessions, cgStats) + val tStats: List = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) + val tSessionGroup = SessionGroup(getString(R.string.tournament), tSessions, tStats) - this.statsAdapter = RowRepresentableAdapter(this) // StatsAdapter(this, null) + return Calculator.computeGroups(listOf(allSessionGroup, cgSessionGroup, tSessionGroup), Calculator.Options()) + + } + + private fun showResults(results: List) { + + this.rowRepresentables = this.convertResultsIntoRepresentables(results) val viewManager = LinearLayoutManager(requireContext()) @@ -144,7 +160,6 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc layoutManager = viewManager adapter = statsAdapter } - } private fun convertResultsIntoRepresentables(results: List) : ArrayList {