Merge branch 'master' of gitlab.com:stax-river/poker-analytics

feature/top10
Laurent 7 years ago
commit 57f9d4cfab
  1. 3
      app/build.gradle
  2. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
  3. 107
      app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
  4. 23
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
  6. 38
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt
  7. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  8. 5
      app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt
  9. 19
      app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt
  10. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt
  11. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  12. 20
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt
  13. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
  14. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt
  15. 55
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  16. 4
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt
  17. 229
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt
  18. 17
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt
  19. 14
      app/src/main/java/net/pokeranalytics/android/util/Global.kt
  20. 51
      app/src/main/java/net/pokeranalytics/android/util/UIExtensions.kt
  21. BIN
      app/src/main/res/drawable-xxhdpi/add_tournament.png
  22. BIN
      app/src/main/res/drawable-xxhdpi/add_tournoi.png
  23. 6
      app/src/main/res/layout/fragment_history.xml
  24. 84
      app/src/main/res/layout/row_follow_us.xml
  25. 0
      app/src/main/res/layout/row_header_title.xml
  26. 2
      app/src/main/res/layout/row_session_view.xml
  27. 3
      app/src/main/res/layout/row_stats_title_value.xml
  28. 2
      app/src/main/res/layout/row_title.xml
  29. 47
      app/src/main/res/layout/row_title_arrow.xml
  30. 2
      app/src/main/res/layout/row_title_value.xml
  31. 2
      app/src/main/res/layout/row_title_value_action.xml
  32. 2
      app/src/main/res/values/colors.xml
  33. 7
      app/src/main/res/values/styles.xml

@ -44,13 +44,14 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// Android
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.1.0-alpha04'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
implementation 'androidx.browser:browser:1.0.0'
// Places
implementation 'com.google.android.libraries.places:places:1.0.0'

@ -49,7 +49,7 @@ open class Bankroll(name: String = "") : RealmObject(), Savable,
// Row Representable Datasource
override fun adapterRows(): List<out RowRepresentable>? {
override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
rows.addAll(BankrollRow.values())

@ -11,69 +11,68 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import java.util.*
import kotlin.collections.ArrayList
open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource,
RowRepresentable {
open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable {
@PrimaryKey
var id = UUID.randomUUID().toString()
@PrimaryKey
var id = UUID.randomUUID().toString()
// The name of the game
var name: String = ""
// The name of the game
var name: String = ""
// A shorter name for the game
var shortName: String? = null
// A shorter name for the game
var shortName: String? = null
override fun getDisplayName(): String {
return this.name
}
override fun getDisplayName(): String {
return this.name
}
override fun uniqueIdentifier(): String {
return this.id
}
override fun uniqueIdentifier(): String {
return this.id
}
override fun adapterRows(): List<out RowRepresentable>? {
val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
rows.addAll(GameRow.values())
return rows
}
override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
rows.addAll(GameRow.values())
return rows
}
override fun stringForRow(row: RowRepresentable): String {
return when (row) {
SimpleRow.NAME -> this.name
GameRow.SHORT_NAME -> this.shortName?:""
else -> return super.stringForRow(row)
}
}
override fun stringForRow(row: RowRepresentable): String {
return when (row) {
SimpleRow.NAME -> this.name
GameRow.SHORT_NAME -> this.shortName ?: ""
else -> return super.stringForRow(row)
}
}
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor> {
val data = java.util.ArrayList<RowRepresentableEditDescriptor>()
when (row) {
SimpleRow.NAME -> data.add(
RowRepresentableEditDescriptor(
this.name,
SimpleRow.NAME.resId
)
)
GameRow.SHORT_NAME -> data.add(
RowRepresentableEditDescriptor(
this.shortName,
GameRow.SHORT_NAME.resId
)
)
}
return data
}
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor> {
val data = java.util.ArrayList<RowRepresentableEditDescriptor>()
when (row) {
SimpleRow.NAME -> data.add(
RowRepresentableEditDescriptor(
this.name,
SimpleRow.NAME.resId
)
)
GameRow.SHORT_NAME -> data.add(
RowRepresentableEditDescriptor(
this.shortName,
GameRow.SHORT_NAME.resId
)
)
}
return data
}
override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) {
SimpleRow.NAME -> this.name = value as String? ?: ""
GameRow.SHORT_NAME -> this.shortName = value as String
}
}
override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) {
SimpleRow.NAME -> this.name = value as String? ?: ""
GameRow.SHORT_NAME -> this.shortName = value as String
}
}
override fun isValidForSave(): Boolean {
return this.name.isNotEmpty()
}
override fun isValidForSave(): Boolean {
return this.name.isNotEmpty()
}
}

