Fixes occasional crash in bankroll

od
Laurent 6 years ago
parent 8b673674ec
commit 8e7038028b
  1. 3
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  2. 3
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt
  3. 2
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReportManager.kt
  4. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt
  5. 58
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt
  6. 5
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt

@ -13,7 +13,6 @@ import net.pokeranalytics.android.model.migrations.Patcher
import net.pokeranalytics.android.model.migrations.PokerAnalyticsMigration import net.pokeranalytics.android.model.migrations.PokerAnalyticsMigration
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.utils.Seed import net.pokeranalytics.android.model.utils.Seed
import net.pokeranalytics.android.util.FakeDataManager
import net.pokeranalytics.android.util.PokerAnalyticsLogs import net.pokeranalytics.android.util.PokerAnalyticsLogs
import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.UserDefaults
import net.pokeranalytics.android.util.billing.AppGuard import net.pokeranalytics.android.util.billing.AppGuard
@ -77,7 +76,7 @@ class PokerAnalyticsApplication : Application() {
if (sessionsCount < 10) { if (sessionsCount < 10) {
GlobalScope.launch { GlobalScope.launch {
FakeDataManager.createFakeSessions(200) // FakeDataManager.createFakeSessions(200)
} }
} }

@ -15,10 +15,9 @@ class BankrollCalculator {
fun computeReport(realm: Realm, setup: BankrollReportSetup) : BankrollReport { fun computeReport(realm: Realm, setup: BankrollReportSetup) : BankrollReport {
//val realm = Realm.getDefaultInstance()
val report = BankrollReport(setup) val report = BankrollReport(setup)
realm.refresh() // fixes an issue where a newly created bankroll is not found, throwing an exception
val bankrolls: List<Bankroll> = val bankrolls: List<Bankroll> =
if (setup.bankrollId != null) { if (setup.bankrollId != null) {
val bankroll = realm.findById<Bankroll>(setup.bankrollId) ?: throw PAIllegalStateException("Bankroll not found with id=${setup.bankrollId}") val bankroll = realm.findById<Bankroll>(setup.bankrollId) ?: throw PAIllegalStateException("Bankroll not found with id=${setup.bankrollId}")

@ -27,7 +27,6 @@ object BankrollReportManager {
init { init {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
realm.isAutoRefresh = true
computableResults = realm.where(ComputableResult::class.java).findAll() computableResults = realm.where(ComputableResult::class.java).findAll()
bankrolls = realm.where(Bankroll::class.java).findAll() bankrolls = realm.where(Bankroll::class.java).findAll()
transactions = realm.where(Transaction::class.java).findAll() transactions = realm.where(Transaction::class.java).findAll()
@ -60,6 +59,7 @@ object BankrollReportManager {
fun reportForBankroll(bankrollId: String?, handler: (BankrollReport) -> Unit) { fun reportForBankroll(bankrollId: String?, handler: (BankrollReport) -> Unit) {
Timber.d("Request bankroll report for bankrollId = $bankrollId")
// if the report exists, return it // if the report exists, return it
val existingReport: BankrollReport? = this.reports[bankrollId] val existingReport: BankrollReport? = this.reports[bankrollId]
if (existingReport != null) { if (existingReport != null) {

@ -25,6 +25,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.findById
import timber.log.Timber
class BankrollDetailsFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { class BankrollDetailsFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate {
@ -111,6 +112,7 @@ class BankrollDetailsFragment : RealmFragment(), StaticRowRepresentableDataSourc
private fun updateUI() { private fun updateUI() {
this.updateMenuUI() this.updateMenuUI()
Timber.d("BankrollDetailsFragment > updateUI > reportForBankroll")
BankrollReportManager.reportForBankroll(this.bankrollId) { bankrollReport -> BankrollReportManager.reportForBankroll(this.bankrollId) { bankrollReport ->
this.initRows(bankrollReport) this.initRows(bankrollReport)
this.bankrollAdapter.notifyDataSetChanged() this.bankrollAdapter.notifyDataSetChanged()

@ -8,7 +8,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.github.mikephil.charting.data.LineDataSet import com.github.mikephil.charting.data.LineDataSet
import io.realm.RealmObject
import io.realm.RealmResults import io.realm.RealmResults
import kotlinx.android.synthetic.main.fragment_bankroll.* import kotlinx.android.synthetic.main.fragment_bankroll.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -36,6 +35,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollMainRow
import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollTotalRow import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollTotalRow
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.util.extensions.sorted import net.pokeranalytics.android.util.extensions.sorted
import timber.log.Timber
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -60,8 +60,6 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour
private var rows: ArrayList<RowRepresentable> = ArrayList() private var rows: ArrayList<RowRepresentable> = ArrayList()
private var bankrollRowRepresentables: HashMap<String?, List<BankrollRowRepresentable>> = HashMap() private var bankrollRowRepresentables: HashMap<String?, List<BankrollRowRepresentable>> = HashMap()
private var lastItemClickedPosition: Int = 0
private var deletedRow: RowRepresentable? = null
private lateinit var bankrolls: RealmResults<Bankroll> private lateinit var bankrolls: RealmResults<Bankroll>
@ -106,26 +104,6 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour
} }
override fun adapterRows(): List<RowRepresentable>? {
return rows
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
lastItemClickedPosition = position
when (row) {
is BankrollGraphRow -> {
val lineDataSet = row.dataSet as LineDataSet
GraphActivity.newInstance(requireContext(), listOf(lineDataSet), title = getString(R.string.bankroll))
}
is BankrollRowRepresentable -> {
BankrollReportManager.reportForBankroll(row.bankrollId) { bankrollReport ->
BankrollDetailsActivity.newInstanceForResult(this, bankrollReport, RequestCode.BANKROLL_DETAILS.value)
}
}
}
}
// Business
/** /**
* Init data * Init data
@ -133,8 +111,17 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour
private fun initData() { private fun initData() {
this.bankrolls = getRealm().sorted() this.bankrolls = getRealm().sorted()
this.bankrolls.addChangeListener { _, _ ->
this.createRowRepresentables()
}
this.createRowRepresentables()
}
private fun createRowRepresentables() {
rows.clear() rows.clear()
bankrollRowRepresentables.clear()
// Virtual bankroll // Virtual bankroll
val graphRow = BankrollGraphRow() val graphRow = BankrollGraphRow()
@ -148,13 +135,13 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour
rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.bankrolls)) rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.bankrolls))
bankrolls.forEach { bankroll -> bankrolls.forEach { bankroll ->
Timber.d("Creating row for br : ${bankroll.id}, name= ${bankroll.name}, isManaged = ${bankroll.isManaged()}, isValid = ${bankroll.isValid}")
val row = BankrollTotalRow(bankroll.id, bankroll.name) val row = BankrollTotalRow(bankroll.id, bankroll.name)
rows.add(row) rows.add(row)
bankrollRowRepresentables[bankroll.id] = listOf(row) bankrollRowRepresentables[bankroll.id] = listOf(row)
} }
dataListAdapter.notifyDataSetChanged() dataListAdapter.notifyDataSetChanged()
} }
/** /**
@ -184,17 +171,22 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour
} }
} }
override fun updateUIAfterDeletion(itemId: String, itemPosition: Int) { override fun adapterRows(): List<RowRepresentable>? {
lastItemClickedPosition = rows.indexOfFirst { if (it is BankrollRowRepresentable) it.bankrollId == itemId else false } return rows
deletedRow = rows.find { if (it is BankrollRowRepresentable) it.bankrollId == itemId else false }
rows.removeAt(lastItemClickedPosition)
dataListAdapter.notifyItemRemoved(lastItemClickedPosition)
} }
override fun updateUIAfterUndoDeletion(newItem: RealmObject) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
deletedRow?.let { row -> when (row) {
rows.add(lastItemClickedPosition, row) is BankrollGraphRow -> {
dataListAdapter.notifyDataSetChanged() // update both virtual + ex-deleted val lineDataSet = row.dataSet as LineDataSet
GraphActivity.newInstance(requireContext(), listOf(lineDataSet), title = getString(R.string.bankroll))
}
is BankrollRowRepresentable -> {
Timber.d("BankrollFragment > onRowSelected > reportForBankroll")
BankrollReportManager.reportForBankroll(row.bankrollId) { bankrollReport ->
BankrollDetailsActivity.newInstanceForResult(this, bankrollReport, RequestCode.BANKROLL_DETAILS.value)
}
}
} }
} }

@ -38,6 +38,7 @@ import net.pokeranalytics.android.ui.graph.AxisFormatting
import net.pokeranalytics.android.ui.graph.setStyle import net.pokeranalytics.android.ui.graph.setStyle
import net.pokeranalytics.android.ui.view.rowrepresentable.* import net.pokeranalytics.android.ui.view.rowrepresentable.*
import net.pokeranalytics.android.util.extensions.longDate import net.pokeranalytics.android.util.extensions.longDate
import timber.log.Timber
/** /**
* An interface used to factor the configuration of RecyclerView.ViewHolder * An interface used to factor the configuration of RecyclerView.ViewHolder
@ -142,6 +143,7 @@ enum class RowViewType(private var layoutRes: Int) {
*/ */
@SuppressWarnings("ResourceType") @SuppressWarnings("ResourceType")
inner class RowViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { inner class RowViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
when (row) { when (row) {
@ -153,6 +155,7 @@ enum class RowViewType(private var layoutRes: Int) {
it.text = row.localizedTitle(itemView.context) it.text = row.localizedTitle(itemView.context)
} }
Timber.d("RowViewHolder > bind > reportForBankroll")
BankrollReportManager.reportForBankroll(row.bankrollId) { report -> BankrollReportManager.reportForBankroll(row.bankrollId) { report ->
itemView.findViewById<AppCompatTextView>(R.id.title)?.let { itemView.findViewById<AppCompatTextView>(R.id.title)?.let {
@ -411,6 +414,7 @@ enum class RowViewType(private var layoutRes: Int) {
when (row) { when (row) {
is BankrollGraphRow -> { is BankrollGraphRow -> {
Timber.d("GraphViewHolder > bind > reportForBankroll")
BankrollReportManager.reportForBankroll(row.bankrollId) { report -> BankrollReportManager.reportForBankroll(row.bankrollId) { report ->
val dataSet = report.lineDataSet(itemView.context) val dataSet = report.lineDataSet(itemView.context)
row.dataSet = dataSet row.dataSet = dataSet
@ -441,6 +445,7 @@ enum class RowViewType(private var layoutRes: Int) {
if (row is BankrollRowRepresentable) { if (row is BankrollRowRepresentable) {
Timber.d("LegendDefaultViewHolder > bind > reportForBankroll")
BankrollReportManager.reportForBankroll(row.bankrollId) { report -> BankrollReportManager.reportForBankroll(row.bankrollId) { report ->
itemView.findViewById<AppCompatTextView>(R.id.stat1Value)?.let { itemView.findViewById<AppCompatTextView>(R.id.stat1Value)?.let {

Loading…
Cancel
Save