From 62b08bc284d5e571d09a1ba7891decb853fdef90 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 2 May 2019 08:13:41 +0200 Subject: [PATCH] Start working on Bankroll fragment --- .../pokeranalytics/android/calculus/Stat.kt | 3 +- .../calculus/bankroll/BankrollReport.kt | 15 ++- .../android/ui/fragment/BankrollFragment.kt | 120 +++++++++++++----- .../android/ui/view/RowViewType.kt | 33 ++++- .../main/res/layout/row_legend_default.xml | 83 ++++++++++++ 5 files changed, 221 insertions(+), 33 deletions(-) create mode 100644 app/src/main/res/layout/row_legend_default.xml diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt index cb4c42dc..248676b1 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -53,6 +53,7 @@ enum class Stat : RowRepresentable { WINNING_SESSION_COUNT, BB_SESSION_COUNT, TOTAL_BUYIN, + RISK_OF_RUIN, ; companion object { @@ -145,7 +146,7 @@ enum class Stat : RowRepresentable { HOURLY_DURATION, AVERAGE_HOURLY_DURATION, MAXIMUM_DURATION -> { return TextFormat(value.formattedHourlyDuration()) } // red/green percentages - WIN_RATIO, ROI -> { + WIN_RATIO, ROI, RISK_OF_RUIN -> { val color = if (value * 100 >= this.threshold) R.color.green else R.color.red return TextFormat("${(value * 100).formatted()}%", color) } // white amountsr diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt b/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt index bfef7adf..c37b6b66 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt @@ -9,6 +9,8 @@ import net.pokeranalytics.android.model.interfaces.DatedValue import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.graph.DataSetFactory +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType import java.util.* import kotlin.collections.HashMap @@ -48,7 +50,7 @@ import kotlin.collections.HashMap * This class holds the results from the BankrollCalculator computations * It has all the information required for the Bankroll various displays */ -class BankrollReport(var setup: BankrollReportSetup) { +class BankrollReport(var setup: BankrollReportSetup) : RowRepresentable { /** * The value of the bankroll @@ -134,10 +136,19 @@ class BankrollReport(var setup: BankrollReportSetup) { /** * The list of dated items used for the graph - */ + */ var evolutionItems: MutableList = mutableListOf() private set + override val viewType: Int + get() { + return if (setup.bankroll == null) { + RowViewType.LEGEND_DEFAULT.ordinal + } else { + RowViewType.TITLE_VALUE_ARROW.ordinal + } + } + /** * Adds a list of dated items to the evolution items used to get the bankroll graph */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt index b0c06521..2368a76e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt @@ -5,50 +5,110 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager +import io.realm.RealmResults import kotlinx.android.synthetic.main.fragment_bankroll.* import kotlinx.android.synthetic.main.fragment_stats.recyclerView import net.pokeranalytics.android.R +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.BankrollReportSetup +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.realm.Bankroll 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.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 timber.log.Timber + +class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { + + companion object { + + /** + * Create new instance + */ + fun newInstance(): BankrollFragment { + val fragment = BankrollFragment() + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + } -class BankrollFragment : PokerAnalyticsFragment() { + private lateinit var parentActivity: PokerAnalyticsActivity + private lateinit var bankrollAdapter: RowRepresentableAdapter + private lateinit var bankrolls: RealmResults + private var rows: ArrayList = ArrayList() - companion object { + // Life Cycle - /** - * Create new instance - */ - fun newInstance(): BankrollFragment { - val fragment = BankrollFragment() - val bundle = Bundle() - fragment.arguments = bundle - return fragment - } - } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_bankroll, container, false) + } - private lateinit var parentActivity: PokerAnalyticsActivity + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initUI() + initData() + } + + override fun adapterRows(): List? { + Timber.d("adapterRows: ${rows.size}") + return rows + } - // Life Cycle - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_bankroll, container, false) - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initData() - initUI() - } + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + + } + // Business + + /** + * Init data + */ + private fun initData() { - // Business + // Graph + //rows.add(GraphRow(report, Stat.NET_RESULT)) - /** - * Init data - */ - private fun initData() { - } + // Global + + + val start = System.currentTimeMillis() + + val globalBankrollReportSetup = BankrollReportSetup() + val globalBankrollReport = BankrollCalculator.computeReport(globalBankrollReportSetup) + + Timber.d("bankrollReport: ${globalBankrollReport.total}") + + rows.add(globalBankrollReport) + + + // Bankrolls + rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.bankrolls)) + + bankrolls = LiveData.BANKROLL.items(getRealm()) as RealmResults + Timber.d("Bankrolls: ${bankrolls.size}") + + 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)) + } + + Timber.d("Done in: ${System.currentTimeMillis() - start}ms") + Timber.d("initData: ${rows.size} rows") + + } /** * Init UI @@ -63,10 +123,12 @@ class BankrollFragment : PokerAnalyticsFragment() { val viewManager = LinearLayoutManager(requireContext()) + bankrollAdapter = RowRepresentableAdapter(this, this) + recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager - //adapter = statsAdapter + adapter = bankrollAdapter } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index a76a4d83..5554d807 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -20,6 +20,9 @@ import com.github.mikephil.charting.data.LineDataSet import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_transaction.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.ComputedStat +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.calculus.bankroll.BankrollReport import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -75,6 +78,7 @@ enum class RowViewType(private var layoutRes: Int) { STATS(R.layout.row_stats_title_value), STATS_DOUBLE(R.layout.row_stats_double), GRAPH(R.layout.row_graph), + LEGEND_DEFAULT(R.layout.row_legend_default), // Separator SEPARATOR(R.layout.row_separator); @@ -110,6 +114,7 @@ enum class RowViewType(private var layoutRes: Int) { STATS -> StatsTitleValueViewHolder(layout) STATS_DOUBLE -> StatsDoubleViewHolder(layout) GRAPH -> GraphViewHolder(layout) + LEGEND_DEFAULT -> LegendDefaultViewHolder(layout) // Separator SEPARATOR -> SeparatorViewHolder(layout) @@ -306,7 +311,7 @@ enum class RowViewType(private var layoutRes: Int) { } /** - * Display a stat + * Display a graph */ inner class GraphViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { @@ -355,6 +360,32 @@ enum class RowViewType(private var layoutRes: Int) { } } + /** + * Display a legend + */ + inner class LegendDefaultViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + + if (row is BankrollReport) { + itemView.findViewById(R.id.stat1Name)?.let { + it.text = itemView.context.getString(R.string.total) + } + itemView.findViewById(R.id.stat1Value)?.let { + val formattedStat = ComputedStat(Stat.NET_RESULT, row.total).format() + it.setTextFormat(formattedStat, itemView.context) + } + itemView.findViewById(R.id.stat2Name)?.let { + it.text = itemView.context.getString(R.string.risk_of_ruin) + } + itemView.findViewById(R.id.stat2Value)?.let { + val riskOfRuin = row.riskOfRuin ?: 0.0 + val formattedStat = ComputedStat(Stat.RISK_OF_RUIN, riskOfRuin).format() + it.setTextFormat(formattedStat, itemView.context) + } + } + } + } /** * Display a button in a row diff --git a/app/src/main/res/layout/row_legend_default.xml b/app/src/main/res/layout/row_legend_default.xml new file mode 100644 index 00000000..884833cb --- /dev/null +++ b/app/src/main/res/layout/row_legend_default.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file