@ -314,7 +314,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
return "Session ${this.creationDate}"
}
override fun adapterRows(): List<out RowRepresentable>? {
override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>()
// Headers
@ -365,7 +365,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
}
// Rows
rows.addAll(SessionRow.getRows(type, getState()))
rows.addAll(SessionRow.getRows(this))
return rows
}
@ -379,7 +379,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
SessionRow.BLINDS -> getBlinds()
SessionRow.BREAK_TIME -> timeFrame?.breakDuration?.toMinutes() ?: "--"
SessionRow.BUY_IN -> buyin.toCurrency()
SessionRow.CASHED_OUT, SessionRow.PRIZE -> result?.cashout?.toCurrency() ?: "--"
SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> result?.cashout?.toCurrency() ?: "--"
SessionRow.COMMENT -> if (comment.isNotEmpty()) comment else "--"
SessionRow.END_DATE -> if (timeFrame != null) timeFrame?.endDate?.shortDateTime() ?: "--" else "--"
SessionRow.GAME -> getGameTitle()
@ -464,12 +464,13 @@ open class Session : RealmObject(), SessionInterface, Savable,
)
)
}
SessionRow.CASHED_OUT, SessionRow.PRIZE -> {
SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> {
data.add(
RowRepresentableEditDescriptor(
result?.cashout?.round(),
inputType = InputType.TYPE_CLASS_NUMBER
or InputType.TYPE_NUMBER_FLAG_DECIMAL
or InputType.TYPE_NUMBER_FLAG_SIGNED
)
)
}
@ -563,9 +564,19 @@ open class Session : RealmObject(), SessionInterface, Savable,
localResult.buyin = value as Double?
result = localResult
}
SessionRow.CASHED_OUT, SessionRow.PRIZE -> {
SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> {
val localResult = if (result != null) result as Result else realm.createObject(Result::class.java)
localResult.cashout = if (value == null) null else (value as String).toDouble()
if (value == null) {
localResult.cashout = null
} else {
localResult.cashout = (value as String).toDouble()
val timeFrameToUpdate =
if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java)
timeFrameToUpdate.setDate(null, Date())
timeFrame = timeFrameToUpdate
}
result = localResult
}
SessionRow.COMMENT -> comment = value as String? ?: ""

@ -28,7 +28,7 @@ open class TournamentFeature : RealmObject(), Savable, StaticRowRepresentableDat
return this.id
}
override fun adapterRows(): List<out RowRepresentable>? {
override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
rows.addAll(TournamentFeatureRow.values())

@ -3,13 +3,15 @@ package net.pokeranalytics.android.model.realm
import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import java.util.*
import kotlin.collections.ArrayList
open class TournamentType : RealmObject(), Savable, RowRepresentable {
open class TournamentType : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable {
@PrimaryKey
var id = UUID.randomUUID().toString()
@ -31,4 +33,36 @@ open class TournamentType : RealmObject(), Savable, RowRepresentable {
}
}
override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
//rows.addAll(TournamentType.values())
return rows
}
override fun stringForRow(row: RowRepresentable): String {
return when (row) {
SimpleRow.NAME -> this.name
else -> return super.stringForRow(row)
}
}
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor> {
val data = java.util.ArrayList<RowRepresentableEditDescriptor>()
when (row) {
SimpleRow.NAME -> data.add(
RowRepresentableEditDescriptor(
this.name,
SimpleRow.NAME.resId
)
)
}
return data
}
override fun isValidForSave(): Boolean {
return this.name.isNotEmpty()
}
}

