Create the ActionReadRow and the extension to compact a list of ComputedAction into a list of ActionReadRow

hh
Laurent 6 years ago
parent 95d8e0e229
commit d986378ffe
  1. 22
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryAdapter.kt
  2. 12
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/ActionReadRow.kt
  3. 22
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/ComputedAction.kt
  4. 46
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/HandHistoryViewModel.kt
  5. 3
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/PositionAdapter.kt
  6. 28
      app/src/main/res/layout/row_hand_action_read.xml

@ -13,6 +13,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import kotlinx.android.synthetic.main.row_hand_action.view.* import kotlinx.android.synthetic.main.row_hand_action.view.*
import kotlinx.android.synthetic.main.row_hand_action_read.view.*
import kotlinx.android.synthetic.main.row_hand_cards.view.* import kotlinx.android.synthetic.main.row_hand_cards.view.*
import kotlinx.android.synthetic.main.row_hand_player_summary.view.* import kotlinx.android.synthetic.main.row_hand_player_summary.view.*
import kotlinx.android.synthetic.main.row_hhsettings_player_setup.view.* import kotlinx.android.synthetic.main.row_hhsettings_player_setup.view.*
@ -33,6 +34,7 @@ import net.pokeranalytics.android.ui.modules.handhistory.views.PositionAdapter
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.holder.RowViewHolder import net.pokeranalytics.android.ui.view.holder.RowViewHolder
import net.pokeranalytics.android.ui.view.rowrepresentable.ViewIdentifier import net.pokeranalytics.android.ui.view.rowrepresentable.ViewIdentifier
import net.pokeranalytics.android.util.extensions.formatted
enum class HandRowType(var layoutRes: Int) : ViewIdentifier, RowRepresentable, HandHistoryRow { enum class HandRowType(var layoutRes: Int) : ViewIdentifier, RowRepresentable, HandHistoryRow {
@ -46,7 +48,8 @@ enum class HandRowType(var layoutRes: Int) : ViewIdentifier, RowRepresentable, H
PLAYER_NUMBER(R.layout.row_title_value), PLAYER_NUMBER(R.layout.row_title_value),
PLAYER_SETUP(R.layout.row_hhsettings_player_setup), PLAYER_SETUP(R.layout.row_hhsettings_player_setup),
ANTE(R.layout.row_title_value), ANTE(R.layout.row_title_value),
BIG_BLIND_ANTE(R.layout.row_title_switch) BIG_BLIND_ANTE(R.layout.row_title_switch),
ACTION_READ(R.layout.row_hand_action_read)
; ;
override val viewType: Int = this.ordinal override val viewType: Int = this.ordinal
@ -155,8 +158,8 @@ class HandHistoryAdapter(
HandRowType.STRADDLE -> RowHandStraddle(layout) HandRowType.STRADDLE -> RowHandStraddle(layout)
HandRowType.PLAYER_SETUP -> RowHandPlayerSetup(layout) HandRowType.PLAYER_SETUP -> RowHandPlayerSetup(layout)
HandRowType.COMMENT -> RowViewHolder(layout) HandRowType.COMMENT -> RowViewHolder(layout)
HandRowType.PLAYER_NUMBER, HandRowType.ANTE, HandRowType.ACTION_READ -> RowActionRead(layout)
HandRowType.BIG_BLIND_ANTE -> RowViewHolder(layout) HandRowType.PLAYER_NUMBER, HandRowType.ANTE, HandRowType.BIG_BLIND_ANTE -> RowViewHolder(layout)
} }
} }
@ -432,6 +435,19 @@ class HandHistoryAdapter(
} }
inner class RowActionRead(itemView: View) : RowHandHolder(itemView) {
override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) {
val actionReadRow = row as ActionReadRow
itemView.playersText.text = actionReadRow.positions.map { it.value }.joinToString(", ")
itemView.actionText.text = actionReadRow.action.localizedTitle(itemView.context)
itemView.amountText.text = actionReadRow.amount?.formatted()
}
}
/** /**
* Display a hand street * Display a hand street
*/ */

@ -0,0 +1,12 @@
package net.pokeranalytics.android.ui.modules.handhistory.model
import net.pokeranalytics.android.model.handhistory.Position
import net.pokeranalytics.android.model.realm.handhistory.Action
import net.pokeranalytics.android.ui.modules.handhistory.HandRowType
import net.pokeranalytics.android.ui.view.RowRepresentable
class ActionReadRow(var positions: MutableList<Position>, var action: Action.Type?, var amount: Double?) : RowRepresentable {
override val viewType: Int = HandRowType.STREET.ordinal
}

