Adds UI elements to HH

hh
Laurent 6 years ago
parent 42001c8f0d
commit df13c43e3d
  1. 22
      app/src/main/java/net/pokeranalytics/android/model/handhistory/HHBuilder.kt
  2. 5
      app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
  3. 15
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt
  4. 4
      app/src/main/java/net/pokeranalytics/android/ui/activity/HandHistoryActivity.kt
  5. 164
      app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt
  6. 173
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt
  7. 68
      app/src/main/java/net/pokeranalytics/android/ui/view/HandHistoryRowView.kt
  8. 6
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  9. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/StreetHeader.kt
  10. 22
      app/src/main/java/net/pokeranalytics/android/ui/view/holder/RowHandHistoryViewHolder.kt
  11. 6
      app/src/main/res/layout/fragment_feed.xml
  12. 38
      app/src/main/res/layout/row_hand_action.xml
  13. 37
      app/src/main/res/layout/row_hand_cards.xml
  14. 12
      app/src/main/res/layout/row_hand_history.xml
  15. 108
      app/src/main/res/layout/row_hand_history_view.xml
  16. 6
      app/src/main/res/layout/row_hand_street.xml

@ -55,19 +55,13 @@ class HHBuilder {
}
/***
* Fills the [actionsPerStreet] variable with the proper actions
* Fills the [sortedActions] variable with the proper actions
* Pre-computes the potsizes for the video export
*/
private fun load() {
// var potSize = 0.0
var totalPotSize = 0.0
// on veut sortir:
// une liste d'action pour générer des images / des animations => ImageRepresentable?
// une liste de lignes à afficher dans un tableau => RowRepresentable
// => ne pas oublier flop / turn / river / résumé
// sorted actions
val computedActions = mutableListOf<ComputedAction>()
val sortedActions = this.handHistory.actions.sortedBy { it.index }
@ -78,15 +72,6 @@ class HHBuilder {
}
this.sortedActions = computedActions
// Street.values().forEach { street ->
// val filteredActions = sortedActions.filter { it.street == street.ordinal }
// val computedActions = filteredActions.map { action ->
// totalPotSize += action.effectiveAmount
// ComputedAction(action, potSize, totalPotSize, action.positionRemainingStack)
// }
// this.actionsPerStreet[street] = computedActions
// potSize = totalPotSize
// }
}
/***
@ -265,7 +250,7 @@ class HHBuilder {
}
/***
* Saves the current hand state, represented by [actionsPerStreet], in the database
* Saves the current hand state in the database
*/
private fun save() {
@ -279,8 +264,11 @@ class HHBuilder {
rows.add(StreetHeader(street, this.handHistory.cardsForStreet(street), potSize))
val actions = this.sortedActions.filter { it.action.street == street.ordinal }
rows.addAll(actions)
if (actions.isNotEmpty()) {
potSize = actions.last().totalPotSize
}
}
return rows
}

