From b1fa2d90200187d9e58e72b41daeb3fae5995fc2 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 17 Jan 2020 13:48:48 +0100 Subject: [PATCH] Various refactoring to fix text edition bugs --- .../model/handhistory/ComputedAction.kt | 4 +- .../android/model/handhistory/HHBuilder.kt | 6 +- .../FeedHandHistoryRowRepresentableAdapter.kt | 1 - .../FeedSessionRowRepresentableAdapter.kt | 1 - .../FeedTransactionRowRepresentableAdapter.kt | 1 - .../android/ui/adapter/HandHistoryAdapter.kt | 212 ++++++++++++ .../android/ui/adapter/RecyclerAdapter.kt | 26 ++ .../ui/adapter/RowRepresentableAdapter.kt | 18 +- .../ui/fragment/HandHistoryFragment.kt | 6 +- .../android/ui/view/RowViewType.kt | 303 ++---------------- .../ui/view/handhistory/StreetCardHeader.kt | 4 +- .../view/holder/RowHandHistoryViewHolder.kt | 2 +- .../android/ui/view/holder/RowViewHolder.kt | 170 ++++++++++ .../CustomizableRowRepresentable.kt | 8 +- 14 files changed, 455 insertions(+), 307 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/adapter/HandHistoryAdapter.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/adapter/RecyclerAdapter.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/holder/RowViewHolder.kt diff --git a/app/src/main/java/net/pokeranalytics/android/model/handhistory/ComputedAction.kt b/app/src/main/java/net/pokeranalytics/android/model/handhistory/ComputedAction.kt index dd07c891..63398ad0 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/handhistory/ComputedAction.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/handhistory/ComputedAction.kt @@ -1,8 +1,8 @@ package net.pokeranalytics.android.model.handhistory import net.pokeranalytics.android.model.realm.handhistory.Action +import net.pokeranalytics.android.ui.adapter.HandRowType import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowViewType import timber.log.Timber interface HandHistoryRow : RowRepresentable { @@ -42,7 +42,7 @@ class ComputedAction(var action: Action, } } - override val viewType: Int = RowViewType.ROW_HAND_ACTION.ordinal + override val viewType: Int = HandRowType.ACTION.ordinal override fun keyboardForCompletion() : HHKeyboard? { Timber.d("index = ${action.index} / type = ${this.action.type} / amount = ${this.action.amount}") 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 7822c27c..9d681b61 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 @@ -4,8 +4,8 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.handhistory.Action import net.pokeranalytics.android.model.realm.handhistory.HandHistory +import net.pokeranalytics.android.ui.adapter.HandRowType import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.handhistory.StreetCardHeader import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import timber.log.Timber @@ -286,7 +286,7 @@ class HHBuilder { fun rowRepresentables() : List { val rows: MutableList = mutableListOf() - rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.settings)) + rows.add(CustomizableRowRepresentable(customViewType = HandRowType.HEADER, resId = R.string.settings)) var potSize = 0.0 Street.values().forEach { street -> @@ -295,7 +295,7 @@ class HHBuilder { if (actions.isNotEmpty()) { // Name of the street + pot size if not preflop - rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = street.resId)) + rows.add(CustomizableRowRepresentable(customViewType = HandRowType.HEADER, resId = street.resId)) // Cards if not preflop if (street.totalBoardCards > 0) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt index ac6f60f5..b38ce338 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt @@ -9,7 +9,6 @@ import io.realm.RealmResults import kotlinx.android.synthetic.main.row_hand_history.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.handhistory.HandHistory -import net.pokeranalytics.android.ui.view.BindableHolder import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.getMonthAndYear diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedSessionRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedSessionRowRepresentableAdapter.kt index 14a76ced..11bd14a0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedSessionRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedSessionRowRepresentableAdapter.kt @@ -15,7 +15,6 @@ import kotlinx.android.synthetic.main.row_feed_session.view.* import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session -import net.pokeranalytics.android.ui.view.BindableHolder import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.extensions.getMonthAndYear import timber.log.Timber diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedTransactionRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedTransactionRowRepresentableAdapter.kt index e66001d4..5f97e69e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedTransactionRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedTransactionRowRepresentableAdapter.kt @@ -9,7 +9,6 @@ import io.realm.RealmResults import kotlinx.android.synthetic.main.row_transaction.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Transaction -import net.pokeranalytics.android.ui.view.BindableHolder import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.getMonthAndYear 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 new file mode 100644 index 00000000..b062bdac --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HandHistoryAdapter.kt @@ -0,0 +1,212 @@ +package net.pokeranalytics.android.ui.adapter + +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.EditText +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.model.handhistory.ComputedAction +import net.pokeranalytics.android.model.handhistory.HHKeyboard +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.holder.RowViewHolder +import net.pokeranalytics.android.ui.view.rowrepresentable.ViewIdentifier +import net.pokeranalytics.android.util.extensions.formatted +import timber.log.Timber + +enum class HandRowType(var layoutRes: Int) : ViewIdentifier { + HEADER(R.layout.row_header_title), + ACTION(R.layout.row_hand_action), + STREET(R.layout.row_hand_cards); + + override val identifier: Int + get() { return this.ordinal } +} + +class HandHistoryAdapter( + override var dataSource: RowRepresentableDataSource, + override var delegate: RowRepresentableDelegate? = null) : + RecyclerView.Adapter(), RecyclerAdapter { + + override fun getItemViewType(position: Int): Int { + return this.dataSource.viewTypeForPosition(position) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val rowType: HandRowType = HandRowType.values()[viewType] + val layout = LayoutInflater.from(parent.context).inflate(rowType.layoutRes, parent, false) + return when (rowType) { + HandRowType.HEADER -> RowViewHolder(layout) + HandRowType.ACTION -> RowHandAction(layout) + HandRowType.STREET -> RowHandStreet(layout) + } + } + + override fun getItemCount(): Int { + return this.dataSource.numberOfRows() + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + this.dataSource.rowRepresentableForPosition(position)?.let { rowRepresentable -> + (holder as BindableHolder).onBind(position, rowRepresentable, this) + } + } + + /** + * Refresh the row in the adapter + */ + fun refreshRow(row: RowRepresentable) { + val rows = this.dataSource.adapterRows() + val index = rows?.indexOf(row) ?: -1 + if (index >= 0) { + notifyItemChanged(index) + } + } + + /** + * Update UI + */ + fun updateRows(diffResult: DiffUtil.DiffResult) { + diffResult.dispatchUpdatesTo(this) + } + + 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() + + init { + itemView.findViewById(R.id.actionEditText)?.let { actionEditText -> + actionEditText.setOnFocusChangeListener { v, hasFocus -> + Timber.d("focus change = $hasFocus at position = $position") + actionEditText.setBackgroundColor(color(hasFocus)) + } + } + + itemView.findViewById(R.id.amountEditText)?.let { amountEditText -> + + amountEditText.setOnFocusChangeListener { v, hasFocus -> + Timber.d("focus change = $hasFocus at position = $position") + amountEditText.setBackgroundColor(color(hasFocus)) + } + + amountEditText.addTextChangedListener(this.listener) + + } + } + + private fun color(isFocused: Boolean) : Int { + val color = if (isFocused) R.color.green_light else R.color.kaki_medium + return itemView.context.getColor(color) + } + + override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { + this.listener.position = position + + val computedAction = row as ComputedAction + + // Position + itemView.findViewById