Improve Session model & UI

feature/top10
Aurelien Hubert 7 years ago
parent 806ae3ad3a
commit ce16a063d4
  1. 107
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  2. 46
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  3. 6
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt
  4. 75
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt
  5. 70
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  6. 25
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  7. 14
      app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt
  8. 9
      app/src/main/res/layout/fragment_session.xml
  9. 4
      app/src/main/res/layout/row_header_title_value.xml
  10. 5
      app/src/main/res/layout/row_session_view.xml
  11. 2
      app/src/main/res/layout/row_title_value.xml

@ -2,7 +2,6 @@ package net.pokeranalytics.android.model.realm
import android.content.Context
import android.text.InputType
import com.google.android.material.tabs.TabLayout
import io.realm.RealmList
import io.realm.RealmObject
import io.realm.annotations.Ignore
@ -16,6 +15,7 @@ import net.pokeranalytics.android.model.extensions.SessionState
import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.view.HeaderRowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.SessionRow
@ -23,7 +23,6 @@ import net.pokeranalytics.android.util.getDuration
import net.pokeranalytics.android.util.round
import net.pokeranalytics.android.util.shortDateTime
import net.pokeranalytics.android.util.toCurrency
import timber.log.Timber
import java.util.*
import kotlin.collections.ArrayList
@ -153,17 +152,17 @@ open class Session : RealmObject(), SessionInterface, Savable,
/**
* Return the duration of the current session
*/
fun getDuration(context: Context): String {
fun getDuration(): String {
val startDate = timeFrame?.startDate ?: Date()
val enDate = timeFrame?.endDate ?: Date()
return startDate.getDuration(context, enDate)
return startDate.getDuration(enDate)
}
/**
* Return the formatted blinds
*/
fun getBlinds(): String {
return if (cgSmallBlind == null) "--" else "$${cgSmallBlind?.round()}/${cgBigBlind?.round()}"
return if (cgSmallBlind == null) "--" else "${cgSmallBlind?.toCurrency()}/${cgBigBlind?.round()}"
}
/**
@ -275,6 +274,22 @@ open class Session : RealmObject(), SessionInterface, Savable,
override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<RowRepresentable>()
// Headers
when (getState()) {
SessionState.STARTED, SessionState.PAUSED -> {
rows.add(HeaderRowRepresentable.HEADER_SESSION_DURATION)
}
SessionState.FINISHED -> {
rows.add(HeaderRowRepresentable.HEADER_SESSION_DURATION)
rows.add(HeaderRowRepresentable.HEADER_SESSION_NET_HOURLY_RATE)
rows.add(HeaderRowRepresentable.HEADER_SESSION_BANKROLL_VARIATION)
}
else -> {
}
}
// Rows
rows.addAll(SessionRow.getRowsForState(getState()))
return rows
}
@ -283,9 +298,11 @@ open class Session : RealmObject(), SessionInterface, Savable,
return false
}
override fun stringForRow(row: RowRepresentable, context:Context): String {
override fun stringForRow(row: RowRepresentable, context: Context): String {
return when (row) {
SessionRow.CASHED_OUT -> result?.cashout?.toCurrency() ?: "--"
SessionRow.BUY_IN -> buyin.toCurrency()
SessionRow.TIPS -> result?.tips?.toCurrency() ?: "--"
SessionRow.BLINDS -> getBlinds()
SessionRow.GAME -> getGameTitle()
SessionRow.LOCATION -> location?.name ?: "--"
@ -312,7 +329,11 @@ open class Session : RealmObject(), SessionInterface, Savable,
val data = ArrayList<RowRepresentableEditDescriptor>()
when (row) {
SessionRow.CASHED_OUT -> {
data.add(
RowRepresentableEditDescriptor(result?.cashout?.round(), inputType = InputType.TYPE_CLASS_NUMBER)
)
}
SessionRow.BUY_IN -> {
// Add first & second buttons values, current value & set the 2 edit texts
data.add(RowRepresentableEditDescriptor(100.0 * (cgBigBlind ?: 0.0)))
@ -331,32 +352,13 @@ open class Session : RealmObject(), SessionInterface, Savable,
)
)
}
SessionRow.CASHED_OUT -> {
data.add(
RowRepresentableEditDescriptor(
result?.cashout,
inputType = InputType.TYPE_CLASS_NUMBER
)
)
}
SessionRow.TIPS -> {
// Disable the buttons with value = 0, add current value & set the 2 edit texts
// TODO: manage tips
data.add(RowRepresentableEditDescriptor(cgSmallBlind ?: 0.0))
data.add(RowRepresentableEditDescriptor(cgBigBlind ?: 0.0))
data.add(RowRepresentableEditDescriptor(0))
data.add(
RowRepresentableEditDescriptor(
"",
inputType = InputType.TYPE_CLASS_NUMBER
)
)
data.add(
RowRepresentableEditDescriptor(
"",
inputType = InputType.TYPE_CLASS_NUMBER
)
)
data.add(RowRepresentableEditDescriptor(result?.tips ?: 0.0))
data.add(RowRepresentableEditDescriptor("", inputType = InputType.TYPE_CLASS_NUMBER))
data.add(RowRepresentableEditDescriptor("", inputType = InputType.TYPE_CLASS_NUMBER))
}
SessionRow.TABLE_SIZE -> {
data.add(RowRepresentableEditDescriptor(tableSize))
@ -368,46 +370,18 @@ open class Session : RealmObject(), SessionInterface, Savable,
}
SessionRow.LOCATION -> {
// Add current location and locations list
data.add(
RowRepresentableEditDescriptor(
location,
data = LiveData.LOCATION.items(realm)
)
)
data.add(RowRepresentableEditDescriptor(location, data = LiveData.LOCATION.items(realm)))
}
SessionRow.BANKROLL -> {
// Add current bankroll and bankrolls list
data.add(
RowRepresentableEditDescriptor(
bankroll,
data = LiveData.BANKROLL.items(realm)
)
)
data.add(RowRepresentableEditDescriptor(bankroll, data = LiveData.BANKROLL.items(realm)))
}
SessionRow.BLINDS -> {
data.add(
RowRepresentableEditDescriptor(
cgSmallBlind,
R.string.smallblind,
InputType.TYPE_CLASS_NUMBER
)
)
data.add(
RowRepresentableEditDescriptor(
cgBigBlind,
R.string.bigblind,
InputType.TYPE_CLASS_NUMBER
)
)
data.add(RowRepresentableEditDescriptor(cgSmallBlind, R.string.smallblind, InputType.TYPE_CLASS_NUMBER))
data.add(RowRepresentableEditDescriptor(cgBigBlind, R.string.bigblind, InputType.TYPE_CLASS_NUMBER))
}
SessionRow.COMMENT -> {
data.add(
RowRepresentableEditDescriptor(
comment,
R.string.comment,
InputType.TYPE_CLASS_TEXT
)
)
data.add(RowRepresentableEditDescriptor(comment, R.string.comment, InputType.TYPE_CLASS_TEXT))
}
}
@ -427,11 +401,14 @@ open class Session : RealmObject(), SessionInterface, Savable,
localResult.cashout = if (value == null) null else (value as String).toDouble()
result = localResult
}
SessionRow.TIPS -> {
val localResult = if (result != null) result as Result else realm.createObject(Result::class.java)
localResult.tips = value as Double?
result = localResult
}
SessionRow.TABLE_SIZE -> tableSize = value as Int?
SessionRow.GAME -> {
if (value is ArrayList<*>) {
Timber.d("${value[0]}")
Timber.d("${value[1]}")
limit = try {
(value[0] as Int?)
} catch (e: Exception) {
@ -465,7 +442,6 @@ open class Session : RealmObject(), SessionInterface, Savable,
}
}
}
//TODO: Update
SessionRow.START_DATE -> if (value is Date?) {
if (value == null) {
timeFrame = null
@ -476,7 +452,6 @@ open class Session : RealmObject(), SessionInterface, Savable,
timeFrame = timeFrameToUpdate
}
}
//TODO: Update
SessionRow.END_DATE -> if (value is Date?) {
val timeFrameToUpdate =
if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java)

@ -1,6 +1,7 @@
package net.pokeranalytics.android.ui.fragment
import android.os.Bundle
import android.os.Handler
import android.view.*
import android.view.animation.OvershootInterpolator
import android.widget.Toast
@ -26,7 +27,6 @@ import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableDiffCallback
import net.pokeranalytics.android.ui.view.SessionRow
import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
import net.pokeranalytics.android.util.px
import net.pokeranalytics.android.util.toast
import timber.log.Timber
import java.util.*
@ -37,6 +37,13 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
private lateinit var sessionAdapter: RowRepresentableAdapter
private var sessionMenu: Menu? = null
private val oldRows: ArrayList<RowRepresentable> = ArrayList()
private val handler: Handler = Handler()
private val refreshTimer: Runnable = object: Runnable {
override fun run() {
sessionAdapter.notifyItemChanged(0)
handler.postDelayed(this, 30000)
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_session, container, false)
@ -47,6 +54,11 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
initUI()
}
override fun onPause() {
super.onPause()
handler.removeCallbacksAndMessages(null)
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
inflater?.inflate(R.menu.session_toolbar, menu)
this.sessionMenu = menu
@ -106,6 +118,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
currentSession.updateValue(value, row)
sessionAdapter.refreshRow(row)
when (row) {
SessionRow.CASHED_OUT, SessionRow.BUY_IN, SessionRow.TIPS -> updateSessionUI()
SessionRow.START_DATE, SessionRow.END_DATE -> updateSessionUI()
}
}
@ -141,61 +154,40 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
*/
private fun updateSessionUI() {
handler.removeCallbacksAndMessages(null)
when (currentSession.getState()) {
SessionState.PENDING -> {
state.text = "WAITING"
state.setTextColor(ContextCompat.getColor(requireContext(), R.color.white))
sessionMenu?.findItem(R.id.restart)?.isVisible = false
floatingActionButton.setImageResource(R.drawable.ic_outline_play)
sessionMenu?.findItem(R.id.stop)?.isVisible = false
floatingActionButton.animate().scaleX(1f).scaleY(1f).alpha(1f)
.setInterpolator(OvershootInterpolator()).start()
sessionData.animate().translationY(-(72f.px)).alpha(1f)
.setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
recyclerView.animate().translationY(-(72f.px))
.setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
}
SessionState.STARTED -> {
state.text = "PLAYING"
state.setTextColor(ContextCompat.getColor(requireContext(), R.color.green))
sessionMenu?.findItem(R.id.restart)?.isVisible = true
floatingActionButton.setImageResource(R.drawable.ic_outline_pause)
sessionMenu?.findItem(R.id.stop)?.isVisible = true
floatingActionButton.animate().scaleX(1f).scaleY(1f).alpha(1f)
.setInterpolator(OvershootInterpolator()).start()
sessionData.animate().translationY(0f).alpha(1f)
.setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
recyclerView.animate().translationY(0f.px)
.setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
handler.postDelayed(refreshTimer, 30000)
}
SessionState.PAUSED -> {
state.text = "BREAK"
state.setTextColor(ContextCompat.getColor(requireContext(), R.color.blue))
sessionMenu?.findItem(R.id.restart)?.isVisible = true
floatingActionButton.setImageResource(R.drawable.ic_outline_play)
sessionMenu?.findItem(R.id.stop)?.isVisible = true
floatingActionButton.animate().scaleX(1f).scaleY(1f).alpha(1f)
.setInterpolator(OvershootInterpolator()).start()
sessionData.animate().translationY(0f).alpha(1f)
.setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
recyclerView.animate().translationY(0f.px)
.setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
}
SessionState.FINISHED -> {
state.text = "FINISHED"
state.setTextColor(ContextCompat.getColor(requireContext(), R.color.white))
sessionMenu?.findItem(R.id.restart)?.isVisible = true
sessionMenu?.findItem(R.id.stop)?.isVisible = false
floatingActionButton.animate().scaleX(0f).scaleY(0f).alpha(0f)
.setInterpolator(FastOutSlowInInterpolator()).start()
sessionData.animate().translationY(0f).alpha(1f)
.setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
recyclerView.animate().translationY(0f.px)
.setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
}
}
@ -224,8 +216,6 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
*/
private fun manageSessionState() {
Timber.d("oldRows: $oldRows")
when (currentSession.getState()) {
SessionState.PENDING -> {
currentSession.startSession()
@ -236,6 +226,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
SessionState.PAUSED -> {
currentSession.startSession()
}
else -> {}
}
updateSessionUI()
@ -262,6 +253,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
updateSessionUI()
Timber.d("Session state: ${currentSession.getState()}")
Timber.d("Result: ${currentSession.result}")
}
}

@ -70,7 +70,7 @@ class BottomSheetSumFragment : BottomSheetFragment() {
button1.text = defaultValue1.toCurrency()
button1.visibility = if (defaultValue1 > 0) View.VISIBLE else View.GONE
button1.setOnClickListener {
this.delegate.onRowValueChanged(data, row)
this.delegate.onRowValueChanged(currentDefaultValue + defaultValue1, row)
dismiss()
}
@ -84,7 +84,7 @@ class BottomSheetSumFragment : BottomSheetFragment() {
button2.text = defaultValue2.toCurrency()
button2.visibility = if (defaultValue2 > 0) View.VISIBLE else View.GONE
button2.setOnClickListener {
this.delegate.onRowValueChanged(data, row)
this.delegate.onRowValueChanged(currentDefaultValue + defaultValue2, row)
dismiss()
}
@ -110,7 +110,7 @@ class BottomSheetSumFragment : BottomSheetFragment() {
editText2.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
this.delegate.onRowValueChanged(data, row)
this.delegate.onRowValueChanged(value, row)
dismiss()
true
} else {

@ -95,77 +95,4 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(),
}
return "UNKNOWN CONTEXT FOR ROW $row"
}
}
/*
class BottomSheetTableSizeGridFragment : BottomSheetFragment() {
private var dataList: ArrayList<String> = ArrayList()
private lateinit var dataAdapter: TableSizeGridAdapter
private var defaultSize: Int? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initData()
initUI()
}
override fun onResume() {
super.onResume()
dataAdapter.notifyDataSetChanged()
}
override fun getValue(): Any? {
return defaultSize
}
/**
* Init data
*/
private fun initData() {
val bottomSheetData = getData()
if (bottomSheetData.isNotEmpty() && bottomSheetData.first().defaultValue != null) {
defaultSize = bottomSheetData.first().defaultValue as Int?
}
dataList.add(getString(net.pokeranalytics.android.R.string.heads_up))
for (i in 3..10) {
dataList.add("$i-max")
}
}
/**
* Init UI
*/
private fun initUI() {
setAddButtonVisible(false)
LayoutInflater.from(requireContext())
.inflate(net.pokeranalytics.android.R.layout.bottom_sheet_grid, view?.bottomSheetContainer, true)
val viewManager = GridLayoutManager(requireContext(), 3)
dataAdapter = TableSizeGridAdapter(dataList)
dataAdapter.onClickOnItem = { position ->
bottomSheetDelegate.onRowValueChangedFromBottomSheet(position + 2, row)
dismiss()
}
val spanCount = 3
val spacing = 2.px
val includeEdge = false
reyclerView.apply {
setHasFixedSize(true)
layoutManager = viewManager
adapter = dataAdapter
addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, includeEdge))
}
}
}
*/
}