@ -38,7 +38,7 @@ open class TransactionType : RealmObject(), Savable, StaticRowRepresentableDataS
return this.id
}
override fun adapterRows(): List<out RowRepresentable>? {
override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
rows.addAll(TransactionTypeRow.values())

@ -4,7 +4,6 @@ import android.content.Context
import net.pokeranalytics.android.calculus.TextFormat
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import org.w3c.dom.Text
/**
* Base Interface to provide the RowRepresentable to the adapter
@ -14,7 +13,7 @@ interface RowRepresentableDataSource: EditableDataSource, DisplayableDataSource
/**
* Returns a prebuild list of rows
*/
fun adapterRows(): List<out RowRepresentable>?
fun adapterRows(): List<RowRepresentable>?
/**
* Returns a [RowRepresentable] at position [Int]
@ -74,7 +73,7 @@ interface StaticRowRepresentableDataSource: RowRepresentableDataSource {
* To do that, this interface overrides and provides a default implementation to specific methods of [RowRepresentableDataSource]
*/
interface LiveRowRepresentableDataSource: RowRepresentableDataSource {
override fun adapterRows(): List<out RowRepresentable>? {
override fun adapterRows(): List<RowRepresentable>? {
return null
}
}

@ -14,15 +14,19 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.model.realm.Game
import net.pokeranalytics.android.model.realm.Location
import net.pokeranalytics.android.model.realm.TournamentType
import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.helpers.PlacePickerManager
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.helpers.PlacePickerManager
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow
@ -137,10 +141,21 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate,
finishActivityWithResult(uniqueIdentifier)
}
} else {
val message = when(item) {
is Bankroll -> R.string.empty_name_for_br_error
is Location -> R.string.location_empty_field_error
is Game -> R.string.location_empty_field_error
is TournamentType -> R.string.tt_empty_field_error
//is TransactionType -> R.string.operation_type_empty_field_error
else -> throw IllegalStateException("Need to manage ${item::class.java} error")
}
val builder = AlertDialog.Builder(requireContext())
.setMessage(R.string.empty_name_for_br_error)
.setMessage(message)
.setNegativeButton(R.string.ok, null)
builder.show()
}
}

