Showing only editable transaction types + changing the legend label according to the type in the BR graph

dev
Laurent 7 years ago
parent 601427f8c2
commit 9d78e30a26
  1. 20
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollReport.kt
  2. 18
      app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt
  3. 9
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt
  4. 7
      app/src/main/java/net/pokeranalytics/android/ui/graph/GraphUnderlyingEntry.kt
  5. 12
      app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt
  6. 24
      app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt

@ -88,7 +88,7 @@ class BankrollReport(var setup: BankrollReportSetup) : RowRepresentable {
/** /**
* Computes the bankroll total * Computes the bankroll total
*/ */
fun computeBankrollTotal() { private fun computeBankrollTotal() {
this.total = this.initial + this.netResult + this.transactionsNet this.total = this.initial + this.netResult + this.transactionsNet
} }
@ -143,13 +143,12 @@ class BankrollReport(var setup: BankrollReportSetup) : RowRepresentable {
/** /**
* The list of bankroll graph points * The list of bankroll graph points
*/ */
var evolutionPoints: MutableList<BRGraphPoint> = mutableListOf() private var evolutionPoints: MutableList<BRGraphPoint> = mutableListOf()
/** /**
* The list of dated items used for the graph * The list of dated items used for the graph
*/ */
var evolutionItems: MutableList<DatedValue> = mutableListOf() private var evolutionItems: MutableList<DatedValue> = mutableListOf()
private set
override val viewType: Int override val viewType: Int
get() { get() {
@ -185,7 +184,7 @@ class BankrollReport(var setup: BankrollReportSetup) : RowRepresentable {
bucket.addTransaction(transaction) bucket.addTransaction(transaction)
} ?: run { } ?: 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) { class TransactionBucket(useRate: Boolean = false) {
/**
* Whether the bankroll rate should be used
*/
private var useRate: Boolean = useRate
/** /**
* A list of _transactions * A list of _transactions
*/ */
private var _transactions: MutableList<Transaction> = mutableListOf() private var _transactions: MutableList<Transaction> = mutableListOf()
private set
val transactions: List<Transaction> val transactions: List<Transaction>
get() { get() {
@ -296,11 +299,6 @@ class TransactionBucket(useRate: Boolean = false) {
var total: Double = 0.0 var total: Double = 0.0
private set private set
/**
* Whether the bankroll rate should be used
*/
var useRate: Boolean = useRate
private set
fun addTransaction(transaction: Transaction) { fun addTransaction(transaction: Transaction) {

@ -1,6 +1,7 @@
package net.pokeranalytics.android.model.realm package net.pokeranalytics.android.model.realm
import android.content.Context import android.content.Context
import com.github.mikephil.charting.data.Entry
import io.realm.Realm import io.realm.Realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore 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.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.* import net.pokeranalytics.android.model.interfaces.*
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource 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.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.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow
@ -140,4 +144,18 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo
return stat.format(this.amount) 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)
}
} }

@ -9,6 +9,7 @@ import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.Realm
import io.realm.RealmResults import io.realm.RealmResults
import kotlinx.android.synthetic.main.fragment_data_list.* import kotlinx.android.synthetic.main.fragment_data_list.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
@ -28,7 +29,7 @@ import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.extensions.sorted import net.pokeranalytics.android.util.extensions.sorted
class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate {
companion object { companion object {
const val REQUEST_CODE_DETAILS = 1000 const val REQUEST_CODE_DETAILS = 1000
@ -48,9 +49,11 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource
this.identifiableClass = this.dataType.relatedEntity this.identifiableClass = this.dataType.relatedEntity
setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext())) setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext()))
val realm = getRealm() this.items = this.retrieveItems(getRealm())
this.items = realm.sorted(this.identifiableClass) }
open fun retrieveItems(realm: Realm): RealmResults<out Deletable> {
return realm.sorted(this.identifiableClass, editableOnly = true)
} }
override fun deletableItems() : List<Deletable> { override fun deletableItems() : List<Deletable> {

@ -3,11 +3,11 @@ package net.pokeranalytics.android.ui.graph
import android.content.Context import android.content.Context
import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.Entry
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.util.TextFormat
import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.model.interfaces.Timed
import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.fragment.GraphFragment
import net.pokeranalytics.android.ui.view.DefaultLegendValues import net.pokeranalytics.android.ui.view.DefaultLegendValues
import net.pokeranalytics.android.ui.view.LegendContent import net.pokeranalytics.android.ui.view.LegendContent
import net.pokeranalytics.android.util.TextFormat
class ObjectIdentifier(var id: String, var clazz: Class<out Timed>) { class ObjectIdentifier(var id: String, var clazz: Class<out Timed>) {
@ -26,15 +26,16 @@ interface GraphUnderlyingEntry {
context: Context context: Context
): LegendContent { ): LegendContent {
val leftName = stat.localizedTitle(context)
return when (stat) { return when (stat) {
Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES, Stat.WIN_RATIO, Stat.HOURLY_DURATION, Stat.AVERAGE_HOURLY_DURATION -> { 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) val totalStatValue = stat.format(entry.y.toDouble(), currency = null)
DefaultLegendValues(this.entryTitle(context), totalStatValue) DefaultLegendValues(this.entryTitle(context), totalStatValue, leftName = leftName)
} }
else -> { else -> {
val entryValue = this.formattedValue(stat) val entryValue = this.formattedValue(stat)
val totalStatValue = stat.format(entry.y.toDouble(), currency = null) val totalStatValue = stat.format(entry.y.toDouble(), currency = null)
DefaultLegendValues(this.entryTitle(context), entryValue, totalStatValue) DefaultLegendValues(this.entryTitle(context), entryValue, totalStatValue, leftName = leftName)
} }
} }

@ -9,16 +9,17 @@ import androidx.core.view.isVisible
import kotlinx.android.synthetic.main.layout_legend_default.view.* import kotlinx.android.synthetic.main.layout_legend_default.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.util.TextFormat
import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.ui.extensions.setTextFormat
import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.fragment.GraphFragment
import net.pokeranalytics.android.util.TextFormat
interface LegendContent interface LegendContent
data class DefaultLegendValues( data class DefaultLegendValues(
var title: String, var title: String,
var leftFormat: TextFormat, var leftFormat: TextFormat,
var rightFormat: TextFormat? = null var rightFormat: TextFormat? = null,
var leftName: String? = null
) : LegendContent ) : LegendContent
/** /**
@ -51,7 +52,7 @@ open class LegendView : FrameLayout {
init() init()
} }
open protected fun getResourceLayout(): Int { protected open fun getResourceLayout(): Int {
return R.layout.layout_legend_default return R.layout.layout_legend_default
} }
@ -86,7 +87,7 @@ open class LegendView : FrameLayout {
} }
counter?.let { counter?.let {
val counterText = "$it ${context.getString(R.string.sessions)}" val counterText = "$it ${context.getString(R.string.points)}"
this.counter.text = counterText this.counter.text = counterText
this.counter.isVisible = stat.graphShouldShowNumberOfSessions this.counter.isVisible = stat.graphShouldShowNumberOfSessions
} }
@ -110,6 +111,9 @@ open class LegendView : FrameLayout {
content.rightFormat?.let { content.rightFormat?.let {
this.stat2Value.setTextFormat(it, context) this.stat2Value.setTextFormat(it, context)
} }
content.leftName?.let { name ->
this.stat1Name.text = name
}
} }

@ -8,10 +8,7 @@ import io.realm.kotlin.where
import net.pokeranalytics.android.model.interfaces.CountableUsage import net.pokeranalytics.android.model.interfaces.CountableUsage
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.TournamentFeature
import net.pokeranalytics.android.model.realm.Transaction
fun <T : Identifiable> Realm.findById(clazz: Class<T>, id: String) : T? { fun <T : Identifiable> Realm.findById(clazz: Class<T>, id: String) : T? {
return this.where(clazz).equalTo("id", id).findFirst() return this.where(clazz).equalTo("id", id).findFirst()
@ -38,9 +35,20 @@ inline fun <reified T: NameManageable> Realm.getOrCreate(name: String) : T {
/** /**
* Returns all entities of the [clazz] sorted with their default sorting * 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<T>) : RealmResults<T> { fun < T : RealmModel> Realm.sorted(clazz: Class<T>, editableOnly: Boolean = false) : RealmResults<T> {
val items = this.where(clazz).findAll() 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 sortField = arrayOf("name")
var resultSort = arrayOf(Sort.ASCENDING) var resultSort = arrayOf(Sort.ASCENDING)
@ -65,8 +73,8 @@ fun < T : RealmModel> Realm.sorted(clazz: Class<T>) : RealmResults<T> {
/** /**
* Returns all entities of the [C] class sorted with their default sorting * Returns all entities of the [C] class sorted with their default sorting
*/ */
inline fun <reified C : RealmModel> Realm.sorted() : RealmResults<C> { inline fun <reified C : RealmModel> Realm.sorted(editableOnly: Boolean = false) : RealmResults<C> {
return this.sorted(C::class.java) return this.sorted(C::class.java, editableOnly)
} }
/** /**

Loading…
Cancel
Save