Adds various keyboards

hh
Laurent 6 years ago
parent 5c2542f758
commit e437591748
  1. 12
      app/src/main/java/net/pokeranalytics/android/model/handhistory/HHBuilder.kt
  2. 13
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Action.kt
  3. 30
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt
  4. 39
      app/src/main/java/net/pokeranalytics/android/ui/fragment/HandHistoryFragment.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt
  6. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt
  7. 7
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt
  8. 8
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  9. 10
      app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/AbstractKeyboardView.kt
  10. 58
      app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardActionView.kt
  11. 7
      app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardAmountView.kt
  12. 7
      app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardCardView.kt
  13. 80
      app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardContainer.kt
  14. 38
      app/src/main/java/net/pokeranalytics/android/ui/viewmodel/HandHistoryViewModel.kt
  15. 2
      app/src/main/res/layout/bottom_sheet_grid.xml
  16. 2
      app/src/main/res/layout/bottom_sheet_list.xml
  17. 9
      app/src/main/res/layout/fragment_hand_history.xml
  18. 42
      app/src/main/res/layout/view_hand_keyboard_action.xml
  19. 52
      app/src/main/res/layout/view_hand_keyboard_amount.xml
  20. 72
      app/src/main/res/layout/view_hand_keyboard_card.xml

@ -6,6 +6,7 @@ import net.pokeranalytics.android.model.realm.handhistory.Action
import net.pokeranalytics.android.model.realm.handhistory.HandHistory import net.pokeranalytics.android.model.realm.handhistory.HandHistory
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.handhistory.HandHistoryKeyboard
import net.pokeranalytics.android.ui.view.handhistory.StreetHeader import net.pokeranalytics.android.ui.view.handhistory.StreetHeader
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import java.util.* import java.util.*
@ -138,7 +139,7 @@ class HHBuilder {
* for convenience we remove all the following actions to avoid managing complex cases * for convenience we remove all the following actions to avoid managing complex cases
* Also calculates the player effective amounts in proper cases * Also calculates the player effective amounts in proper cases
*/ */
private fun selectAction(index: Int, actionType: Action.Type) : Boolean { fun selectAction(index: Int, actionType: Action.Type) : Boolean {
val computedAction = this.actionForIndex(index) val computedAction = this.actionForIndex(index)
computedAction.action.type = actionType computedAction.action.type = actionType
@ -178,7 +179,7 @@ class HHBuilder {
* Sets the amount for the action at the provided [index] * Sets the amount for the action at the provided [index]
* In the case of an UNDEFINED_ALLIN, define if it's a RAISE_ALLIN or a CALL_ALLIN * In the case of an UNDEFINED_ALLIN, define if it's a RAISE_ALLIN or a CALL_ALLIN
*/ */
private fun setAmount(index: Int, amount: Double) { fun setAmount(index: Int, amount: Double) {
val computedAction = this.actionForIndex(index) val computedAction = this.actionForIndex(index)
val revisedAmount = computedAction.playerRemainingStack?.let { min(it, amount) } ?: amount val revisedAmount = computedAction.playerRemainingStack?.let { min(it, amount) } ?: amount
@ -298,4 +299,11 @@ class HHBuilder {
return rows return rows
} }
/***
* Finds the index of the first incomplete action, if existing
*/
fun findIndexForEdition(): Pair<Int, HandHistoryKeyboard>? {
return Pair(2, HandHistoryKeyboard.ACTION) // TODO implement
}
} }

@ -3,10 +3,12 @@ package net.pokeranalytics.android.model.realm.handhistory
import io.realm.RealmObject import io.realm.RealmObject
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.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
open class Action : RealmObject() { open class Action : RealmObject() {
enum class Type(var resId: Int) { enum class Type(override var resId: Int) : RowRepresentable {
POST_SB(R.string.posts_sb), POST_SB(R.string.posts_sb),
POST_BB(R.string.post_bb), POST_BB(R.string.post_bb),
@ -30,6 +32,15 @@ open class Action : RealmObject() {
} }
} }
override val viewType: Int = RowViewType.TITLE_GRID.ordinal
companion object {
val defaultTypes: List<Type>
get() { return listOf(FOLD, CHECK, BET, CALL, RAISE, UNDEFINED_ALLIN) }
}
} }
/*** /***

@ -1,19 +1,39 @@
package net.pokeranalytics.android.model.realm.handhistory package net.pokeranalytics.android.model.realm.handhistory
import io.realm.RealmObject import io.realm.RealmObject
import net.pokeranalytics.android.exceptions.PAIllegalStateException
open class Card : RealmObject() { open class Card : RealmObject() {
enum class Suit { companion object {
SPADES,
HEART, fun valueFormatted(value: Int) : String {
DIAMOND, return when(value) {
CLOVER 0 -> "x"
in 2..9 -> "$value"
10 -> "T"
11 -> "J"
12 -> "Q"
13 -> "K"
14 -> "A"
else -> throw PAIllegalStateException("card value '$value' not handled")
}
}
}
enum class Suit(val value: String) {
UNDEFINED("x"),
SPADES(""),
HEART(""),
DIAMOND(""),
CLOVER("")
} }
/*** /***
* The card value: 2..A * The card value: 2..A
* 0: undefined
*/ */
var value: Int = 0 var value: Int = 0

@ -6,21 +6,26 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_settings.* import kotlinx.android.synthetic.main.fragment_hand_history.*
import kotlinx.android.synthetic.main.fragment_settings.recyclerView
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.HHBuilder import net.pokeranalytics.android.model.handhistory.HHBuilder
import net.pokeranalytics.android.model.handhistory.HandSetup import net.pokeranalytics.android.model.handhistory.HandSetup
import net.pokeranalytics.android.model.realm.handhistory.Action
import net.pokeranalytics.android.model.realm.handhistory.Card
import net.pokeranalytics.android.model.realm.handhistory.HandHistory import net.pokeranalytics.android.model.realm.handhistory.HandHistory
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.handhistory.HandHistoryKeyboard
import net.pokeranalytics.android.ui.view.handhistory.KeyboardListener
import net.pokeranalytics.android.ui.viewmodel.HandHistoryViewModel import net.pokeranalytics.android.ui.viewmodel.HandHistoryViewModel
import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.findById
class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepresentableDelegate { class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepresentableDelegate, KeyboardListener {
private lateinit var model: HandHistoryViewModel private lateinit var model: HandHistoryViewModel
@ -90,6 +95,22 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepr
this.rows = this.model.builder.value?.rowRepresentables() ?: listOf() this.rows = this.model.builder.value?.rowRepresentables() ?: listOf()
this.keyboard.keyboardListener = this
this.edit()
}
private fun edit() {
this.model.findIndexForEdition()?.let {
this.keyboard.show(it)
this.highlightCell(it)
}
}
private fun highlightCell(handHistoryKeyboard: HandHistoryKeyboard) {
} }
// RowRepresentableDataSource // RowRepresentableDataSource
@ -110,4 +131,18 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepr
return this.rows[position].viewType return this.rows[position].viewType
} }
// Keyboard Listener
override fun actionSelected(action: Action.Type) {
this.model.actionSelected(action)
}
override fun cardSelected(value: Card, suit: Card.Suit) {
this.model.cardSelected(value, suit)
}
override fun amountSelected(amount: Double) {
this.model.amountSelected(amount)
}
} }

