Adds position selection in the Action keyboard - unfinished

hh
Laurent 6 years ago
parent 658792e93a
commit d24ae60dd5
  1. 20
      app/src/main/java/net/pokeranalytics/android/model/handhistory/HHBuilder.kt
  2. 7
      app/src/main/java/net/pokeranalytics/android/model/handhistory/Position.kt
  3. 11
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt
  4. 13
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryViewModel.kt
  5. 8
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/AbstractKeyboardView.kt
  6. 32
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardActionView.kt
  7. 7
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardContainer.kt
  8. 63
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/PositionAdapter.kt
  9. 25
      app/src/main/res/layout/view_hand_keyboard_action.xml

@ -9,7 +9,6 @@ import net.pokeranalytics.android.ui.modules.handhistory.views.StreetCardHeader
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import timber.log.Timber import timber.log.Timber
import java.util.*
enum class HHKeyboard { enum class HHKeyboard {
ACTION, ACTION,
@ -344,6 +343,15 @@ class HHBuilder {
return nextActions.firstOrNull() { it.action.isActionSignificant } return nextActions.firstOrNull() { it.action.isActionSignificant }
} }
/***
* Returns a list of positions at the provided [index]
*/
fun positionsAtIndex(index: Int): List<Position> {
val currentStreet = this.actionForIndex(index).action.street
val streetActions = this.sortedActions.filter { it.action.street == currentStreet }
return streetActions.drop(index + 1).map { it.position }
}
fun setNumberOfPlayers(playerCount: Int) { fun setNumberOfPlayers(playerCount: Int) {
this.handHistory.numberOfPlayers = playerCount this.handHistory.numberOfPlayers = playerCount
this.positions = Position.positionsPerPlayers(playerCount) this.positions = Position.positionsPerPlayers(playerCount)
@ -416,5 +424,15 @@ class HHBuilder {
return null return null
} }
fun nextActionIndex(actionIndexForSelection: Int, position: Position): Int {
var i = actionIndexForSelection + 1
while (true) {
if (this.sortedActions[i].position == position) return i
i++
if (i > this.sortedActions.size) throw PAIllegalStateException("algo sucks")
}
}
} }

@ -1,9 +1,11 @@
package net.pokeranalytics.android.model.handhistory package net.pokeranalytics.android.model.handhistory
import android.content.Context
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.ui.view.RowRepresentable
import java.util.* import java.util.*
enum class Position(var value: String) { enum class Position(var value: String) : RowRepresentable {
SB("SB"), SB("SB"),
BB("BB"), BB("BB"),
UTG("UTG"), UTG("UTG"),
@ -34,5 +36,8 @@ enum class Position(var value: String) {
} }
override fun getDisplayName(context: Context): String {
return this.value
}
} }

@ -112,6 +112,9 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepr
selection?.let { selection?.let {
Timber.d("Current selection is ${selection.index} / ${selection.keyboard}") Timber.d("Current selection is ${selection.index} / ${selection.keyboard}")
retrieveEditTextInputConnection(selection.index) retrieveEditTextInputConnection(selection.index)
val positions = this.model.positionsForSelection()
this.keyboard.setPositions(positions)
} ?: run { } ?: run {
this.keyboard.setEditText(null, null) this.keyboard.setEditText(null, null)
} }
@ -296,6 +299,13 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepr
this.model.amountChanged(amount) this.model.amountChanged(amount)
} }
override fun positionSelected(position: Position) {
val rowRepresentableIndex = this.model.nextActionIndexForPosition(position)
this.rowRepresentableForPosition(rowRepresentableIndex)?.let {
onRowSelected(rowRepresentableIndex, it, HHKeyboard.ACTION.ordinal)
} ?: throw PAIllegalStateException("Rowrepresentable not fouind at index $rowRepresentableIndex")
}
// Table refresh // Table refresh
private fun refreshCells(oldIndex: Int) { private fun refreshCells(oldIndex: Int) {
@ -310,5 +320,4 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepr
} }
} }
} }

