From 529a7cc21e930c15f5dc583912b8339c2879867d Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 21 Jan 2020 00:45:50 +0100 Subject: [PATCH] First implementation of numeric keyboard --- .../android/model/handhistory/HHBuilder.kt | 3 +- .../android/ui/adapter/HandHistoryAdapter.kt | 36 ++++---- .../ui/fragment/HandHistoryFragment.kt | 6 ++ .../ui/view/handhistory/KeyboardActionView.kt | 4 +- .../ui/view/handhistory/KeyboardAmountView.kt | 87 ++++++++++++++++++- .../ui/view/handhistory/KeyboardContainer.kt | 16 +--- .../ui/viewmodel/HandHistoryViewModel.kt | 13 +++ .../main/res/layout/fragment_hand_history.xml | 2 +- .../res/layout/view_hand_keyboard_amount.xml | 11 ++- 9 files changed, 141 insertions(+), 37 deletions(-) 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 f2cc025e..e145f16c 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 @@ -15,7 +15,8 @@ import kotlin.math.min enum class HHKeyboard { ACTION, AMOUNT, - CARD + CARD; + } class HHSelection(var index: Int, var keyboard: HHKeyboard) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HandHistoryAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HandHistoryAdapter.kt index 9ed629a0..43310ef9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HandHistoryAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HandHistoryAdapter.kt @@ -3,9 +3,7 @@ package net.pokeranalytics.android.ui.adapter import android.app.Activity import android.content.Context import android.content.res.ColorStateList -import android.text.Editable import android.text.InputType -import android.text.TextWatcher import android.view.LayoutInflater import android.view.MotionEvent import android.view.View @@ -73,28 +71,28 @@ class HandHistoryAdapter( } } - inner class TextListener : TextWatcher { - - var position: Int = 0 - - override fun afterTextChanged(s: Editable?) {} - - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} - - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { - val row = dataSource.rowRepresentableForPosition(position) - ?: throw PAIllegalStateException("Row Representable not found at index: $position") - delegate?.onRowValueChanged(s.toString(), row) - } - - } +// inner class TextListener : TextWatcher { +// +// var position: Int = 0 +// +// override fun afterTextChanged(s: Editable?) {} +// +// override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} +// +// override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { +// val row = dataSource.rowRepresentableForPosition(position) +// ?: throw PAIllegalStateException("Row Representable not found at index: $position") +// delegate?.onRowValueChanged(s.toString(), row) +// } +// +// } /** * Display a hand action */ inner class RowHandAction(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - private var listener = TextListener() +// private var listener = TextListener() private var currentPosition = 0 private var actionCanBeEdited = true private var amountCanBeEdited = true @@ -134,7 +132,7 @@ class HandHistoryAdapter( return@setOnTouchListener true } - amountEditText.addTextChangedListener(this.listener) +// amountEditText.addTextChangedListener(this.listener) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HandHistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HandHistoryFragment.kt index 486616f6..ad120c19 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HandHistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HandHistoryFragment.kt @@ -20,6 +20,7 @@ import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager import net.pokeranalytics.android.ui.view.handhistory.KeyboardListener +import net.pokeranalytics.android.ui.view.handhistory.NumericKey import net.pokeranalytics.android.ui.view.handhistory.StreetCardHeader import net.pokeranalytics.android.ui.viewmodel.HandHistoryViewModel import net.pokeranalytics.android.util.extensions.findById @@ -237,6 +238,11 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepr this.keyboard?.hide() } + override fun amountKeyTyped(key: NumericKey) { + this.model.amountKeyTyped(key) + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + // Table refresh private fun refreshCells(oldIndex: Int) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardActionView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardActionView.kt index 37fda3de..36bf1b1a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardActionView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardActionView.kt @@ -3,7 +3,7 @@ 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 kotlinx.android.synthetic.main.view_hand_keyboard_action.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.handhistory.Action import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -22,7 +22,7 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context), init { LayoutInflater.from(context) - .inflate(R.layout.bottom_sheet_grid, this, true) + .inflate(R.layout.view_hand_keyboard_action, this, true) val viewManager = GridLayoutManager(context, 3) this.dataAdapter = RowRepresentableAdapter(this, this) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardAmountView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardAmountView.kt index f1ee5bd2..97a15c1a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardAmountView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardAmountView.kt @@ -2,15 +2,81 @@ 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.view_hand_keyboard_amount.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.PAIllegalStateException +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 +import net.pokeranalytics.android.ui.view.RowViewType +import java.text.DecimalFormatSymbols -class KeyboardAmountView(context: Context) : AbstractKeyboardView(context) { +class NumericKey : RowRepresentable { + + private var type: Type + + var value: String = "" + private set + + constructor(type: Type) { + this.type = type + } + + constructor(number: Int) : this(Type.NUMBER) { + this.value = "$number" + } + + enum class Type { + NUMBER, + DECIMAL, + BACKSPACE + } + + override fun getDisplayName(context: Context): String { + return when (this.type) { + Type.NUMBER -> this.value + Type.BACKSPACE -> "⌫" + Type.DECIMAL -> DecimalFormatSymbols.getInstance().decimalSeparator.toString() + } + } + + override val viewType: Int = RowViewType.TITLE_GRID.ordinal + + val isBackSpace: Boolean + get() { return this.type == Type.BACKSPACE} + + val isDecimalSeparator: Boolean + get() { return this.type == Type.DECIMAL } + +} + +class KeyboardAmountView(context: Context) : AbstractKeyboardView(context), + StaticRowRepresentableDataSource, RowRepresentableDelegate { + + private var dataAdapter: RowRepresentableAdapter init { LayoutInflater.from(context) .inflate(R.layout.view_hand_keyboard_amount, 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)) + } + this.nextButton.setOnClickListener { this.keyboardListener?.amountValidated() } @@ -24,4 +90,23 @@ class KeyboardAmountView(context: Context) : AbstractKeyboardView(context) { } } + override fun adapterRows(): List? { + val keys = mutableListOf() + (0 until 12).forEach { index -> + val key = when (index) { + in 0 until 9 -> NumericKey(index + 1) + 9 -> NumericKey(NumericKey.Type.DECIMAL) + 10 -> NumericKey(0) + 11 -> NumericKey(NumericKey.Type.BACKSPACE) + else -> throw PAIllegalStateException("index problem in numeric keyboard") + } + keys.add(key) + } + return keys + } + + override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { + this.keyboardListener?.amountKeyTyped(row as NumericKey) + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardContainer.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardContainer.kt index 93279e25..f4b6e5ec 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardContainer.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/KeyboardContainer.kt @@ -14,6 +14,7 @@ import net.pokeranalytics.android.model.realm.handhistory.Card interface KeyboardListener { fun actionSelected(action: Action.Type) + fun amountKeyTyped(key: NumericKey) fun cardValueSelected(value: Int) fun cardSuitSelected(suit: Card.Suit) fun amountValidated() @@ -50,18 +51,9 @@ class KeyboardContainer(context: Context, attrs: AttributeSet?) : FrameLayout(co if (view == null) { view = when(type) { - HHKeyboard.ACTION -> { -// activity.hideKeyboard() - KeyboardActionView(context) - } - HHKeyboard.AMOUNT -> { -// activity.showKeyboard() - KeyboardAmountView(context) - } - HHKeyboard.CARD -> { -// activity.hideKeyboard() - KeyboardCardView(context) - } + HHKeyboard.ACTION -> { KeyboardActionView(context) } + HHKeyboard.AMOUNT -> { KeyboardAmountView(context) } + HHKeyboard.CARD -> { KeyboardCardView(context) } } view.keyboardListener = this.keyboardListener this.keyboards[type] = view diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/HandHistoryViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/HandHistoryViewModel.kt index b6a09ff5..f08c78d3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/HandHistoryViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/HandHistoryViewModel.kt @@ -9,6 +9,7 @@ import net.pokeranalytics.android.model.handhistory.HHSelection import net.pokeranalytics.android.model.realm.handhistory.Action import net.pokeranalytics.android.model.realm.handhistory.Card import net.pokeranalytics.android.model.realm.handhistory.CardProperty +import net.pokeranalytics.android.ui.view.handhistory.NumericKey import timber.log.Timber class HandHistoryViewModel : ViewModel() { @@ -89,4 +90,16 @@ class HandHistoryViewModel : ViewModel() { } + fun amountKeyTyped(key: NumericKey) { + var string = this.currentAmount + if (string == null && !key.isBackSpace) { + string = key.value + } else if (key.isBackSpace) { + string?.dropLast(1) + } else if (!(key.isDecimalSeparator && string!!.contains(key.value))) { + string += key.value + } + this.currentAmount = string + } + } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_hand_history.xml b/app/src/main/res/layout/fragment_hand_history.xml index e1eb2179..32a1aee0 100644 --- a/app/src/main/res/layout/fragment_hand_history.xml +++ b/app/src/main/res/layout/fragment_hand_history.xml @@ -37,7 +37,7 @@ diff --git a/app/src/main/res/layout/view_hand_keyboard_amount.xml b/app/src/main/res/layout/view_hand_keyboard_amount.xml index 31c1d693..840285c6 100644 --- a/app/src/main/res/layout/view_hand_keyboard_amount.xml +++ b/app/src/main/res/layout/view_hand_keyboard_amount.xml @@ -10,7 +10,7 @@ android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintBottom_toTopOf="@id/recyclerView"> + + \ No newline at end of file