diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/CustomFieldDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/CustomFieldDataFragment.kt index 5dcc8c6d..7bcc948a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/CustomFieldDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/CustomFieldDataFragment.kt @@ -210,6 +210,11 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa * Init UI */ private fun initUI() { + val addItem = binding.addItem + val sortChoices = binding.sortChoices + val sortDescending = binding.sortDescending + val recyclerView = binding.recyclerView + customField.updateRowRepresentation() binding.bottomBar.translationY = 72f.px binding.bottomBar.visibility = View.VISIBLE diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt index 90c7a99c..d5449c22 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt @@ -11,13 +11,14 @@ import io.realm.RealmQuery import io.realm.RealmResults import io.realm.Sort import io.realm.kotlin.where -import kotlinx.android.synthetic.main.row_feed_session.view.* +import net.pokeranalytics.android.R 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.adapter.BindableHolder import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.ui.view.SessionRowView import net.pokeranalytics.android.util.extensions.getMonthAndYear import timber.log.Timber import java.util.* @@ -74,16 +75,17 @@ class FeedSessionRowRepresentableAdapter( */ inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + private var sessionRow: SessionRowView = itemView.findViewById(R.id.sessionRow) fun bind(position: Int, row: Session?, adapter: FeedSessionRowRepresentableAdapter) { - itemView.sessionRow.setData(row as Session) + this.sessionRow.setData(row as Session) val listener = View.OnClickListener { adapter.delegate?.onRowSelected(position, row) } - itemView.sessionRow.setOnClickListener(listener) + this.sessionRow.setOnClickListener(listener) - itemView.sessionRow.setOnLongClickListener { + this.sessionRow.setOnLongClickListener { adapter.delegate?.onRowLongClick(itemView, row, adapterPosition) return@setOnLongClickListener true } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt index 3d8afe9f..1572906e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt @@ -6,12 +6,12 @@ import android.view.ViewGroup import androidx.appcompat.widget.AppCompatTextView import androidx.recyclerview.widget.RecyclerView 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.adapter.BindableHolder import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.ui.view.TransactionRowView import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.getMonthAndYear import java.util.* @@ -42,14 +42,15 @@ class FeedTransactionRowRepresentableAdapter( */ inner class RowTransactionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + private var transactionRow: TransactionRowView = itemView.findViewById(R.id.transactionRow) fun bind(position: Int, row: Transaction?, adapter: FeedTransactionRowRepresentableAdapter) { - itemView.transactionRow.setData(row as Transaction) + this.transactionRow.setData(row as Transaction) val listener = View.OnClickListener { adapter.delegate?.onRowSelected(position, row) } - itemView.transactionRow.setOnClickListener(listener) + this.transactionRow.setOnClickListener(listener) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorAdapter.kt index 11e42a90..ea2e360d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorAdapter.kt @@ -3,24 +3,13 @@ package net.pokeranalytics.android.ui.modules.handhistory.editor import android.content.res.ColorStateList import android.text.InputType import android.view.* -import android.widget.Button -import android.widget.EditText -import android.widget.LinearLayout -import android.widget.TextView +import android.widget.* +import androidx.appcompat.widget.AppCompatButton import androidx.core.view.isEmpty import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.chip.Chip -import kotlinx.android.synthetic.main.row_hand_action.view.* -import kotlinx.android.synthetic.main.row_hand_action_read.view.* -import kotlinx.android.synthetic.main.row_hand_cards.view.* -import kotlinx.android.synthetic.main.row_hand_player_summary.view.* -import kotlinx.android.synthetic.main.row_hhsettings_player_setup.view.* -import kotlinx.android.synthetic.main.row_hhsettings_player_setup.view.position_button -import kotlinx.android.synthetic.main.row_hhsettings_player_setup.view.ps_hand_layout -import kotlinx.android.synthetic.main.row_hhsettings_player_setup_read.view.* -import kotlinx.android.synthetic.main.row_hhsettings_straddle.view.* -import kotlinx.android.synthetic.main.row_recycler.view.* +import com.google.android.material.internal.FlowLayout import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.handhistory.Position @@ -69,9 +58,9 @@ enum class HandRowType(var layoutRes: Int) : ViewIdentifier, RowRepresentable { override val bottomSheetType: BottomSheetType get() { return when(this) { - PLAYER_NUMBER -> BottomSheetType.GRID - COMMENT -> BottomSheetType.EDIT_TEXT_MULTI_LINES - ANTE -> BottomSheetType.NUMERIC_TEXT + PLAYER_NUMBER -> BottomSheetType.GRID + COMMENT -> BottomSheetType.EDIT_TEXT_MULTI_LINES + ANTE -> BottomSheetType.NUMERIC_TEXT else -> BottomSheetType.NONE } } @@ -79,11 +68,11 @@ enum class HandRowType(var layoutRes: Int) : ViewIdentifier, RowRepresentable { override val resId: Int? get() { return when(this) { - PLAYER_NUMBER -> R.string.number_of_players - COMMENT -> R.string.comment - ANTE -> R.string.ante - BIG_BLIND_ANTE, BIG_BLIND_ANTE_READ -> R.string.bb_ante_option - SETTINGS_HEADER -> R.string.settings + PLAYER_NUMBER -> R.string.number_of_players + COMMENT -> R.string.comment + ANTE -> R.string.ante + BIG_BLIND_ANTE, BIG_BLIND_ANTE_READ -> R.string.bb_ante_option + SETTINGS_HEADER -> R.string.settings else -> null } } @@ -91,8 +80,8 @@ enum class HandRowType(var layoutRes: Int) : ViewIdentifier, RowRepresentable { override val imageRes: Int? get() { return when(this) { - COMMENT -> R.drawable.picto_comment - SETTINGS_HEADER -> R.drawable.ic_settings + COMMENT -> R.drawable.picto_comment + SETTINGS_HEADER -> R.drawable.ic_settings else -> null } } @@ -103,8 +92,9 @@ enum class HandRowType(var layoutRes: Int) : ViewIdentifier, RowRepresentable { } class EditorAdapter( - override var dataSource: RowRepresentableDataSource, - override var delegate: RowRepresentableDelegate? = null) : + override var dataSource: RowRepresentableDataSource, + override var delegate: RowRepresentableDelegate? = null +) : RecyclerView.Adapter(), RecyclerAdapter { @@ -116,21 +106,21 @@ class EditorAdapter( val rowType: HandRowType = HandRowType.values()[viewType] val layout = LayoutInflater.from(parent.context).inflate(rowType.layoutRes, parent, false) return when (rowType) { - HandRowType.DEFAULT -> RowViewHolder(layout) - HandRowType.HEADER -> RowViewHolder(layout) - HandRowType.SETTINGS_HEADER -> RowViewHolder(layout) - HandRowType.ACTION -> RowActionHolder(layout) - HandRowType.STREET -> RowStreetHolder(layout) - HandRowType.PLAYER_SUMMARY -> RowPlayerSummaryHolder(layout) - HandRowType.STRADDLE -> RowStraddleHolder(layout) - HandRowType.PLAYER_SETUP -> RowPlayerSetupHolder(layout) - HandRowType.PLAYER_SETUP_READ -> RowReadOnlyPlayerSetupHolder(layout) - HandRowType.COMMENT -> RowViewHolder(layout) - HandRowType.ACTION_READ -> RowActionReadHolder(layout) - HandRowType.HERO_POSITION, HandRowType.PLAYER_POSITION -> RowPositionHolder(layout) - HandRowType.PLAYER_NUMBER, - HandRowType.ANTE, - HandRowType.BIG_BLIND_ANTE, HandRowType.BIG_BLIND_ANTE_READ -> RowViewHolder(layout) + HandRowType.DEFAULT -> RowViewHolder(layout) + HandRowType.HEADER -> RowViewHolder(layout) + HandRowType.SETTINGS_HEADER -> RowViewHolder(layout) + HandRowType.ACTION -> RowActionHolder(layout) + HandRowType.STREET -> RowStreetHolder(layout) + HandRowType.PLAYER_SUMMARY -> RowPlayerSummaryHolder(layout) + HandRowType.STRADDLE -> RowStraddleHolder(layout) + HandRowType.PLAYER_SETUP -> RowPlayerSetupHolder(layout) + HandRowType.PLAYER_SETUP_READ -> RowReadOnlyPlayerSetupHolder(layout) + HandRowType.COMMENT -> RowViewHolder(layout) + HandRowType.ACTION_READ -> RowActionReadHolder(layout) + HandRowType.HERO_POSITION, HandRowType.PLAYER_POSITION -> RowPositionHolder(layout) + HandRowType.PLAYER_NUMBER, + HandRowType.ANTE, + HandRowType.BIG_BLIND_ANTE, HandRowType.BIG_BLIND_ANTE_READ -> RowViewHolder(layout) } } @@ -180,15 +170,27 @@ class EditorAdapter( this.currentPosition = position } - protected fun configureEditTexts(index: Int, position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { + protected fun configureEditTexts( + index: Int, + position: Int, + row: RowRepresentable, + adapter: RecyclerAdapter + ) { this.configureEditTexts(index..index, position, row, adapter) } - private fun configureEditTexts(tagRange: IntRange, position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { + private fun configureEditTexts( + tagRange: IntRange, + position: Int, + row: RowRepresentable, + adapter: RecyclerAdapter + ) { tagRange.forEach { tag -> - val editText = itemView.findViewWithTag(tag) ?: throw PAIllegalStateException("Edit Text not found for tag: $tag, class: $this") + val editText = itemView.findViewWithTag(tag) ?: throw PAIllegalStateException( + "Edit Text not found for tag: $tag, class: $this" + ) // hides soft input view editText.setTextIsSelectable(true) @@ -229,7 +231,9 @@ class EditorAdapter( } protected fun configureTextView(tag: Int, row: RowRepresentable, adapter: RecyclerAdapter) { - val textView = itemView.findViewWithTag(tag) ?: throw PAIllegalStateException("TextView not found for tag: $tag, class: $this") + val textView = itemView.findViewWithTag(tag) ?: throw PAIllegalStateException( + "TextView not found for tag: $tag, class: $this" + ) textView.text = adapter.dataSource.charSequenceForRow(row, itemView.context, tag) } @@ -287,7 +291,11 @@ class EditorAdapter( return itemView.findViewWithTag(tag) } - protected fun configurePlayerImage(playerImageView: PlayerImageView, position: Int, row: RowRepresentable) { + protected fun configurePlayerImage( + playerImageView: PlayerImageView, + position: Int, + row: RowRepresentable + ) { // Player val listener = View.OnClickListener { @@ -359,6 +367,8 @@ class EditorAdapter( } inner class RowStraddleHolder(itemView: View) : RowHandHolder(itemView) { + private var container: ViewGroup = itemView.findViewById(R.id.container) + private var positionsChipGroup: FlowLayout = itemView.findViewById(R.id.positionsChipGroup) override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { super.onBind(position, row, adapter) @@ -366,10 +376,14 @@ class EditorAdapter( val straddleRow = row as StraddleRowRepresentable adapter.dataSource.backgroundColor(position, row)?.let { color -> - itemView.findViewById(R.id.container)?.setBackgroundColor(itemView.context.getColor(color)) + this.container.setBackgroundColor( + itemView.context.getColor( + color + ) + ) } - itemView.positionsChipGroup.removeAllViews() + this.positionsChipGroup.removeAllViews() straddleRow.positions.forEach { pos -> val chip = Chip(itemView.context) @@ -388,20 +402,21 @@ class EditorAdapter( } adapter.delegate?.onRowValueChanged(straddleRow.selectedPositions, row) } - itemView.positionsChipGroup.addView(chip) + this.positionsChipGroup.addView(chip) } } } inner class RowPositionHolder(itemView: View) : RowHandHolder(itemView) { + private var recycler: RecyclerView = itemView.findViewById(R.id.recycler) private var positionAdapter: PositionAdapter = PositionAdapter() private var positionViewManager: LinearLayoutManager = LinearLayoutManager(itemView.context, RecyclerView.HORIZONTAL, false) init { - itemView.recycler.apply { + this.recycler.apply { setHasFixedSize(true) layoutManager = positionViewManager adapter = positionAdapter @@ -411,7 +426,11 @@ class EditorAdapter( override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { super.onBind(position, row, adapter) - this.positionAdapter.positions = adapter.dataSource.contentForRow(row, itemView.context, Position::class) + this.positionAdapter.positions = adapter.dataSource.contentForRow( + row, + itemView.context, + Position::class + ) this.positionAdapter.setOnClickListener { pos -> adapter.delegate?.onRowValueChanged(pos, row) this.positionAdapter.notifyDataSetChanged() @@ -427,26 +446,33 @@ class EditorAdapter( inner class RowActionReadHolder(itemView: View) : RowHandHolder(itemView) { - init { - itemView.player_image_rhar.tag = ActionReadRow.Tag.PLAYER.ordinal - itemView.stackText.tag = ActionReadRow.Tag.STACK.ordinal + private var playerImage: PlayerImageView = itemView.findViewById(R.id.player_image_rhar) + private var stackText: TextView = itemView.findViewById(R.id.stackText) + private var playersText: TextView = itemView.findViewById(R.id.playersText) + private var actionText: TextView = itemView.findViewById(R.id.actionText) + private var actionContainer: View = itemView.findViewById(R.id.action_container) + private var amountText: TextView = itemView.findViewById(R.id.amountText) + + init { + playerImage.tag = ActionReadRow.Tag.PLAYER.ordinal + stackText.tag = ActionReadRow.Tag.STACK.ordinal } - override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { + override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { - configurePlayerImage(itemView.player_image_rhar, position, row) + configurePlayerImage(this.playerImage, position, row) val actionReadRow = row as ActionReadRow - itemView.playersText.text = actionReadRow.positions.joinToString(", ") { it.value } + this.playersText.text = actionReadRow.positions.joinToString(", ") { it.value } actionReadRow.action?.let { type -> - itemView.actionText.text = type.localizedTitle(itemView.context) + this.actionText.text = type.localizedTitle(itemView.context) val background = itemView.context.getDrawable(type.background) - itemView.action_container.background = background + this.actionContainer.background = background } - itemView.amountText.text = actionReadRow.amount?.formatted - itemView.stackText.text = actionReadRow.stack?.formatted + this.amountText.text = actionReadRow.amount?.formatted + this.stackText.text = actionReadRow.stack?.formatted } } @@ -456,36 +482,42 @@ class EditorAdapter( */ inner class RowActionHolder(itemView: View) : RowHandHolder(itemView) { - init { - itemView.player_image_rha.tag = ComputedAction.Tag.PLAYER.ordinal - itemView.actionButton.tag = ComputedAction.Tag.ACTION.ordinal - itemView.amountEditText.tag = ComputedAction.Tag.AMOUNT.ordinal + private var playerImage: PlayerImageView = itemView.findViewById(R.id.player_image_rha) + private var actionButton: AppCompatButton = itemView.findViewById(R.id.actionButton) + private var amountEditText: EditText = itemView.findViewById(R.id.amountEditText) + private var positionButton: AppCompatButton = itemView.findViewById(R.id.positionButton) + + init { + + this.playerImage.tag = ComputedAction.Tag.PLAYER.ordinal + this.actionButton.tag = ComputedAction.Tag.ACTION.ordinal + this.amountEditText.tag = ComputedAction.Tag.AMOUNT.ordinal // Action - setOnClickListener(itemView.actionButton) + setOnClickListener(this.actionButton) // Amount - itemView.findViewById(R.id.amountEditText)?.let { amountEditText -> + this.amountEditText.let { amountEditText -> - amountEditText.inputType = InputType.TYPE_NUMBER_FLAG_DECIMAL - amountEditText.isFocusableInTouchMode = true + amountEditText.inputType = InputType.TYPE_NUMBER_FLAG_DECIMAL + amountEditText.isFocusableInTouchMode = true - amountEditText.setOnTouchListener { _, event -> + amountEditText.setOnTouchListener { _, event -> -// Timber.d("=== event.action = ${event.action}") - if (event.action == MotionEvent.ACTION_UP) { - // Both are required, otherwise requestFocus() fails - amountEditText.isFocusable = true - amountEditText.isFocusableInTouchMode = true + // Timber.d("=== event.action = ${event.action}") + if (event.action == MotionEvent.ACTION_UP) { + // Both are required, otherwise requestFocus() fails + amountEditText.isFocusable = true + amountEditText.isFocusableInTouchMode = true - amountEditText.requestFocus() + amountEditText.requestFocus() - editTextSelected(amountEditText) - } - return@setOnTouchListener true - } + editTextSelected(amountEditText) + } + return@setOnTouchListener true + } - } + } } private fun positionColor(isFocused: Boolean) : Int { @@ -498,17 +530,17 @@ class EditorAdapter( val computedAction = row as ComputedAction - configurePlayerImage(itemView.player_image_rha, position, row) + configurePlayerImage(this.playerImage, position, row) // Position - itemView.findViewById