@ -6,6 +6,7 @@ import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.handhistory.HHBuilder import net.pokeranalytics.android.model.handhistory.HHBuilder
import net.pokeranalytics.android.model.handhistory.HHKeyboard import net.pokeranalytics.android.model.handhistory.HHKeyboard
import net.pokeranalytics.android.model.handhistory.HHSelection import net.pokeranalytics.android.model.handhistory.HHSelection
import net.pokeranalytics.android.model.handhistory.Position
import net.pokeranalytics.android.model.realm.handhistory.Action import net.pokeranalytics.android.model.realm.handhistory.Action
import net.pokeranalytics.android.model.realm.handhistory.Card import net.pokeranalytics.android.model.realm.handhistory.Card
import net.pokeranalytics.android.model.realm.handhistory.CardProperty import net.pokeranalytics.android.model.realm.handhistory.CardProperty
@ -95,4 +96,16 @@ class HandHistoryViewModel : ViewModel() {
this.currentAmount = amount this.currentAmount = amount
} }
fun positionsForSelection(): List<Position> {
this.builder.value?.let {
return it.positionsAtIndex(this.actionIndexForSelection)
} ?: throw PAIllegalStateException("Builder not defined")
}
fun nextActionIndexForPosition(position: Position): Int {
this.builder.value?.let {
return it.nextActionIndex(this.actionIndexForSelection, position)
} ?: throw PAIllegalStateException("Builder not defined")
}
} }

@ -6,5 +6,13 @@ import android.widget.FrameLayout
abstract class AbstractKeyboardView(context: Context) : FrameLayout(context) { abstract class AbstractKeyboardView(context: Context) : FrameLayout(context) {
var keyboardListener: KeyboardListener? = null var keyboardListener: KeyboardListener? = null
set(value) {
field = value
value?.let { onListenerSet(it) }
}
open fun onListenerSet(listener: KeyboardListener) {
}
} }

@ -3,8 +3,12 @@ package net.pokeranalytics.android.ui.modules.handhistory.views
import android.content.Context import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.view_hand_keyboard_action.view.* import kotlinx.android.synthetic.main.view_hand_keyboard_action.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.handhistory.Position
import net.pokeranalytics.android.model.realm.handhistory.Action import net.pokeranalytics.android.model.realm.handhistory.Action
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
@ -18,16 +22,18 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context),
StaticRowRepresentableDataSource, RowRepresentableDelegate { StaticRowRepresentableDataSource, RowRepresentableDelegate {
private var dataAdapter: RowRepresentableAdapter private var dataAdapter: RowRepresentableAdapter
private lateinit var positionAdapter: PositionAdapter
init { init {
LayoutInflater.from(context) LayoutInflater.from(context)
.inflate(R.layout.view_hand_keyboard_action, this, true) .inflate(R.layout.view_hand_keyboard_action, this, true)
val viewManager = GridLayoutManager(context, 3) // Action recycler
val spanCount = 3
val viewManager = GridLayoutManager(context, spanCount)
this.dataAdapter = RowRepresentableAdapter(this, this) this.dataAdapter = RowRepresentableAdapter(this, this)
val spanCount = 3
val spacing = 2.px val spacing = 2.px
val includeEdge = false val includeEdge = false
@ -38,12 +44,34 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context),
addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, includeEdge)) addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, includeEdge))
} }
this.closeButton.setOnClickListener { this.closeButton.setOnClickListener {
this.keyboardListener?.closeKeyboard() this.keyboardListener?.closeKeyboard()
} }
} }
override fun onListenerSet(listener: KeyboardListener) {
// Position Recycler
val positionViewManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
this.keyboardListener?.let {
this.positionAdapter = PositionAdapter(it)
} ?: throw PAIllegalStateException("keyboard listener not set")
this.positionRecyclerView.apply {
setHasFixedSize(true)
layoutManager = positionViewManager
adapter = positionAdapter
// addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, includeEdge))
}
}
fun setPositions(positions: List<Position>) {
this.positionAdapter.positions = positions
}
override fun adapterRows(): List<RowRepresentable>? { override fun adapterRows(): List<RowRepresentable>? {
return Action.Type.defaultTypes return Action.Type.defaultTypes
} }