@ -9,6 +9,21 @@ import net.pokeranalytics.android.ui.modules.handhistory.HandRowType
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
/***
* An extension to transform a list of ComputedAction into
* a more compact and read-friendly list of ActionReadRow
*/
fun List<ComputedAction>.compact(): List<ActionReadRow> {
val rows = mutableListOf<ActionReadRow>()
this.forEach {
if (it.action.type == Action.Type.FOLD && rows.lastOrNull()?.action == Action.Type.FOLD) {
rows.lastOrNull()?.positions?.add(it.position)
} else {
rows.add(it.toReadRow())
}
}
return rows
}
/*** /***
* ComputedAction is a convenience class which main role is to represent a hand history Action * ComputedAction is a convenience class which main role is to represent a hand history Action
@ -278,4 +293,11 @@ class ComputedAction(var manager: ActionManager,
override val viewType: Int = HandRowType.ACTION.ordinal override val viewType: Int = HandRowType.ACTION.ordinal
/***
* The "read mode" representation of the action
*/
fun toReadRow(): ActionReadRow {
return ActionReadRow(mutableListOf(this.position), this.action.type, this.action.amount)
}
} }

@ -206,8 +206,51 @@ class HandHistoryViewModel : ViewModel(), RowRepresentableDataSource, CardCentra
private fun readRowRepresentation(): MutableList<RowRepresentable> { private fun readRowRepresentation(): MutableList<RowRepresentable> {
val rows: MutableList<RowRepresentable> = mutableListOf() val rows: MutableList<RowRepresentable> = mutableListOf()
rows.add(HandRowType.COMMENT) rows.add(HandRowType.COMMENT)
rows.add(CustomizableRowRepresentable(customViewType = HandRowType.HEADER, resId = R.string.settings, value = ""))
rows.add(HandRowType.PLAYER_NUMBER)
rows.add(HandRowType.ANTE)
if (this.handSetup.type != Session.Type.CASH_GAME) {
rows.add(HandRowType.BIG_BLIND_ANTE)
}
this.playerSetups().forEach {
rows.add(it)
}
Street.values().forEach { street ->
when (street) {
Street.SUMMARY -> {
val lastActionIndex = this.sortedActions.size - 1
if (this.sortedActions.activePositions(lastActionIndex).size < 2 || this.sortedActions.isStreetActionClosed(lastActionIndex) == Street.SUMMARY) {
addStreetHeader(rows, street)
// TODO remove useless settings, collapse multifolds val activePositions = this.sortedActions.activePositions(lastActionIndex, true)
activePositions.forEach { position ->
val positionIndex = this.sortedActions.positions.indexOf(position)
val playerCardsRow = PlayerCardsRow(this,
position,
positionIndex,
this.handHistory,
this.handHistory.playerSetupForPosition(positionIndex),
this.playerHandMaxCards)
rows.add(playerCardsRow)
}
}
}
else -> {
val actions = this.sortedActions.filter { it.street == street }
if (actions.isNotEmpty()) {
addStreetHeader(rows, street)
rows.addAll(actions.compact())
}
}
}
}
return rows return rows
} }
@ -227,6 +270,7 @@ class HandHistoryViewModel : ViewModel(), RowRepresentableDataSource, CardCentra
rows.add(HandRowType.BIG_BLIND_ANTE) rows.add(HandRowType.BIG_BLIND_ANTE)
} }
// Straddle
val positions = Position.positionsPerPlayers(this.handHistory.numberOfPlayers) val positions = Position.positionsPerPlayers(this.handHistory.numberOfPlayers)
if (this.handSetup.type != Session.Type.TOURNAMENT && this.isNew && positions.size > 2) { // don't allow any straddle changes if not new, or if it's a headsup if (this.handSetup.type != Session.Type.TOURNAMENT && this.isNew && positions.size > 2) { // don't allow any straddle changes if not new, or if it's a headsup

@ -12,7 +12,6 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
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.holder.RowViewHolder import net.pokeranalytics.android.ui.view.holder.RowViewHolder
import timber.log.Timber
class PositionAdapter(var listener: PositionSelectionListener? = null) : class PositionAdapter(var listener: PositionSelectionListener? = null) :
RecyclerView.Adapter<RecyclerView.ViewHolder>(), RecyclerView.Adapter<RecyclerView.ViewHolder>(),
@ -26,7 +25,7 @@ class PositionAdapter(var listener: PositionSelectionListener? = null) :
var positions: List<Position> = listOf() var positions: List<Position> = listOf()
set(value) { set(value) {
field = value field = value
Timber.d("Setting positions = $value") // Timber.d("Setting positions = $value")
notifyDataSetChanged() notifyDataSetChanged()
} }

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/playersText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:layout_marginStart="8dp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actionText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="8dp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/amountText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="8dp" />
</LinearLayout>
Loading…
Cancel
Save