From 9d78e30a26482f901200cd5fcae080c548a10d27 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 30 May 2019 12:09:24 +0200 Subject: [PATCH] Showing only editable transaction types + changing the legend label according to the type in the BR graph --- .../calculus/bankroll/BankrollReport.kt | 20 +++++++--------- .../android/model/realm/Transaction.kt | 18 ++++++++++++++ .../android/ui/fragment/DataListFragment.kt | 9 ++++--- .../android/ui/graph/GraphUnderlyingEntry.kt | 7 +++--- .../android/ui/view/LegendView.kt | 12 ++++++---- .../util/extensions/RealmExtensions.kt | 24 ++++++++++++------- 6 files changed, 61 insertions(+), 29 deletions(-) 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 20199a44..2b7e4724 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 @@ -88,7 +88,7 @@ class BankrollReport(var setup: BankrollReportSetup) : RowRepresentable { /** * Computes the bankroll total */ - fun computeBankrollTotal() { + private fun computeBankrollTotal() { this.total = this.initial + this.netResult + this.transactionsNet } @@ -143,13 +143,12 @@ class BankrollReport(var setup: BankrollReportSetup) : RowRepresentable { /** * The list of bankroll graph points */ - var evolutionPoints: MutableList = mutableListOf() + private var evolutionPoints: MutableList = mutableListOf() /** * The list of dated items used for the graph */ - var evolutionItems: MutableList = mutableListOf() - private set + private var evolutionItems: MutableList = mutableListOf() override val viewType: Int get() { @@ -185,7 +184,7 @@ class BankrollReport(var setup: BankrollReportSetup) : RowRepresentable { bucket.addTransaction(transaction) } ?: run { - throw Exception("Transaction has no type") + throw IllegalStateException("Transaction has no type") } } @@ -279,11 +278,15 @@ class BankrollReportSetup(val bankroll: Bankroll? = null, val from: Date? = null */ class TransactionBucket(useRate: Boolean = false) { + /** + * Whether the bankroll rate should be used + */ + private var useRate: Boolean = useRate + /** * A list of _transactions */ private var _transactions: MutableList = mutableListOf() - private set val transactions: List get() { @@ -296,11 +299,6 @@ class TransactionBucket(useRate: Boolean = false) { var total: Double = 0.0 private set - /** - * Whether the bankroll rate should be used - */ - var useRate: Boolean = useRate - private set fun addTransaction(transaction: Transaction) { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt index 9055eb96..03b6ddb8 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt @@ -1,6 +1,7 @@ package net.pokeranalytics.android.model.realm import android.content.Context +import com.github.mikephil.charting.data.Entry import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.Ignore @@ -11,7 +12,10 @@ import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.* import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource +import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.graph.GraphUnderlyingEntry +import net.pokeranalytics.android.ui.view.DefaultLegendValues +import net.pokeranalytics.android.ui.view.LegendContent import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow @@ -140,4 +144,18 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo return stat.format(this.amount) } + override fun legendValues( + stat: Stat, + entry: Entry, + style: GraphFragment.Style, + groupName: String, + context: Context + ): LegendContent { + + val entryValue = this.formattedValue(stat) + val totalStatValue = stat.format(entry.y.toDouble(), currency = null) + val leftName = context.getString(R.string.value) + return DefaultLegendValues(this.entryTitle(context), entryValue, totalStatValue, leftName = leftName) + } + } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index 7f3cb6fa..c16383e7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -9,6 +9,7 @@ import android.view.ViewGroup import androidx.core.view.isVisible import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager +import io.realm.Realm import io.realm.RealmResults import kotlinx.android.synthetic.main.fragment_data_list.* import net.pokeranalytics.android.R @@ -28,7 +29,7 @@ import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.extensions.sorted -class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { +open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { companion object { const val REQUEST_CODE_DETAILS = 1000 @@ -48,9 +49,11 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource this.identifiableClass = this.dataType.relatedEntity setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext())) - val realm = getRealm() - this.items = realm.sorted(this.identifiableClass) + this.items = this.retrieveItems(getRealm()) + } + open fun retrieveItems(realm: Realm): RealmResults { + return realm.sorted(this.identifiableClass, editableOnly = true) } override fun deletableItems() : List { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt index fb072ffb..897ff3f9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt @@ -3,11 +3,11 @@ package net.pokeranalytics.android.ui.graph import android.content.Context import com.github.mikephil.charting.data.Entry import net.pokeranalytics.android.calculus.Stat -import net.pokeranalytics.android.util.TextFormat import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.view.DefaultLegendValues import net.pokeranalytics.android.ui.view.LegendContent +import net.pokeranalytics.android.util.TextFormat class ObjectIdentifier(var id: String, var clazz: Class) { @@ -26,15 +26,16 @@ interface GraphUnderlyingEntry { context: Context ): LegendContent { + val leftName = stat.localizedTitle(context) return when (stat) { Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES, Stat.WIN_RATIO, Stat.HOURLY_DURATION, Stat.AVERAGE_HOURLY_DURATION -> { val totalStatValue = stat.format(entry.y.toDouble(), currency = null) - DefaultLegendValues(this.entryTitle(context), totalStatValue) + DefaultLegendValues(this.entryTitle(context), totalStatValue, leftName = leftName) } else -> { val entryValue = this.formattedValue(stat) val totalStatValue = stat.format(entry.y.toDouble(), currency = null) - DefaultLegendValues(this.entryTitle(context), entryValue, totalStatValue) + DefaultLegendValues(this.entryTitle(context), entryValue, totalStatValue, leftName = leftName) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt index e95e4829..3ab9580d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt @@ -9,16 +9,17 @@ import androidx.core.view.isVisible import kotlinx.android.synthetic.main.layout_legend_default.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat -import net.pokeranalytics.android.util.TextFormat import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.ui.fragment.GraphFragment +import net.pokeranalytics.android.util.TextFormat interface LegendContent data class DefaultLegendValues( var title: String, var leftFormat: TextFormat, - var rightFormat: TextFormat? = null + var rightFormat: TextFormat? = null, + var leftName: String? = null ) : LegendContent /** @@ -51,7 +52,7 @@ open class LegendView : FrameLayout { init() } - open protected fun getResourceLayout(): Int { + protected open fun getResourceLayout(): Int { return R.layout.layout_legend_default } @@ -86,7 +87,7 @@ open class LegendView : FrameLayout { } counter?.let { - val counterText = "$it ${context.getString(R.string.sessions)}" + val counterText = "$it ${context.getString(R.string.points)}" this.counter.text = counterText this.counter.isVisible = stat.graphShouldShowNumberOfSessions } @@ -110,6 +111,9 @@ open class LegendView : FrameLayout { content.rightFormat?.let { this.stat2Value.setTextFormat(it, context) } + content.leftName?.let { name -> + this.stat1Name.text = name + } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt index 077b42d7..67bbc119 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt @@ -8,10 +8,7 @@ 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.Filter -import net.pokeranalytics.android.model.realm.Session -import net.pokeranalytics.android.model.realm.TournamentFeature -import net.pokeranalytics.android.model.realm.Transaction +import net.pokeranalytics.android.model.realm.* fun Realm.findById(clazz: Class, id: String) : T? { return this.where(clazz).equalTo("id", id).findFirst() @@ -38,9 +35,20 @@ inline fun Realm.getOrCreate(name: String) : T { /** * Returns all entities of the [clazz] sorted with their default sorting + * Set [editableOnly] to true to only receive entities that can be edited */ -fun < T : RealmModel> Realm.sorted(clazz: Class) : RealmResults { - val items = this.where(clazz).findAll() +fun < T : RealmModel> Realm.sorted(clazz: Class, editableOnly: Boolean = false) : RealmResults { + val query = this.where(clazz) + + if (editableOnly) { + when (clazz.kotlin) { + TransactionType::class -> { + query.equalTo("lock", false) + } + } + } + + val items = query.findAll() var sortField = arrayOf("name") var resultSort = arrayOf(Sort.ASCENDING) @@ -65,8 +73,8 @@ fun < T : RealmModel> Realm.sorted(clazz: Class) : RealmResults { /** * Returns all entities of the [C] class sorted with their default sorting */ -inline fun Realm.sorted() : RealmResults { - return this.sorted(C::class.java) +inline fun Realm.sorted(editableOnly: Boolean = false) : RealmResults { + return this.sorted(C::class.java, editableOnly) } /**