@ -9,6 +9,7 @@ import androidx.core.view.isVisible
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.handhistory.HHKeyboard import net.pokeranalytics.android.model.handhistory.HHKeyboard
import net.pokeranalytics.android.model.handhistory.Position
import net.pokeranalytics.android.model.realm.handhistory.Action import net.pokeranalytics.android.model.realm.handhistory.Action
import net.pokeranalytics.android.model.realm.handhistory.Card import net.pokeranalytics.android.model.realm.handhistory.Card
@ -21,6 +22,7 @@ interface KeyboardListener {
fun amountValidated() fun amountValidated()
fun clearAmount() fun clearAmount()
fun closeKeyboard() fun closeKeyboard()
fun positionSelected(position: Position)
} }
class KeyboardContainer(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { class KeyboardContainer(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) {
@ -109,6 +111,11 @@ class KeyboardContainer(context: Context, attrs: AttributeSet?) : FrameLayout(co
amountKeyboard.setEditText(editText, amount) amountKeyboard.setEditText(editText, amount)
} }
fun setPositions(positions: List<Position>) {
val actionKeyboard = this.keyboards[HHKeyboard.ACTION] as KeyboardActionView
actionKeyboard.setPositions(positions)
}
// private fun loadView(layoutId: Int) { // private fun loadView(layoutId: Int) {
// val layoutInflater = LayoutInflater.from(context) // val layoutInflater = LayoutInflater.from(context)
// constraintLayout = layoutInflater.inflate(layoutId, this, false) as ConstraintLayout // constraintLayout = layoutInflater.inflate(layoutId, this, false) as ConstraintLayout

@ -0,0 +1,63 @@
package net.pokeranalytics.android.ui.modules.handhistory.views
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import net.pokeranalytics.android.model.handhistory.Position
import net.pokeranalytics.android.ui.adapter.BindableHolder
import net.pokeranalytics.android.ui.adapter.RecyclerAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
import timber.log.Timber
class PositionAdapter(var keyboardListener: KeyboardListener) :
RecyclerView.Adapter<RecyclerView.ViewHolder>(),
RowRepresentableDataSource, RowRepresentableDelegate, RecyclerAdapter {
override var dataSource: RowRepresentableDataSource = this
override var delegate: RowRepresentableDelegate? = this
var positions: List<Position> = listOf()
set(value) {
field = value
Timber.d("Setting positions = $value")
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return RowViewType.values()[viewType].viewHolder(parent)
}
override fun getItemCount(): Int {
return this.positions.size
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
this.rowRepresentableForPosition(position)?.let {
(holder as BindableHolder).onBind(position, it, this)
}
}
override fun adapterRows(): List<RowRepresentable>? {
return this.positions
}
override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
return this.positions[position]
}
override fun numberOfRows(): Int {
return this.positions.size
}
override fun viewTypeForPosition(position: Int): Int {
return RowViewType.TITLE_GRID.ordinal
}
override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) {
Timber.d("/////onRowSelected")
keyboardListener.positionSelected(this.positions[position])
}
}

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout <LinearLayout
@ -10,7 +12,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/recyclerView"> app:layout_constraintBottom_toTopOf="@id/positionRecyclerView">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/closeButton" android:id="@+id/closeButton"
@ -20,16 +22,19 @@
android:layout_height="44dp" android:layout_height="44dp"
android:layout_marginStart="8dp"/> android:layout_marginStart="8dp"/>
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:chipSpacingHorizontal="8dp"
app:singleSelection="true"/>
</LinearLayout> </LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/positionRecyclerView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/recyclerView"
tools:layout_height="44dp"
/>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"

Loading…
Cancel
Save