Creates HH row for the feed

hh
Laurent 6 years ago
parent 6b15412b45
commit 12dc039a1b
  1. 50
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt
  2. 55
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt
  3. 16
      app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt
  4. 6
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt
  5. 47
      app/src/main/java/net/pokeranalytics/android/ui/view/HandHistoryRowView.kt
  6. 3
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  7. 7
      app/src/main/res/drawable/rounded_background.xml
  8. 3
      app/src/main/res/layout/row_hand_history.xml
  9. 93
      app/src/main/res/layout/row_hand_history_view.xml
  10. 12
      app/src/main/res/layout/view_card.xml
  11. 7
      app/src/main/res/layout/view_card_separator.xml
  12. 3
      app/src/main/res/values/colors.xml
  13. 6
      app/src/main/res/values/styles.xml

@ -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<Card>.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
}
}

@ -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<View> {
val views = mutableListOf<View>()
val layoutInflater = LayoutInflater.from(context)
// Create all the possible cards list: hero, opponents, board
val cardSets = mutableListOf<List<Card>>()
// 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
}
}

@ -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
}
}

@ -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)
}
}

@ -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

@ -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)

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF"/>
<!-- <stroke android:width="3dp" android:color="#B1BCBE" />-->
<corners android:radius="6dp"/>
<padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

@ -2,7 +2,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:orientation="vertical"
android:padding="4dp">
<net.pokeranalytics.android.ui.view.HandHistoryRowView
android:id="@+id/handHistoryRow"

@ -6,78 +6,51 @@
android:layout_height="56dp"
android:background="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/transactionDateDay"
style="@style/PokerAnalyticsTheme.TextView.SessionRow.Date"
android:layout_width="32dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
android:textAllCaps="true"
app:fontFamily="@font/roboto_mono_medium"
app:layout_constraintBottom_toTopOf="@+id/transactionDateNumber"
app:layout_constraintStart_toStartOf="@+id/guidelineStart"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="THU" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/transactionDateNumber"
style="@style/PokerAnalyticsTheme.TextView.SessionRow.DateNumber"
android:layout_width="32dp"
<LinearLayout
android:id="@+id/cardsLayout"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:gravity="center"
android:layout_marginStart="16dp"
android:gravity="center_vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/transactionDateDay"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="@+id/transactionDateDay"
app:layout_constraintTop_toBottomOf="@+id/transactionDateDay"
tools:text="21" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/transactionTitle"
style="@style/PokerAnalyticsTheme.TextView.SessionRow.Title"
android:layout_width="0dp"
android:layout_height="24dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintBottom_toTopOf="@+id/transactionSubtitle"
app:layout_constraintEnd_toStartOf="@+id/transactionAmount"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/transactionDateDay"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="Deposit: Live" />
app:layout_constraintStart_toStartOf="parent" />
<!-- <androidx.appcompat.widget.AppCompatTextView-->
<!-- android:layout_width="24dp"-->
<!-- android:layout_height="42dp"-->
<!-- style="@style/PokerAnalyticsTheme.CardTextView"-->
<!-- android:textColor="@color/black"-->
<!-- android:background="@drawable/rounded_background"-->
<!-- android:text="5\n♣"-->
<!-- android:gravity="center"-->
<!-- android:layout_marginEnd="4dp"-->
<!-- android:lines="2"-->
<!-- />-->
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/transactionSubtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginBottom="2dp"
android:ellipsize="end"
android:fontFamily="@font/roboto"
android:maxLines="1"
android:textColor="@color/kaki_lighter"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/transactionAmount"
app:layout_constraintStart_toStartOf="@+id/transactionTitle"
app:layout_constraintTop_toBottomOf="@+id/transactionTitle"
tools:text="Live"
tools:visibility="visible" />
<!-- <androidx.appcompat.widget.AppCompatTextView-->
<!-- android:layout_width="24dp"-->
<!-- android:layout_height="42dp"-->
<!-- style="@style/PokerAnalyticsTheme.CardTextView"-->
<!-- android:textColor="@color/black"-->
<!-- android:background="@drawable/rounded_background"-->
<!-- android:text="A\n♥"-->
<!-- android:gravity="center"-->
<!-- android:lines="2"-->
<!-- />-->
<!-- </LinearLayout>-->
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/transactionAmount"
android:id="@+id/amount"
style="@style/PokerAnalyticsTheme.TextView.SessionRow.Result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
app:layout_constraintBottom_toBottomOf="@+id/transactionSubtitle"
app:layout_constraintEnd_toStartOf="@+id/nextArrow"
app:layout_constraintTop_toTopOf="@+id/transactionTitle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="$ 1000" />
<ImageView

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.AppCompatTextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/PokerAnalyticsTheme.CardTextView"
android:layout_width="24dp"
android:layout_height="42dp"
android:layout_marginEnd="4dp"
android:background="@drawable/rounded_background"
android:gravity="center"
android:lines="2"
tools:text="5\n♣" />

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="1dp"
android:layout_height="36dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="8dp"
android:background="@color/kaki" />

@ -38,6 +38,7 @@
<color name="blue">#1b8ec8</color>
<color name="purple">#8e35c8</color>
<color name="grey">#999999</color>
<color name="chart_default">#5c7258</color>
<color name="chart_highlight_indicator">#f8ffe5</color>
@ -55,6 +56,6 @@
<color name="player_color_9">#ff971e</color>
<color name="diamond">#ff971e</color>
<color name="clover">#71fb94</color>
<color name="clover">#479E5D</color>
</resources>

@ -24,6 +24,12 @@
</style>
<!-- Defaults -->
<style name="PokerAnalyticsTheme.CardTextView">
<item name="android:textSize">16sp</item>
<item name="android:textColor">@color/black</item>
<item name="android:fontFamily">@font/roboto_bold</item>
</style>
<!-- Defaults -->
<style name="PokerAnalyticsTheme.DefaultText">

Loading…
Cancel
Save