Add state & field for session + improve UI

dev_raz_wip
Aurelien Hubert 7 years ago
parent 84702e202a
commit 1248aa213e
  1. 10
      app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt
  2. 92
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  3. 8
      app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt
  4. 13
      app/src/main/java/net/pokeranalytics/android/ui/activity/SessionActivity.kt
  5. 8
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/RowRepresentableAdapter.kt
  6. 74
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  7. 67
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  8. 11
      app/src/main/res/layout/fragment_session.xml
  9. 8
      app/src/main/res/layout/row_title_value.xml
  10. 12
      app/src/main/res/values/styles.xml

@ -16,17 +16,25 @@ enum class SessionState {
* For example: STARTED, PAUSED, FINISHED * For example: STARTED, PAUSED, FINISHED
*/ */
fun Session.getState(): SessionState { fun Session.getState(): SessionState {
if (timeFrame == null) {
return SessionState.PENDING
}
val endDate = timeFrame?.endDate val endDate = timeFrame?.endDate
timeFrame?.let {sessionTimeFrame ->
timeFrame?.startDate?.let {startDate -> timeFrame?.startDate?.let {startDate ->
if (startDate > Date()) { if (startDate > Date()) {
return SessionState.PENDING return SessionState.PENDING
} else if (endDate != null) { } else if (endDate != null) {
return SessionState.FINISHED return SessionState.FINISHED
} else if (isPaused) { } else if (sessionTimeFrame.paused) {
return SessionState.PAUSED return SessionState.PAUSED
} else { } else {
return SessionState.STARTED return SessionState.STARTED
} }
} }
}
return SessionState.INVALID return SessionState.INVALID
} }

@ -7,6 +7,8 @@ import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.SessionInterface import net.pokeranalytics.android.calculus.SessionInterface
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.getState
import net.pokeranalytics.android.ui.adapter.components.LiveDataDataSource import net.pokeranalytics.android.ui.adapter.components.LiveDataDataSource
import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData
@ -88,17 +90,70 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
// The features of the tournament, like Knockout, Shootout, Turbo... // The features of the tournament, like Knockout, Shootout, Turbo...
var tournamentFeatures: RealmList<TournamentFeature> = RealmList() var tournamentFeatures: RealmList<TournamentFeature> = RealmList()
var isPaused: Boolean = false /**
* Start a session
*/
fun startSession() {
realm.executeTransaction {
when (getState()) {
SessionState.PENDING -> {
val sessionTimeFrame = this.timeFrame ?: realm.createObject(TimeFrame::class.java)
sessionTimeFrame.setDate(Date(), null)
this.timeFrame = sessionTimeFrame
}
SessionState.PAUSED -> {
this.timeFrame?.paused = false
}
else -> {
}
}
}
}
companion object { /**
* Pause a session
*/
fun pauseSession() {
realm.executeTransaction {
when (getState()) {
SessionState.STARTED -> {
this.timeFrame?.paused = true
}
}
}
}
/**
* Stop a session
*/
fun stopSession() {
realm.executeTransaction {
when (getState()) {
SessionState.STARTED, SessionState.PAUSED -> {
this.timeFrame?.paused = false
this.timeFrame?.setDate(null, Date())
}
}
}
}
/**
* Delete the object from realm
* TODO: Cascade delete?
*/
fun delete() {
realm.executeTransaction {
deleteFromRealm()
}
}
companion object {
fun newInstance(): Session { fun newInstance(): Session {
var session: Session = Session() var session: Session = Session()
session.result = Result() session.result = Result()
session.timeFrame = TimeFrame() session.timeFrame = TimeFrame()
return session return session
} }
} }
@Ignore // SessionInterface value @Ignore // SessionInterface value
@ -137,7 +192,7 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
override fun adapterRows(): ArrayList<RowRepresentable> { override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.addAll(SessionRow.values()) rows.addAll(SessionRow.getRowsForState(getState()))
return rows return rows
} }
@ -180,10 +235,22 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
data.add(BottomSheetData(game, inputType = InputType.TYPE_NULL, data = LiveData.GAME.items(realm))) data.add(BottomSheetData(game, inputType = InputType.TYPE_NULL, data = LiveData.GAME.items(realm)))
} }
SessionRow.LOCATION -> { SessionRow.LOCATION -> {
data.add(BottomSheetData(location, inputType = InputType.TYPE_NULL, data = LiveData.LOCATION.items(realm))) data.add(
BottomSheetData(
location,
inputType = InputType.TYPE_NULL,
data = LiveData.LOCATION.items(realm)
)
)
} }
SessionRow.BANKROLL -> { SessionRow.BANKROLL -> {
data.add(BottomSheetData(bankroll, inputType = InputType.TYPE_NULL, data = LiveData.BANKROLL.items(realm))) data.add(
BottomSheetData(
bankroll,
inputType = InputType.TYPE_NULL,
data = LiveData.BANKROLL.items(realm)
)
)
} }
SessionRow.BLINDS -> { SessionRow.BLINDS -> {
data.add(BottomSheetData(cgSmallBlind, R.string.smallblind, InputType.TYPE_CLASS_NUMBER)) data.add(BottomSheetData(cgSmallBlind, R.string.smallblind, InputType.TYPE_CLASS_NUMBER))
@ -205,8 +272,16 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
SessionRow.LOCATION -> location = value as Location? SessionRow.LOCATION -> location = value as Location?
SessionRow.COMMENT -> comment = value as String? ?: "" SessionRow.COMMENT -> comment = value as String? ?: ""
SessionRow.BLINDS -> if (value is ArrayList<*>) { SessionRow.BLINDS -> if (value is ArrayList<*>) {
cgSmallBlind = try {(value[0] as String? ?: "0").toDouble()} catch (e:Exception) {null} cgSmallBlind = try {
cgBigBlind = try {(value[1] as String? ?: "0").toDouble()} catch (e:Exception) {null} (value[0] as String? ?: "0").toDouble()
} catch (e: Exception) {
null
}
cgBigBlind = try {
(value[1] as String? ?: "0").toDouble()
} catch (e: Exception) {
null
}
} }
//TODO: Update //TODO: Update
SessionRow.START_DATE -> if (value is Date) { SessionRow.START_DATE -> if (value is Date) {
@ -227,6 +302,7 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
} }
realm.commitTransaction() realm.commitTransaction()
} }
} }
enum class TournamentKind { enum class TournamentKind {

@ -50,7 +50,7 @@ open class TimeFrame : RealmObject() {
@Ignore @Ignore
var session: Session? = null var session: Session? = null
get() = this.sessions?.first() //get() = this.sessions?.first() ?: null
// Group // Group
@LinkingObjects("timeFrame") @LinkingObjects("timeFrame")
@ -60,8 +60,12 @@ open class TimeFrame : RealmObject() {
var set: SessionSet? = null var set: SessionSet? = null
get() = this.sets?.first() get() = this.sets?.first()
fun setDate(startDate: Date, endDate: Date?) { fun setDate(startDate: Date?, endDate: Date?) {
startDate?.let {
this.startDate = startDate this.startDate = startDate
}
this.endDate = endDate this.endDate = endDate
this.computeDuration() this.computeDuration()

@ -10,16 +10,21 @@ import net.pokeranalytics.android.ui.fragment.SessionFragment
class SessionActivity: PokerAnalyticsActivity() { class SessionActivity: PokerAnalyticsActivity() {
enum class IntentKey(val keyName : String) {
IS_TOURNAMENT("IS_TOURNAMENT"),
SESSION_ID("SESSION_ID");
}
companion object { companion object {
fun newInstance(context: Context, isTournament: Boolean? = false, sessionId: String? = "") { fun newInstance(context: Context, isTournament: Boolean? = false, sessionId: String? = "") {
val intent = Intent(context, SessionActivity::class.java) val intent = Intent(context, SessionActivity::class.java)
isTournament?.let { isTournament?.let {
intent.putExtra("is_tournament", isTournament) intent.putExtra(IntentKey.IS_TOURNAMENT.keyName, isTournament)
} }
sessionId?.let { sessionId?.let {
intent.putExtra("session_id", sessionId) intent.putExtra(IntentKey.SESSION_ID.keyName, sessionId)
} }
context.startActivity(intent) context.startActivity(intent)
@ -38,8 +43,8 @@ class SessionActivity: PokerAnalyticsActivity() {
* Init UI * Init UI
*/ */
private fun initUI() { private fun initUI() {
val sessionId = intent.getStringExtra("session_id") val sessionId = intent.getStringExtra(IntentKey.SESSION_ID.keyName)
val isTournament = intent.getBooleanExtra("is_tournament", false) val isTournament = intent.getBooleanExtra(IntentKey.IS_TOURNAMENT.keyName, false)
val fragment = newSessionFragment as SessionFragment val fragment = newSessionFragment as SessionFragment
fragment.setData(isTournament, sessionId) fragment.setData(isTournament, sessionId)
} }

@ -85,4 +85,12 @@ class RowRepresentableAdapter(var rowRepresentableDataSource: RowRepresentableDa
} }
} }
/**
* Refresh all adapter rows
*/
fun refreshAllRows() {
this.rows = rowRepresentableDataSource.adapterRows()
notifyDataSetChanged()
}
} }

@ -3,11 +3,14 @@ package net.pokeranalytics.android.ui.fragment
import android.os.Bundle import android.os.Bundle
import android.view.* import android.view.*
import android.widget.Toast import android.widget.Toast
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.kotlin.where import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_session.* import kotlinx.android.synthetic.main.fragment_session.*
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.getState
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
@ -20,6 +23,7 @@ import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheet
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SessionRow import net.pokeranalytics.android.ui.view.SessionRow
import net.pokeranalytics.android.util.toast import net.pokeranalytics.android.util.toast
import timber.log.Timber
import java.util.* import java.util.*
class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, BottomSheetDelegate { class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, BottomSheetDelegate {
@ -44,7 +48,10 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
override fun onOptionsItemSelected(item: MenuItem?): Boolean { override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item!!.itemId) { when (item!!.itemId) {
R.id.restart -> toast("Restard is clicked!") R.id.restart -> toast("Restard is clicked!")
R.id.delete -> toast("Delete is clicked!") R.id.delete -> {
currentSession.delete()
activity?.finish()
}
} }
return true return true
} }
@ -97,6 +104,10 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
private fun initUI() { private fun initUI() {
val activity = activity as PokerAnalyticsActivity val activity = activity as PokerAnalyticsActivity
// Avoid a bug during setting the title
toolbar.title = ""
activity.setSupportActionBar(toolbar) activity.setSupportActionBar(toolbar)
activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) activity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
setHasOptionsMenu(true) setHasOptionsMenu(true)
@ -113,23 +124,78 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
bottomAppBar.setOnMenuItemClickListener { item -> bottomAppBar.setOnMenuItemClickListener { item ->
when (item.itemId) { when (item.itemId) {
R.id.stop -> toast("Stop is clicked!") R.id.stop -> {
currentSession.stopSession()
updateSessionUI()
}
} }
false false
} }
floatingActionButton.setExpanded(false)
floatingActionButton.setOnClickListener { floatingActionButton.setOnClickListener {
manageSessionState()
}
}
/**
* Update the UI with the session data
* Should be called after the initialization of the session
*/
private fun updateSessionUI() {
when (currentSession.getState()) {
SessionState.PENDING -> {
floatingActionButton.setImageResource(R.drawable.ic_outline_play)
bottomAppBar.menu.findItem(R.id.stop).isVisible = false
}
SessionState.STARTED -> {
floatingActionButton.setImageResource(R.drawable.ic_outline_pause) floatingActionButton.setImageResource(R.drawable.ic_outline_pause)
bottomAppBar.menu.findItem(R.id.stop).isVisible = true bottomAppBar.menu.findItem(R.id.stop).isVisible = true
} }
SessionState.PAUSED -> {
floatingActionButton.setImageResource(R.drawable.ic_outline_play)
bottomAppBar.menu.findItem(R.id.stop).isVisible = true
}
SessionState.FINISHED -> {
bottomAppBar.menu.findItem(R.id.stop).isVisible = false
floatingActionButton.animate()
.scaleX(0f)
.scaleY(0f)
.alpha(0f)
.setInterpolator(FastOutSlowInInterpolator())
.start()
}
}
sessionAdapter.refreshAllRows()
}
/**
* Update the state of the session (start / pause)
*/
private fun manageSessionState() {
when (currentSession.getState()) {
SessionState.PENDING -> {
currentSession.startSession()
}
SessionState.STARTED -> {
currentSession.pauseSession()
}
SessionState.PAUSED -> {
currentSession.startSession()
}
}
updateSessionUI()
} }
/** /**
* Set fragment data * Set fragment data
*/ */
fun setData(isTournament: Boolean, sessionId: String) { fun setData(isTournament: Boolean, sessionId: String) {
toolbar.title = if (isTournament) "Tournament" else "Cash game" toolbar.title = if (isTournament) getString(R.string.tournament) else getString(R.string.cash_game)
val realm = getRealm() val realm = getRealm()
val sessionRealm = realm.where<Session>().equalTo("id", sessionId).findFirst() val sessionRealm = realm.where<Session>().equalTo("id", sessionId).findFirst()
@ -144,6 +210,8 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
sessionAdapter = RowRepresentableAdapter(currentSession, this) sessionAdapter = RowRepresentableAdapter(currentSession, this)
recyclerView.adapter = sessionAdapter recyclerView.adapter = sessionAdapter
updateSessionUI()
Timber.d("Session state: ${currentSession.getState()}")
} }
} }

@ -3,6 +3,7 @@ package net.pokeranalytics.android.ui.view
import android.content.Context 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.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
/** /**
@ -52,32 +53,89 @@ interface RowRepresentable {
} }
enum class SessionRow : RowRepresentable { enum class SessionRow : RowRepresentable {
DURATION,
NET_HOURLY_RATE,
BANKROLL_VARIATION,
CASHED_OUT,
BUY_IN,
TIPS,
GAME, GAME,
BLINDS, BLINDS,
LOCATION, LOCATION,
BANKROLL, BANKROLL,
TABLE_SIZE,
START_DATE, START_DATE,
END_DATE, END_DATE,
BREAK_TIME,
COMMENT; COMMENT;
companion object {
/**
* Return the rows to display for the current session state
*/
fun getRowsForState(sessionState: SessionState): ArrayList<RowRepresentable> {
return when (sessionState) {
SessionState.PENDING -> {
arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE)
}
SessionState.STARTED -> {
arrayListOf(
CASHED_OUT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT
)
}
SessionState.PAUSED -> {
arrayListOf(
CASHED_OUT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT
)
}
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
)
}
else -> arrayListOf()
}
}
}
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {
BLINDS -> R.string.blinds
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
GAME -> R.string.game GAME -> R.string.game
BLINDS -> R.string.blinds
LOCATION -> R.string.location LOCATION -> R.string.location
BANKROLL -> R.string.bankroll BANKROLL -> R.string.bankroll
COMMENT -> R.string.comment TABLE_SIZE -> R.string.table_size
START_DATE -> R.string.start_date START_DATE -> R.string.start_date
END_DATE -> R.string.end_date END_DATE -> R.string.end_date
BREAK_TIME -> R.string.break_time
COMMENT -> R.string.comment
} }
} }
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
BLINDS, GAME, BANKROLL, LOCATION, COMMENT -> RowViewType.TITLE_VALUE.ordinal DURATION, NET_HOURLY_RATE, BANKROLL_VARIATION,
START_DATE, END_DATE -> RowViewType.TITLE_VALUE_ACTION.ordinal CASHED_OUT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal
} }
} }
@ -96,6 +154,7 @@ enum class SessionRow : RowRepresentable {
enum class SimpleRow : RowRepresentable { enum class SimpleRow : RowRepresentable {
NAME; NAME;
override val resId: Int? = R.string.name override val resId: Int? = R.string.name
override val viewType: Int = RowViewType.TITLE_VALUE.ordinal override val viewType: Int = RowViewType.TITLE_VALUE.ordinal
override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT

@ -19,6 +19,8 @@
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:paddingBottom="96dp"
android:clipToPadding="false"
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"
@ -57,11 +59,12 @@
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.bottomappbar.BottomAppBar <com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottomAppBar" android:id="@+id/bottomAppBar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:fabAlignmentMode="center"
android:background="@color/red"
android:theme="@style/PokerAnalyticsTheme.BottomAppBar" android:theme="@style/PokerAnalyticsTheme.BottomAppBar"
android:layout_gravity="bottom" /> android:layout_gravity="bottom" />
@ -69,7 +72,9 @@
android:id="@+id/floatingActionButton" android:id="@+id/floatingActionButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/ic_outline_play" android:layout_gravity="bottom|center"
app:layout_anchor="@id/bottomAppBar" /> android:layout_marginBottom="28dp"
android:elevation="16dp"
android:src="@drawable/ic_outline_play" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

@ -6,8 +6,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?selectableItemBackground" android:background="?selectableItemBackground"
android:paddingStart="24dp" android:paddingStart="16dp"
android:paddingEnd="24dp"> android:paddingEnd="16dp">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title" android:id="@+id/title"
@ -15,7 +15,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
android:textSize="18sp" style="@style/PokerAnalyticsTheme.TextView.RowTitle"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -30,7 +30,7 @@
android:ellipsize="end" android:ellipsize="end"
android:gravity="end" android:gravity="end"
android:maxLines="1" android:maxLines="1"
android:textSize="14sp" style="@style/PokerAnalyticsTheme.TextView.RowValue"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/title" app:layout_constraintStart_toEndOf="@+id/title"

@ -80,13 +80,19 @@
<item name="android:paddingTop">8dp</item> <item name="android:paddingTop">8dp</item>
</style> </style>
<style name="PokerAnalyticsTheme.TextView.TitleRow"> <style name="PokerAnalyticsTheme.TextView.RowTitle">
<item name="android:textSize">16sp</item> <item name="android:textSize">16sp</item>
<item name="android:textColor">@color/gray_darker</item> <item name="android:textColor">@color/white</item>
<item name="android:fontFamily">@font/roboto</item>
</style>
<style name="PokerAnalyticsTheme.TextView.RowValue">
<item name="android:textSize">16sp</item>
<item name="android:textColor">@color/kaki_lighter</item>
<item name="android:fontFamily">@font/roboto</item> <item name="android:fontFamily">@font/roboto</item>
<item name="android:paddingTop">8dp</item>
</style> </style>
<!-- EditText --> <!-- EditText -->
<style name="PokerAnalyticsTheme.EditText" parent="Widget.AppCompat.EditText"> <style name="PokerAnalyticsTheme.EditText" parent="Widget.AppCompat.EditText">
<item name="android:textColor">@color/white</item> <item name="android:textColor">@color/white</item>

Loading…
Cancel
Save