@ -127,7 +127,7 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource
if (!calendar.isSameDay(currentCalendar) || index == 0) {
calendar.time = currentCalendar.time
val header = HeaderRowRepresentable(
customViewType = RowViewType.HEADER_SESSION,
customViewType = RowViewType.HEADER_TITLE,
title = session.creationDate.longDate()
)
rows.add(header)
@ -136,7 +136,7 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource
if (!calendar.isSameMonth(currentCalendar) || index == 0) {
calendar.time = currentCalendar.time
val header = HeaderRowRepresentable(
customViewType = RowViewType.HEADER_SESSION,
customViewType = RowViewType.HEADER_TITLE,
title = session.creationDate.getMonthAndYear()
)
rows.add(header)
@ -165,8 +165,8 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource
}
override fun viewTypeForPosition(position: Int): Int {
return if (rows[position].viewType == RowViewType.HEADER_SESSION.ordinal) {
RowViewType.HEADER_SESSION.ordinal
return if (rows[position].viewType == RowViewType.HEADER_TITLE.ordinal) {
RowViewType.HEADER_TITLE.ordinal
} else {
RowViewType.ROW_SESSION.ordinal
}

@ -104,7 +104,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
currentSession.updateValue(value, row)
sessionAdapter.refreshRow(row)
when (row) {
SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.BUY_IN, SessionRow.TIPS,
SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT, SessionRow.BUY_IN, SessionRow.TIPS,
SessionRow.START_DATE, SessionRow.END_DATE -> updateSessionUI()
}
}

@ -10,15 +10,19 @@ import kotlinx.android.synthetic.main.fragment_settings.*
import net.pokeranalytics.android.BuildConfig
import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.activity.DataListActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow
import net.pokeranalytics.android.util.*
class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, StaticRowRepresentableDataSource {
private lateinit var parentActivity: PokerAnalyticsActivity
companion object {
/**
@ -60,6 +64,20 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) {
SettingRow.RATE_APP -> parentActivity.openPlayStorePage()
SettingRow.CONTACT_US -> parentActivity.openContactMail()
SettingRow.BUG_REPORT -> Toast.makeText(requireContext(), "Bug report", Toast.LENGTH_SHORT).show()
SettingRow.FOLLOW_US -> {
when(position) {
0 -> parentActivity.openUrl(BLOG)
1 -> parentActivity.openUrl(INSTAGRAM)
2 -> parentActivity.openUrl(TWITTER)
3 -> parentActivity.openUrl(FACEBOOK)
}
}
SettingRow.CURRENCY -> Toast.makeText(requireContext(), "Currency", Toast.LENGTH_SHORT).show()
SettingRow.PRIVACY_POLICY -> parentActivity.openUrl(URL_PRIVACY_POLICY)
SettingRow.TERMS_OF_USE -> parentActivity.openUrl(URL_TERMS)
SettingRow.GDPR -> Toast.makeText(requireContext(), "Show GDPR", Toast.LENGTH_SHORT).show()
}
@ -73,6 +91,8 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta
*/
private fun initData() {
parentActivity = activity as PokerAnalyticsActivity
val viewManager = LinearLayoutManager(requireContext())
settingsAdapterRow = RowRepresentableAdapter(
this, this

@ -52,7 +52,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
// Row Representable DS
override fun adapterRows(): List<out RowRepresentable>? {
override fun adapterRows(): List<RowRepresentable>? {
return this.rowRepresentables
}
@ -141,7 +141,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
val rows: ArrayList<RowRepresentable> = ArrayList()
results.forEach { results ->
rows.add(HeaderRowRepresentable(RowViewType.TITLE, title = results.group.name))
rows.add(HeaderRowRepresentable(title = results.group.name))
results.group.stats?.forEach { stat ->
rows.add(StatRepresentable(stat, results.computedStat(stat)))
}

@ -72,7 +72,7 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(),
}
}
override fun adapterRows(): List<out RowRepresentable>? {
override fun adapterRows(): List<RowRepresentable>? {
return TableSize.all
}

@ -3,15 +3,16 @@ package net.pokeranalytics.android.ui.view
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.row_bottom_sheet_grid_title.view.*
import kotlinx.android.synthetic.main.row_bottom_sheet_title.view.*
import kotlinx.android.synthetic.main.row_header_title.view.*
import kotlinx.android.synthetic.main.row_header_title_amount.view.*
import kotlinx.android.synthetic.main.row_header_title_value.view.*
import kotlinx.android.synthetic.main.row_history_session.view.*
import kotlinx.android.synthetic.main.row_history_session_header.view.*
import kotlinx.android.synthetic.main.row_stats_title_value.view.*
import kotlinx.android.synthetic.main.row_title.view.*
import kotlinx.android.synthetic.main.row_title_switch.view.*
@ -28,21 +29,19 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentabl
* An interface used to factor the configuration of RecyclerView.ViewHolder
*/
interface BindableHolder {
fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
}
}
enum class RowViewType {
HEADER,
HEADER_TITLE_VALUE,
HEADER_TITLE_AMOUNT,
HEADER_TITLE_AMOUNT_BIG,
HEADER_SESSION,
HEADER_TITLE,
EDIT_TEXT,
TITLE,
TITLE_ARROW,
TITLE_VALUE,
TITLE_VALUE_ACTION,
TITLE_SWITCH,
@ -51,6 +50,7 @@ enum class RowViewType {
TITLE_GRID,
ROW_SESSION,
BUTTON,
FOLLOW_US,
STAT;
/**
@ -86,6 +86,13 @@ enum class RowViewType {
false
)
)
TITLE_ARROW -> TitleViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title_arrow,
parent,
false
)
)
TITLE_VALUE -> TitleValueViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title_value,
@ -128,10 +135,10 @@ enum class RowViewType {
false
)
)
HEADER_SESSION -> {
HEADER_TITLE -> {
HeaderSessionViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_history_session_header,
R.layout.row_header_title,
parent,
false
)
@ -153,6 +160,15 @@ enum class RowViewType {
)
)
}
FOLLOW_US -> {
FollowUsViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_follow_us,
parent,
false
)
)
}
STAT -> StatsTitleValueViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_stats_title_value,
@ -168,12 +184,12 @@ enum class RowViewType {
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.rowHeaderTitleValue_title.text = row.localizedTitle(itemView.context)
adapter.dataSource?.let {
adapter.dataSource.let {
itemView.rowHeaderTitleValue_value.text = it.stringForRow(row, itemView.context)
}
// val listener = View.OnClickListener {
// adapter.delegate?.onRowSelected(position, row)
// }
//val listener = View.OnClickListener {
// adapter.delegate?.onRowSelected(position, row)
//}
//itemView.rowHeaderTitleValue_container.setOnClickListener(listener)
itemView.rowHeaderTitleValue_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE
}
@ -228,6 +244,23 @@ enum class RowViewType {
}
}
inner class FollowUsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.findViewById<AppCompatImageView>(R.id.icon1).setOnClickListener {
adapter.delegate?.onRowSelected(0, row)
}
itemView.findViewById<AppCompatImageView>(R.id.icon2).setOnClickListener {
adapter.delegate?.onRowSelected(1, row)
}
itemView.findViewById<AppCompatImageView>(R.id.icon3).setOnClickListener {
adapter.delegate?.onRowSelected(2, row)
}
itemView.findViewById<AppCompatImageView>(R.id.icon4).setOnClickListener {
adapter.delegate?.onRowSelected(3, row)
}
}
}
inner class StatsTitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {

@ -8,7 +8,7 @@ import net.pokeranalytics.android.ui.view.RowViewType
* A class to display headers as row representable
*/
class HeaderRowRepresentable(
var customViewType: RowViewType? = RowViewType.HEADER,
var customViewType: RowViewType? = RowViewType.HEADER_TITLE,
override var resId: Int? = null,
var title: String? = null,
var value: String? = null
@ -26,6 +26,6 @@ class HeaderRowRepresentable(
}
override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER.ordinal
override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER_TITLE.ordinal
}

@ -2,6 +2,7 @@ package net.pokeranalytics.android.ui.view.rowrepresentable
import net.pokeranalytics.android.R
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.view.RowRepresentable
@ -10,121 +11,131 @@ import net.pokeranalytics.android.ui.view.RowViewType
enum class SessionRow : RowRepresentable {
PRIZE,
CASHED_OUT,
INITIAL_BUY_IN,
BUY_IN,
POSITION,
PLAYERS,
TIPS,
PRIZE,
CASHED_OUT,
NET_RESULT,
INITIAL_BUY_IN,
BUY_IN,
POSITION,
PLAYERS,
TIPS,
GAME,
BLINDS,
LOCATION,
BANKROLL,
TABLE_SIZE,
TOURNAMENT_TYPE,
START_DATE,
END_DATE,
GAME,
BLINDS,
LOCATION,
BANKROLL,
TABLE_SIZE,
TOURNAMENT_TYPE,
START_DATE,
END_DATE,
BREAK_TIME,
COMMENT;
BREAK_TIME,
COMMENT;
companion object {
/**
* Return the rows to display for the current session state
*/
fun getRows(type: Int, sessionState: SessionState): ArrayList<RowRepresentable> {
when (type) {
Session.Type.TOURNAMENT.ordinal -> {
return when (sessionState) {
SessionState.PENDING, SessionState.PLANNED -> {
arrayListOf(
GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE,
START_DATE, END_DATE
)
}
SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> {
arrayListOf(
PRIZE, BUY_IN, POSITION, PLAYERS, TIPS,
GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE,
START_DATE, END_DATE, BREAK_TIME, COMMENT
)
}
else -> arrayListOf()
}
}
Session.Type.CASH_GAME.ordinal -> {
return when (sessionState) {
SessionState.PENDING, SessionState.PLANNED -> {
arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE)
}
SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> {
arrayListOf(
CASHED_OUT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT
)
}
else -> arrayListOf()
}
}
}
return arrayListOf()
}
}
companion object {
/**
* Return the rows to display for the current session state
*/
fun getRows(session: Session): ArrayList<RowRepresentable> {
when (session.type) {
Session.Type.TOURNAMENT.ordinal -> {
return when (session.getState()) {
SessionState.PENDING, SessionState.PLANNED -> {
arrayListOf(
GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE,
START_DATE, END_DATE
)
}
SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> {
arrayListOf(
PRIZE, BUY_IN, POSITION, PLAYERS, TIPS,
GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE,
START_DATE, END_DATE, BREAK_TIME, COMMENT
)
}
else -> arrayListOf()
}
}
Session.Type.CASH_GAME.ordinal -> {
when (session.getState()) {
SessionState.PENDING, SessionState.PLANNED -> {
return arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE)
}
SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> {
val liveBankroll = session.bankroll?.live ?: false
return if (liveBankroll) {
arrayListOf(
CASHED_OUT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT
)
} else {
arrayListOf(
NET_RESULT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT
)
}
}
else -> return arrayListOf()
}
}
}
return arrayListOf()
}
}
override val needSeparator: Boolean
get() {
return when (this) {
SessionRow.TIPS -> true
else -> false
}
}
override val needSeparator: Boolean
get() {
return when (this) {
SessionRow.TIPS -> true
else -> false
}
}
override val resId: Int?
get() {
return when (this) {
PRIZE -> R.string.prize
POSITION -> R.string.position
PLAYERS -> R.string.players
CASHED_OUT -> R.string.cashed_out
INITIAL_BUY_IN -> R.string.initial_stack
BUY_IN -> R.string.buyin
TIPS -> R.string.tips
GAME -> R.string.game
BLINDS -> R.string.blinds
LOCATION -> R.string.location
BANKROLL -> R.string.bankroll
TABLE_SIZE -> R.string.table_size
TOURNAMENT_TYPE -> R.string.tournament_type
START_DATE -> R.string.start_date
END_DATE -> R.string.end_date
BREAK_TIME -> R.string.break_time
COMMENT -> R.string.comment
}
}
override val resId: Int?
get() {
return when (this) {
NET_RESULT -> R.string.net_result
PRIZE -> R.string.prize
POSITION -> R.string.position
PLAYERS -> R.string.players
CASHED_OUT -> R.string.cashed_out
INITIAL_BUY_IN -> R.string.initial_stack
BUY_IN -> R.string.buyin
TIPS -> R.string.tips
GAME -> R.string.game
BLINDS -> R.string.blinds
LOCATION -> R.string.location
BANKROLL -> R.string.bankroll
TABLE_SIZE -> R.string.table_size
TOURNAMENT_TYPE -> R.string.tournament_type
START_DATE -> R.string.start_date
END_DATE -> R.string.end_date
BREAK_TIME -> R.string.break_time
COMMENT -> R.string.comment
}
}
override val viewType: Int
get() {
return when (this) {
PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT,
TOURNAMENT_TYPE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal
}
}
override val viewType: Int
get() {
return when (this) {
NET_RESULT, PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT,
TOURNAMENT_TYPE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal
}
}
override val bottomSheetType: BottomSheetType
get() {
return when (this) {
CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.EDIT_TEXT
BUY_IN, TIPS -> BottomSheetType.SUM
BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT
GAME -> BottomSheetType.LIST_GAME
LOCATION, BANKROLL, TOURNAMENT_TYPE -> BottomSheetType.LIST
TABLE_SIZE -> BottomSheetType.GRID
COMMENT -> BottomSheetType.EDIT_TEXT_MULTI_LINES
else -> BottomSheetType.NONE
}
}
override val bottomSheetType: BottomSheetType
get() {
return when (this) {
NET_RESULT, CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.EDIT_TEXT
BUY_IN, TIPS -> BottomSheetType.SUM
BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT
GAME -> BottomSheetType.LIST_GAME
LOCATION, BANKROLL, TOURNAMENT_TYPE -> BottomSheetType.LIST
TABLE_SIZE -> BottomSheetType.GRID
COMMENT -> BottomSheetType.EDIT_TEXT_MULTI_LINES
else -> BottomSheetType.NONE
}
}
}

@ -25,7 +25,6 @@ enum class SettingRow : RowRepresentable {
GAME,
LOCATION,
TOURNAMENT_TYPE,
TRANSACTION_TYPE,
// Terms
PRIVACY_POLICY,
@ -40,24 +39,24 @@ enum class SettingRow : RowRepresentable {
fun getRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<RowRepresentable>()
rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.information))
rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.information))
rows.addAll(arrayListOf(VERSION, RATE_APP, CONTACT_US, BUG_REPORT))
rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.follow_us))
rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.follow_us))
rows.addAll(arrayListOf(FOLLOW_US))
rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.preferences))
rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.preferences))
rows.addAll(arrayListOf(CURRENCY))
rows.add(
HeaderRowRepresentable(
customViewType = RowViewType.HEADER_SESSION,
customViewType = RowViewType.HEADER_TITLE,
resId = R.string.data_management
)
)
rows.addAll(arrayListOf(BANKROLL, GAME, LOCATION, TOURNAMENT_TYPE, TRANSACTION_TYPE))
rows.addAll(arrayListOf(BANKROLL, GAME, LOCATION, TOURNAMENT_TYPE))
rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.terms))
rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.terms))
rows.addAll(arrayListOf(PRIVACY_POLICY, TERMS_OF_USE, GDPR))
return rows
@ -90,7 +89,8 @@ enum class SettingRow : RowRepresentable {
get() {
return when (this) {
VERSION -> RowViewType.TITLE_VALUE.ordinal
else -> RowViewType.TITLE.ordinal
FOLLOW_US -> RowViewType.FOLLOW_US.ordinal
else -> RowViewType.TITLE_ARROW.ordinal
}
}
@ -101,7 +101,6 @@ enum class SettingRow : RowRepresentable {
GAME -> LiveData.GAME
LOCATION -> LiveData.LOCATION
TOURNAMENT_TYPE -> LiveData.TOURNAMENT_TYPE
TRANSACTION_TYPE -> LiveData.TRANSACTION_TYPE
else -> null
}
}

