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

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

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

@ -95,77 +95,4 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(),
} }
return "UNKNOWN CONTEXT FOR ROW $row" 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.R
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.extensions.SessionState 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 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, fun getTitle(context: Context, data: Any) : String {
NET_HOURLY_RATE, return when (this) {
BANKROLL_VARIATION, 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, CASHED_OUT,
BUY_IN, BUY_IN,
@ -119,7 +173,6 @@ enum class SessionRow : RowRepresentable {
} }
SessionState.FINISHED -> { SessionState.FINISHED -> {
arrayListOf( arrayListOf(
DURATION, NET_HOURLY_RATE, BANKROLL_VARIATION,
CASHED_OUT, BUY_IN, TIPS, CASHED_OUT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT 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 override val needSeparator: Boolean
get() { get() {
return when (this) { return when (this) {
TIPS, BANKROLL_VARIATION -> true TIPS -> true
else -> false else -> false
} }
} }
@ -141,10 +194,6 @@ enum class SessionRow : RowRepresentable {
get() { get() {
return when (this) { 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 CASHED_OUT -> R.string.cashed_out
BUY_IN -> R.string.buyin BUY_IN -> R.string.buyin
TIPS -> R.string.tips TIPS -> R.string.tips
@ -164,7 +213,6 @@ enum class SessionRow : RowRepresentable {
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
DURATION, NET_HOURLY_RATE, BANKROLL_VARIATION -> RowViewType.HEADER_TITLE_VALUE.ordinal
CASHED_OUT, BUY_IN, TIPS, CASHED_OUT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal 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 { enum class RowViewType {
HEADER, HEADER,
HEADER_TITLE_VALUE, HEADER_TITLE_VALUE,
HEADER_DOUBLE_VALUES,
EDIT_TEXT, EDIT_TEXT,
TITLE, TITLE,
TITLE_VALUE, 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), inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder { BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
@ -201,6 +219,13 @@ enum class RowViewType {
false false
) )
) )
HEADER_DOUBLE_VALUES -> HeaderDoubleValuesViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_header_title_value,
parent,
false
)
)
TITLE_VALUE -> TitleValueViewHolder( TITLE_VALUE -> TitleValueViewHolder(
LayoutInflater.from(parent.context).inflate( LayoutInflater.from(parent.context).inflate(
R.layout.row_title_value, R.layout.row_title_value,

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

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

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

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

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

Loading…
Cancel
Save