From ab6f102df08fef15293c43ff523b65604e2642b2 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 2 May 2019 14:57:57 +0200 Subject: [PATCH 01/13] Link Bankroll & Bankroll details --- app/src/main/AndroidManifest.xml | 5 + .../ui/activity/BankrollDetailsActivity.kt | 48 ++++++ .../ui/fragment/BankrollDetailsFragment.kt | 151 ++++++++++++++++++ .../android/ui/fragment/BankrollFragment.kt | 38 +++-- .../res/layout/activity_bankroll_details.xml | 7 + .../res/layout/fragment_bankroll_details.xml | 56 +++++++ .../res/menu/toolbar_bankroll_details.xml | 11 ++ 7 files changed, 299 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/BankrollDetailsActivity.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt create mode 100644 app/src/main/res/layout/activity_bankroll_details.xml create mode 100644 app/src/main/res/layout/fragment_bankroll_details.xml create mode 100644 app/src/main/res/menu/toolbar_bankroll_details.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8c2989ed..7ef8c9cd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,6 +40,11 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> + + = ArrayList() + + // Life Cycle + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_bankroll_details, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initUI() + initData() + } + + override fun adapterRows(): List? { + return rows + } + + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + + } + + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + menu?.clear() + inflater?.inflate(R.menu.toolbar_comparison_chart, menu) + this.bankrollDetailsMenu = menu + updateMenuUI() + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item!!.itemId) { + R.id.settings -> editBankroll() + } + return true + } + + // Business + + /** + * Init data + */ + private fun initData() { + + rows.clear() + + rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.global)) + + val totalComputedStat = ComputedStat(Stat.NET_RESULT, bankrollReport.total) + val netComputedStat = ComputedStat(Stat.NET_RESULT, bankrollReport.netResult) + val netBankedComputedStat = ComputedStat(Stat.NET_RESULT, bankrollReport.netBanked) + + rows.add(CustomizableRowRepresentable(RowViewType.TITLE_VALUE, resId = R.string.bankroll, computedStat = totalComputedStat)) + rows.add(CustomizableRowRepresentable(RowViewType.TITLE_VALUE, resId = R.string.net_result, computedStat = netComputedStat)) + rows.add(CustomizableRowRepresentable(RowViewType.TITLE_VALUE, resId = R.string.net_banked, computedStat = netBankedComputedStat)) + + } + + /** + * Init UI + */ + private fun initUI() { + + parentActivity = activity as PokerAnalyticsActivity + + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) + + Timber.d("bankrollReport: ${bankrollReport.setup.bankroll} ${bankrollReport.setup.virtualBankroll}") + + if (bankrollReport.setup.virtualBankroll) { + toolbar.title = getString(R.string.total) + bankrollDetailsMenu?.findItem(R.id.settings)?.isVisible = false + } else { + toolbar.title = bankrollReport.setup.bankroll?.name + bankrollDetailsMenu?.findItem(R.id.settings)?.isVisible = true + } + + toolbar.title = if (bankrollReport.setup.virtualBankroll) getString(R.string.total) else bankrollReport.setup.bankroll?.name + + bankrollAdapter = RowRepresentableAdapter(this, this) + + val viewManager = LinearLayoutManager(requireContext()) + + recyclerView.apply { + setHasFixedSize(true) + layoutManager = viewManager + adapter = bankrollAdapter + } + } + + /** + * Update menu UI + */ + private fun updateMenuUI() { + bankrollDetailsMenu?.findItem(R.id.settings)?.isVisible = !bankrollReport.setup.virtualBankroll + } + + /** + * Open Bankroll edit activity + */ + private fun editBankroll() { + EditableDataActivity.newInstanceForResult(this, LiveData.BANKROLL.ordinal, bankrollReport.setup.bankroll?.id, REQUEST_CODE_EDIT) + } + +} \ No newline at end of file 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 dd25a45f..53bf74e9 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 @@ -32,6 +32,7 @@ import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.realm.Bankroll +import net.pokeranalytics.android.ui.activity.BankrollDetailsActivity import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity @@ -39,8 +40,6 @@ 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 @@ -54,6 +53,8 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou companion object { + const val REQUEST_CODE_DETAILS = 1000 + /** * Create new instance */ @@ -106,7 +107,7 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { Timber.d("onRowSelected: $row") - when(row) { + when (row) { is GraphRow -> { row.report.results.firstOrNull()?.group?.let { computableGroup -> StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report, false, row.title) @@ -114,8 +115,9 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou } else -> { if (bankrollReportForRow.containsKey(row)) { - val bankrollReport = bankrollReportForRow[row] - toast("${bankrollReport?.total}") + bankrollReportForRow[row]?.let { bankrollReport -> + BankrollDetailsActivity.newInstanceForResult(this, bankrollReport, REQUEST_CODE_DETAILS) + } } } } @@ -156,22 +158,24 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou // Bankrolls rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.bankrolls)) - val bankrolls = LiveData.BANKROLL.items(realm) as RealmResults - - bankrolls.forEach { - val bankrollReportSetup = BankrollReportSetup(it) - val bankrollReport = BankrollCalculator.computeReport(bankrollReportSetup) - val computedStat = ComputedStat(Stat.NET_RESULT, bankrollReport.total) - val row = CustomizableRowRepresentable(RowViewType.TITLE_VALUE_ARROW, title = it.name, computedStat = computedStat, isSelectable = true) - - rows.add(row) - bankrollReportForRow[row] = bankrollReport - } - realm.close() Timber.d("initData: ${System.currentTimeMillis() - startDate.time}ms") launch(Dispatchers.Main) { + + val bankrolls = LiveData.BANKROLL.items(getRealm()) as RealmResults + + bankrolls.forEach { + val bankrollReportSetup = BankrollReportSetup(it) + val bankrollReport = BankrollCalculator.computeReport(bankrollReportSetup) + val computedStat = ComputedStat(Stat.NET_RESULT, bankrollReport.total) + val row = CustomizableRowRepresentable(RowViewType.TITLE_VALUE_ARROW, title = it.name, computedStat = computedStat, isSelectable = true) + + rows.add(row) + bankrollReportForRow[row] = bankrollReport + } + + if (!isDetached) { bankrollAdapter.notifyDataSetChanged() } diff --git a/app/src/main/res/layout/activity_bankroll_details.xml b/app/src/main/res/layout/activity_bankroll_details.xml new file mode 100644 index 00000000..70454fb9 --- /dev/null +++ b/app/src/main/res/layout/activity_bankroll_details.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bankroll_details.xml b/app/src/main/res/layout/fragment_bankroll_details.xml new file mode 100644 index 00000000..0cf1c9b1 --- /dev/null +++ b/app/src/main/res/layout/fragment_bankroll_details.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/toolbar_bankroll_details.xml b/app/src/main/res/menu/toolbar_bankroll_details.xml new file mode 100644 index 00000000..2132026e --- /dev/null +++ b/app/src/main/res/menu/toolbar_bankroll_details.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file From 06630b82fc902b2f134cdf8505f3f4f226d8a4ec Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 2 May 2019 15:19:57 +0200 Subject: [PATCH 02/13] Add correct graph data for Bankroll --- .../ui/activity/EditableDataActivity.kt | 4 +-- ...ragment.kt => BankrollEditDataFragment.kt} | 4 +-- .../android/ui/fragment/BankrollFragment.kt | 23 +++++----------- .../ui/fragment/CalendarDetailsFragment.kt | 27 ++++++++++++++----- .../android/ui/view/RowViewType.kt | 4 +-- .../ui/view/rowrepresentable/GraphRow.kt | 3 ++- 6 files changed, 36 insertions(+), 29 deletions(-) rename app/src/main/java/net/pokeranalytics/android/ui/fragment/{BankrollDataFragment.kt => BankrollEditDataFragment.kt} (97%) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt index fc9e305b..e1a34c27 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt @@ -7,7 +7,7 @@ import androidx.fragment.app.Fragment import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity -import net.pokeranalytics.android.ui.fragment.BankrollDataFragment +import net.pokeranalytics.android.ui.fragment.BankrollEditDataFragment import net.pokeranalytics.android.ui.fragment.EditableDataFragment import net.pokeranalytics.android.ui.fragment.LocationDataFragment import net.pokeranalytics.android.ui.fragment.TransactionDataFragment @@ -62,7 +62,7 @@ class EditableDataActivity : PokerAnalyticsActivity() { val fragmentManager = supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() val fragment: EditableDataFragment = when (dataType) { - LiveData.BANKROLL.ordinal -> BankrollDataFragment() + LiveData.BANKROLL.ordinal -> BankrollEditDataFragment() LiveData.LOCATION.ordinal -> LocationDataFragment() LiveData.TRANSACTION.ordinal -> TransactionDataFragment() else -> EditableDataFragment() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt similarity index 97% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt index 7f15c747..bdecaa46 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt @@ -30,7 +30,7 @@ import java.util.* /** * Custom EditableDataFragment to manage the Bankroll data */ -class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataSource { +class BankrollEditDataFragment : EditableDataFragment(), StaticRowRepresentableDataSource { companion object { const val REQUEST_CODE_CURRENCY: Int = 100 @@ -130,7 +130,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (row) { - BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollDataFragment, REQUEST_CODE_CURRENCY) + BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollEditDataFragment, REQUEST_CODE_CURRENCY) BankrollRow.REFRESH_RATE -> refreshRate() else -> super.onRowSelected(position, row, fromAction) } 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 53bf74e9..3bf48d3b 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 @@ -22,13 +22,11 @@ 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.interfaces.Deletable import net.pokeranalytics.android.model.realm.Bankroll @@ -106,11 +104,14 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou } 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) + row.report?.let { report -> + row.stat?.let { stat -> + report.results.firstOrNull()?.group?.let { computableGroup -> + StatisticDetailsActivity.newInstance(requireContext(), stat, computableGroup, report, false, row.title) + } + } } } else -> { @@ -139,19 +140,9 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou val realm = Realm.getDefaultInstance() // Graph - - val requiredStats: List = listOf(Stat.NET_RESULT) - val options = Calculator.Options( - evolutionValues = Calculator.Options.EvolutionValues.STANDARD, - stats = requiredStats, - criterias = listOf(Criteria.Bankrolls) - ) - - val report = Calculator.computeStats(realm, options = options) - rows.add(0, GraphRow(report, Stat.NET_RESULT)) - val globalBankrollReportSetup = BankrollReportSetup() val globalBankrollReport = BankrollCalculator.computeReport(globalBankrollReportSetup) + rows.add(0, GraphRow(dataSet = globalBankrollReport.lineDataSet(requireContext()))) rows.add(globalBankrollReport) bankrollReportForRow[globalBankrollReport] = globalBankrollReport diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index ebb162b8..d8ae4772 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -150,8 +150,12 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (row) { is GraphRow -> { - row.report.results.firstOrNull()?.group?.let { computableGroup -> - StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report, false, row.title) + row.report?.let { report -> + row.stat?.let { stat -> + report.results.firstOrNull()?.group?.let { computableGroup -> + StatisticDetailsActivity.newInstance(requireContext(), stat, computableGroup, report, false, row.title) + } + } } } } @@ -199,7 +203,8 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable val options = Calculator.Options( evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats, - query = query) + query = query + ) val report = Calculator.computeStats(realm, options) Timber.d("Report take: ${System.currentTimeMillis() - startDate.time}ms") @@ -207,17 +212,27 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable report.results.firstOrNull()?.let { // Create rows + val dataSet1 = report.results.firstOrNull()?.defaultStatEntries(Stat.NET_RESULT, requireContext()) + val dataSet2 = report.results.firstOrNull()?.defaultStatEntries(Stat.STANDARD_DEVIATION, requireContext()) + val dataSet3 = report.results.firstOrNull()?.defaultStatEntries(Stat.HOURLY_DURATION, requireContext()) rowRepresentables.clear() rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.net_result)) - rowRepresentables.add(GraphRow(report, Stat.NET_RESULT)) + rowRepresentables.add(GraphRow(dataSet1, report = report, stat = Stat.NET_RESULT)) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.NET_RESULT), it.computedStat(Stat.HOURLY_RATE))) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.LOCATIONS_PLAYED), it.computedStat(Stat.LONGEST_STREAKS))) rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.distribution)) - rowRepresentables.add(GraphRow(report, Stat.STANDARD_DEVIATION, requireContext().getString(R.string.distribution))) + rowRepresentables.add( + GraphRow( + dataSet2, + requireContext().getString(R.string.distribution), + report = report, + stat = Stat.STANDARD_DEVIATION + ) + ) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.WIN_RATIO), it.computedStat(Stat.MAXIMUM_NETRESULT))) rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.volume)) - rowRepresentables.add(GraphRow(report, Stat.HOURLY_DURATION)) + rowRepresentables.add(GraphRow(dataSet3, report = report, stat = Stat.HOURLY_DURATION)) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.HOURLY_DURATION), it.computedStat(Stat.AVERAGE_HOURLY_DURATION))) rowRepresentables.add(StatDoubleRow(it.computedStat(Stat.DAYS_PLAYED), it.computedStat(Stat.MAXIMUM_DURATION))) } 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 05c518f4..764dd5da 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 @@ -93,7 +93,7 @@ enum class RowViewType(private var layoutRes: Int) { return when (this) { // Row View Holder - HEADER_TITLE, HEADER_TITLE_VALUE, HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT_BIG, LOCATION_TITLE, + HEADER_TITLE, HEADER_TITLE_VALUE, HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT_BIG, LOCATION_TITLE, INFO, TITLE, TITLE_ARROW, TITLE_ICON_ARROW, TITLE_VALUE, TITLE_VALUE_ARROW, TITLE_GRID, TITLE_SWITCH, TITLE_CHECK, TITLE_VALUE_CHECK, DATA, BOTTOM_SHEET_DATA, LOADER -> RowViewHolder(layout) @@ -319,7 +319,7 @@ enum class RowViewType(private var layoutRes: Int) { if (row is GraphRow) { - row.report.results.firstOrNull()?.defaultStatEntries(row.stat, itemView.context)?.let { dataSet -> + row.dataSet?.let { dataSet -> val context = itemView.context diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt index b877e42e..7af17e6b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt @@ -1,12 +1,13 @@ package net.pokeranalytics.android.ui.view.rowrepresentable +import com.github.mikephil.charting.data.DataSet import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -class GraphRow(var report: Report, var stat: Stat, var title: String? = null) : RowRepresentable { +class GraphRow(var dataSet: DataSet<*>?, var title: String? = null, var report: Report? = null, var stat: Stat? = null) : RowRepresentable { override val viewType: Int get() = RowViewType.GRAPH.ordinal From 7a9f5a8364fc19df08fa05048752529c21fb6960 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 2 May 2019 16:30:00 +0200 Subject: [PATCH 03/13] Improve Bankroll management --- .../ui/fragment/BankrollDetailsFragment.kt | 43 +++++++++++------ .../ui/fragment/BankrollEditDataFragment.kt | 7 +++ .../android/ui/fragment/BankrollFragment.kt | 46 +++++++++++-------- 3 files changed, 64 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt index c50a58f1..c2a49935 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt @@ -1,5 +1,7 @@ package net.pokeranalytics.android.ui.fragment +import android.app.Activity.RESULT_OK +import android.content.Intent import android.os.Bundle import android.view.* import androidx.recyclerview.widget.LinearLayoutManager @@ -10,6 +12,7 @@ import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.bankroll.BankrollReport import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -19,7 +22,6 @@ 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 BankrollDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { @@ -56,6 +58,18 @@ class BankrollDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable initData() } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_CODE_EDIT && resultCode == RESULT_OK) { + if (data != null && data.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false)) { + activity?.setResult(RESULT_OK, data) + activity?.finish() + } else { + updateMenuUI() + } + } + } + override fun adapterRows(): List? { return rows } @@ -107,21 +121,13 @@ class BankrollDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable parentActivity = activity as PokerAnalyticsActivity + // Avoid a bug during setting the title + toolbar.title = "" + parentActivity.setSupportActionBar(toolbar) parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) - - Timber.d("bankrollReport: ${bankrollReport.setup.bankroll} ${bankrollReport.setup.virtualBankroll}") - - if (bankrollReport.setup.virtualBankroll) { - toolbar.title = getString(R.string.total) - bankrollDetailsMenu?.findItem(R.id.settings)?.isVisible = false - } else { - toolbar.title = bankrollReport.setup.bankroll?.name - bankrollDetailsMenu?.findItem(R.id.settings)?.isVisible = true - } - - toolbar.title = if (bankrollReport.setup.virtualBankroll) getString(R.string.total) else bankrollReport.setup.bankroll?.name + updateMenuUI() bankrollAdapter = RowRepresentableAdapter(this, this) @@ -138,7 +144,16 @@ class BankrollDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable * Update menu UI */ private fun updateMenuUI() { - bankrollDetailsMenu?.findItem(R.id.settings)?.isVisible = !bankrollReport.setup.virtualBankroll + if (bankrollReport.setup.virtualBankroll) { + toolbar.title = getString(R.string.total) + collapsingToolbar.title = getString(R.string.total) + bankrollDetailsMenu?.findItem(R.id.settings)?.isVisible = false + } else { + toolbar.title = bankrollReport.setup.bankroll?.name + collapsingToolbar.title = bankrollReport.setup.bankroll?.name + bankrollDetailsMenu?.findItem(R.id.settings)?.isVisible = true + } + } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt index bdecaa46..67947540 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt @@ -3,6 +3,8 @@ package net.pokeranalytics.android.ui.fragment import android.app.Activity.RESULT_OK import android.content.Intent import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater import android.view.View import net.pokeranalytics.android.R import net.pokeranalytics.android.api.CurrencyConverterApi @@ -54,6 +56,11 @@ class BankrollEditDataFragment : EditableDataFragment(), StaticRowRepresentableD } ?: false } + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + super.onCreateOptionsMenu(menu, inflater) + menu?.findItem(R.id.delete)?.isVisible = false + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) 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 3bf48d3b..442c6bab 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 @@ -6,7 +6,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar import io.realm.Realm @@ -28,7 +27,6 @@ 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.LiveData -import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.ui.activity.BankrollDetailsActivity import net.pokeranalytics.android.ui.activity.DataListActivity @@ -97,6 +95,9 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou } } } + + initData() + //TODO: Refresh bankroll } override fun adapterRows(): List? { @@ -117,6 +118,7 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou else -> { if (bankrollReportForRow.containsKey(row)) { bankrollReportForRow[row]?.let { bankrollReport -> + lastItemClickedPosition = position BankrollDetailsActivity.newInstanceForResult(this, bankrollReport, REQUEST_CODE_DETAILS) } } @@ -166,7 +168,6 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou bankrollReportForRow[row] = bankrollReport } - if (!isDetached) { bankrollAdapter.notifyDataSetChanged() } @@ -213,32 +214,41 @@ class BankrollFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSou */ private fun deleteItem(position: Int) { + //TODO: Get bankroll from bankrollReport and delete it + + /* if (isDetached || activity == null) { return } // Save the delete position & create a copy of the object - val mRecentlyDeletedItem = rowRepresentableForPosition(position) + var mRecentlyDeletedItem = rowRepresentableForPosition(position) lastDeletedItemPosition = position - if (mRecentlyDeletedItem is RealmObject) { - // Check if the object is valid for the deletion - if ((mRecentlyDeletedItem as Deletable).isValidForDelete(this.getRealm())) { - deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) - getRealm().executeTransaction { - mRecentlyDeletedItem.deleteFromRealm() + if (mRecentlyDeletedItem is BankrollReport) { + + if (mRecentlyDeletedItem is RealmObject) { + // Check if the object is valid for the deletion + if ((mRecentlyDeletedItem as Deletable).isValidForDelete(this.getRealm())) { + deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) + getRealm().executeTransaction { + mRecentlyDeletedItem.deleteFromRealm() + } + bankrollAdapter.notifyItemRemoved(position) + showUndoSnackBar() + } else { + bankrollAdapter.notifyItemChanged(position) + val builder = AlertDialog.Builder(requireContext()) + .setMessage((mRecentlyDeletedItem as Deletable).getFailedDeleteMessage()) + .setNegativeButton(R.string.ok, null) + builder.show() } - bankrollAdapter.notifyItemRemoved(position) - showUndoSnackBar() - } else { - bankrollAdapter.notifyItemChanged(position) - val builder = AlertDialog.Builder(requireContext()) - .setMessage((mRecentlyDeletedItem as Deletable).getFailedDeleteMessage()) - .setNegativeButton(R.string.ok, null) - builder.show() } + } + */ + } /** From dc80f62b21a4094f0c2a1943e791fed76aa41ddc Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 3 May 2019 10:31:53 +0200 Subject: [PATCH 04/13] Add new menu for Feed tab --- app/src/main/AndroidManifest.xml | 237 +++++++++--------- .../android/ui/activity/HomeActivity.kt | 1 - .../ui/activity/NewDataMenuActivity.kt | 120 +++++++++ .../android/ui/fragment/HistoryFragment.kt | 126 ++++++---- app/src/main/res/layout/activity_new_data.xml | 132 ++++++++++ app/src/main/res/layout/fragment_history.xml | 89 ++++--- app/src/main/res/values/styles.xml | 13 + 7 files changed, 527 insertions(+), 191 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/NewDataMenuActivity.kt create mode 100644 app/src/main/res/layout/activity_new_data.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7ef8c9cd..0864aea4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,119 +1,126 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + package="net.pokeranalytics.android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt index 719b8249..e0289090 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt @@ -14,7 +14,6 @@ import kotlinx.android.synthetic.main.activity_home.* import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Currency -import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.HomePagerAdapter import timber.log.Timber diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/NewDataMenuActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/NewDataMenuActivity.kt new file mode 100644 index 00000000..a5680189 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/NewDataMenuActivity.kt @@ -0,0 +1,120 @@ +package net.pokeranalytics.android.ui.activity + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.view.ViewAnimationUtils +import kotlinx.android.synthetic.main.activity_new_data.* +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.extensions.px + + +class NewDataMenuActivity : PokerAnalyticsActivity() { + + enum class IntentKey(val keyName: String) { + CHOICE("CHOICE"), + } + + companion object { + fun newInstance(context: Context) { + val intent = Intent(context, NewDataMenuActivity::class.java) + context.startActivity(intent) + } + } + + private val fabSize = 48.px + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(net.pokeranalytics.android.R.layout.activity_new_data) + initUI() + } + + override fun onBackPressed() { + hideMenu() + } + + override fun onPause() { + super.onPause() + overridePendingTransition(0, 0) + } + + /** + * Init UI + */ + private fun initUI() { + + overridePendingTransition(0, 0) + + container.viewTreeObserver.addOnGlobalLayoutListener { + showMenu() + } + + newCashGame.setOnClickListener { + finishWithResult(0) + } + + newTournament.setOnClickListener { + finishWithResult(1) + } + + newTransaction.setOnClickListener { + finishWithResult(2) + } + + container.setOnClickListener { + hideMenu() + } + } + + /** + * Set the result and hide menu + */ + private fun finishWithResult(choice: Int) { + val intent = Intent() + intent.putExtra(IntentKey.CHOICE.keyName, choice) + setResult(RESULT_OK, intent) + hideMenu(true) + } + + /** + * Show menu + */ + private fun showMenu() { + + val cx = menuContainer.measuredWidth - fabSize / 2 + val cy = menuContainer.measuredHeight - fabSize / 2 + val finalRadius = Math.max(menuContainer.width, menuContainer.height) + val anim = ViewAnimationUtils.createCircularReveal(menuContainer, cx, cy, 0f, finalRadius.toFloat()) + anim.duration = 300 + + menuContainer.visibility = View.VISIBLE + anim.start() + } + + /** + * Hide menu + */ + private fun hideMenu(hideQuickly: Boolean = false) { + + val cx = menuContainer.measuredWidth - fabSize / 2 + val cy = menuContainer.measuredHeight - fabSize / 2 + val initialRadius = menuContainer.width + val anim = ViewAnimationUtils.createCircularReveal(menuContainer, cx, cy, initialRadius.toFloat(), 0f) + anim.duration = if (hideQuickly) 150 else 300 + + anim.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + super.onAnimationEnd(animation) + menuContainer.visibility = View.INVISIBLE + finish() + } + }) + + anim.start() + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index 06319966..89563e44 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -1,19 +1,22 @@ package net.pokeranalytics.android.ui.fragment +import android.app.Activity.RESULT_OK +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.core.app.ActivityOptionsCompat import androidx.core.view.isVisible import androidx.interpolator.view.animation.FastOutSlowInInterpolator import io.realm.RealmResults import io.realm.Sort import io.realm.kotlin.where import kotlinx.android.synthetic.main.fragment_history.* -import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Editable import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.activity.NewDataMenuActivity import net.pokeranalytics.android.ui.activity.SessionActivity import net.pokeranalytics.android.ui.adapter.HistorySessionRowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource @@ -25,9 +28,16 @@ import net.pokeranalytics.android.util.Preferences import java.text.SimpleDateFormat import java.util.* + + + + class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { companion object { + + const val REQUEST_CODE_MENU = 100 + fun newInstance(): HistoryFragment { val fragment = HistoryFragment() val bundle = Bundle() @@ -37,13 +47,14 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource } private lateinit var historyAdapter: HistorySessionRowRepresentableAdapter - private lateinit var realmSessions: RealmResults + private lateinit var betaLimitDate: Date + private val rows: ArrayList = ArrayList() private var newSessionCreated: Boolean = false override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_history, container, false) + return inflater.inflate(net.pokeranalytics.android.R.layout.fragment_history, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -52,42 +63,48 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource initData() } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_CODE_MENU && resultCode == RESULT_OK && data != null) { + when(data.getIntExtra(NewDataMenuActivity.IntentKey.CHOICE.keyName, -1)) { + 0 -> createNewSession(false) + 1 -> createNewSession(true) + 2 -> createNewTransaction() + } + } + } + override fun onDestroyView() { super.onDestroyView() realmSessions.removeAllChangeListeners() } - /** - * Init UI - */ - private fun initUI() { - - disclaimerContainer.isVisible = Preferences.shouldShowDisclaimer(requireContext()) - - val sdf = SimpleDateFormat("dd/M/yyyy hh:mm") - val betaLimitDate = sdf.parse("17/7/2019 10:00") + override fun rowRepresentableForPosition(position: Int): RowRepresentable? { + return this.rows[position] + } - newCashGame.setOnClickListener { + override fun numberOfRows(): Int { + return this.rows.size + } - if (Date().after(betaLimitDate)) { - this.showEndOfBetaMessage() - return@setOnClickListener - } + override fun viewTypeForPosition(position: Int): Int { + return rows[position].viewType + } - SessionActivity.newInstance(requireContext(), false) - newSessionCreated = true - } + override fun indexForRow(row: RowRepresentable): Int { + return this.rows.indexOf(row) + } - newTournament.setOnClickListener { + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + SessionActivity.newInstance(requireContext(), sessionId = (row as Editable).id) + } - if (Date().after(betaLimitDate)) { - this.showEndOfBetaMessage() - return@setOnClickListener - } + /** + * Init UI + */ + private fun initUI() { - SessionActivity.newInstance(requireContext(), true) - newSessionCreated = true - } + disclaimerContainer.isVisible = Preferences.shouldShowDisclaimer(requireContext()) disclaimerDismiss.setOnClickListener { Preferences.setStopShowingDisclaimer(requireContext()) @@ -98,11 +115,13 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource .start() } - } - - private fun showEndOfBetaMessage() { - Toast.makeText(context, "Beta has ended. Please update with the Google Play version", Toast.LENGTH_LONG).show() - + addButton.setOnClickListener { + activity?.let { + val options = ActivityOptionsCompat.makeSceneTransitionAnimation(it) + val intent = Intent(requireContext(), NewDataMenuActivity::class.java) + startActivityForResult(intent, REQUEST_CODE_MENU, options.toBundle()) + } + } } /** @@ -110,6 +129,9 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource */ private fun initData() { + val sdf = SimpleDateFormat("dd/M/yyyy hh:mm", Locale.getDefault()) + betaLimitDate = sdf.parse("17/7/2019 10:00") + this.realmSessions = getRealm().where().findAll().sort("startDate", Sort.DESCENDING) this.realmSessions.addChangeListener { _, _ -> this.historyAdapter.refreshData() @@ -130,23 +152,37 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource } } - override fun rowRepresentableForPosition(position: Int): RowRepresentable? { - return this.rows[position] - } + /** + * Create a new cash game + */ + private fun createNewSession(isTournament: Boolean) { - override fun numberOfRows(): Int { - return this.rows.size - } + if (Date().after(betaLimitDate)) { + this.showEndOfBetaMessage() + return + } - override fun viewTypeForPosition(position: Int): Int { - return rows[position].viewType + SessionActivity.newInstance(requireContext(), isTournament) + newSessionCreated = true } - override fun indexForRow(row: RowRepresentable): Int { - return this.rows.indexOf(row) + /** + * Create a new transaction + */ + private fun createNewTransaction() { + + if (Date().after(betaLimitDate)) { + this.showEndOfBetaMessage() + return + } + } - override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - SessionActivity.newInstance(requireContext(), sessionId = (row as Editable).id) + /** + * Show end of beta message + */ + private fun showEndOfBetaMessage() { + Toast.makeText(context, "Beta has ended. Please update with the Google Play version", Toast.LENGTH_LONG).show() } + } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_new_data.xml b/app/src/main/res/layout/activity_new_data.xml new file mode 100644 index 00000000..cc84d52f --- /dev/null +++ b/app/src/main/res/layout/activity_new_data.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_history.xml b/app/src/main/res/layout/fragment_history.xml index 6177771c..b9a5668a 100644 --- a/app/src/main/res/layout/fragment_history.xml +++ b/app/src/main/res/layout/fragment_history.xml @@ -7,38 +7,53 @@ android:layout_height="match_parent" tools:context=".ui.activity.HomeActivity"> - + app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + + + + + + + + + @color/colorPrimary @color/white @color/white + true @style/PokerAnalyticsTheme.BottomNavigationView @style/PokerAnalyticsTheme.Toolbar @@ -23,6 +24,7 @@ + @@ -241,6 +243,17 @@ + +