@ -88,7 +88,7 @@ open class BottomSheetListFragment : BottomSheetFragment(), LiveRowRepresentable
val dataAdapter = RowRepresentableAdapter(this, this) val dataAdapter = RowRepresentableAdapter(this, this)
this.viewModel.dataAdapter = dataAdapter this.viewModel.dataAdapter = dataAdapter
reyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager layoutManager = viewManager
adapter = dataAdapter adapter = dataAdapter

@ -51,7 +51,7 @@ class BottomSheetStaticListFragment : BottomSheetFragment(), StaticRowRepresenta
val dataAdapter = RowRepresentableAdapter(this, this) val dataAdapter = RowRepresentableAdapter(this, this)
this.viewModel.dataAdapter = dataAdapter this.viewModel.dataAdapter = dataAdapter
reyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager layoutManager = viewManager
adapter = dataAdapter adapter = dataAdapter

@ -6,6 +6,7 @@ import android.view.View
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import kotlinx.android.synthetic.main.bottom_sheet_grid.* import kotlinx.android.synthetic.main.bottom_sheet_grid.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TableSize
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
@ -34,7 +35,7 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowReprese
*/ */
private fun initUI() { private fun initUI() {
LayoutInflater.from(requireContext()) LayoutInflater.from(requireContext())
.inflate(net.pokeranalytics.android.R.layout.bottom_sheet_grid, view?.bottomSheetContainer, true) .inflate(R.layout.bottom_sheet_grid, view?.bottomSheetContainer, true)
val viewManager = GridLayoutManager(requireContext(), 3) val viewManager = GridLayoutManager(requireContext(), 3)
val dataAdapter = RowRepresentableAdapter(this, this) val dataAdapter = RowRepresentableAdapter(this, this)
@ -44,7 +45,7 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowReprese
val spacing = 2.px val spacing = 2.px
val includeEdge = false val includeEdge = false
reyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager layoutManager = viewManager
adapter = dataAdapter adapter = dataAdapter
@ -59,7 +60,6 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowReprese
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
this.viewModel.defaultSize = (row as TableSize).numberOfPlayer this.viewModel.defaultSize = (row as TableSize).numberOfPlayer
this.viewModel.onRowValueChanged() this.viewModel.onRowValueChanged()
// this.delegate.onRowValueChanged((row as TableSize).numberOfPlayer, this.row)
dismiss() dismiss()
} }
@ -69,4 +69,5 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowReprese
} }
return "UNKNOWN CONTEXT FOR ROW $row" return "UNKNOWN CONTEXT FOR ROW $row"
} }
} }

