Merge branch 'master' into dev

dev^2
Razmig Sarkissian 6 years ago
commit 86a2f3bb1b
  1. 6
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  2. 4
      app/src/main/java/net/pokeranalytics/android/model/interfaces/CountableUsage.kt
  3. 7
      app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
  4. 3
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
  6. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
  7. 29
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  8. 10
      app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedSessionRowRepresentableAdapter.kt
  9. 45
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt
  10. 140
      app/src/main/java/net/pokeranalytics/android/ui/fragment/Top10Fragment.kt
  11. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt
  12. 13
      app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt

@ -33,7 +33,7 @@ class PokerAnalyticsApplication : Application() {
Realm.init(this)
val realmConfiguration = RealmConfiguration.Builder()
.name(Realm.DEFAULT_REALM_NAME)
.schemaVersion(6)
.schemaVersion(7)
.migration(PokerAnalyticsMigration())
.initialData(Seed(this))
.build()
@ -60,7 +60,7 @@ class PokerAnalyticsApplication : Application() {
if (BuildConfig.DEBUG) {
Timber.d("UserPreferences.defaultCurrency: ${UserDefaults.currency.symbol}")
this.createFakeSessions()
// this.createFakeSessions()
}
Patcher.patchAll(this.applicationContext)
@ -72,7 +72,7 @@ class PokerAnalyticsApplication : Application() {
private fun createFakeSessions() {
val realm = Realm.getDefaultInstance()
val sessionsCount = realm.where<Session>().findAll().size
val sessionsCount = realm.where<Session>().count()
realm.close()
if (sessionsCount < 10) {

@ -1,5 +1,7 @@
package net.pokeranalytics.android.model.interfaces
import io.realm.RealmModel
/**
* An interface to be able to track the usage of an object
*/
@ -7,4 +9,6 @@ interface CountableUsage : Identifiable {
var useCount: Int
get() { return 0 }
set(_) {}
val ownerClass: Class<out RealmModel>
}

@ -144,6 +144,13 @@ class PokerAnalyticsMigration : RealmMigration {
schema.get("Filter")?.removeField("usageCount")
currentVersion++
}
// Migrate to version 7
if (currentVersion == 6) {
Timber.d("*** Running migration ${currentVersion + 1}")
schema.get("TransactionType")?.addField("useCount", Int::class.java)
currentVersion++
}
}
override fun equals(other: Any?): Boolean {

@ -75,6 +75,9 @@ open class Filter : RealmObject(), RowRepresentable, Editable, Deletable, Counta
override var useCount: Int = 0
@Ignore
override val ownerClass: Class<out RealmModel> = Session::class.java
var filterConditions: RealmList<FilterCondition> = RealmList()
private set

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import android.content.Context
import io.realm.Realm
import io.realm.RealmModel
import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey
@ -46,6 +47,9 @@ open class Game : RealmObject(), NameManageable, StaticRowRepresentableDataSourc
// CountableUsage
override var useCount: Int = 0
@Ignore
override val ownerClass: Class<out RealmModel> = Session::class.java
fun getNotNullShortName() : String {
this.shortName?.let {
return it

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import android.content.Context
import io.realm.Realm
import io.realm.RealmModel
import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey
@ -44,6 +45,9 @@ open class TournamentFeature : RealmObject(), NameManageable, StaticRowRepresent
// CountableUsage
override var useCount: Int = 0
@Ignore
override val ownerClass: Class<out RealmModel> = Session::class.java
override fun getDisplayName(context: Context): String {
return this.name
}

@ -2,15 +2,13 @@ package net.pokeranalytics.android.model.realm
import android.content.Context
import io.realm.Realm
import io.realm.RealmModel
import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus
import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.model.interfaces.*
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.view.Localizable
import net.pokeranalytics.android.ui.view.RowRepresentable
@ -23,7 +21,8 @@ import java.util.*
import kotlin.collections.ArrayList
open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentableDataSource, RowRepresentable {
open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentableDataSource, RowRepresentable,
CountableUsage {
enum class Value(override var uniqueIdentifier: Int, val additive: Boolean) : IntIdentifiable, Localizable {
@ -69,21 +68,6 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab
throw PAIllegalStateException("Transaction type ${value.name} should exist in database!")
}
fun getOrCreateByValue(realm: Realm, context: Context, value: Value): TransactionType {
val type = realm.where(TransactionType::class.java).equalTo("kind", value.uniqueIdentifier).findFirst()
type?.let {
return it
}
val tt = TransactionType()
tt.name = value.localizedTitle(context)
tt.additive = value.additive
tt.kind = value.uniqueIdentifier
tt.lock = true
return tt
}
}
@Ignore
@ -109,6 +93,11 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab
// The predefined kind, if necessary, like: Withdrawal, deposit, or tips
var kind: Int? = null
override var useCount: Int = 0
@Ignore
override val ownerClass: Class<out RealmModel> = Transaction::class.java
override fun getDisplayName(context: Context): String {
return this.name
}

@ -61,9 +61,11 @@ class FeedSessionRowRepresentableAdapter(
// listeners
this.startedSessions.addChangeListener { _, _ ->
// Timber.d("---> started session change")
refreshData()
}
this.pendingSessions.addChangeListener { _, _ ->
// Timber.d("---> pending session change")
refreshData()
}
@ -187,11 +189,12 @@ class FeedSessionRowRepresentableAdapter(
/**
* Refresh headers positions
*/
fun refreshData() {
private fun refreshData() {
allSessions.clear()
allSessions.addAll(this.pendingSessions)
allSessions.addAll(this.startedSessions)
Timber.d("All sessions count = ${allSessions.size}")
val headersPositions = HashMap<Int, Date?>()
@ -232,4 +235,9 @@ class FeedSessionRowRepresentableAdapter(
return currentCalendar.get(Calendar.YEAR) == previousYear && currentCalendar.get(Calendar.MONTH) < previousMonth || (currentCalendar.get(Calendar.YEAR) < previousYear)
}
fun destroy() {
this.startedSessions.removeAllChangeListeners()
this.pendingSessions.removeAllChangeListeners()
}
}

@ -56,6 +56,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
}
private var currentTab = Tab.SESSIONS
private lateinit var feedSessionAdapter: FeedSessionRowRepresentableAdapter
private lateinit var feedTransactionAdapter: FeedTransactionRowRepresentableAdapter
@ -145,6 +147,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
override fun onDestroyView() {
super.onDestroyView()
feedSessionAdapter.destroy()
realmTransactions.removeAllChangeListeners()
}
@ -191,6 +194,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
messageBox.isVisible = false
}
// Add button
addButton.setOnClickListener {
activity?.let {
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(it)
@ -199,18 +203,18 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
}
}
// Tabs
tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
when (tab.position) {
Tab.SESSIONS.ordinal -> {
currentFilterable = FilterableType.SESSION
menuRecyclerView.adapter = feedSessionAdapter
}
Tab.TRANSACTIONS.ordinal -> {
currentFilterable = FilterableType.TRANSACTION
menuRecyclerView.adapter = feedTransactionAdapter
}
}
tabChanged(tab.position)
}
override fun onTabUnselected(tab: TabLayout.Tab) {
@ -279,13 +283,11 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
*/
private fun createNewSession(isTournament: Boolean, sessionId: String? = null, duplicate: Boolean = false) {
// if (!BuildConfig.DEBUG) {
val sessionCount = getRealm().count(Session::class.java)
if (!AppGuard.isProUser && sessionCount >= AppGuard.MAX_SESSIONS_BEFORE_REQUESTING_SUBSCRIPTION) { // && !BuildConfig.DEBUG
BillingActivity.newInstanceForResult(this, true)
return
}
// }
val sessionCount = getRealm().count(Session::class.java)
if (!AppGuard.isProUser && sessionCount >= AppGuard.MAX_SESSIONS_BEFORE_REQUESTING_SUBSCRIPTION) { // && !BuildConfig.DEBUG
BillingActivity.newInstanceForResult(this, true)
return
}
// Keep commented code for special versions
// if (Date().after(betaLimitDate)) {
@ -350,11 +352,9 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
filter?.let {
when (it.filterableType) {
FilterableType.SESSION -> {
menuRecyclerView.adapter = feedSessionAdapter
this.selectTab(Tab.SESSIONS)
}
FilterableType.TRANSACTION -> {
menuRecyclerView.adapter = feedTransactionAdapter
this.selectTab(Tab.TRANSACTIONS)
}
else -> {
@ -365,24 +365,33 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
if (!adapterHasBeenSet) {
adapterHasBeenSet = true
menuRecyclerView.adapter = feedSessionAdapter
this.setAdapter()
}
}
override fun removeFilter() {
super.removeFilter()
this.loadSessions()
this.loadTransactions()
if (currentFilterable == FilterableType.SESSION) {
menuRecyclerView.adapter = feedSessionAdapter
} else {
menuRecyclerView.adapter = feedTransactionAdapter
}
this.setAdapter()
}
private fun selectTab(tab: Tab) {
this.currentTab = tab
this.tabs.getTabAt(tab.ordinal)?.select()
setAdapter()
}
private fun tabChanged(index: Int) {
this.currentTab = Tab.values()[index]
setAdapter()
}
private fun setAdapter() {
when (this.currentTab) {
Tab.SESSIONS -> menuRecyclerView.adapter = feedSessionAdapter
Tab.TRANSACTIONS -> menuRecyclerView.adapter = feedTransactionAdapter
}
}
}

@ -6,7 +6,6 @@ import android.view.View
import android.view.ViewGroup
import com.google.android.material.tabs.TabLayout
import io.realm.RealmResults
import io.realm.Sort
import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_top_10.*
import net.pokeranalytics.android.R
@ -36,9 +35,11 @@ class Top10Fragment : RealmFragment(), RowRepresentableDataSource, RowRepresenta
}
}
private lateinit var positiveSessions: RealmResults<Session>
private lateinit var dataListAdapter: RowRepresentableAdapter
private lateinit var realmCashGames: RealmResults<Session>
private lateinit var realmTournaments: RealmResults<Session>
private var realmCashGames: List<Session> = mutableListOf()
private var realmTournaments: List<Session> = mutableListOf()
private var currentTab: Tab = Tab.CASH_GAMES
@ -54,63 +55,12 @@ class Top10Fragment : RealmFragment(), RowRepresentableDataSource, RowRepresenta
}
/**
* Init data
* Init UI
*/
private fun initData() {
this.realmCashGames = getRealm().where<Session>()
.equalTo("type", Session.Type.CASH_GAME.ordinal)
.greaterThanOrEqualTo("result.net", 0.0)
.sort("result.net", Sort.DESCENDING)
.limit(10)
.findAll()
this.realmCashGames.addChangeListener { _, _ ->
this.dataListAdapter.notifyDataSetChanged()
}
this.realmTournaments = getRealm().where<Session>()
.equalTo("type", Session.Type.TOURNAMENT.ordinal)
.greaterThanOrEqualTo("result.net", 0.0)
.sort("result.net", Sort.DESCENDING)
.limit(10)
.findAll()
this.realmTournaments.addChangeListener { _, _ ->
this.dataListAdapter.notifyDataSetChanged()
}
private fun initUI() {
dataListAdapter = RowRepresentableAdapter(this, this)
recyclerView.adapter = dataListAdapter
}
override fun adapterRows(): List<RowRepresentable>? {
return when (currentTab) {
Tab.CASH_GAMES -> realmCashGames
Tab.TOURNAMENTS -> realmTournaments
}
}
override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
return when (currentTab) {
Tab.CASH_GAMES -> realmCashGames[position]
Tab.TOURNAMENTS -> realmTournaments[position]
}
}
override fun numberOfRows(): Int {
return when (currentTab) {
Tab.CASH_GAMES -> realmCashGames.size
Tab.TOURNAMENTS -> realmTournaments.size
}
}
override fun viewTypeForPosition(position: Int): Int {
return RowViewType.ROW_TOP_10.ordinal
}
/**
* Init UI
*/
private fun initUI() {
setDisplayHomeAsUpEnabled(true)
@ -144,4 +94,82 @@ class Top10Fragment : RealmFragment(), RowRepresentableDataSource, RowRepresenta
}
/**
* Init data
*/
private fun initData() {
this.positiveSessions = getRealm().where<Session>()
.isNotNull("endDate")
.greaterThan("result.net", 0.0)
.findAll()
updateTop10()
}
private fun updateTop10() {
val cashGames = mutableListOf<Session>()
val tournaments = mutableListOf<Session>()
// filter by type: cash game or tournament
this.positiveSessions.forEach {
when (it.type) {
Session.Type.CASH_GAME.ordinal -> {
cashGames.add(it)
}
else -> {
tournaments.add(it)
}
}
}
// Sort by rated net
val sortedCashGames = cashGames.sortedByDescending {
it.computableResult?.ratedNet
}.toMutableList()
val sortedTournaments = tournaments.sortedByDescending {
it.computableResult?.ratedNet
}.toMutableList()
// Keep 10 items
if (sortedCashGames.size > 10) {
sortedCashGames.subList(10, sortedCashGames.size).clear()
}
if (sortedTournaments.size > 10) {
sortedTournaments.subList(10, sortedTournaments.size).clear()
}
this.realmCashGames = sortedCashGames
this.realmTournaments = sortedTournaments
dataListAdapter.notifyDataSetChanged()
}
override fun adapterRows(): List<RowRepresentable>? {
return when (currentTab) {
Tab.CASH_GAMES -> realmCashGames
Tab.TOURNAMENTS -> realmTournaments
}
}
override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
return when (currentTab) {
Tab.CASH_GAMES -> realmCashGames[position]
Tab.TOURNAMENTS -> realmTournaments[position]
}
}
override fun numberOfRows(): Int {
return when (currentTab) {
Tab.CASH_GAMES -> realmCashGames.size
Tab.TOURNAMENTS -> realmTournaments.size
}
}
override fun viewTypeForPosition(position: Int): Int {
return RowViewType.ROW_TOP_10.ordinal
}
}

@ -65,8 +65,8 @@ class TransactionTypeDataFragment : EditableDataFragment(), RowRepresentableData
TransactionTypeRow.TRANSACTION_ADDITIVE -> {
val realm = getRealm()
val useCount = realm.where(Transaction::class.java)
.equalTo("type.id", this.transactionType.id).findAll().size
return useCount == 0
.equalTo("type.id", this.transactionType.id).count()
return useCount == 0L
}
else -> super.isSelectable(row)
}

@ -4,14 +4,16 @@ import io.realm.Realm
import io.realm.RealmModel
import io.realm.RealmResults
import io.realm.Sort
import io.realm.kotlin.where
import net.pokeranalytics.android.model.interfaces.CountableUsage
import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.model.realm.TournamentFeature
import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.model.realm.TransactionType
fun <T : RealmModel>Realm.count(clazz: Class<T>) : Int {
return this.where(clazz).findAll().size
fun <T : RealmModel>Realm.count(clazz: Class<T>) : Long {
return this.where(clazz).count()
}
fun <T : Identifiable> Realm.findById(clazz: Class<T>, id: String) : T? {
@ -96,10 +98,11 @@ fun <T : RealmModel>Realm.updateUsageCount(clazz: Class<T>) {
val countable = (countableUsage as CountableUsage)
val fieldName = when (clazz.kotlin) {
TransactionType::class -> "type.id"
TournamentFeature::class -> "tournamentFeatures.id"
else -> "${clazz.simpleName.decapitalize()}.id"
}
val count = it.where<Session>().contains(fieldName, countable.id).count().toInt()
val count = it.where(countable.ownerClass).contains(fieldName, countable.id).count().toInt()
countable.useCount = count
}
}

Loading…
Cancel
Save