@ -1,3 +1,17 @@
package net.pokeranalytics.android.util
val NULL_TEXT: String = "--"
// Support
const val SUPPORT_EMAIL = "support@pokeranalytics.net"
// Terms
const val URL_PRIVACY_POLICY = "https://www.poker-analytics.net/privacypolicy.html"
const val URL_TERMS = "https://www.poker-analytics.net/terms.html"
// Social Network
const val BLOG = "https://medium.com/poker-analytics"
const val INSTAGRAM = "https://www.instagram.com/pokeranalytics"
const val TWITTER = "https://twitter.com/paapptweet"
const val FACEBOOK = "https://www.facebook.com/171053452998758"

@ -1,7 +1,14 @@
package net.pokeranalytics.android.util
import android.content.ActivityNotFoundException
import android.content.Intent
import android.content.res.Resources
import android.net.Uri
import android.widget.Toast
import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.content.ContextCompat
import net.pokeranalytics.android.BuildConfig
import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
@ -17,13 +24,49 @@ val Float.px: Float
get() = (this * Resources.getSystem().displayMetrics.density)
// Toast
fun PokerAnalyticsActivity.toast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
fun PokerAnalyticsFragment.toast(message: String) {
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
}
}
// Open Play Store for rating
fun PokerAnalyticsActivity.openPlayStorePage() {
val uri = Uri.parse("market://details?id=$packageName")
val goToMarket = Intent(Intent.ACTION_VIEW, uri)
goToMarket.addFlags(
Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_NEW_DOCUMENT or
Intent.FLAG_ACTIVITY_MULTIPLE_TASK
)
try {
startActivity(goToMarket)
} catch (e: ActivityNotFoundException) {
startActivity(
Intent(
Intent.ACTION_VIEW, Uri.parse(
"http://play.google.com/store/apps/details?id=$packageName"
)
)
)
}
}
// Open email for "Contact us"
fun PokerAnalyticsActivity.openContactMail() {
val info = "v${BuildConfig.VERSION_NAME}(${BuildConfig.VERSION_CODE}), Android ${android.os.Build.VERSION.SDK_INT}"
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:$SUPPORT_EMAIL")
intent.putExtra(Intent.EXTRA_EMAIL, SUPPORT_EMAIL)
intent.putExtra(Intent.EXTRA_TEXT, "\n\n$info")
startActivity(Intent.createChooser(intent, getString(R.string.contact)))
}
// Open custom tab
fun PokerAnalyticsActivity.openUrl(url: String) {
val builder: CustomTabsIntent.Builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(this, R.color.colorPrimary))
val customTabsIntent = builder.build()
customTabsIntent.launchUrl(this, Uri.parse(url))
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