@ -4,6 +4,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import android.widget.EditText
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
@ -695,12 +696,19 @@ enum class RowViewType(private var layoutRes: Int) {
computedAction.action.type?.resId?.let { computedAction.action.type?.resId?.let {
button.text = itemView.context.getString(it) button.text = itemView.context.getString(it)
} }
button.setOnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
} }
itemView.findViewById<Button>(R.id.positionButton)?.let { button -> itemView.findViewById<Button>(R.id.positionButton)?.let { button ->
button.text = computedAction.position.value button.text = computedAction.position.value
} }
itemView.findViewById<EditText>(R.id.amountEditText)?.let { editText ->
adapter.delegate?.onRowSelected(position, row)
}
} }
} }

@ -0,0 +1,10 @@
package net.pokeranalytics.android.ui.view.handhistory
import android.content.Context
import android.widget.FrameLayout
abstract class AbstractKeyboardView(context: Context) : FrameLayout(context) {
var keyboardListener: KeyboardListener? = null
}

@ -0,0 +1,58 @@
package net.pokeranalytics.android.ui.view.handhistory
import android.content.Context
import android.view.LayoutInflater
import androidx.recyclerview.widget.GridLayoutManager
import kotlinx.android.synthetic.main.bottom_sheet_grid.view.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.handhistory.Action
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.extensions.px
import net.pokeranalytics.android.ui.view.GridSpacingItemDecoration
import net.pokeranalytics.android.ui.view.RowRepresentable
class KeyboardActionView(context: Context) : AbstractKeyboardView(context),
StaticRowRepresentableDataSource, RowRepresentableDelegate {
private var dataAdapter: RowRepresentableAdapter
init {
LayoutInflater.from(context)
.inflate(R.layout.bottom_sheet_grid, this, true)
val viewManager = GridLayoutManager(context, 3)
this.dataAdapter = RowRepresentableAdapter(this, this)
val spanCount = 3
val spacing = 2.px
val includeEdge = false
this.recyclerView.apply {
setHasFixedSize(true)
layoutManager = viewManager
adapter = dataAdapter
addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, includeEdge))
}
}
override fun adapterRows(): List<RowRepresentable>? {
return Action.Type.defaultTypes
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
this.keyboardListener?.actionSelected(row as Action.Type)
}
// override fun stringForRow(row: RowRepresentable): String {
// this.context?.let {
// return row.localizedTitle(it)
// }
// return "UNKNOWN CONTEXT FOR ROW $row"
// }
}

@ -0,0 +1,7 @@
package net.pokeranalytics.android.ui.view.handhistory
import android.content.Context
class KeyboardAmountView(context: Context) : AbstractKeyboardView(context) {
}

@ -0,0 +1,7 @@
package net.pokeranalytics.android.ui.view.handhistory
import android.content.Context
class KeyboardCardView(context: Context) : AbstractKeyboardView(context) {
}

