diff --git a/app/src/main/java/net/pokeranalytics/android/model/handhistory/ComputedAction.kt b/app/src/main/java/net/pokeranalytics/android/model/handhistory/ComputedAction.kt index ae8c8717..00e4b9cb 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/handhistory/ComputedAction.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/handhistory/ComputedAction.kt @@ -6,7 +6,8 @@ import net.pokeranalytics.android.ui.view.RowViewType class ComputedAction(var action: Action, var totalPotSize: Double = 0.0, - var playerRemainingStack: Double? = null) : RowRepresentable { + var playerRemainingStack: Double? = null, + var position: Position) : RowRepresentable { /*** * Returns whether the action requires the user to enter an amount for the selected action diff --git a/app/src/main/java/net/pokeranalytics/android/model/handhistory/HHBuilder.kt b/app/src/main/java/net/pokeranalytics/android/model/handhistory/HHBuilder.kt index 56ae164f..100552f3 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/handhistory/HHBuilder.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/handhistory/HHBuilder.kt @@ -1,10 +1,14 @@ package net.pokeranalytics.android.model.handhistory +import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.handhistory.Action import net.pokeranalytics.android.model.realm.handhistory.HandHistory import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.handhistory.StreetHeader +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable +import java.util.* import kotlin.math.min class HHBuilder { @@ -15,6 +19,7 @@ class HHBuilder { private var handHistory: HandHistory set(value) { field = value + setNumberOfPlayers(value.numberOfPlayers) load() } @@ -28,6 +33,8 @@ class HHBuilder { */ private var sortedActions: List = mutableListOf() + var positions: LinkedHashSet = linkedSetOf() + /*** * Creates a builder using a [handSetup] * Creates a new Hand History and configures it according to the [handSetup] @@ -36,7 +43,6 @@ class HHBuilder { val handHistory = HandHistory() handHistory.configure(handSetup) this.handHistory = handHistory - } /*** @@ -67,7 +73,8 @@ class HHBuilder { val sortedActions = this.handHistory.actions.sortedBy { it.index } sortedActions.forEach { action -> totalPotSize += action.effectiveAmount - val ca = ComputedAction(action, totalPotSize, action.positionRemainingStack) + val position = this.positions.elementAt(action.position) + val ca = ComputedAction(action, totalPotSize, action.positionRemainingStack, position) computedActions.add(ca) } this.sortedActions = computedActions @@ -249,6 +256,11 @@ class HHBuilder { return previousActions.lastOrNull { it.action.isActionSignificant } } + fun setNumberOfPlayers(playerCount: Int) { + this.handHistory.numberOfPlayers = playerCount + this.positions = Position.positionsPerPlayers(playerCount) + } + /*** * Saves the current hand state in the database */ @@ -259,15 +271,28 @@ class HHBuilder { fun rowRepresentables() : List { val rows: MutableList = mutableListOf() + rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.settings)) + var potSize = 0.0 Street.values().forEach { street -> - rows.add(StreetHeader(street, this.handHistory.cardsForStreet(street), potSize)) + val actions = this.sortedActions.filter { it.action.street == street.ordinal } - rows.addAll(actions) if (actions.isNotEmpty()) { + // Name of the street + pot size if not preflop + rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = street.resId)) + + // Cards if not preflop + if (street.totalBoardCards > 0) { + rows.add(StreetHeader(street, this.handHistory.cardsForStreet(street), potSize)) + } + + // Actions + rows.addAll(actions) + potSize = actions.last().totalPotSize } + } return rows diff --git a/app/src/main/java/net/pokeranalytics/android/model/handhistory/Position.kt b/app/src/main/java/net/pokeranalytics/android/model/handhistory/Position.kt new file mode 100644 index 00000000..c22af621 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/handhistory/Position.kt @@ -0,0 +1,38 @@ +package net.pokeranalytics.android.model.handhistory + +import net.pokeranalytics.android.exceptions.PAIllegalStateException +import java.util.* + +enum class Position(var value: String) { + SB("SB"), + BB("BB"), + UTG("UTG"), + UTG1("UTG+1"), + UTG2("UTG+2"), + UTG3("UTG+3"), + MP("MP"), + HJ("HJ"), + CO("CO"), + BUT("BUT"); + + companion object { + + fun positionsPerPlayers(playerCount: Int) : LinkedHashSet { + return when(playerCount) { + 2 -> linkedSetOf(SB, BB) + 3 -> linkedSetOf(SB, BB, BUT) + 4 -> linkedSetOf(SB, BB, UTG, BUT) + 5 -> linkedSetOf(SB, BB, UTG, CO, BUT) + 6 -> linkedSetOf(SB, BB, UTG, HJ, CO, BUT) + 7 -> linkedSetOf(SB, BB, UTG, MP, HJ, CO, BUT) + 8 -> linkedSetOf(SB, BB, UTG, UTG1, MP, HJ, CO, BUT) + 9 -> linkedSetOf(SB, BB, UTG, UTG1, UTG2, MP, HJ, CO, BUT) + 10 -> linkedSetOf(SB, BB, UTG, UTG1, UTG2, UTG3, MP, HJ, CO, BUT) + else -> throw PAIllegalStateException("Unmanaged number of players") + } + } + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/handhistory/Street.kt b/app/src/main/java/net/pokeranalytics/android/model/handhistory/Street.kt index f823dd0c..861e5c11 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/handhistory/Street.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/handhistory/Street.kt @@ -1,5 +1,7 @@ package net.pokeranalytics.android.model.handhistory +import net.pokeranalytics.android.R + enum class Street { PREFLOP, FLOP, @@ -15,5 +17,16 @@ enum class Street { RIVER -> 5 } } + + val resId: Int + get() { + return when (this) { + PREFLOP -> R.string.street_preflop + FLOP -> R.string.street_flop + TURN -> R.string.street_turn + RIVER -> R.string.street_river + } + } + } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Action.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Action.kt index 30f056a6..fe91f2f7 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Action.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Action.kt @@ -1,23 +1,25 @@ package net.pokeranalytics.android.model.realm.handhistory import io.realm.RealmObject +import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException open class Action : RealmObject() { - enum class Type { - POST_SB, - POST_BB, - STRADDLE, - FOLD, - CHECK, - CALL, - BET, - RAISE, - UNDEFINED_ALLIN, - CALL_ALLIN, - BET_ALLIN, - RAISE_ALLIN; + enum class Type(var resId: Int) { + + POST_SB(R.string.posts_sb), + POST_BB(R.string.post_bb), + STRADDLE(R.string.straddle), + FOLD(R.string.fold), + CHECK(R.string.check), + CALL(R.string.call), + BET(R.string.bet), + RAISE(R.string.raise), + UNDEFINED_ALLIN(R.string.allin), + CALL_ALLIN(R.string.allin), + BET_ALLIN(R.string.allin), + RAISE_ALLIN(R.string.allin); val isSignificant: Boolean get() { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt index 6e0e8d48..11b582a9 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt @@ -98,7 +98,7 @@ open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterab handSetup.smallBlind?.let { this.smallBlind = it } handSetup.bigBlind?.let { this.bigBlind = it } - for (i in 0..this.numberOfPlayers) { + for (i in 0 until this.numberOfPlayers) { val action = Action() action.index = i action.position = i 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 4568665e..a33110a6 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 @@ -3,6 +3,7 @@ package net.pokeranalytics.android.ui.view import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Button import android.widget.FrameLayout import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatTextView @@ -25,6 +26,7 @@ import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.bankroll.BankrollReportManager import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.extensions.getFormattedGameType +import net.pokeranalytics.android.model.handhistory.ComputedAction import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.Player import net.pokeranalytics.android.model.realm.Session @@ -685,7 +687,19 @@ enum class RowViewType(private var layoutRes: Int) { * Display a hand action */ inner class RowHandAction(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + val computedAction = row as ComputedAction + + itemView.findViewById