@ -82,7 +82,7 @@
android:layout_marginEnd="8dp"
android:text="@string/new_cash_game"
app:icon="@drawable/add_cash_game"
app:iconSize="32dp"
app:iconSize="28dp"
app:layout_constraintEnd_toStartOf="@+id/newTournament"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread"
@ -99,8 +99,8 @@
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:text="@string/new_tournament"
app:icon="@drawable/add_tournoi"
app:iconSize="32dp"
app:icon="@drawable/add_tournament"
app:iconSize="28dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/newCashGame"

@ -0,0 +1,84 @@
<?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"
android:id="@+id/rowTitle.container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon1"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="?selectableItemBackgroundBorderless"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/icon2"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toStartOf="@+id/guidelineStart"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/blog" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon2"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="?selectableItemBackgroundBorderless"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/icon3"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/icon1"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/insta" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon3"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="?selectableItemBackgroundBorderless"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/icon4"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/icon2"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/twitter" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon4"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="?selectableItemBackgroundBorderless"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guidelineEnd"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/icon3"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/facebook" />
<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="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="56dp"
android:background="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView

@ -31,7 +31,6 @@
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:paddingTop="-8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/nextArrow"
app:layout_constraintStart_toStartOf="@+id/guidelineStart"
@ -44,11 +43,11 @@
android:layout_height="24dp"
android:src="@drawable/ic_arrow_right"
android:tint="@color/gray_light"
android:visibility="gone"
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"

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rowTitle.container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:background="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView

@ -0,0 +1,47 @@
<?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:id="@+id/rowTitle.container"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/rowTitle.title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/guidelineEnd"
app:layout_constraintStart_toStartOf="@+id/guidelineStart"
app:layout_constraintTop_toTopOf="parent"
tools:text="Data Type Title" />
<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="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rowTitleValue.container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rowTitleValueAction.container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:background="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView

@ -8,7 +8,7 @@
<color name="white">#FFFFFF</color>
<color name="white_transparent">#30FFFFFF</color>
<color name="gray_light">#6AFFFFFF</color>
<color name="gray_light">#8AFFFFFF</color>
<color name="gray_darker">#141414</color>
<color name="gray_dark">#1B1F1B</color>

@ -111,7 +111,7 @@
</style>
<style name="PokerAnalyticsTheme.TextView.RowStatsValue">
<item name="android:textSize">24sp</item>
<item name="android:textSize">28sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:fontFamily">@font/roboto_light</item>
<item name="android:maxLines">1</item>
@ -130,7 +130,7 @@
<item name="android:textColor">@color/kaki_medium</item>
<item name="android:maxLines">1</item>
<item name="android:ellipsize">end</item>
<item name="android:fontFamily">@font/roboto_bold</item>
<item name="android:fontFamily">@font/roboto_medium</item>
<item name="android:textSize">16sp</item>
</style>
@ -200,8 +200,9 @@
<!-- Button -->
<style name="PokerAnalyticsTheme.Button" parent="Widget.MaterialComponents.Button">
<item name="iconPadding">0dp</item>
<item name="android:height">48dp</item>
<item name="iconTint">@color/black</item>
<item name="android:letterSpacing">-0.02</item>
<item name="android:letterSpacing">0</item>
<item name="android:fontFamily">@font/roboto_medium</item>
<item name="android:textColor">@color/black</item>
<item name="android:paddingStart">4dp</item>

Loading…
Cancel
Save