@ -0,0 +1,80 @@
package net.pokeranalytics.android.ui.view.handhistory
import android.content.Context
import android.util.AttributeSet
import android.widget.FrameLayout
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.handhistory.Action
import net.pokeranalytics.android.model.realm.handhistory.Card
interface KeyboardListener {
fun actionSelected(action: Action.Type)
fun cardSelected(value: Card, suit: Card.Suit)
fun amountSelected(amount: Double)
}
enum class HandHistoryKeyboard {
ACTION,
AMOUNT,
CARD
}
class KeyboardContainer(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) {
var keyboardListener: KeyboardListener? = null
val keyboards = HashMap<HandHistoryKeyboard, AbstractKeyboardView>()
private lateinit var constraintLayout: ConstraintLayout
init {
this.setBackgroundColor(context.getColor(R.color.kaki))
}
private fun show() {
this.isVisible = true
}
fun hide() {
this.isVisible = false
}
fun show(type: HandHistoryKeyboard) {
show()
var view = this.keyboards[type]
if (view == null) {
view = when(type) {
HandHistoryKeyboard.ACTION -> { KeyboardActionView(context) }
HandHistoryKeyboard.AMOUNT -> { KeyboardAmountView(context) }
HandHistoryKeyboard.CARD -> { KeyboardCardView(context) }
}
view.keyboardListener = this.keyboardListener
addView(view)
}
show(view)
}
private fun show(keyboardView: AbstractKeyboardView) {
this.keyboards.values.forEach { kbView ->
kbView.isVisible = (kbView == keyboardView)
}
}
// private fun loadView(layoutId: Int) {
// val layoutInflater = LayoutInflater.from(context)
// constraintLayout = layoutInflater.inflate(layoutId, this, false) as ConstraintLayout
// val layoutParams = LayoutParams(
// LayoutParams.MATCH_PARENT,
// LayoutParams.MATCH_PARENT
// )
// addView(constraintLayout, layoutParams)
//
// }
}

@ -2,10 +2,16 @@ package net.pokeranalytics.android.ui.viewmodel
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
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.realm.handhistory.Action
import net.pokeranalytics.android.model.realm.handhistory.Card
import net.pokeranalytics.android.ui.view.handhistory.HandHistoryKeyboard
class HandHistoryViewModel : ViewModel() { class HandHistoryViewModel : ViewModel() {
var currentActionIndex: Int? = null
var builder = MutableLiveData<HHBuilder>() var builder = MutableLiveData<HHBuilder>()
fun setBuilder(builder: HHBuilder) { fun setBuilder(builder: HHBuilder) {
@ -16,4 +22,36 @@ class HandHistoryViewModel : ViewModel() {
// this.builder. // this.builder.
} }
fun actionSelected(action: Action.Type) {
this.currentActionIndex?.let { index ->
builder.value?.selectAction(index, action)
} ?: run {
throw PAIllegalStateException("No action is selected to set the player action")
}
}
fun amountSelected(amount: Double) {
this.currentActionIndex?.let { index ->
builder.value?.setAmount(index, amount)
} ?: run {
throw PAIllegalStateException("No action is selected to set the action amount")
}
}
fun cardSelected(value: Card, suit: Card.Suit) {
// builder.value?.selectCard(value, suit)
}
fun findIndexForEdition() : HandHistoryKeyboard? {
builder.value?.let { builder ->
val r = builder.findIndexForEdition()
this.currentActionIndex = r?.first
return r?.second
} ?: throw PAIllegalStateException("Builder not defined")
}
} }

@ -4,7 +4,7 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/reyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" /> android:layout_height="200dp" />

@ -4,7 +4,7 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/reyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" /> android:layout_height="200dp" />

@ -34,4 +34,13 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBar" /> app:layout_constraintTop_toBottomOf="@+id/appBar" />
<net.pokeranalytics.android.ui.view.handhistory.KeyboardContainer
android:id="@+id/keyboard"
android:layout_width="match_parent"
android:layout_height="300dp"
app:layout_constraintTop_toBottomOf="@id/recyclerView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/recyclerView">
<com.google.android.material.button.MaterialButton
android:id="@+id/closeButton"
app:icon="@drawable/ic_close"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="44dp"
android:layout_height="44dp"
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>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="200dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.button.MaterialButton
android:id="@+id/closeButton"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/clearButton"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/kiloButton"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/millionButton"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/nextButton"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:orientation="horizontal"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/valueRecyclerView">
<com.google.android.material.button.MaterialButton
android:id="@+id/closeButton"
style="@style/PokerAnalyticsTheme.Button"
app:icon="@drawable/ic_close"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_weight="1"
android:layout_marginStart="8dp"/>
<Space
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/clearButton"
style="@style/PokerAnalyticsTheme.Button"
android:text="@string/clear"
android:layout_weight="1"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"/>
<Space
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/doneButton"
style="@style/PokerAnalyticsTheme.Button"
android:text="@string/done"
android:layout_weight="1"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"/>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/valueRecyclerView"
android:layout_width="match_parent"
android:layout_height="100dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/suitRecyclerView"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/suitRecyclerView"
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save