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. 5
      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. 49
      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. 27
      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. 49
      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 fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// Android // Android
implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.1.0-alpha04' implementation 'androidx.core:core-ktx:1.1.0-alpha04'
implementation 'com.google.android.material:material:1.0.0' implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
implementation 'androidx.browser:browser:1.0.0'
// Places // Places
implementation 'com.google.android.libraries.places:places:1.0.0' implementation 'com.google.android.libraries.places:places:1.0.0'

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

@ -11,8 +11,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource, open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable {
RowRepresentable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()
@ -31,7 +30,7 @@ open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource,
return this.id return this.id
} }
override fun adapterRows(): List<out RowRepresentable>? { override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(SimpleRow.NAME)
rows.addAll(GameRow.values()) rows.addAll(GameRow.values())

@ -314,7 +314,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
return "Session ${this.creationDate}" return "Session ${this.creationDate}"
} }
override fun adapterRows(): List<out RowRepresentable>? { override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
// Headers // Headers
@ -365,7 +365,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
} }
// Rows // Rows
rows.addAll(SessionRow.getRows(type, getState())) rows.addAll(SessionRow.getRows(this))
return rows return rows
} }
@ -379,7 +379,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
SessionRow.BLINDS -> getBlinds() SessionRow.BLINDS -> getBlinds()
SessionRow.BREAK_TIME -> timeFrame?.breakDuration?.toMinutes() ?: "--" SessionRow.BREAK_TIME -> timeFrame?.breakDuration?.toMinutes() ?: "--"
SessionRow.BUY_IN -> buyin.toCurrency() 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.COMMENT -> if (comment.isNotEmpty()) comment else "--"
SessionRow.END_DATE -> if (timeFrame != null) timeFrame?.endDate?.shortDateTime() ?: "--" else "--" SessionRow.END_DATE -> if (timeFrame != null) timeFrame?.endDate?.shortDateTime() ?: "--" else "--"
SessionRow.GAME -> getGameTitle() 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( data.add(
RowRepresentableEditDescriptor( RowRepresentableEditDescriptor(
result?.cashout?.round(), result?.cashout?.round(),
inputType = InputType.TYPE_CLASS_NUMBER inputType = InputType.TYPE_CLASS_NUMBER
or InputType.TYPE_NUMBER_FLAG_DECIMAL 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? localResult.buyin = value as Double?
result = localResult 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) 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 result = localResult
} }
SessionRow.COMMENT -> comment = value as String? ?: "" SessionRow.COMMENT -> comment = value as String? ?: ""

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

@ -3,13 +3,15 @@ package net.pokeranalytics.android.model.realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
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.StaticRowRepresentableDataSource
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.rowrepresentable.SimpleRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import java.util.* import java.util.*
import kotlin.collections.ArrayList
open class TournamentType : RealmObject(), Savable, RowRepresentable { open class TournamentType : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() 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 return this.id
} }
override fun adapterRows(): List<out RowRepresentable>? { override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(SimpleRow.NAME)
rows.addAll(TransactionTypeRow.values()) rows.addAll(TransactionTypeRow.values())

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

@ -14,15 +14,19 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.Savable 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.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate 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.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment 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
import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow
@ -137,10 +141,21 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate,
finishActivityWithResult(uniqueIdentifier) finishActivityWithResult(uniqueIdentifier)
} }
} else { } 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()) val builder = AlertDialog.Builder(requireContext())
.setMessage(R.string.empty_name_for_br_error) .setMessage(message)
.setNegativeButton(R.string.ok, null) .setNegativeButton(R.string.ok, null)
builder.show() builder.show()
} }
} }

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

