From 12dc039a1b29a39ec64c6fac2c700f1c8bd4dd8e Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 20 Feb 2020 16:06:47 +0100 Subject: [PATCH] Creates HH row for the feed --- .../android/model/realm/handhistory/Card.kt | 50 ++++++++-- .../model/realm/handhistory/HandHistory.kt | 55 +++++++++++ .../FeedHandHistoryRowRepresentableAdapter.kt | 16 +++- .../views/RowHandHistoryViewHolder.kt | 6 +- .../android/ui/view/HandHistoryRowView.kt | 47 +++++++++- .../android/ui/view/RowViewType.kt | 3 + .../main/res/drawable/rounded_background.xml | 7 ++ app/src/main/res/layout/row_hand_history.xml | 3 +- .../main/res/layout/row_hand_history_view.xml | 93 +++++++------------ app/src/main/res/layout/view_card.xml | 12 +++ .../main/res/layout/view_card_separator.xml | 7 ++ app/src/main/res/values/colors.xml | 3 +- app/src/main/res/values/styles.xml | 6 ++ 13 files changed, 225 insertions(+), 83 deletions(-) create mode 100644 app/src/main/res/drawable/rounded_background.xml create mode 100644 app/src/main/res/layout/view_card.xml create mode 100644 app/src/main/res/layout/view_card_separator.xml diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt index 1a5b2f48..2064a69a 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt @@ -4,6 +4,10 @@ import android.content.Context import android.text.SpannableString import android.text.TextUtils import android.text.style.ForegroundColorSpan +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatTextView import io.realm.Realm import io.realm.RealmObject import net.pokeranalytics.android.R @@ -14,6 +18,9 @@ import net.pokeranalytics.android.ui.view.RowViewType interface CardProperty +/*** + * Returns a CharSequence containing each card representation + */ fun List.formatted(context: Context) : CharSequence? { var span: CharSequence? = null this.forEach { @@ -40,6 +47,10 @@ open class Card : RealmObject() { } } + /*** + * The Value of a Card + * Can represent all values from Deuce to Ace, or a blank + */ class Value(var value: Int?) : CardProperty, RowRepresentable { companion object { @@ -61,7 +72,6 @@ open class Card : RealmObject() { else -> "X" } } - } override fun getDisplayName(context: Context): String { @@ -99,10 +109,10 @@ open class Card : RealmObject() { val color: Int get() { return when (this) { - UNDEFINED -> R.color.white - SPADES -> R.color.white_dark + UNDEFINED -> R.color.grey + SPADES -> R.color.black HEART -> R.color.red - DIAMOND -> R.color.diamond + DIAMOND -> R.color.blue CLOVER -> R.color.clover } } @@ -117,7 +127,7 @@ open class Card : RealmObject() { /*** * The card value: 2..A - * 0: undefined + * can be undefined */ var value: Int? = null @@ -148,9 +158,12 @@ open class Card : RealmObject() { */ var index: Int = 0 + /*** + * Returns the street where the card belongs based on its [index] + */ val street: Street get() { - return when (index) { + return when (this.index) { in 0..2 -> Street.FLOP 3 -> Street.TURN 4 -> Street.RIVER @@ -159,18 +172,35 @@ open class Card : RealmObject() { } /*** - * Formats the Card into a Spannable String with the appropriate color + * Formats the Card into a Spannable String with the appropriate color for the card suit + * [lineBreak] adds "\n" between the value and the suit */ - fun formatted(context: Context) : SpannableString { + fun formatted(context: Context, lineBreak: Boolean = false) : SpannableString { - val spannable = SpannableString(this.formattedValue + Suit.format(this.suit)) + val suit = Suit.format(this.suit) + val spannable = if (lineBreak) { + SpannableString(this.formattedValue + "\n" + suit) + } else { + SpannableString(this.formattedValue + suit) + } + + val suitStart = spannable.indexOf(suit) spannable.setSpan( ForegroundColorSpan(context.getColor(Suit.color(this.suit))), - 0, + suitStart, spannable.length, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE ) return spannable } + /*** + * Returns a view showing the card [value] and [suit] + */ + fun view(context: Context, layoutInflater: LayoutInflater, root: ViewGroup): View { + val textView = layoutInflater.inflate(R.layout.view_card, root, false) as AppCompatTextView + textView.text = this.formatted(context, true) + return textView + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt index 098622aa..ac67473f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt @@ -1,6 +1,10 @@ package net.pokeranalytics.android.model.realm.handhistory import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatTextView import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.Ignore @@ -306,4 +310,55 @@ open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterab return actionItems.joinToString(" ") } + /*** + * Creates a list of cards for the hand history to give a representation of the hand + * We will try to add a minimum of 5 cards using by priority: + * - the hero hand + * - the opponents hands + * - the board + */ + fun cardViews(context: Context, viewGroup: ViewGroup): List { + + val views = mutableListOf() + val layoutInflater = LayoutInflater.from(context) + + // Create all the possible cards list: hero, opponents, board + val cardSets = mutableListOf>() + + // Hero + this.heroIndex?.let { hIndex -> + this.playerSetupForPosition(hIndex)?.cards?.let { + cardSets.add(it) + } + } + // Opponents + this.playerSetups.filter { it.cards.isNotEmpty() && it.position != this.heroIndex }.forEach { + cardSets.add(it.cards) + } + // Board + cardSets.add(this.board) + + // Try to add cards while we haven't reach at least 4 + while (views.size < 5 && cardSets.isNotEmpty()) { + + val cardSet = cardSets.removeAt(0) + + if (views.isNotEmpty() && cardSet.isNotEmpty()) { // add separator with previous set of cards + views.add(layoutInflater.inflate(R.layout.view_card_separator, viewGroup) as AppCompatTextView) + } + cardSet.forEach { views.add(it.view(context, layoutInflater, viewGroup)) } + } + + // Add 5 blank cards if no card has been added + if (views.isEmpty()) { + val blankCard = Card() + (1..5).forEach { _ -> + val view = blankCard.view(context, layoutInflater, viewGroup) + view.setBackgroundColor(context.getColor(R.color.kaki_light)) + views.add(view) + } + } + return views + } + } \ No newline at end of file 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 b38ce338..c030b5b6 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 @@ -38,6 +38,14 @@ class FeedHandHistoryRowRepresentableAdapter( inner class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { +// override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { +// itemView.handHistoryRow.setData(row as HandHistory) +// val listener = View.OnClickListener { +// adapter.delegate?.onRowSelected(position, row) +// } +// itemView.handHistoryRow.setOnClickListener(listener) +// } + fun bind(position: Int, row: HandHistory?, adapter: FeedHandHistoryRowRepresentableAdapter) { itemView.handHistoryRow.setData(row as HandHistory) @@ -62,8 +70,8 @@ class FeedHandHistoryRowRepresentableAdapter( } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - return if (viewType == RowViewType.ROW_TRANSACTION.ordinal) { - val layout = LayoutInflater.from(parent.context).inflate(R.layout.row_transaction, parent, false) + return if (viewType == RowViewType.HAND_HISTORY.ordinal) { + val layout = LayoutInflater.from(parent.context).inflate(R.layout.row_hand_history, parent, false) RowHandHistoryViewHolder(layout) } else { val layout = LayoutInflater.from(parent.context).inflate(R.layout.row_header_title, parent, false) @@ -77,8 +85,8 @@ class FeedHandHistoryRowRepresentableAdapter( return if (sortedHeaders.containsKey(position)) { RowViewType.HEADER_TITLE.ordinal } else { - 1 -// RowViewType.ROW_HAND_HISTORY.ordinal +// 1 + RowViewType.HAND_HISTORY.ordinal } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt index 856611ac..f27573fe 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt @@ -5,18 +5,20 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_hand_history.view.* import net.pokeranalytics.android.model.realm.handhistory.HandHistory import net.pokeranalytics.android.ui.adapter.BindableHolder -import net.pokeranalytics.android.ui.adapter.FeedHandHistoryRowRepresentableAdapter +import net.pokeranalytics.android.ui.adapter.RecyclerAdapter +import net.pokeranalytics.android.ui.view.RowRepresentable class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - fun bind(position: Int, row: HandHistory?, adapter: FeedHandHistoryRowRepresentableAdapter) { + override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { itemView.handHistoryRow.setData(row as HandHistory) val listener = View.OnClickListener { adapter.delegate?.onRowSelected(position, row) } itemView.handHistoryRow.setOnClickListener(listener) + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/HandHistoryRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/HandHistoryRowView.kt index 6b163de6..23a639fc 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/HandHistoryRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/HandHistoryRowView.kt @@ -5,11 +5,13 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.widget.FrameLayout import androidx.constraintlayout.widget.ConstraintLayout -import kotlinx.android.synthetic.main.row_transaction_view.view.* +import io.realm.Realm +import kotlinx.android.synthetic.main.row_hand_history_view.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.handhistory.Street +import net.pokeranalytics.android.model.realm.handhistory.Card import net.pokeranalytics.android.model.realm.handhistory.HandHistory -import net.pokeranalytics.android.util.extensions.getDayNumber -import net.pokeranalytics.android.util.extensions.getShortDayName +import net.pokeranalytics.android.util.extensions.formatted /** * Display a transaction row @@ -48,9 +50,44 @@ class HandHistoryRowView : FrameLayout { */ fun setData(handHistory: HandHistory) { + rowHandHistory.cardsLayout.removeAllViews() + + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + + val list = listOf(Card.newInstance(it, null, Card.Suit.CLOVER), + Card.newInstance(Realm.getDefaultInstance(), 12, Card.Suit.HEART) + ) + + list.forEach { card -> + val view = card.view(context, LayoutInflater.from(context), rowHandHistory.cardsLayout) + rowHandHistory.cardsLayout.addView(view) + } + + LayoutInflater.from(context).inflate(R.layout.view_card_separator, rowHandHistory.cardsLayout) + + val list2 = listOf(Card.newInstance(it, null, Card.Suit.CLOVER), + Card.newInstance(Realm.getDefaultInstance(), 12, Card.Suit.HEART) + ) + + list2.forEach { card -> + val view = card.view(context, LayoutInflater.from(context), rowHandHistory.cardsLayout) + rowHandHistory.cardsLayout.addView(view) + } + + } + + +// handHistory.cardViews(context).forEach { view -> +// rowHandHistory.cardsLayout.addView(view) +// } + + rowHandHistory.amount.text = handHistory.potSizeForStreet(Street.SUMMARY).formatted() + + // Date - rowHandHistory.transactionDateDay.text = handHistory.date.getShortDayName() - rowHandHistory.transactionDateNumber.text = handHistory.date.getDayNumber() +// rowHandHistory.transactionDateDay.text = handHistory.date.getShortDayName() +// rowHandHistory.transactionDateNumber.text = handHistory.date.getDayNumber() // Title / Game type // var title = handHistory.type?.name ?: "" + " " + handHistory.comment diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 0ca0e9c6..c1c06fa6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -35,6 +35,7 @@ import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.ui.fragment.BankrollRowRepresentable import net.pokeranalytics.android.ui.graph.AxisFormatting import net.pokeranalytics.android.ui.graph.setStyle +import net.pokeranalytics.android.ui.modules.handhistory.views.RowHandHistoryViewHolder import net.pokeranalytics.android.ui.view.holder.RowViewHolder import net.pokeranalytics.android.ui.view.rowrepresentable.* import net.pokeranalytics.android.util.extensions.longDate @@ -86,6 +87,7 @@ enum class RowViewType(private var layoutRes: Int) : ViewIdentifier { LIST(R.layout.row_list), ROW_PLAYER(R.layout.row_player), ROW_PLAYER_IMAGE(R.layout.row_player_image), + HAND_HISTORY(R.layout.row_hand_history_view), // ROW_HAND_ACTION(R.layout.row_hand_action), // ROW_HAND_STREET(R.layout.row_hand_cards), @@ -142,6 +144,7 @@ enum class RowViewType(private var layoutRes: Int) : ViewIdentifier { LEGEND_DEFAULT -> LegendDefaultViewHolder(layout) // Hand History + HAND_HISTORY -> RowHandHistoryViewHolder(layout) // ROW_HAND_HISTORY -> RowHandHistoryViewHolder(layout) // ROW_HAND_ACTION -> RowHandAction(layout) // ROW_HAND_STREET -> RowHandStreet(layout) diff --git a/app/src/main/res/drawable/rounded_background.xml b/app/src/main/res/drawable/rounded_background.xml new file mode 100644 index 00000000..2507c3ef --- /dev/null +++ b/app/src/main/res/drawable/rounded_background.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_hand_history.xml b/app/src/main/res/layout/row_hand_history.xml index c1d8d759..8c0b0094 100644 --- a/app/src/main/res/layout/row_hand_history.xml +++ b/app/src/main/res/layout/row_hand_history.xml @@ -2,7 +2,8 @@ + android:orientation="vertical" + android:padding="4dp"> - - - - - + app:layout_constraintStart_toStartOf="parent" /> + + + + + + + + + + + - + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/view_card_separator.xml b/app/src/main/res/layout/view_card_separator.xml new file mode 100644 index 00000000..933ee660 --- /dev/null +++ b/app/src/main/res/layout/view_card_separator.xml @@ -0,0 +1,7 @@ + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8c51a0c2..31e865b5 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -38,6 +38,7 @@ #1b8ec8 #8e35c8 + #999999 #5c7258 #f8ffe5 @@ -55,6 +56,6 @@ #ff971e #ff971e - #71fb94 + #479E5D diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 844cc94b..c4322eaa 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -24,6 +24,12 @@ + +