From d24ae60dd5c0f2ddf7893ca827eeb5fd858d2f0b Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 24 Jan 2020 16:48:53 +0100 Subject: [PATCH] Adds position selection in the Action keyboard - unfinished --- .../android/model/handhistory/HHBuilder.kt | 20 +++++- .../android/model/handhistory/Position.kt | 7 ++- .../handhistory/HandHistoryFragment.kt | 11 +++- .../handhistory/HandHistoryViewModel.kt | 13 ++++ .../handhistory/views/AbstractKeyboardView.kt | 8 +++ .../handhistory/views/KeyboardActionView.kt | 32 +++++++++- .../handhistory/views/KeyboardContainer.kt | 7 +++ .../handhistory/views/PositionAdapter.kt | 63 +++++++++++++++++++ .../res/layout/view_hand_keyboard_action.xml | 25 +++++--- 9 files changed, 171 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/PositionAdapter.kt 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 b66beb2c..4a5b6469 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 @@ -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.CustomizableRowRepresentable import timber.log.Timber -import java.util.* enum class HHKeyboard { ACTION, @@ -344,6 +343,15 @@ class HHBuilder { return nextActions.firstOrNull() { it.action.isActionSignificant } } + /*** + * Returns a list of positions at the provided [index] + */ + fun positionsAtIndex(index: Int): List { + 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) { this.handHistory.numberOfPlayers = playerCount this.positions = Position.positionsPerPlayers(playerCount) @@ -416,5 +424,15 @@ class HHBuilder { 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") + } + } + } 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 index c22af621..ef19d2f1 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/handhistory/Position.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/handhistory/Position.kt @@ -1,9 +1,11 @@ package net.pokeranalytics.android.model.handhistory +import android.content.Context import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.ui.view.RowRepresentable import java.util.* -enum class Position(var value: String) { +enum class Position(var value: String) : RowRepresentable { SB("SB"), BB("BB"), UTG("UTG"), @@ -34,5 +36,8 @@ enum class Position(var value: String) { } + override fun getDisplayName(context: Context): String { + return this.value + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt index 42dfbcfd..582bd796 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt @@ -112,6 +112,9 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepr selection?.let { Timber.d("Current selection is ${selection.index} / ${selection.keyboard}") retrieveEditTextInputConnection(selection.index) + + val positions = this.model.positionsForSelection() + this.keyboard.setPositions(positions) } ?: run { this.keyboard.setEditText(null, null) } @@ -296,6 +299,13 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepr 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 private fun refreshCells(oldIndex: Int) { @@ -310,5 +320,4 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepr } } - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryViewModel.kt index cf53dd3b..bc7c7387 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryViewModel.kt @@ -6,6 +6,7 @@ import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.handhistory.HHBuilder import net.pokeranalytics.android.model.handhistory.HHKeyboard 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.Card import net.pokeranalytics.android.model.realm.handhistory.CardProperty @@ -95,4 +96,16 @@ class HandHistoryViewModel : ViewModel() { this.currentAmount = amount } + fun positionsForSelection(): List { + 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") + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/AbstractKeyboardView.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/AbstractKeyboardView.kt index 8d92c700..2f3bc20a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/AbstractKeyboardView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/AbstractKeyboardView.kt @@ -6,5 +6,13 @@ import android.widget.FrameLayout abstract class AbstractKeyboardView(context: Context) : FrameLayout(context) { var keyboardListener: KeyboardListener? = null + set(value) { + field = value + value?.let { onListenerSet(it) } + } + + open fun onListenerSet(listener: KeyboardListener) { + + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardActionView.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardActionView.kt index 3f076a95..4d48d4e4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardActionView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardActionView.kt @@ -3,8 +3,12 @@ package net.pokeranalytics.android.ui.modules.handhistory.views import android.content.Context import android.view.LayoutInflater 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 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.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -18,16 +22,18 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context), StaticRowRepresentableDataSource, RowRepresentableDelegate { private var dataAdapter: RowRepresentableAdapter + private lateinit var positionAdapter: PositionAdapter init { LayoutInflater.from(context) .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) - val spanCount = 3 val spacing = 2.px val includeEdge = false @@ -38,12 +44,34 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context), addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, includeEdge)) } + this.closeButton.setOnClickListener { 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) { + this.positionAdapter.positions = positions + } + override fun adapterRows(): List? { return Action.Type.defaultTypes } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardContainer.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardContainer.kt index 7f501754..c98c5ac6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardContainer.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardContainer.kt @@ -9,6 +9,7 @@ import androidx.core.view.isVisible import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException 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.Card @@ -21,6 +22,7 @@ interface KeyboardListener { fun amountValidated() fun clearAmount() fun closeKeyboard() + fun positionSelected(position: Position) } 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) } + fun setPositions(positions: List) { + val actionKeyboard = this.keyboards[HHKeyboard.ACTION] as KeyboardActionView + actionKeyboard.setPositions(positions) + } + // private fun loadView(layoutId: Int) { // val layoutInflater = LayoutInflater.from(context) // constraintLayout = layoutInflater.inflate(layoutId, this, false) as ConstraintLayout diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/PositionAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/PositionAdapter.kt new file mode 100644 index 00000000..fd6046cb --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/PositionAdapter.kt @@ -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(), + RowRepresentableDataSource, RowRepresentableDelegate, RecyclerAdapter { + + override var dataSource: RowRepresentableDataSource = this + override var delegate: RowRepresentableDelegate? = this + + var positions: List = 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? { + 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]) + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/view_hand_keyboard_action.xml b/app/src/main/res/layout/view_hand_keyboard_action.xml index a0cd2f70..45162313 100644 --- a/app/src/main/res/layout/view_hand_keyboard_action.xml +++ b/app/src/main/res/layout/view_hand_keyboard_action.xml @@ -1,7 +1,9 @@ - + app:layout_constraintBottom_toTopOf="@id/positionRecyclerView"> - - + +