@ -4,6 +4,8 @@ import android.content.Context
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.extensions.SessionState
import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
/**
@ -75,11 +77,63 @@ interface Displayable: Localizable {
}
enum class SessionRow : RowRepresentable {
/**
* An enum to display headers as row representable
*/
enum class HeaderRowRepresentable : RowRepresentable {
HEADER_SESSION_DURATION,
HEADER_SESSION_NET_HOURLY_RATE,
HEADER_SESSION_BANKROLL_VARIATION;
override val resId: Int?
get() {
return when (this) {
HEADER_SESSION_DURATION -> R.string.duration
HEADER_SESSION_NET_HOURLY_RATE -> R.string.hour_rate_without_pauses
HEADER_SESSION_BANKROLL_VARIATION -> R.string.bankroll_variation
}
}
override val viewType: Int
get() {
return when (this) {
HEADER_SESSION_DURATION, HEADER_SESSION_NET_HOURLY_RATE, HEADER_SESSION_BANKROLL_VARIATION -> {
RowViewType.HEADER_DOUBLE_VALUES.ordinal
}
}
}
DURATION,
NET_HOURLY_RATE,
BANKROLL_VARIATION,
fun getTitle(context: Context, data: Any) : String {
return when (this) {
HEADER_SESSION_DURATION -> {
if (data is Session) {
if (data.getState() == SessionState.PAUSED) context.getString(R.string.pause) else data.getDuration()
} else {
localizedTitle(context)
}
}
else -> localizedTitle(context)
}
}
fun getAmount(context: Context, data: Any) : Double {
when (this) {
HEADER_SESSION_DURATION -> {
if (data is Session) {
return data.result?.net ?: 0.0
}
}
}
return 0.0
}
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
}
enum class SessionRow : RowRepresentable {
CASHED_OUT,
BUY_IN,
@ -119,7 +173,6 @@ enum class SessionRow : RowRepresentable {
}
SessionState.FINISHED -> {
arrayListOf(
DURATION, NET_HOURLY_RATE, BANKROLL_VARIATION,
CASHED_OUT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT
)
@ -132,7 +185,7 @@ enum class SessionRow : RowRepresentable {
override val needSeparator: Boolean
get() {
return when (this) {
TIPS, BANKROLL_VARIATION -> true
TIPS -> true
else -> false
}
}
@ -141,10 +194,6 @@ enum class SessionRow : RowRepresentable {
get() {
return when (this) {
DURATION -> R.string.duration
NET_HOURLY_RATE -> R.string.hour_rate_without_pauses
BANKROLL_VARIATION -> R.string.bankroll_variation
CASHED_OUT -> R.string.cashed_out
BUY_IN -> R.string.buyin
TIPS -> R.string.tips
@ -164,7 +213,6 @@ enum class SessionRow : RowRepresentable {
override val viewType: Int
get() {
return when (this) {
DURATION, NET_HOURLY_RATE, BANKROLL_VARIATION -> RowViewType.HEADER_TITLE_VALUE.ordinal
CASHED_OUT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal
}

@ -31,6 +31,7 @@ interface BindableHolder {
enum class RowViewType {
HEADER,
HEADER_TITLE_VALUE,
HEADER_DOUBLE_VALUES,
EDIT_TEXT,
TITLE,
TITLE_VALUE,
@ -125,6 +126,23 @@ enum class RowViewType {
}
}
inner class HeaderDoubleValuesViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
if (row is HeaderRowRepresentable) {
itemView.rowHeaderTitleValue_title.text = row.getTitle(itemView.context, adapter.dataSource)
itemView.rowHeaderTitleValue_value.isCurrency = true
when (row) {
HeaderRowRepresentable.HEADER_SESSION_DURATION -> {
itemView.rowHeaderTitleValue_value.amount = row.getAmount(itemView.context, adapter.dataSource)
}
}
}
}
}
inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
@ -201,6 +219,13 @@ enum class RowViewType {
false
)
)
HEADER_DOUBLE_VALUES -> HeaderDoubleValuesViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_header_title_value,
parent,
false
)
)
TITLE_VALUE -> TitleValueViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title_value,

@ -5,7 +5,6 @@ import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import kotlinx.android.synthetic.main.row_session_view.view.*
import net.pokeranalytics.android.R
@ -15,9 +14,10 @@ import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.util.getDayNumber
import net.pokeranalytics.android.util.getShortDayName
import net.pokeranalytics.android.util.toCurrency
/**
* Display a row session
*/
class SessionRowView : FrameLayout {
private lateinit var rowHistorySession: ConstraintLayout
@ -39,8 +39,6 @@ class SessionRowView : FrameLayout {
/**
* Init
*
* @param attrs
*/
private fun init() {
val layoutInflater = LayoutInflater.from(context)
@ -78,7 +76,7 @@ class SessionRowView : FrameLayout {
rowHistorySession.sessionInfoDurationIcon.isVisible = session.timeFrame != null
rowHistorySession.sessionInfoDurationValue.isVisible = session.timeFrame != null
session.timeFrame?.let {
rowHistorySession.sessionInfoDurationValue.text = session.getDuration(context)
rowHistorySession.sessionInfoDurationValue.text = session.getDuration()
}
// Location
@ -106,9 +104,7 @@ class SessionRowView : FrameLayout {
rowHistorySession.playingTitle.isVisible = false
val result = session.result?.netResult ?: 0.0
val resultColor = if (result >= 0.0) R.color.green else R.color.red
rowHistorySession.gameResult.text = result.toCurrency()
rowHistorySession.gameResult.setTextColor(ContextCompat.getColor(context, resultColor))
rowHistorySession.gameResult.amount = result
}
}

@ -21,11 +21,10 @@
android:layout_height="wrap_content"
android:background="@color/gray_darker"
android:elevation="4dp"
android:translationY="-72dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:translationY="0dp">
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/sinceTitle"
@ -102,12 +101,10 @@
android:layout_height="0dp"
android:clipToPadding="false"
android:paddingBottom="96dp"
android:translationY="-72dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/sessionData"
tools:translationY="0dp" />
app:layout_constraintTop_toBottomOf="@+id/sessionData" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -24,7 +24,7 @@
app:layout_constraintTop_toTopOf="parent"
tools:text="Title" />
<androidx.appcompat.widget.AppCompatTextView
<net.pokeranalytics.android.ui.view.PokerAnalyticsTextView
android:id="@+id/rowHeaderTitleValue.value"
style="@style/PokerAnalyticsTheme.TextView.RowValue"
android:layout_width="0dp"
@ -55,10 +55,8 @@
android:orientation="vertical"
app:layout_constraintGuide_end="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:id="@+id/rowHeaderTitleValue.separator"
android:layout_width="match_parent"

@ -151,13 +151,14 @@
app:layout_constraintEnd_toStartOf="@+id/nextArrow"
app:layout_constraintTop_toTopOf="@+id/sessionTitle">
<androidx.appcompat.widget.AppCompatTextView
<net.pokeranalytics.android.ui.view.PokerAnalyticsTextView
android:id="@+id/gameResult"
style="@style/PokerAnalyticsTheme.TextView.SessionRow.Result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
tools:text="$1000"
app:isCurrency="true"
tools:amount="1000"
tools:visibility="visible" />
<androidx.appcompat.widget.AppCompatImageView

@ -63,7 +63,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible">
tools:visibility="gone">
<View
android:layout_width="match_parent"

Loading…
Cancel
Save