Improve Bankroll list

dev
Aurelien Hubert 7 years ago
parent 333d81dd74
commit bed0ed041d
  1. 107
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt
  2. 5
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  3. 13
      app/src/main/res/layout/fragment_bankroll.xml
  4. 2
      app/src/main/res/layout/fragment_data_list.xml
  5. 3
      app/src/main/res/layout/row_legend_default.xml

@ -1,29 +1,47 @@
package net.pokeranalytics.android.ui.fragment
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.Realm
import io.realm.RealmResults
import kotlinx.android.synthetic.main.fragment_bankroll.*
import kotlinx.android.synthetic.main.fragment_stats.recyclerView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.calculus.bankroll.BankrollCalculator
import net.pokeranalytics.android.calculus.bankroll.BankrollReport
import net.pokeranalytics.android.calculus.bankroll.BankrollReportSetup
import net.pokeranalytics.android.model.Criteria
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.ui.activity.DataListActivity
import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
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.toast
import net.pokeranalytics.android.ui.fragment.DataListFragment.Companion.REQUEST_CODE_DETAILS
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.GraphRow
import timber.log.Timber
import java.util.*
import kotlin.collections.ArrayList
class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate {
@ -42,8 +60,9 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou
private lateinit var parentActivity: PokerAnalyticsActivity
private lateinit var bankrollAdapter: RowRepresentableAdapter
private lateinit var bankrolls: RealmResults<Bankroll>
private var rows: ArrayList<RowRepresentable> = ArrayList()
private var bankrollReportForRow: HashMap<RowRepresentable, BankrollReport> = HashMap()
// Life Cycle
@ -57,15 +76,40 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou
initData()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_DETAILS && resultCode == Activity.RESULT_OK) {
val needToDeleteItem = data?.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false) ?: false
if (needToDeleteItem) {
GlobalScope.launch(Dispatchers.Main) {
delay(300)
//TODO: Delete bankroll
//deleteItem(lastItemClickedPosition)
}
}
}
}
override fun adapterRows(): List<RowRepresentable>? {
Timber.d("adapterRows: ${rows.size}")
return rows
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
Timber.d("onRowSelected: $row")
when(row) {
is GraphRow -> {
row.report.results.firstOrNull()?.group?.let { computableGroup ->
StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report, false, row.title)
}
}
else -> {
if (bankrollReportForRow.containsKey(row)) {
val bankrollReport = bankrollReportForRow[row]
toast("${bankrollReport?.total}")
}
}
}
}
// Business
@ -75,38 +119,55 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou
*/
private fun initData() {
// Graph
//rows.add(GraphRow(report, Stat.NET_RESULT))
rows.clear()
bankrollReportForRow.clear()
GlobalScope.launch {
val startDate = Date()
val realm = Realm.getDefaultInstance()
// Global
// Graph
val requiredStats: List<Stat> = listOf(Stat.NET_RESULT)
val options = Calculator.Options(
evolutionValues = Calculator.Options.EvolutionValues.STANDARD,
stats = requiredStats,
criterias = listOf(Criteria.Bankrolls)
)
val start = System.currentTimeMillis()
val report = Calculator.computeStats(realm, options = options)
rows.add(0, GraphRow(report, Stat.NET_RESULT))
val globalBankrollReportSetup = BankrollReportSetup()
val globalBankrollReport = BankrollCalculator.computeReport(globalBankrollReportSetup)
Timber.d("bankrollReport: ${globalBankrollReport.total}")
rows.add(globalBankrollReport)
bankrollReportForRow[globalBankrollReport] = globalBankrollReport
// Bankrolls
rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.bankrolls))
bankrolls = LiveData.BANKROLL.items(getRealm()) as RealmResults<Bankroll>
Timber.d("Bankrolls: ${bankrolls.size}")
val bankrolls = LiveData.BANKROLL.items(realm) as RealmResults<Bankroll>
bankrolls.forEach {
val bankrollReportSetup = BankrollReportSetup(it)
val bankrollReport = BankrollCalculator.computeReport(bankrollReportSetup)
val computedStat = ComputedStat(Stat.NET_RESULT, bankrollReport.total)
rows.add(CustomizableRowRepresentable(RowViewType.TITLE_VALUE_ARROW, title = it.name, computedStat = computedStat))
val row = CustomizableRowRepresentable(RowViewType.TITLE_VALUE_ARROW, title = it.name, computedStat = computedStat, isSelectable = true)
rows.add(row)
bankrollReportForRow[row] = bankrollReport
}
Timber.d("Done in: ${System.currentTimeMillis() - start}ms")
Timber.d("initData: ${rows.size} rows")
realm.close()
Timber.d("initData: ${System.currentTimeMillis() - startDate.time}ms")
launch(Dispatchers.Main) {
if (!isDetached) {
bankrollAdapter.notifyDataSetChanged()
}
}
}
}
@ -130,6 +191,16 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou
layoutManager = viewManager
adapter = bankrollAdapter
}
addButton.setOnClickListener {
LiveData.BANKROLL?.let {
EditableDataActivity.newInstance(
requireContext(),
dataType = it.ordinal,
primaryKey = null
)
}
}
}
}

@ -383,6 +383,11 @@ enum class RowViewType(private var layoutRes: Int) {
val formattedStat = ComputedStat(Stat.RISK_OF_RUIN, riskOfRuin).format()
it.setTextFormat(formattedStat, itemView.context)
}
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.findViewById<ConstraintLayout>(R.id.container)?.setOnClickListener(listener)
}
}
}

@ -53,4 +53,17 @@
</com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/addButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:src="@drawable/ic_add"
android:tint="@color/black"
app:fabSize="normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

@ -82,7 +82,6 @@
</com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/addButton"
android:layout_width="wrap_content"
@ -96,5 +95,4 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

@ -2,9 +2,10 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:background="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat1Name"

Loading…
Cancel
Save