@ -187,6 +187,11 @@ class PokerAnalyticsMigration : RealmMigration {
hhSchema.addField("numberOfPlayers", Int::class.java)
hhSchema.addField("comment", String::class.java)
hhSchema.addField("heroIndex", Int::class.java).setRequired("heroIndex", false)
hhSchema.addField("dayOfWeek", Integer::class.java)
hhSchema.addField("month", Integer::class.java)
hhSchema.addField("year", Integer::class.java)
hhSchema.addField("dayOfMonth", Integer::class.java)
val cardSchema = schema.create("Card")
cardSchema.addField("value", Int::class.java)

@ -4,14 +4,17 @@ import io.realm.RealmList
import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.handhistory.HandSetup
import net.pokeranalytics.android.model.handhistory.Street
import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.TimeFilterable
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.view.RowRepresentable
import java.util.*
open class HandHistory : RealmObject(), Identifiable {
open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterable, TimeFilterable {
@PrimaryKey
override var id = UUID.randomUUID().toString()
@ -23,6 +26,10 @@ open class HandHistory : RealmObject(), Identifiable {
* The date of the hand history
*/
var date: Date = Date()
set(value) {
field = value
this.updateTimeParameter(field)
}
/***
* The session whose hand was played
@ -79,6 +86,12 @@ open class HandHistory : RealmObject(), Identifiable {
*/
var playerSetups: RealmList<PlayerSetup> = RealmList()
// Timed interface
override var dayOfWeek: Int? = null
override var month: Int? = null
override var year: Int? = null
override var dayOfMonth: Int? = null
fun configure(handSetup: HandSetup) {
handSetup.tableSize?.let { this.numberOfPlayers = it }

@ -16,8 +16,8 @@ class HandHistoryActivity : BaseActivity() {
companion object {
fun newInstance(fragment: Fragment, id: String?) {
val intent = Intent(fragment.requireContext(), DataListActivity::class.java)
fun newInstance(fragment: Fragment, id: String? = null) {
val intent = Intent(fragment.requireContext(), HandHistoryActivity::class.java)
id?.let { intent.putExtra(IntentKey.IDENTIFIER.keyName, it) }
fragment.startActivityForResult(intent, RequestCode.NEW_HAND_HISTORY.value)
}

@ -0,0 +1,164 @@
package net.pokeranalytics.android.ui.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
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
import java.util.*
import kotlin.collections.HashMap
/**
* An adapter capable of displaying a list of RowRepresentables
* @param dataSource the datasource providing rows
* @param delegate the delegate, notified of UI actions
*/
class FeedHandHistoryRowRepresentableAdapter(
var delegate: RowRepresentableDelegate? = null,
var realmHandHistories: RealmResults<HandHistory>,
var distinctHandHistoryHeaders: RealmResults<HandHistory>
) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var headersPositions = HashMap<Int, Date?>()
private lateinit var sortedHeaders: SortedMap<Int, Date?>
init {
refreshData()
}
inner class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
fun bind(position: Int, row: HandHistory?, adapter: FeedHandHistoryRowRepresentableAdapter) {
itemView.handHistoryRow.setData(row as HandHistory)
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.handHistoryRow.setOnClickListener(listener)
}
}
/**
* Display a header
*/
inner class HeaderTitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
fun bind(title: String) {
// Title
itemView.findViewById<AppCompatTextView>(R.id.title)?.let {
it.text = title
}
}
}
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)
RowHandHistoryViewHolder(layout)
} else {
val layout = LayoutInflater.from(parent.context).inflate(R.layout.row_header_title, parent, false)
HeaderTitleViewHolder(layout)
}
}
override fun getItemViewType(position: Int): Int {
return if (sortedHeaders.containsKey(position)) {
RowViewType.HEADER_TITLE.ordinal
} else {
1
// RowViewType.ROW_HAND_HISTORY.ordinal
}
}
override fun getItemCount(): Int {
return realmHandHistories.size + distinctHandHistoryHeaders.size
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is RowHandHistoryViewHolder) {
holder.bind(position, getHandHistoryForPosition(position), this)
} else if (holder is HeaderTitleViewHolder) {
holder.bind(getHeaderForPosition(position))
}
}
/**
* Return the header
*/
private fun getHeaderForPosition(position: Int): String {
if (sortedHeaders.containsKey(position)) {
val realmHeaderPosition = sortedHeaders.keys.indexOf(position)
return distinctHandHistoryHeaders[realmHeaderPosition]?.date?.getMonthAndYear() ?: ""
}
return NULL_TEXT
}
/**
* Get real index
*/
private fun getHandHistoryForPosition(position: Int): HandHistory? {
// Row position
var headersBefore = 0
for (key in sortedHeaders.keys) {
if (position > key) {
headersBefore++
} else {
break
}
}
return realmHandHistories[position - headersBefore]
}
/**
* Refresh headers positions
*/
fun refreshData() {
headersPositions.clear()
var previousYear = Int.MAX_VALUE
var previousMonth = Int.MAX_VALUE
val calendar = Calendar.getInstance()
// Add headers if the date doesn't exist yet
for ((index, handHistory) in realmHandHistories.withIndex()) {
calendar.time = handHistory.date
if (checkHeaderCondition(calendar, previousYear, previousMonth)) {
headersPositions[index + headersPositions.size] = handHistory.date
previousYear = calendar.get(Calendar.YEAR)
previousMonth = calendar.get(Calendar.MONTH)
}
}
sortedHeaders = headersPositions.toSortedMap()
}
/**
* Check if we need to add a header
* Can be change to manage different condition
*/
private fun checkHeaderCondition(currentCalendar: Calendar, previousYear: Int, previousMonth: Int): Boolean {
return currentCalendar.get(Calendar.YEAR) == previousYear && currentCalendar.get(Calendar.MONTH) < previousMonth || (currentCalendar.get(
Calendar.YEAR) < previousYear)
}
}

@ -2,10 +2,6 @@ package net.pokeranalytics.android.ui.fragment
import android.app.Activity.RESULT_OK
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Rect
import android.os.Bundle
import android.view.*
import android.widget.Toast
@ -25,12 +21,13 @@ import net.pokeranalytics.android.model.interfaces.Editable
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.model.realm.handhistory.HandHistory
import net.pokeranalytics.android.ui.activity.*
import net.pokeranalytics.android.ui.activity.components.RequestCode
import net.pokeranalytics.android.ui.adapter.FeedHandHistoryRowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.FeedSessionRowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.FeedTransactionRowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.extensions.toByteArray
import net.pokeranalytics.android.ui.fragment.components.FilterableFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode
import net.pokeranalytics.android.ui.interfaces.FilterableType
@ -39,8 +36,6 @@ import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
import net.pokeranalytics.android.util.Preferences
import net.pokeranalytics.android.util.billing.AppGuard
import net.pokeranalytics.android.util.extensions.count
import net.pokeranalytics.android.util.video.MMediaMuxer
import timber.log.Timber
import java.text.SimpleDateFormat
import java.util.*
@ -48,7 +43,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
private enum class Tab {
SESSIONS,
TRANSACTIONS
TRANSACTIONS,
HAND_HISTORY
}
companion object {
@ -66,10 +62,12 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
private var currentTab = Tab.SESSIONS
private lateinit var feedSessionAdapter: FeedSessionRowRepresentableAdapter
private lateinit var feedTransactionAdapter: FeedTransactionRowRepresentableAdapter
private lateinit var sessionAdapter: FeedSessionRowRepresentableAdapter
private lateinit var transactionAdapter: FeedTransactionRowRepresentableAdapter
private lateinit var handHistoryAdapter: FeedHandHistoryRowRepresentableAdapter
private lateinit var realmTransactions: RealmResults<Transaction>
private lateinit var realmHandHistories: RealmResults<HandHistory>
private lateinit var betaLimitDate: Date
private var newSessionCreated: Boolean = false
@ -78,7 +76,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
private var selectedTransactionPosition: Int = -1
override val observedEntities: List<Class<out RealmModel>> =
listOf(Session::class.java, Transaction::class.java)
listOf(Session::class.java, Transaction::class.java, HandHistory::class.java)
override fun entitiesChanged(
clazz: Class<out RealmModel>,
@ -88,12 +86,16 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
when (clazz.kotlin) {
Session::class -> {
this.feedSessionAdapter.refreshData()
this.feedSessionAdapter.notifyDataSetChanged()
this.sessionAdapter.refreshData()
this.sessionAdapter.notifyDataSetChanged()
}
Transaction::class -> {
this.feedTransactionAdapter.refreshData()
this.feedTransactionAdapter.notifyDataSetChanged()
this.transactionAdapter.refreshData()
this.transactionAdapter.notifyDataSetChanged()
}
HandHistory::class -> {
this.handHistoryAdapter.refreshData()
this.handHistoryAdapter.notifyDataSetChanged()
}
}
@ -133,7 +135,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
when (item?.itemId) {
R.id.duplicate -> {
val sessionId = this.feedSessionAdapter.sessionIdForPosition(menuPosition)
val sessionId = this.sessionAdapter.sessionIdForPosition(menuPosition)
if (sessionId != null) {
createNewSession(true, sessionId = sessionId, duplicate = true)
} else {
@ -204,6 +206,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
this.selectTab(Tab.TRANSACTIONS)
} else if (requestCode == RequestCode.NEW_SESSION.value && resultCode == RESULT_OK) {
this.selectTab(Tab.SESSIONS)
} else if (requestCode == RequestCode.NEW_HAND_HISTORY.value && resultCode == RESULT_OK) {
this.selectTab(Tab.HAND_HISTORY)
}
}
@ -229,6 +233,9 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
RequestCode.FEED_TRANSACTION_DETAILS.value
)
}
is HandHistory -> {
HandHistoryActivity.newInstance(this, row.id)
}
}
}
@ -237,7 +244,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
*/
private fun initUI() {
this.feedSessionAdapter = FeedSessionRowRepresentableAdapter(getRealm(), this)
this.sessionAdapter = FeedSessionRowRepresentableAdapter(getRealm(), this)
registerForContextMenu(this.menuRecyclerView)
@ -287,6 +294,9 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
Tab.TRANSACTIONS.ordinal -> {
currentFilterable = FilterableType.TRANSACTION
}
Tab.HAND_HISTORY.ordinal -> {
currentFilterable = FilterableType.HAND_HISTORY
}
}
tabChanged(tab.position)
}
@ -331,10 +341,10 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
when (filter?.filterableType) {
FilterableType.SESSION -> {
this.feedSessionAdapter.filter = filter
this.sessionAdapter.filter = filter
}
else -> {
this.feedSessionAdapter.filter = null
this.sessionAdapter.filter = null
}
}
}
@ -357,7 +367,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
getRealm().where<Transaction>().distinct("year", "month").findAll()
}
distinctDateTransactions = distinctDateTransactions.sort("date", Sort.DESCENDING)
this.feedTransactionAdapter =
this.transactionAdapter =
FeedTransactionRowRepresentableAdapter(
this,
realmTransactions,
@ -366,6 +376,33 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
}
private fun loadHandHistories(filter: Filter? = null) {
val handHistoryFilter: Filter? = filter?.let {
if (it.filterableType == FilterableType.HAND_HISTORY) {
it
} else {
null
}
}
// Transactions
this.realmHandHistories =
handHistoryFilter?.results() ?: run { getRealm().where<HandHistory>().findAll() }
this.realmHandHistories = this.realmHandHistories.sort("date", Sort.DESCENDING)
var distinctDates = handHistoryFilter?.results("year", "month") ?: run {
getRealm().where<HandHistory>().distinct("year", "month").findAll()
}
distinctDates = distinctDates.sort("date", Sort.DESCENDING)
this.handHistoryAdapter =
FeedHandHistoryRowRepresentableAdapter(
this,
realmHandHistories,
distinctDates
)
}
/**
* Create a new cash game
*/
@ -423,56 +460,52 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
*/
private fun createNewHandHistory() {
Timber.d("**** Start video test")
val width = 480
val height = 480
HandHistoryActivity.newInstance(this)
// val testView = View(requireContext())
// testView.setBackgroundColor(requireContext().getColor(R.color.blue))
// testView.layoutParams = ViewGroup.LayoutParams(width, height)
// Timber.d("**** Start video test")
//
// val videoView = VideoView(requireContext())
val bitmap = Bitmap.createBitmap(480, 480, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val paint = Paint()
paint.isAntiAlias = true
paint.style = Paint.Style.STROKE
paint.strokeWidth = 20.0.toFloat()
paint.color = requireContext().getColor(R.color.blue)
canvas.drawRect(Rect(0,0, width, height), paint)
bitmap.let {
val muxer = MMediaMuxer()
Timber.d("width = ${it.width}, height = ${it.height}")
val width = (it.width / 2) * 2
val height= (it.height / 2) * 2
muxer.Init(requireActivity(), width, height, "hhVideo", "YES!")
Timber.d("**** Adds frames")
for (i in 0..50) {
try {
val byteArray = it.toByteArray()
muxer.AddFrame(byteArray)
} catch (e: Exception) {
Timber.e("error = ${e.message}")
}
}
Timber.d("**** Create video")
muxer.CreateVideo()
val path = muxer.GetPath()
Timber.d("**** Video path = $path")
}
// val width = 480
// val height = 480
//
// val bitmap = Bitmap.createBitmap(480, 480, Bitmap.Config.ARGB_8888)
// val canvas = Canvas(bitmap)
//
// val paint = Paint()
// paint.isAntiAlias = true
// paint.style = Paint.Style.STROKE
// paint.strokeWidth = 20.0.toFloat()
// paint.color = requireContext().getColor(R.color.blue)
//
// canvas.drawRect(Rect(0,0, width, height), paint)
//
// bitmap.let {
//
// val muxer = MMediaMuxer()
//
// Timber.d("width = ${it.width}, height = ${it.height}")
//
// val width = (it.width / 2) * 2
// val height= (it.height / 2) * 2
//
// muxer.Init(requireActivity(), width, height, "hhVideo", "YES!")
//
// Timber.d("**** Adds frames")
// for (i in 0..50) {
//
// try {
// val byteArray = it.toByteArray()
// muxer.AddFrame(byteArray)
// } catch (e: Exception) {
// Timber.e("error = ${e.message}")
// }
// }
// Timber.d("**** Create video")
// muxer.CreateVideo()
//
// val path = muxer.GetPath()
// Timber.d("**** Video path = $path")
// }
}
@ -506,6 +539,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
val filter: Filter? = this.currentFilter(this.requireContext(), getRealm())
this.loadSessions(filter)
this.loadTransactions(filter)
this.loadHandHistories(filter)
filter?.let {
when (it.filterableType) {
@ -531,6 +565,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
super.removeFilter()
this.loadSessions()
this.loadTransactions()
this.loadHandHistories()
this.setAdapter()
}
@ -547,8 +582,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
private fun setAdapter() {
when (this.currentTab) {
Tab.SESSIONS -> menuRecyclerView.adapter = feedSessionAdapter
Tab.TRANSACTIONS -> menuRecyclerView.adapter = feedTransactionAdapter
Tab.SESSIONS -> menuRecyclerView.adapter = sessionAdapter
Tab.TRANSACTIONS -> menuRecyclerView.adapter = transactionAdapter
}
}

@ -0,0 +1,68 @@
package net.pokeranalytics.android.ui.view
import android.content.Context
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 net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.handhistory.HandHistory
import net.pokeranalytics.android.util.extensions.getDayNumber
import net.pokeranalytics.android.util.extensions.getShortDayName
/**
* Display a transaction row
*/
class HandHistoryRowView : FrameLayout {
private lateinit var rowHandHistory: ConstraintLayout
/**
* Constructors
*/
constructor(context: Context) : super(context) {
init()
}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
init()
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
init()
}
/**
* Init
*/
private fun init() {
val layoutInflater = LayoutInflater.from(context)
rowHandHistory = layoutInflater.inflate(R.layout.row_hand_history_view, this, false) as ConstraintLayout
val layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
addView(rowHandHistory, layoutParams)
}
/**
* Set the session data to the view
*/
fun setData(handHistory: HandHistory) {
// Date
rowHandHistory.transactionDateDay.text = handHistory.date.getShortDayName()
rowHandHistory.transactionDateNumber.text = handHistory.date.getDayNumber()
// Title / Game type
// var title = handHistory.type?.name ?: "" + " " + handHistory.comment
// var subtitle = handHistory.bankroll?.name
//
// rowHandHistory.transactionTitle.text = title
// rowHandHistory.transactionSubtitle.text = subtitle
//
// Amount
// val formattedStat = ComputedStat(Stat.NET_RESULT, handHistory.amount, currency = handHistory.bankroll?.utilCurrency).format()
// rowHandHistory.transactionAmount.setTextFormat(formattedStat, context)
}
}

@ -84,6 +84,7 @@ enum class RowViewType(private var layoutRes: Int) {
// Custom row
ROW_SESSION(R.layout.row_feed_session),
ROW_TRANSACTION(R.layout.row_transaction),
// ROW_HAND_HISTORY(R.layout.row_hand_history),
ROW_TOP_10(R.layout.row_top_10),
ROW_BUTTON(R.layout.row_button),
ROW_FOLLOW_US(R.layout.row_follow_us),
@ -95,7 +96,7 @@ enum class RowViewType(private var layoutRes: Int) {
ROW_PLAYER(R.layout.row_player),
ROW_PLAYER_IMAGE(R.layout.row_player_image),
ROW_HAND_ACTION(R.layout.row_hand_action),
ROW_HAND_STREET(R.layout.row_hand_street),
ROW_HAND_STREET(R.layout.row_hand_cards),
// Separator
SEPARATOR(R.layout.row_separator);
@ -124,7 +125,6 @@ enum class RowViewType(private var layoutRes: Int) {
// Row Transaction
ROW_TOP_10 -> RowTop10ViewHolder(layout)
ROW_PLAYER -> RowPlayerViewHolder(layout)
ROW_PLAYER_IMAGE -> RowPlayerImageViewHolder(layout)
@ -145,6 +145,7 @@ enum class RowViewType(private var layoutRes: Int) {
LEGEND_DEFAULT -> LegendDefaultViewHolder(layout)
// Hand History
// ROW_HAND_HISTORY -> RowHandHistoryViewHolder(layout)
ROW_HAND_ACTION -> RowHandAction(layout)
ROW_HAND_STREET -> RowHandStreet(layout)
@ -579,7 +580,6 @@ enum class RowViewType(private var layoutRes: Int) {
}
}
/**
* Display a top 10 row
*/

@ -6,4 +6,6 @@ import net.pokeranalytics.android.ui.view.RowRepresentable
class StreetHeader(var street: Street, var cards: List<Card>, var potSize: Double) : RowRepresentable {
override val viewType: Int = 0
}

@ -0,0 +1,22 @@
package net.pokeranalytics.android.ui.view.holder
import android.view.View
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.FeedHandHistoryRowRepresentableAdapter
import net.pokeranalytics.android.ui.view.BindableHolder
class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
fun bind(position: Int, row: HandHistory?, adapter: FeedHandHistoryRowRepresentableAdapter) {
itemView.handHistoryRow.setData(row as HandHistory)
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.handHistoryRow.setOnClickListener(listener)
}
}

@ -44,6 +44,12 @@
android:layout_height="wrap_content"
android:text="@string/operations" />
<com.google.android.material.tabs.TabItem
android:id="@+id/filterHandHistories"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hands_history" />
</com.google.android.material.tabs.TabLayout>
</com.google.android.material.appbar.AppBarLayout>

@ -1,6 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.button.MaterialButton
android:id="@+id/playerButton"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/positionButton"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/actionButton"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="120dp"
android:layout_height="44dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"/>
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/amountEditText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:imeOptions="actionDone"
android:maxLines="1" />
</LinearLayout>

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/flopEditText"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:imeOptions="actionDone"
android:maxLines="1" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/turnEditText"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:imeOptions="actionDone"
android:maxLines="1" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/riverEditText"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:imeOptions="actionDone"
android:maxLines="1" />
</LinearLayout>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<net.pokeranalytics.android.ui.view.HandHistoryRowView
android:id="@+id/handHistoryRow"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
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"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:gravity="center"
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" />
<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:id="@+id/transactionAmount"
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"
tools:text="$ 1000" />
<ImageView
android:id="@+id/nextArrow"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_arrow_right"
android:tint="@color/gray_light"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/guidelineEnd"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="16dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineEnd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="8dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
Loading…
Cancel
Save