@ -104,7 +104,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.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() 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.BuildConfig
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.activity.DataListActivity 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.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow
import net.pokeranalytics.android.util.*
class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, StaticRowRepresentableDataSource { class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, StaticRowRepresentableDataSource {
private lateinit var parentActivity: PokerAnalyticsActivity
companion object { companion object {
/** /**
@ -60,6 +64,20 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) { 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() SettingRow.GDPR -> Toast.makeText(requireContext(), "Show GDPR", Toast.LENGTH_SHORT).show()
} }
@ -73,6 +91,8 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta
*/ */
private fun initData() { private fun initData() {
parentActivity = activity as PokerAnalyticsActivity
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
settingsAdapterRow = RowRepresentableAdapter( settingsAdapterRow = RowRepresentableAdapter(
this, this this, this

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

@ -3,15 +3,16 @@ package net.pokeranalytics.android.ui.view
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.row_bottom_sheet_grid_title.view.* 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_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_amount.view.*
import kotlinx.android.synthetic.main.row_header_title_value.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.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_stats_title_value.view.*
import kotlinx.android.synthetic.main.row_title.view.* import kotlinx.android.synthetic.main.row_title.view.*
import kotlinx.android.synthetic.main.row_title_switch.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 * An interface used to factor the configuration of RecyclerView.ViewHolder
*/ */
interface BindableHolder { interface BindableHolder {
fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
} }
} }
enum class RowViewType { enum class RowViewType {
HEADER,
HEADER_TITLE_VALUE, HEADER_TITLE_VALUE,
HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT,
HEADER_TITLE_AMOUNT_BIG, HEADER_TITLE_AMOUNT_BIG,
HEADER_SESSION, HEADER_TITLE,
EDIT_TEXT, EDIT_TEXT,
TITLE, TITLE,
TITLE_ARROW,
TITLE_VALUE, TITLE_VALUE,
TITLE_VALUE_ACTION, TITLE_VALUE_ACTION,
TITLE_SWITCH, TITLE_SWITCH,
@ -51,6 +50,7 @@ enum class RowViewType {
TITLE_GRID, TITLE_GRID,
ROW_SESSION, ROW_SESSION,
BUTTON, BUTTON,
FOLLOW_US,
STAT; STAT;
/** /**
@ -86,6 +86,13 @@ enum class RowViewType {
false false
) )
) )
TITLE_ARROW -> TitleViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title_arrow,
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,
@ -128,10 +135,10 @@ enum class RowViewType {
false false
) )
) )
HEADER_SESSION -> { HEADER_TITLE -> {
HeaderSessionViewHolder( HeaderSessionViewHolder(
LayoutInflater.from(parent.context).inflate( LayoutInflater.from(parent.context).inflate(
R.layout.row_history_session_header, R.layout.row_header_title,
parent, parent,
false 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( STAT -> StatsTitleValueViewHolder(
LayoutInflater.from(parent.context).inflate( LayoutInflater.from(parent.context).inflate(
R.layout.row_stats_title_value, R.layout.row_stats_title_value,
@ -168,7 +184,7 @@ enum class RowViewType {
BindableHolder { BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.rowHeaderTitleValue_title.text = row.localizedTitle(itemView.context) itemView.rowHeaderTitleValue_title.text = row.localizedTitle(itemView.context)
adapter.dataSource?.let { adapter.dataSource.let {
itemView.rowHeaderTitleValue_value.text = it.stringForRow(row, itemView.context) itemView.rowHeaderTitleValue_value.text = it.stringForRow(row, itemView.context)
} }
//val listener = View.OnClickListener { //val listener = View.OnClickListener {
@ -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), inner class StatsTitleValueViewHolder(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) {

@ -8,7 +8,7 @@ import net.pokeranalytics.android.ui.view.RowViewType
* A class to display headers as row representable * A class to display headers as row representable
*/ */
class HeaderRowRepresentable( class HeaderRowRepresentable(
var customViewType: RowViewType? = RowViewType.HEADER, var customViewType: RowViewType? = RowViewType.HEADER_TITLE,
override var resId: Int? = null, override var resId: Int? = null,
var title: String? = null, var title: String? = null,
var value: 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.R
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.model.realm.Session
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
@ -12,6 +13,7 @@ enum class SessionRow : RowRepresentable {
PRIZE, PRIZE,
CASHED_OUT, CASHED_OUT,
NET_RESULT,
INITIAL_BUY_IN, INITIAL_BUY_IN,
BUY_IN, BUY_IN,
POSITION, POSITION,
@ -34,10 +36,10 @@ enum class SessionRow : RowRepresentable {
/** /**
* Return the rows to display for the current session state * Return the rows to display for the current session state
*/ */
fun getRows(type: Int, sessionState: SessionState): ArrayList<RowRepresentable> { fun getRows(session: Session): ArrayList<RowRepresentable> {
when (type) { when (session.type) {
Session.Type.TOURNAMENT.ordinal -> { Session.Type.TOURNAMENT.ordinal -> {
return when (sessionState) { return when (session.getState()) {
SessionState.PENDING, SessionState.PLANNED -> { SessionState.PENDING, SessionState.PLANNED -> {
arrayListOf( arrayListOf(
GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE,
@ -55,17 +57,25 @@ enum class SessionRow : RowRepresentable {
} }
} }
Session.Type.CASH_GAME.ordinal -> { Session.Type.CASH_GAME.ordinal -> {
return when (sessionState) { when (session.getState()) {
SessionState.PENDING, SessionState.PLANNED -> { SessionState.PENDING, SessionState.PLANNED -> {
arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE) return arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE)
} }
SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> {
val liveBankroll = session.bankroll?.live ?: false
return if (liveBankroll) {
arrayListOf( arrayListOf(
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
) )
} else {
arrayListOf(
NET_RESULT, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT
)
} }
else -> arrayListOf() }
else -> return arrayListOf()
} }
} }
} }
@ -84,6 +94,7 @@ enum class SessionRow : RowRepresentable {
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {
NET_RESULT -> R.string.net_result
PRIZE -> R.string.prize PRIZE -> R.string.prize
POSITION -> R.string.position POSITION -> R.string.position
PLAYERS -> R.string.players PLAYERS -> R.string.players
@ -107,7 +118,7 @@ enum class SessionRow : RowRepresentable {
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS, NET_RESULT, PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT,
TOURNAMENT_TYPE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal TOURNAMENT_TYPE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal
} }
@ -116,7 +127,7 @@ enum class SessionRow : RowRepresentable {
override val bottomSheetType: BottomSheetType override val bottomSheetType: BottomSheetType
get() { get() {
return when (this) { return when (this) {
CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.EDIT_TEXT NET_RESULT, CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.EDIT_TEXT
BUY_IN, TIPS -> BottomSheetType.SUM BUY_IN, TIPS -> BottomSheetType.SUM
BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT
GAME -> BottomSheetType.LIST_GAME GAME -> BottomSheetType.LIST_GAME

@ -25,7 +25,6 @@ enum class SettingRow : RowRepresentable {
GAME, GAME,
LOCATION, LOCATION,
TOURNAMENT_TYPE, TOURNAMENT_TYPE,
TRANSACTION_TYPE,
// Terms // Terms
PRIVACY_POLICY, PRIVACY_POLICY,
@ -40,24 +39,24 @@ enum class SettingRow : RowRepresentable {
fun getRows(): ArrayList<RowRepresentable> { fun getRows(): ArrayList<RowRepresentable> {
val rows = 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.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.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.addAll(arrayListOf(CURRENCY))
rows.add( rows.add(
HeaderRowRepresentable( HeaderRowRepresentable(
customViewType = RowViewType.HEADER_SESSION, customViewType = RowViewType.HEADER_TITLE,
resId = R.string.data_management 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)) rows.addAll(arrayListOf(PRIVACY_POLICY, TERMS_OF_USE, GDPR))
return rows return rows
@ -90,7 +89,8 @@ enum class SettingRow : RowRepresentable {
get() { get() {
return when (this) { return when (this) {
VERSION -> RowViewType.TITLE_VALUE.ordinal 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 GAME -> LiveData.GAME
LOCATION -> LiveData.LOCATION LOCATION -> LiveData.LOCATION
TOURNAMENT_TYPE -> LiveData.TOURNAMENT_TYPE TOURNAMENT_TYPE -> LiveData.TOURNAMENT_TYPE
TRANSACTION_TYPE -> LiveData.TRANSACTION_TYPE
else -> null else -> null
} }
} }

@ -1,3 +1,17 @@
package net.pokeranalytics.android.util package net.pokeranalytics.android.util
val NULL_TEXT: String = "--" 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 package net.pokeranalytics.android.util
import android.content.ActivityNotFoundException
import android.content.Intent
import android.content.res.Resources import android.content.res.Resources
import android.net.Uri
import android.widget.Toast 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.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
@ -17,13 +24,49 @@ val Float.px: Float
get() = (this * Resources.getSystem().displayMetrics.density) get() = (this * Resources.getSystem().displayMetrics.density)
// Toast // Toast
fun PokerAnalyticsActivity.toast(message: String) { fun PokerAnalyticsActivity.toast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show() Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
} }
fun PokerAnalyticsFragment.toast(message: String) { fun PokerAnalyticsFragment.toast(message: String) {
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() 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:layout_marginEnd="8dp"
android:text="@string/new_cash_game" android:text="@string/new_cash_game"
app:icon="@drawable/add_cash_game" app:icon="@drawable/add_cash_game"
app:iconSize="32dp" app:iconSize="28dp"
app:layout_constraintEnd_toStartOf="@+id/newTournament" app:layout_constraintEnd_toStartOf="@+id/newTournament"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread" app:layout_constraintHorizontal_chainStyle="spread"
@ -99,8 +99,8 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:text="@string/new_tournament" android:text="@string/new_tournament"
app:icon="@drawable/add_tournoi" app:icon="@drawable/add_tournament"
app:iconSize="32dp" app:iconSize="28dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/newCashGame" 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:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="56dp"
android:background="?selectableItemBackground"> android:background="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView

@ -31,7 +31,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:paddingTop="-8dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/nextArrow" app:layout_constraintEnd_toStartOf="@+id/nextArrow"
app:layout_constraintStart_toStartOf="@+id/guidelineStart" app:layout_constraintStart_toStartOf="@+id/guidelineStart"
@ -44,11 +43,11 @@
android:layout_height="24dp" android:layout_height="24dp"
android:src="@drawable/ic_arrow_right" android:src="@drawable/ic_arrow_right"
android:tint="@color/gray_light" android:tint="@color/gray_light"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/guidelineEnd" app:layout_constraintEnd_toEndOf="@+id/guidelineEnd"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineStart" android:id="@+id/guidelineStart"
android:layout_width="wrap_content" android:layout_width="wrap_content"

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rowTitle.container" android:id="@+id/rowTitle.container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="48dp"
android:background="?selectableItemBackground"> android:background="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView <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" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rowTitleValue.container" android:id="@+id/rowTitleValue.container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="48dp"
android:orientation="vertical"> android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout

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

@ -8,7 +8,7 @@
<color name="white">#FFFFFF</color> <color name="white">#FFFFFF</color>
<color name="white_transparent">#30FFFFFF</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_darker">#141414</color>
<color name="gray_dark">#1B1F1B</color> <color name="gray_dark">#1B1F1B</color>

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

Loading…
Cancel
Save