diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index 1bde3302..26922fcd 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -92,7 +92,7 @@ class Calculator { val sessions: List = sessionGroup.sessions var sessionSets = sessionGroup.sessions.mapNotNull { it.sessionSet }.toHashSet() - var results: ComputedResults = ComputedResults() + var results: ComputedResults = ComputedResults(sessionGroup) if (sessions.size == 0) { return results diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Computable.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Computable.kt index 8df9abc2..f149e38c 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Computable.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Computable.kt @@ -38,7 +38,12 @@ class SessionGroup(name: String, sessions: List) { } -class ComputedResults() { +class ComputedResults(group: SessionGroup) { + + /** + * The session group used to computed the stats + */ + var group: SessionGroup = group // The computed stats of the sessionGroup private var _computedStats: MutableMap = mutableMapOf() @@ -46,6 +51,10 @@ class ComputedResults() { // The map containing all evolution values for all stats private var _evolutionValues: MutableMap> = mutableMapOf() + fun allStats() : Collection { + return this._computedStats.values + } + fun addEvolutionValue(value: Double, stat: Stat) { this._addEvolutionValue(Point(value), stat = stat) } diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Format.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Format.kt index 123b770f..79531e93 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Format.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Format.kt @@ -2,7 +2,7 @@ package net.pokeranalytics.android.calculus import android.graphics.Color -class StatFormat { - var text: String = "" - var color: Int = Color.BLUE +class StatFormat(text: String, color: Int = Color.WHITE) { + var text: String = text + var color: Int = color } \ No newline at end of file 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 78a0b126..eaabcf1b 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -107,14 +107,14 @@ class ComputedStat(stat: Stat, value: Double) { * Formats the value of the stat to be suitable for display */ fun format() : StatFormat { - return StatFormat() + return StatFormat("${value}".toUpperCase()) } /** * Returns a StatFormat instance for an evolution value located at the specified [index] */ fun evolutionValueFormat(index: Int) : StatFormat { - return StatFormat() + return StatFormat("undef") } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 7424ced4..3831dfb9 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -50,6 +50,10 @@ open class Session : RealmObject(), SessionInterface, Savable, // The time frame of the Session, i.e. the start & end date var timeFrame: TimeFrame? = null + set(value) { + field = value + value?.let { it.notifySessionDateChange(this) } + } // The time frame sessionGroup, which can contain multiple sessions override var sessionSet: SessionSet? = null @@ -237,7 +241,7 @@ open class Session : RealmObject(), SessionInterface, Savable, // make sessions recreate/find their session set sessionsFromSet?.let { sessions -> sessions.forEach { session -> - session.timeFrame?.notifySessionDateChange() + session.timeFrame?.notifySessionDateChange(session) } } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt index 86596dad..8ac2f2fd 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt @@ -83,18 +83,26 @@ open class TimeFrame : RealmObject() { this.computeDuration() - if (this.session != null) { - this.notifySessionDateChange() + this.session?.let { + this.notifySessionDateChange(it) } + } + /** + * Computes the net duration of the session + */ private fun computeDuration() { var endDate: Date = this.endDate ?: Date() val netDuration = endDate.time - this.startDate.time - this.breakDuration this.duration = netDuration } - fun notifySessionDateChange() { + /** + * Queries all time frames that might be impacted by the date change + * Makes all necessary changes to keep sequential time frames + */ + fun notifySessionDateChange(owner: Session) { val realm = Realm.getDefaultInstance() var query: RealmQuery = realm.where(SessionSet::class.java) query.isNotNull("timeFrame") @@ -118,20 +126,19 @@ open class TimeFrame : RealmObject() { val sessionGroups = query.findAll() - this.updateTimeFrames(sessionGroups) + this.updateTimeFrames(sessionGroups, owner) -// realm.close() } /** * Update Time frames from sets */ - private fun updateTimeFrames(sessionSets: RealmResults) { + private fun updateTimeFrames(sessionSets: RealmResults, owner: Session) { when (sessionSets.size) { - 0 -> this.createSessionGroup() - 1 -> this.updateSingleSessionGroup(sessionSets.first()!!) - else -> this.mergeSessionGroups(sessionSets) + 0 -> this.createSessionGroup(owner) + 1 -> this.updateSingleSessionGroup(owner, sessionSets.first()!!) + else -> this.mergeSessionGroups(owner, sessionSets) } } @@ -139,7 +146,7 @@ open class TimeFrame : RealmObject() { /** * Creates the session sessionGroup when the session has none */ - private fun createSessionGroup() { + private fun createSessionGroup(owner: Session) { val realm = Realm.getDefaultInstance() @@ -151,11 +158,7 @@ open class TimeFrame : RealmObject() { throw ModelException("TimeFrame should never be null here") } - this.session?.let { - it.sessionSet = set - } ?: run { - throw ModelException("Session should never be null here") - } + owner.sessionSet = set Timber.d("sd = : ${set.timeFrame?.startDate}, ed = ${set.timeFrame?.endDate}") @@ -165,7 +168,7 @@ open class TimeFrame : RealmObject() { * Single session sessionGroup update * Changes the sessionGroup timeframe using the current timeframe dates */ - private fun updateSingleSessionGroup(sessionSet: SessionSet) { + private fun updateSingleSessionGroup(owner: Session, sessionSet: SessionSet) { var groupTimeFrame: TimeFrame = sessionSet.timeFrame!! // tested in the query @@ -179,7 +182,7 @@ open class TimeFrame : RealmObject() { groupTimeFrame.endDate = null } - this.session?.sessionSet = sessionSet + owner.sessionSet = sessionSet } @@ -187,7 +190,7 @@ open class TimeFrame : RealmObject() { * Multiple session sets update: * Merges all sets into one (delete all then create a new one) */ - private fun mergeSessionGroups(sessionSets: RealmResults) { + private fun mergeSessionGroups(owner: Session, sessionSets: RealmResults) { var startDate: Date = this.startDate var endDate: Date? = this.endDate @@ -228,11 +231,7 @@ open class TimeFrame : RealmObject() { } // Add the session linked to this timeframe to the new sessionGroup - this.sessions?.first()?.let { - it.sessionSet = set - } ?: run { - throw ModelException("TimeFrame should never be null here") - } + owner.sessionSet = set // Add all orphan sessions sessions.forEach { it.sessionSet = set } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/datasource/StatsDataSource.kt b/app/src/main/java/net/pokeranalytics/android/ui/datasource/StatsDataSource.kt index e1cbdd22..0f931df3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/datasource/StatsDataSource.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/datasource/StatsDataSource.kt @@ -1,18 +1,33 @@ package net.pokeranalytics.android.ui.datasource import net.pokeranalytics.android.calculus.ComputedResults -import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource +import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType -class StatsDataSource(results: List) : RowRepresentableDataSource { + +class StatRepresentable(stat: ComputedStat) : RowRepresentable { + + var computedStat: ComputedStat = stat + + override val viewType: Int + get() = RowViewType.STAT.ordinal + + override val resId: Int? + get() = this.computedStat.stat.resId + +} + +class StatsDataSource(results: List) { var results: List = results + var rows: List = listOf() + + init { - override fun adapterRows(): ArrayList { - return ArrayList() } - override fun numberOfRows(): Int { + fun numberOfRows(): Int { return 0 // return this.results.fold(0) { acc, computedResults -> // return acc + computedResults.numberOfStats() 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 79ffaf32..5190d51e 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 @@ -25,8 +25,7 @@ import net.pokeranalytics.android.util.isSameMonth import net.pokeranalytics.android.util.longDate import java.util.* -class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, - RowRepresentableDelegate { +class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, RowRepresentableDelegate { companion object { fun newInstance(): HistoryFragment { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt index 2325cbd1..9b690134 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt @@ -15,10 +15,18 @@ import net.pokeranalytics.android.calculus.SessionGroup import net.pokeranalytics.android.model.extensions.SessionType import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter -import net.pokeranalytics.android.ui.datasource.StatsDataSource +import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource +import net.pokeranalytics.android.ui.datasource.StatRepresentable import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import net.pokeranalytics.android.ui.view.HeaderRowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType -class StatsFragment : PokerAnalyticsFragment() { +class StatsFragment : PokerAnalyticsFragment(), RowRepresentableDataSource { + + private var rowRepresentables: ArrayList = ArrayList() + + private lateinit var statsAdapterRow: RowRepresentableAdapter companion object { @@ -33,7 +41,6 @@ class StatsFragment : PokerAnalyticsFragment() { } } - private lateinit var statsAdapterRow: RowRepresentableAdapter override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -45,6 +52,21 @@ class StatsFragment : PokerAnalyticsFragment() { initData() } + // Row Representable DS + + override fun adapterRows(): ArrayList { + return this.rowRepresentables + } + + override fun stringForRow(row: RowRepresentable): String { + if (row is StatRepresentable) { + val stat = row as StatRepresentable + val format = stat.computedStat.format() + return format.text + } + return "nope" + } + /** * Init data */ @@ -76,9 +98,14 @@ class StatsFragment : PokerAnalyticsFragment() { val tSessionGroup = SessionGroup(getString(R.string.tournament), tSessions) results = Calculator.computeGroups(listOf(allSessionGroup, cgSessionGroup, tSessionGroup), Calculator.Options()) + } - this.statsAdapterRow = RowRepresentableAdapter(StatsDataSource(results)) + + this.rowRepresentables = this.convertResultsIntoRepresentables(results) + + this.statsAdapterRow = RowRepresentableAdapter(this) // StatsAdapter(this, null) + val viewManager = LinearLayoutManager(requireContext()) @@ -90,4 +117,18 @@ class StatsFragment : PokerAnalyticsFragment() { } + fun convertResultsIntoRepresentables(results: List) : ArrayList { + + val rows: ArrayList = ArrayList() + + results.forEach { + rows.add(HeaderRowRepresentable(RowViewType.HEADER_TITLE_VALUE, title = it.group.name)) + it.allStats().forEach { + rows.add(StatRepresentable(it)) + } + } + + return rows + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index b27ff292..4a8bc446 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -71,8 +71,16 @@ interface Displayable : Localizable { return false } - var displayHeader: Boolean - var headerValues: ArrayList + val displayHeader: Boolean + get() { + return false + } + + + val headerValues: ArrayList + get() { + return ArrayList() + } } 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 be8f19cd..3653830d 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 @@ -42,11 +42,91 @@ enum class RowViewType { DATA, BOTTOM_SHEET_DATA, TITLE_GRID, - ROW_SESSION; + ROW_SESSION, + STAT; - inner class FakeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), - BindableHolder { - override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + /** + * View holder + */ + fun viewHolder(parent: ViewGroup): RecyclerView.ViewHolder { + return when (this) { + HEADER_TITLE_VALUE -> HeaderTitleValueViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_header_title_value, + parent, + false + ) + ) + HEADER_TITLE_AMOUNT -> HeaderTitleAmountViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_header_title_amount, + parent, + false + ) + ) + TITLE -> TitleViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_title, + parent, + false + ) + ) + TITLE_VALUE -> TitleValueViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_title_value, + parent, + false + ) + ) + TITLE_GRID -> TitleGridSessionViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_bottom_sheet_grid_title, + parent, + false) + ) + TITLE_SWITCH -> TitleSwitchViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_title_switch, + parent, + false + ) + ) + TITLE_VALUE_ACTION -> TitleValueActionViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_title_value_action, + parent, + false + ) + ) + DATA -> DataViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_title, + parent, + false + ) + ) + BOTTOM_SHEET_DATA -> BottomSheetDataViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_bottom_sheet_title, + parent, + false + ) + ) + ROW_SESSION -> RowSessionViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_history_session, + parent, + false) + ) + STAT -> TitleValueViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_title_value, + parent, + false + ) + ) + + else -> throw Exception("Undefined rowViewType's holder") } } @@ -209,81 +289,5 @@ enum class RowViewType { } } - /** - * View holder - */ - fun viewHolder(parent: ViewGroup): RecyclerView.ViewHolder { - return when (this) { - HEADER_TITLE_VALUE -> HeaderTitleValueViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_header_title_value, - parent, - false - ) - ) - HEADER_TITLE_AMOUNT -> HeaderTitleAmountViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_header_title_amount, - parent, - false - ) - ) - TITLE -> TitleViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_title, - parent, - false - ) - ) - TITLE_VALUE -> TitleValueViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_title_value, - parent, - false - ) - ) - TITLE_GRID -> TitleGridSessionViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_bottom_sheet_grid_title, - parent, - false) - ) - TITLE_SWITCH -> TitleSwitchViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_title_switch, - parent, - false - ) - ) - TITLE_VALUE_ACTION -> TitleValueActionViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_title_value_action, - parent, - false - ) - ) - DATA -> DataViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_title, - parent, - false - ) - ) - BOTTOM_SHEET_DATA -> BottomSheetDataViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_bottom_sheet_title, - parent, - false - ) - ) - ROW_SESSION -> RowSessionViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_history_session, - parent, - false) - ) - else -> throw Exception("Undefined RowViewType's holder") - } - } } \ No newline at end of file