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

# Conflicts:
#	app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
#	app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
#	app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt
#	app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
#	app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
#	app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
#	app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicRowInterface.kt
#	app/src/main/java/net/pokeranalytics/android/ui/adapter/components/LiveDataAdapter.kt
#	app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt
#	app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
#	app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimePickerManager.kt
dev_raz_wip
Aurelien Hubert 7 years ago
commit 8393877318
  1. 29
      app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt
  2. 4
      app/src/main/java/net/pokeranalytics/android/model/LiveData.kt
  3. 30
      app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
  4. 24
      app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
  5. 24
      app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt
  6. 72
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  7. 24
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
  8. 24
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  9. 53
      app/src/main/java/net/pokeranalytics/android/ui/adapter/NewSessionAdapter.kt
  10. 140
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicRowInterface.kt
  11. 27
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/LiveDataAdapter.kt
  12. 37
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/RowRepresentableAdapter.kt
  13. 16
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt
  14. 46
      app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt
  15. 41
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  16. 16
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt
  17. 33
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
  18. 6
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimePickerManager.kt
  19. 7
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DynamicListFragment.kt
  20. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/PokerAnalyticsFragment.kt
  21. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetData.kt
  22. 12
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleListFragment.kt
  23. 12
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt
  24. 16
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt
  25. 8
      app/src/main/java/net/pokeranalytics/android/ui/view/RowEditable.kt
  26. 158
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  27. 29
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  28. 19
      app/src/main/res/layout/fragment_stats.xml
  29. 17
      app/src/main/res/values/strings.xml

@ -1,10 +1,14 @@
package net.pokeranalytics.android.calculus package net.pokeranalytics.android.calculus
import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
interface AnyStat { interface AnyStat {
} }
enum class Stat : AnyStat { enum class Stat : AnyStat, RowRepresentable {
NETRESULT, NETRESULT,
HOURLY_RATE, HOURLY_RATE,
@ -49,7 +53,30 @@ enum class Stat : AnyStat {
} }
override val resId: Int?
get() {
return when (this) {
NETRESULT -> R.string.net_result
HOURLY_RATE -> R.string.hourly_rate
AVERAGE -> R.string.average
NUMBER_OF_GROUPS -> R.string.number_of_groups
NUMBER_OF_GAMES -> R.string.number_of_games
DURATION -> R.string.duration
AVERAGE_DURATION -> R.string.average_duration
NET_BB_PER_100_HANDS -> R.string.net_bb_per_100_hands
HOURLY_RATE_BB -> R.string.hourly_rate_bb
AVERAGE_NET_BB -> R.string.average_net_bb
WIN_RATIO -> R.string.win_ratio
AVERAGE_BUYIN -> R.string.average_buyin
ROI -> R.string.roi
STANDARD_DEVIATION -> R.string.standard_deviation
STANDARD_DEVIATION_HOURLY -> R.string.standard_deviation_hourly
STANDARD_DEVIATION_BB_PER_100_HANDS -> R.string.standard_deviation_bb_per_100_hands
HANDS_PLAYED -> R.string.hands_played
}
}
override val viewType: Int = RowViewType.TITLE_VALUE.ordinal
} }
enum class CashSessionStat : AnyStat { enum class CashSessionStat : AnyStat {

@ -7,7 +7,7 @@ import io.realm.Sort
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import java.util.* import java.util.*
enum class DataList { enum class LiveData {
BANKROLL, BANKROLL,
GAME, GAME,
LOCATION, LOCATION,
@ -19,7 +19,7 @@ enum class DataList {
} }
private var sortingFieldName: String = "name" private var sortingFieldName: String = "name"
private var sorting: Sort = Sort.DESCENDING private var sorting: Sort = Sort.ASCENDING
private val relatedEntity: Class < out RealmObject > private val relatedEntity: Class < out RealmObject >

@ -4,12 +4,18 @@ import android.text.InputType
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.LiveDataDataSource
import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData
import net.pokeranalytics.android.ui.view.BankrollRow
import net.pokeranalytics.android.ui.view.RowEditable
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SimpleRow
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Bankroll(name: String = "") : RealmObject(), DynamicRowDelegate, DisplayableDataSource, EditableDataSource { open class Bankroll(name: String = "") : RealmObject(), RowRepresentableDataSource, LiveDataDataSource,
RowEditable {
companion object { companion object {
fun newInstance() : Bankroll { fun newInstance() : Bankroll {
@ -38,14 +44,14 @@ open class Bankroll(name: String = "") : RealmObject(), DynamicRowDelegate, Disp
override val title: String get() = this.name override val title: String get() = this.name
override val primaryKey: String get() = this.id override val primaryKey: String get() = this.id
override fun adapterRows(): ArrayList<DynamicRowInterface> { override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<DynamicRowInterface>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(SimpleRow.NAME)
rows.addAll(BankrollRow.values()) rows.addAll(BankrollRow.values())
return rows return rows
} }
override fun stringForRow(row: DynamicRowInterface): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> this.name SimpleRow.NAME -> this.name
BankrollRow.LIVE -> if (this.live) "live" else "online" BankrollRow.LIVE -> if (this.live) "live" else "online"
@ -54,28 +60,22 @@ open class Bankroll(name: String = "") : RealmObject(), DynamicRowDelegate, Disp
} }
} }
override fun boolForRow(row: DynamicRowInterface): Boolean { override fun boolForRow(row: RowRepresentable): Boolean {
when (row) { when (row) {
BankrollRow.LIVE -> return true BankrollRow.LIVE -> return true
else -> return super.boolForRow(row) else -> return super.boolForRow(row)
} }
} }
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: RowRepresentable): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add( SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
BottomSheetData(
this.name,
SimpleRow.NAME.resId,
InputType.TYPE_CLASS_TEXT
)
)
} }
return data return data
} }
override fun setBottomSheetValue(value: Any?, row: DynamicRowInterface) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" SimpleRow.NAME -> this.name = value as String? ?: ""
} }

@ -5,9 +5,13 @@ import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.*
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData
import net.pokeranalytics.android.ui.view.RowEditable
import net.pokeranalytics.android.ui.view.GameRow
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SimpleRow
import java.util.* import java.util.*
open class Game : RealmObject(), DynamicRowDelegate, DisplayableDataSource, EditableDataSource { open class Game : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, RowEditable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()
@ -21,35 +25,29 @@ open class Game : RealmObject(), DynamicRowDelegate, DisplayableDataSource, Edit
override val title: String get() = this.name override val title: String get() = this.name
override val primaryKey: String get() = this.id override val primaryKey: String get() = this.id
override fun adapterRows(): ArrayList<DynamicRowInterface> { override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<DynamicRowInterface>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(SimpleRow.NAME)
rows.addAll(GameRow.values()) rows.addAll(GameRow.values())
return rows return rows
} }
override fun stringForRow(row: DynamicRowInterface): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> this.name SimpleRow.NAME -> this.name
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
} }
} }
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: RowRepresentable): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add( SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
BottomSheetData(
this.name,
SimpleRow.NAME.resId,
InputType.TYPE_CLASS_TEXT
)
)
} }
return data return data
} }
override fun setBottomSheetValue(value: Any?, row: DynamicRowInterface) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" SimpleRow.NAME -> this.name = value as String? ?: ""
} }

@ -5,10 +5,14 @@ import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.*
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData
import net.pokeranalytics.android.ui.view.RowEditable
import net.pokeranalytics.android.ui.view.LocationRow
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SimpleRow
import java.util.* import java.util.*
open class Location : RealmObject(), DynamicRowDelegate, DisplayableDataSource, EditableDataSource { open class Location : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, RowEditable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()
@ -25,35 +29,29 @@ open class Location : RealmObject(), DynamicRowDelegate, DisplayableDataSource,
override val title: String get() = this.name override val title: String get() = this.name
override val primaryKey: String get() = this.id override val primaryKey: String get() = this.id
override fun adapterRows(): ArrayList<DynamicRowInterface> { override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<DynamicRowInterface>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(SimpleRow.NAME)
rows.addAll(LocationRow.values()) rows.addAll(LocationRow.values())
return rows return rows
} }
override fun stringForRow(row: DynamicRowInterface): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> this.name SimpleRow.NAME -> this.name
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
} }
} }
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: RowRepresentable): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add( SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
BottomSheetData(
this.name,
SimpleRow.NAME.resId,
InputType.TYPE_CLASS_TEXT
)
)
} }
return data return data
} }
override fun setBottomSheetValue(value: Any?, row: DynamicRowInterface) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" SimpleRow.NAME -> this.name = value as String? ?: ""
} }

@ -6,15 +6,19 @@ import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.SessionInterface import net.pokeranalytics.android.calculus.SessionInterface
import net.pokeranalytics.android.model.DataList import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.*
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData
import net.pokeranalytics.android.ui.view.RowEditable
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SessionRow
import net.pokeranalytics.android.util.data.sessionDao import net.pokeranalytics.android.util.data.sessionDao
import net.pokeranalytics.android.util.short import net.pokeranalytics.android.util.short
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, DisplayableDataSource, EditableDataSource { open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource, LiveDataDataSource,
RowEditable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()
@ -128,17 +132,17 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
return 0.0 return 0.0
} }
override fun adapterRows(): ArrayList<DynamicRowInterface> { override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<DynamicRowInterface>() val rows = ArrayList<RowRepresentable>()
rows.addAll(SessionRow.values()) rows.addAll(SessionRow.values())
return rows return rows
} }
override fun boolForRow(row: DynamicRowInterface): Boolean { override fun boolForRow(row: RowRepresentable): Boolean {
return false return false
} }
override fun stringForRow(row: DynamicRowInterface): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SessionRow.BLINDS -> if (cgSmallBlind != null && cgBigBlind != null) "$cgSmallBlind / $cgBigBlind" else "--" SessionRow.BLINDS -> if (cgSmallBlind != null && cgBigBlind != null) "$cgSmallBlind / $cgBigBlind" else "--"
SessionRow.GAME -> game?.title ?: "--" SessionRow.GAME -> game?.title ?: "--"
@ -151,7 +155,7 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
} }
} }
override fun actionIconForRow(row: DynamicRowInterface): Int? { override fun actionIconForRow(row: RowRepresentable): Int? {
return when (row) { return when (row) {
SessionRow.START_DATE, SessionRow.END_DATE -> { SessionRow.START_DATE, SessionRow.END_DATE -> {
R.drawable.ic_close_white_24dp R.drawable.ic_close_white_24dp
@ -164,70 +168,33 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
override var title: String = "Change that: $creationDate" override var title: String = "Change that: $creationDate"
override val primaryKey: String get() = this.id override val primaryKey: String get() = this.id
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: RowRepresentable): ArrayList<BottomSheetData> {
val data = ArrayList<BottomSheetData>() val data = ArrayList<BottomSheetData>()
when (row) { when (row) {
SessionRow.GAME -> { SessionRow.GAME -> {
data.add( data.add(BottomSheetData(game, inputType = InputType.TYPE_NULL, data = LiveData.GAME.items(realm)))
BottomSheetData(
game,
inputType = InputType.TYPE_NULL,
data = DataList.GAME.items(realm)
)
)
} }
SessionRow.LOCATION -> { SessionRow.LOCATION -> {
data.add( data.add(BottomSheetData(location, inputType = InputType.TYPE_NULL, data = LiveData.LOCATION.items(realm)))
BottomSheetData(
location,
inputType = InputType.TYPE_NULL,
data = DataList.LOCATION.items(realm)
)
)
} }
SessionRow.BANKROLL -> { SessionRow.BANKROLL -> {
data.add( data.add(BottomSheetData(bankroll, inputType = InputType.TYPE_NULL, data = LiveData.BANKROLL.items(realm)))
BottomSheetData(
bankroll,
inputType = InputType.TYPE_NULL,
data = DataList.BANKROLL.items(realm)
)
)
} }
SessionRow.BLINDS -> { SessionRow.BLINDS -> {
data.add( data.add(BottomSheetData(cgSmallBlind, R.string.small_blind, InputType.TYPE_CLASS_NUMBER))
BottomSheetData( data.add(BottomSheetData(cgBigBlind, R.string.big_blind, InputType.TYPE_CLASS_NUMBER))
cgSmallBlind,
R.string.small_blind,
InputType.TYPE_CLASS_NUMBER
)
)
data.add(
BottomSheetData(
cgBigBlind,
R.string.big_blind,
InputType.TYPE_CLASS_NUMBER
)
)
} }
SessionRow.COMMENT -> { SessionRow.COMMENT -> {
data.add( data.add(BottomSheetData(comment, R.string.comment, InputType.TYPE_CLASS_TEXT))
BottomSheetData(
comment,
R.string.comment,
InputType.TYPE_CLASS_TEXT
)
)
} }
} }
return data return data
} }
override fun updateValue(value: Any?, row: RowRepresentable) {
override fun setBottomSheetValue(value: Any?, row: DynamicRowInterface) {
realm.beginTransaction() realm.beginTransaction()
when(row) { when(row) {
SessionRow.GAME -> game = value as Game? SessionRow.GAME -> game = value as Game?
@ -256,7 +223,6 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
} }
} }
realm.commitTransaction() realm.commitTransaction()
} }
} }

@ -5,9 +5,13 @@ import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.*
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData
import net.pokeranalytics.android.ui.view.RowEditable
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SimpleRow
import net.pokeranalytics.android.ui.view.TournamentFeatureRow
import java.util.* import java.util.*
open class TournamentFeature : RealmObject(), DynamicRowDelegate, DisplayableDataSource, EditableDataSource { open class TournamentFeature : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, RowEditable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()
@ -18,14 +22,14 @@ open class TournamentFeature : RealmObject(), DynamicRowDelegate, DisplayableDat
override val title: String get() = this.name override val title: String get() = this.name
override val primaryKey: String get() = this.id override val primaryKey: String get() = this.id
override fun adapterRows(): ArrayList<DynamicRowInterface> { override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<DynamicRowInterface>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(SimpleRow.NAME)
rows.addAll(TournamentFeatureRow.values()) rows.addAll(TournamentFeatureRow.values())
return rows return rows
} }
override fun stringForRow(row: DynamicRowInterface): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> this.name SimpleRow.NAME -> this.name
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
@ -33,21 +37,15 @@ open class TournamentFeature : RealmObject(), DynamicRowDelegate, DisplayableDat
} }
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: RowRepresentable): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add( SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
BottomSheetData(
this.name,
SimpleRow.NAME.resId,
InputType.TYPE_CLASS_TEXT
)
)
} }
return data return data
} }
override fun setBottomSheetValue(value: Any?, row: DynamicRowInterface) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" SimpleRow.NAME -> this.name = value as String? ?: ""
} }

@ -5,10 +5,14 @@ import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.*
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData
import net.pokeranalytics.android.ui.view.RowEditable
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SimpleRow
import net.pokeranalytics.android.ui.view.TransactionTypeRow
import java.util.* import java.util.*
open class TransactionType : RealmObject(), DynamicRowDelegate, DisplayableDataSource, EditableDataSource { open class TransactionType : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, RowEditable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()
@ -28,35 +32,29 @@ open class TransactionType : RealmObject(), DynamicRowDelegate, DisplayableDataS
override val title: String get() = this.name override val title: String get() = this.name
override val primaryKey: String get() = this.id override val primaryKey: String get() = this.id
override fun adapterRows(): ArrayList<DynamicRowInterface> { override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<DynamicRowInterface>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(SimpleRow.NAME)
rows.addAll(TransactionTypeRow.values()) rows.addAll(TransactionTypeRow.values())
return rows return rows
} }
override fun stringForRow(row: DynamicRowInterface): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> this.name SimpleRow.NAME -> this.name
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
} }
} }
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: RowRepresentable): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add( SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
BottomSheetData(
this.name,
SimpleRow.NAME.resId,
InputType.TYPE_CLASS_TEXT
)
)
} }
return data return data
} }
override fun setBottomSheetValue(value: Any?, row: DynamicRowInterface) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" SimpleRow.NAME -> this.name = value as String? ?: ""
} }

@ -1,53 +0,0 @@
package net.pokeranalytics.android.ui.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Session
import timber.log.Timber
class NewSessionAdapter(private var session: Session) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object {
const val ROW_SESSION: Int = 100
}
//var onClickOnSession: ((position: Int) -> Unit)? = null
inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind() {
Timber.d("Bind session")
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
when (viewType) {
ROW_SESSION -> return RowSessionViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_history_session,
parent,
false
)
)
else -> throw IllegalStateException("Need to implement type $viewType in NewSessionAdapter")
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (getItemViewType(position)) {
ROW_SESSION -> (holder as NewSessionAdapter.RowSessionViewHolder).bind()
}
}
override fun getItemCount(): Int {
return 2
}
override fun getItemViewType(position: Int): Int {
return ROW_SESSION
}
}

@ -1,140 +0,0 @@
package net.pokeranalytics.android.ui.adapter.components
import android.content.Context
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.DataList
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
interface DynamicRowInterface {
fun localizedTitle(context: Context): String
val viewType: Int
get() {
return 0
}
val bottomSheetType: BottomSheetType
get() {
return BottomSheetType.NONE
}
val relatedDataList: DataList?
get() {
return null
}
}
class SectionRow(stringRes: Int) : DynamicRowInterface {
var stringRes: Int = stringRes
override fun localizedTitle(context: Context): String {
return context.getString(this.stringRes)
}
}
enum class SessionRow(val resId: Int) : DynamicRowInterface {
GAME(R.string.game),
BLINDS(R.string.blinds),
LOCATION(R.string.location),
BANKROLL(R.string.bankroll),
START_DATE(R.string.start_date),
END_DATE(R.string.end_date),
COMMENT(R.string.comment);
override fun localizedTitle(context: Context): String {
return context.getString(this.resId)
}
override val viewType: Int
get() {
return when (this) {
BLINDS, GAME, BANKROLL, LOCATION, COMMENT -> RowViewType.TITLE_VALUE.ordinal
START_DATE, END_DATE -> RowViewType.TITLE_VALUE_ACTION.ordinal
}
}
override val bottomSheetType: BottomSheetType
get() {
return when (this) {
BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT
GAME -> BottomSheetType.LIST
LOCATION -> BottomSheetType.LIST
BANKROLL -> BottomSheetType.LIST
COMMENT -> BottomSheetType.EDIT_TEXT
else -> BottomSheetType.NONE
}
}
}
enum class SimpleRow(val resId: Int) : DynamicRowInterface {
NAME(R.string.name);
override fun localizedTitle(context: Context): String {
return context.getString(this.resId)
}
override val viewType: Int = RowViewType.TITLE_VALUE.ordinal
override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT
}
enum class BankrollRow(val resId: Int) : DynamicRowInterface {
LIVE(R.string.live),
CURRENCY(R.string.currency);
override fun localizedTitle(context: Context): String {
return context.getString(this.resId)
}
override val viewType: Int
get() {
return when (this) {
LIVE, CURRENCY -> RowViewType.TITLE_VALUE.ordinal
}
}
override val bottomSheetType: BottomSheetType
get() {
return when (this) {
LIVE -> BottomSheetType.NONE
CURRENCY -> BottomSheetType.LIST
}
}
}
enum class GameRow(val resId: Int) : DynamicRowInterface {
}
enum class LocationRow(val resId: Int) : DynamicRowInterface {
}
enum class TransactionTypeRow(val resId: Int) : DynamicRowInterface {
}
enum class TournamentFeatureRow(val resId: Int) : DynamicRowInterface {
}
enum class SettingRow(val resId: Int) : DynamicRowInterface {
BANKROLL(R.string.bankroll),
GAME(R.string.game),
LOCATION(R.string.location),
TOURNAMENT_TYPE(R.string.tournament_type),
TRANSACTION_TYPE(R.string.transaction_type);
override fun localizedTitle(context: Context): String {
return context.getString(this.resId)
}
override val viewType: Int = RowViewType.TITLE.ordinal
override val relatedDataList : DataList?
get() {
return when (this) {
BANKROLL -> DataList.BANKROLL
GAME -> DataList.GAME
LOCATION -> DataList.LOCATION
TOURNAMENT_TYPE -> DataList.TOURNAMENT_TYPE
TRANSACTION_TYPE-> DataList.TRANSACTION_TYPE
}
}
}

@ -7,28 +7,23 @@ 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 net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData import net.pokeranalytics.android.ui.view.RowViewType
interface DisplayableDelegate { interface LiveDataDataSource {
fun data(position: Int) : DisplayableDataSource
fun onRowSelected(position: Int)
fun size() : Int
}
interface DisplayableDataSource {
val title: String val title: String
val primaryKey: String val primaryKey: String
} }
interface EditableDataSource { interface LiveDataDelegate {
fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> fun data(position: Int) : LiveDataDataSource
fun setBottomSheetValue(value: Any?, row: DynamicRowInterface) fun onRowSelected(position: Int)
fun size() : Int
} }
class DataListAdapter(var delegate: DisplayableDelegate, var layout: Int? = null) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { class LiveDataAdapter(var adapterDelegate: LiveDataDelegate, var layout: Int? = null) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
inner class DataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { inner class DataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(row: DisplayableDataSource, listener: View.OnClickListener) { fun bind(row: LiveDataDataSource, listener: View.OnClickListener) {
try { try {
itemView.findViewById<AppCompatTextView>(R.id.title).text = row.title itemView.findViewById<AppCompatTextView>(R.id.title).text = row.title
itemView.findViewById<ConstraintLayout>(R.id.container).setOnClickListener(listener) itemView.findViewById<ConstraintLayout>(R.id.container).setOnClickListener(listener)
@ -49,13 +44,13 @@ class DataListAdapter(var delegate: DisplayableDelegate, var layout: Int? = null
} }
override fun getItemCount(): Int { override fun getItemCount(): Int {
return delegate.size() return adapterDelegate.size()
} }
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val listener = View.OnClickListener { val listener = View.OnClickListener {
delegate.onRowSelected(position) adapterDelegate.onRowSelected(position)
} }
(holder as DataViewHolder).bind(this.delegate.data(position), listener) (holder as DataViewHolder).bind(this.adapterDelegate.data(position), listener)
} }
} }

@ -3,24 +3,23 @@ package net.pokeranalytics.android.ui.adapter.components
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import net.pokeranalytics.android.ui.view.DynamicHolder
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
interface EditableDataDelegate { interface RowRepresentableDataSource {
fun setValue(value: Any, row: DynamicRowInterface)
}
interface DynamicRowDelegate {
fun adapterRows(): ArrayList<DynamicRowInterface> fun adapterRows(): ArrayList<RowRepresentable>
fun boolForRow(row: DynamicRowInterface): Boolean { fun boolForRow(row: RowRepresentable): Boolean {
return false return false
} }
fun stringForRow(row: DynamicRowInterface): String { fun stringForRow(row: RowRepresentable): String {
return "" return ""
} }
fun actionIconForRow(row: DynamicRowInterface): Int? { fun actionIconForRow(row: RowRepresentable): Int? {
return 0 return 0
} }
@ -35,18 +34,18 @@ interface DynamicRowDelegate {
} }
interface DynamicRowCallback { interface RowRepresentableDelegate {
fun onRowSelected(row: DynamicRowInterface) {} fun onRowSelected(row: RowRepresentable) {}
fun onActionSelected(row: DynamicRowInterface) {} fun onActionSelected(row: RowRepresentable) {}
} }
class DynamicListAdapter(var delegate: DynamicRowDelegate, var callBackDelegate: DynamicRowCallback? = null) : class RowRepresentableAdapter(var rowRepresentableDataSource: RowRepresentableDataSource, var rowRepresentableDelegate: RowRepresentableDelegate? = null) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() { RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var rows: ArrayList<DynamicRowInterface> = ArrayList() private var rows: ArrayList<RowRepresentable> = ArrayList()
init { init {
this.rows = delegate.adapterRows() this.rows = rowRepresentableDataSource.adapterRows()
} }
override fun getItemViewType(position: Int): Int { override fun getItemViewType(position: Int): Int {
@ -66,20 +65,20 @@ class DynamicListAdapter(var delegate: DynamicRowDelegate, var callBackDelegate:
val dynamicRow = this.rows[position] val dynamicRow = this.rows[position]
val listener = View.OnClickListener { val listener = View.OnClickListener {
callBackDelegate?.onRowSelected(dynamicRow) rowRepresentableDelegate?.onRowSelected(dynamicRow)
} }
val actionListener = View.OnClickListener { val actionListener = View.OnClickListener {
callBackDelegate?.onActionSelected(dynamicRow) rowRepresentableDelegate?.onActionSelected(dynamicRow)
} }
(holder as DynamicHolder).bind(dynamicRow, this.delegate, listener, actionListener) (holder as DynamicHolder).bind(dynamicRow, this.rowRepresentableDataSource, listener, actionListener)
} }
/** /**
* Refresh the row in the adapter * Refresh the row in the adapter
*/ */
fun refreshRow(row: DynamicRowInterface) { fun refreshRow(row: RowRepresentable) {
val index = rows.indexOf(row) val index = rows.indexOf(row)
if (index >= 0) { if (index >= 0) {
notifyItemChanged(index) notifyItemChanged(index)

@ -6,16 +6,16 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.Realm import io.realm.Realm
import io.realm.RealmChangeListener
import io.realm.RealmResults import io.realm.RealmResults
import kotlinx.android.synthetic.main.fragment_data_list.* import kotlinx.android.synthetic.main.fragment_data_list.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.*
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.SettingRow
import timber.log.Timber import timber.log.Timber
class DataListFragment : PokerAnalyticsFragment(), DisplayableDelegate { class DataListFragment : PokerAnalyticsFragment(), LiveDataDelegate {
private lateinit var dataType: SettingRow private lateinit var dataType: SettingRow
@ -31,12 +31,12 @@ class DataListFragment : PokerAnalyticsFragment(), DisplayableDelegate {
initUI() initUI()
} }
override fun data(position: Int): DisplayableDataSource { override fun data(position: Int): LiveDataDataSource {
return (items[position] as DisplayableDataSource) return (items[position] as LiveDataDataSource)
} }
override fun onRowSelected(position: Int) { override fun onRowSelected(position: Int) {
this.dataType.relatedDataList?.let { this.dataType.relatedResultsRepresentable?.let {
EditableDataActivity.newInstance(requireContext(), it.ordinal, this.data(position).primaryKey) EditableDataActivity.newInstance(requireContext(), it.ordinal, this.data(position).primaryKey)
} }
} }
@ -54,7 +54,7 @@ class DataListFragment : PokerAnalyticsFragment(), DisplayableDelegate {
private fun initUI() { private fun initUI() {
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
val dataListAdapter = DataListAdapter(this) val dataListAdapter = LiveDataAdapter(this)
recyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
@ -63,7 +63,7 @@ class DataListFragment : PokerAnalyticsFragment(), DisplayableDelegate {
} }
this.addButton.setOnClickListener { this.addButton.setOnClickListener {
this.dataType.relatedDataList?.let { this.dataType.relatedResultsRepresentable?.let {
EditableDataActivity.newInstance( EditableDataActivity.newInstance(
requireContext(), requireContext(),
dataType = it.ordinal, dataType = it.ordinal,
@ -83,7 +83,7 @@ class DataListFragment : PokerAnalyticsFragment(), DisplayableDelegate {
this.title.text = this.dataType.name.toLowerCase().capitalize() this.title.text = this.dataType.name.toLowerCase().capitalize()
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
this.dataType.relatedDataList?.let { this.dataType.relatedResultsRepresentable?.let {
this.items = it.items(realm) this.items = it.items(realm)
this.items.addChangeListener { newItems -> this.items.addChangeListener { newItems ->
Timber.d("newItems: ${newItems.size}") Timber.d("newItems: ${newItems.size}")

@ -11,19 +11,20 @@ import io.realm.RealmObject
import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_editable_data.*
import kotlinx.android.synthetic.main.fragment_editable_data.view.* import kotlinx.android.synthetic.main.fragment_editable_data.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.DataList import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.*
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.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowEditable
import net.pokeranalytics.android.ui.view.RowRepresentable
class EditableDataFragment : PokerAnalyticsFragment(), DynamicRowCallback, class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, BottomSheetDelegate {
BottomSheetDelegate {
private lateinit var item: RealmObject private lateinit var item: RealmObject
private lateinit var dataType: DataList private lateinit var liveDataType: LiveData
private lateinit var dynamicListAdapter: DynamicListAdapter private lateinit var rowRepresentableAdapter: RowRepresentableAdapter
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_editable_data, container, false) return inflater.inflate(R.layout.fragment_editable_data, container, false)
@ -35,28 +36,29 @@ class EditableDataFragment : PokerAnalyticsFragment(), DynamicRowCallback,
initUI() initUI()
} }
override fun onRowSelected(row: DynamicRowInterface) { override fun onRowSelected(row: RowRepresentable) {
BottomSheetFragment.create(fragmentManager, row, this, (this.item as EditableDataSource).getBottomSheetData(row)) BottomSheetFragment.create(fragmentManager, row, this, (this.item as RowEditable).getBottomSheetData(row))
} }
override fun clickOnAdd(row: DynamicRowInterface) { override fun clickOnAdd(row: RowRepresentable) {
Toast.makeText(requireContext(), "Add new element: $row", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "Add new element: $row", Toast.LENGTH_SHORT).show()
} }
override fun clickOnClear(row: DynamicRowInterface) { override fun clickOnClear(row: RowRepresentable) {
(this.item as EditableDataSource).setBottomSheetValue(null, row) Toast.makeText(requireContext(), "Clear: $row", Toast.LENGTH_SHORT).show()
(this.item as RowEditable).updateValue(null, row)
this.getRealm().executeTransaction { this.getRealm().executeTransaction {
it.copyToRealmOrUpdate(this.item) it.copyToRealmOrUpdate(this.item)
} }
dynamicListAdapter.refreshRow(row) rowRepresentableAdapter.refreshRow(row)
} }
override fun setValue(value: Any, row: DynamicRowInterface) { override fun setValue(value: Any, row: RowRepresentable) {
(this.item as EditableDataSource).setBottomSheetValue(value, row) (this.item as RowEditable).updateValue(value, row)
this.getRealm().executeTransaction { this.getRealm().executeTransaction {
it.copyToRealmOrUpdate(this.item) it.copyToRealmOrUpdate(this.item)
} }
dynamicListAdapter.refreshRow(row) rowRepresentableAdapter.refreshRow(row)
} }
private fun initData() { private fun initData() {
@ -83,19 +85,19 @@ class EditableDataFragment : PokerAnalyticsFragment(), DynamicRowCallback,
*/ */
fun setData(dataType: Int, primaryKey: String?) { fun setData(dataType: Int, primaryKey: String?) {
this.dataType = DataList.values()[dataType] this.liveDataType = LiveData.values()[dataType]
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
var proxyItem : RealmObject? = this.dataType.getData(realm, primaryKey) var proxyItem : RealmObject? = this.liveDataType.getData(realm, primaryKey)
proxyItem?.let { proxyItem?.let {
this.appBar.toolbar.title = "Update ${this.dataType.name.toLowerCase().capitalize()}" this.appBar.toolbar.title = "Update ${this.liveDataType.name.toLowerCase().capitalize()}"
} ?: run { } ?: run {
this.appBar.toolbar.title = "New ${this.dataType.name.toLowerCase().capitalize()}" this.appBar.toolbar.title = "New ${this.liveDataType.name.toLowerCase().capitalize()}"
} }
this.item = this.dataType.updateOrCreate(realm, primaryKey) this.item = this.liveDataType.updateOrCreate(realm, primaryKey)
this.dynamicListAdapter = DynamicListAdapter((this.item as DynamicRowDelegate), this) this.rowRepresentableAdapter = RowRepresentableAdapter((this.item as RowRepresentableDataSource), this)
this.recyclerView.adapter = dynamicListAdapter this.recyclerView.adapter = rowRepresentableAdapter
} }
} }

@ -9,25 +9,24 @@ import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.kotlin.where import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_new_session.* import kotlinx.android.synthetic.main.fragment_new_session.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.DataList import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.components.DynamicListAdapter import net.pokeranalytics.android.ui.adapter.components.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.components.DynamicRowCallback import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface
import net.pokeranalytics.android.ui.adapter.components.SessionRow
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.DateTimePickerManager import net.pokeranalytics.android.ui.fragment.components.DateTimePickerManager
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.BottomSheetFragment
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SessionRow
import java.util.* import java.util.*
class SessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, BottomSheetDelegate {
BottomSheetDelegate {
private lateinit var currentSession: Session private lateinit var currentSession: Session
private lateinit var sessionAdapter: DynamicListAdapter private lateinit var sessionAdapter : RowRepresentableAdapter
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_new_session, container, false) return inflater.inflate(R.layout.fragment_new_session, container, false)
@ -38,7 +37,7 @@ class SessionFragment : PokerAnalyticsFragment(), DynamicRowCallback,
initUI() initUI()
} }
override fun onRowSelected(row: DynamicRowInterface) { override fun onRowSelected(row: RowRepresentable) {
val data = currentSession.getBottomSheetData(row) val data = currentSession.getBottomSheetData(row)
when (row) { when (row) {
SessionRow.START_DATE -> DateTimePickerManager.create( SessionRow.START_DATE -> DateTimePickerManager.create(
@ -57,25 +56,25 @@ class SessionFragment : PokerAnalyticsFragment(), DynamicRowCallback,
} }
} }
override fun onActionSelected(row: DynamicRowInterface) { override fun onActionSelected(row: RowRepresentable) {
Toast.makeText(requireContext(), "Action for row: $row", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "Action for row: $row", Toast.LENGTH_SHORT).show()
} }
override fun clickOnAdd(row: DynamicRowInterface) { override fun clickOnAdd(row: RowRepresentable) {
when (row) { when (row) {
SessionRow.GAME -> EditableDataActivity.newInstance(requireContext(), DataList.GAME.ordinal) SessionRow.GAME -> EditableDataActivity.newInstance(requireContext(), LiveData.GAME.ordinal)
SessionRow.BANKROLL -> EditableDataActivity.newInstance(requireContext(), DataList.BANKROLL.ordinal) SessionRow.BANKROLL -> EditableDataActivity.newInstance(requireContext(), LiveData.BANKROLL.ordinal)
SessionRow.LOCATION -> EditableDataActivity.newInstance(requireContext(), DataList.LOCATION.ordinal) SessionRow.LOCATION -> EditableDataActivity.newInstance(requireContext(), LiveData.LOCATION.ordinal)
} }
} }
override fun clickOnClear(row: DynamicRowInterface) { override fun clickOnClear(row: RowRepresentable) {
currentSession.setBottomSheetValue(null, row) currentSession?.updateValue(null, row)
sessionAdapter.refreshRow(row) sessionAdapter.refreshRow(row)
} }
override fun setValue(value: Any, row: DynamicRowInterface) { override fun setValue(value: Any, row: RowRepresentable) {
currentSession.setBottomSheetValue(value, row) currentSession?.updateValue(value, row)
sessionAdapter.refreshRow(row) sessionAdapter.refreshRow(row)
} }
@ -113,7 +112,7 @@ class SessionFragment : PokerAnalyticsFragment(), DynamicRowCallback,
realm.commitTransaction() realm.commitTransaction()
} }
sessionAdapter = DynamicListAdapter(currentSession, this) sessionAdapter = RowRepresentableAdapter(currentSession, this)
recyclerView.adapter = sessionAdapter recyclerView.adapter = sessionAdapter
} }

@ -10,8 +10,10 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.DataListActivity
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.*
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.SettingRow
class SettingsFragment : PokerAnalyticsFragment(), DynamicRowDelegate, DynamicRowCallback { class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, RowRepresentableDelegate {
companion object { companion object {
@ -26,7 +28,7 @@ class SettingsFragment : PokerAnalyticsFragment(), DynamicRowDelegate, DynamicRo
} }
} }
private lateinit var settingsAdapter: DynamicListAdapter private lateinit var settingsAdapterRow: RowRepresentableAdapter
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@ -38,13 +40,13 @@ class SettingsFragment : PokerAnalyticsFragment(), DynamicRowDelegate, DynamicRo
initData() initData()
} }
override fun adapterRows(): ArrayList<DynamicRowInterface> { override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<DynamicRowInterface>() val rows = ArrayList<RowRepresentable>()
rows.addAll(SettingRow.values()) rows.addAll(SettingRow.values())
return rows return rows
} }
override fun onRowSelected(row: DynamicRowInterface) { override fun onRowSelected(row: RowRepresentable) {
DataListActivity.newInstance(requireContext(), (row as SettingRow).ordinal) DataListActivity.newInstance(requireContext(), (row as SettingRow).ordinal)
} }
@ -54,14 +56,14 @@ class SettingsFragment : PokerAnalyticsFragment(), DynamicRowDelegate, DynamicRo
private fun initData() { private fun initData() {
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
settingsAdapter = DynamicListAdapter( settingsAdapterRow = RowRepresentableAdapter(
this, this this, this
) )
recyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager layoutManager = viewManager
adapter = settingsAdapter adapter = settingsAdapterRow
} }
} }
} }

@ -4,10 +4,16 @@ import android.os.Bundle
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.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_settings.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.ui.adapter.components.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDataSource
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
class StatsFragment : PokerAnalyticsFragment() { class StatsFragment : PokerAnalyticsFragment(), RowRepresentableDataSource {
companion object { companion object {
@ -22,12 +28,37 @@ class StatsFragment : PokerAnalyticsFragment() {
} }
} }
private lateinit var statsAdapterRow: RowRepresentableAdapter
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_stats, container, false) return inflater.inflate(R.layout.fragment_stats, container, false)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initData()
}
override fun adapterRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<RowRepresentable>()
rows.addAll(Stat.values())
return rows
} }
/**
* Init data
*/
private fun initData() {
val viewManager = LinearLayoutManager(requireContext())
this.statsAdapterRow = RowRepresentableAdapter(
this
)
recyclerView.apply {
setHasFixedSize(true)
layoutManager = viewManager
adapter = statsAdapterRow
}
}
} }

@ -8,8 +8,8 @@ import android.text.format.DateFormat
import android.widget.DatePicker import android.widget.DatePicker
import android.widget.TimePicker import android.widget.TimePicker
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate
import net.pokeranalytics.android.ui.view.RowRepresentable
import java.util.* import java.util.*
class DateTimePickerManager : DatePickerDialog.OnDateSetListener, class DateTimePickerManager : DatePickerDialog.OnDateSetListener,
@ -17,14 +17,14 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener,
private var context: Context? = null private var context: Context? = null
lateinit var row: DynamicRowInterface lateinit var row: RowRepresentable
lateinit var bottomSheetDelegate: BottomSheetDelegate lateinit var bottomSheetDelegate: BottomSheetDelegate
lateinit var calendar: Calendar lateinit var calendar: Calendar
companion object { companion object {
fun create( fun create(
context: Context, context: Context,
row: DynamicRowInterface, row: RowRepresentable,
bottomSheetDelegate: BottomSheetDelegate, bottomSheetDelegate: BottomSheetDelegate,
date: Date? date: Date?
) : DateTimePickerManager { ) : DateTimePickerManager {

@ -1,7 +0,0 @@
package net.pokeranalytics.android.ui.fragment.components
open class DynamicListFragment : PokerAnalyticsFragment() {
}

@ -4,7 +4,6 @@ import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import io.realm.Realm import io.realm.Realm
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface
open class PokerAnalyticsFragment: Fragment() { open class PokerAnalyticsFragment: Fragment() {

@ -2,6 +2,7 @@ package net.pokeranalytics.android.ui.fragment.components.bottomsheet
import android.text.InputType import android.text.InputType
import io.realm.RealmResults import io.realm.RealmResults
import net.pokeranalytics.android.ui.view.RowRepresentable
class BottomSheetData( class BottomSheetData(
var defaultValue: Any? = null, var defaultValue: Any? = null,

@ -8,12 +8,12 @@ import kotlinx.android.synthetic.main.bottom_sheet_double_list.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Game import net.pokeranalytics.android.model.realm.Game
import net.pokeranalytics.android.ui.adapter.components.DataListAdapter import net.pokeranalytics.android.ui.adapter.components.LiveDataAdapter
import net.pokeranalytics.android.ui.adapter.components.DisplayableDataSource import net.pokeranalytics.android.ui.adapter.components.LiveDataDataSource
import net.pokeranalytics.android.ui.adapter.components.DisplayableDelegate import net.pokeranalytics.android.ui.adapter.components.LiveDataDelegate
class BottomSheetDoubleListFragment : BottomSheetFragment(), DisplayableDelegate { class BottomSheetDoubleListFragment : BottomSheetFragment(), LiveDataDelegate {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -22,7 +22,7 @@ class BottomSheetDoubleListFragment : BottomSheetFragment(), DisplayableDelegate
initUI() initUI()
} }
override fun data(position: Int): DisplayableDataSource { override fun data(position: Int): LiveDataDataSource {
//TODO: Change that //TODO: Change that
return Game() return Game()
} }
@ -50,7 +50,7 @@ class BottomSheetDoubleListFragment : BottomSheetFragment(), DisplayableDelegate
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_double_list, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_double_list, view?.bottomSheetContainer, true)
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
val dataAdapter = DataListAdapter(this, R.layout.row_bottom_sheet_title) val dataAdapter = LiveDataAdapter(this, R.layout.row_bottom_sheet_title)
gameNameRecyclerView.apply { gameNameRecyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)

@ -9,7 +9,7 @@ import androidx.fragment.app.FragmentManager
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import kotlinx.android.synthetic.main.fragment_bottom_sheet.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface import net.pokeranalytics.android.ui.view.RowRepresentable
enum class BottomSheetType { enum class BottomSheetType {
NONE, NONE,
@ -22,15 +22,15 @@ enum class BottomSheetType {
} }
interface BottomSheetDelegate { interface BottomSheetDelegate {
fun clickOnAdd(row: DynamicRowInterface) fun clickOnAdd(row: RowRepresentable)
fun clickOnClear(row: DynamicRowInterface) fun clickOnClear(row: RowRepresentable)
fun setValue(value: Any, row: DynamicRowInterface) fun setValue(value: Any, row: RowRepresentable)
} }
open class BottomSheetFragment : BottomSheetDialogFragment() { open class BottomSheetFragment : BottomSheetDialogFragment() {
lateinit var row: DynamicRowInterface lateinit var row: RowRepresentable
lateinit var bottomSheetDelegate: BottomSheetDelegate lateinit var bottomSheetDelegate: BottomSheetDelegate
private var data: ArrayList<BottomSheetData> = ArrayList() private var data: ArrayList<BottomSheetData> = ArrayList()
@ -38,7 +38,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() {
companion object { companion object {
fun create( fun create(
fragmentManager: FragmentManager?, fragmentManager: FragmentManager?,
row: DynamicRowInterface, row: RowRepresentable,
bottomSheetDelegate: BottomSheetDelegate, bottomSheetDelegate: BottomSheetDelegate,
data: ArrayList<BottomSheetData> data: ArrayList<BottomSheetData>
): BottomSheetFragment { ): BottomSheetFragment {

@ -9,14 +9,14 @@ import kotlinx.android.synthetic.main.bottom_sheet_double_list.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Game import net.pokeranalytics.android.model.realm.Game
import net.pokeranalytics.android.ui.adapter.components.DataListAdapter import net.pokeranalytics.android.ui.adapter.components.LiveDataAdapter
import net.pokeranalytics.android.ui.adapter.components.DisplayableDataSource import net.pokeranalytics.android.ui.adapter.components.LiveDataDataSource
import net.pokeranalytics.android.ui.adapter.components.DisplayableDelegate import net.pokeranalytics.android.ui.adapter.components.LiveDataDelegate
class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate { class BottomSheetListFragment : BottomSheetFragment(), LiveDataDelegate {
private var realmData: RealmResults<*>? = null private var realmData: RealmResults<*>? = null
private lateinit var dataAdapter: DataListAdapter private lateinit var dataAdapter: LiveDataAdapter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -29,9 +29,9 @@ class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate {
dataAdapter.notifyDataSetChanged() dataAdapter.notifyDataSetChanged()
} }
override fun data(position: Int): DisplayableDataSource { override fun data(position: Int): LiveDataDataSource {
realmData?.let { realmData?.let {
return it[position] as DisplayableDataSource return it[position] as LiveDataDataSource
} }
//TODO: Change that //TODO: Change that
return Game() return Game()
@ -70,7 +70,7 @@ class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate {
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_list, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_list, view?.bottomSheetContainer, true)
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
dataAdapter = DataListAdapter(this, R.layout.row_bottom_sheet_title) dataAdapter = LiveDataAdapter(this, R.layout.row_bottom_sheet_title)
gameNameRecyclerView.apply { gameNameRecyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)

@ -0,0 +1,8 @@
package net.pokeranalytics.android.ui.view
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData
interface RowEditable {
fun getBottomSheetData(row: RowRepresentable): ArrayList<BottomSheetData>
fun updateValue(value: Any?, row: RowRepresentable)
}

@ -0,0 +1,158 @@
package net.pokeranalytics.android.ui.view
import android.content.Context
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
interface RowRepresentable {
fun localizedTitle(context: Context): String {
this.resId?.let {
return context.getString(it)
}
return "LOCALISATION NOT FOUND"
}
val resId: Int?
get() {
return null
}
val viewType: Int
get() {
return 0
}
val bottomSheetType: BottomSheetType
get() {
return BottomSheetType.NONE
}
val relatedResultsRepresentable: LiveData?
get() {
return null
}
}
enum class SessionRow : RowRepresentable {
GAME,
BLINDS,
LOCATION,
BANKROLL,
START_DATE,
END_DATE,
COMMENT;
override val resId: Int?
get() {
return when (this) {
BLINDS -> R.string.blinds
GAME -> R.string.game
LOCATION -> R.string.location
BANKROLL -> R.string.bankroll
COMMENT -> R.string.comment
START_DATE -> R.string.start_date
END_DATE -> R.string.end_date
}
}
override val viewType: Int
get() {
return when (this) {
BLINDS, GAME, BANKROLL, LOCATION, COMMENT -> RowViewType.TITLE_VALUE.ordinal
START_DATE, END_DATE -> RowViewType.TITLE_VALUE_ACTION.ordinal
}
}
override val bottomSheetType: BottomSheetType
get() {
return when (this) {
BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT
GAME -> BottomSheetType.LIST
LOCATION -> BottomSheetType.LIST
BANKROLL -> BottomSheetType.LIST
COMMENT -> BottomSheetType.EDIT_TEXT
else -> BottomSheetType.NONE
}
}
}
enum class SimpleRow : RowRepresentable {
NAME;
override val resId: Int? = R.string.name
override val viewType: Int = RowViewType.TITLE_VALUE.ordinal
override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT
}
enum class BankrollRow : RowRepresentable {
LIVE,
CURRENCY;
override val resId: Int?
get() {
return when (this) {
LIVE -> R.string.live
CURRENCY -> R.string.currency
}
}
override val viewType: Int
get() {
return when (this) {
LIVE, CURRENCY -> RowViewType.TITLE_VALUE.ordinal
}
}
override val bottomSheetType: BottomSheetType
get() {
return when (this) {
LIVE -> BottomSheetType.NONE
CURRENCY -> BottomSheetType.LIST
}
}
}
enum class GameRow : RowRepresentable {
}
enum class LocationRow : RowRepresentable {
}
enum class TransactionTypeRow : RowRepresentable {
}
enum class TournamentFeatureRow : RowRepresentable {
}
enum class SettingRow: RowRepresentable {
BANKROLL,
GAME,
LOCATION,
TOURNAMENT_TYPE,
TRANSACTION_TYPE;
override val resId: Int?
get() {
return when (this) {
BANKROLL -> R.string.bankroll
GAME -> R.string.game
LOCATION -> R.string.location
TOURNAMENT_TYPE -> R.string.tournament_type
TRANSACTION_TYPE -> R.string.transaction_type
}
}
override val viewType: Int = RowViewType.TITLE.ordinal
override val relatedResultsRepresentable : LiveData?
get() {
return when (this) {
BANKROLL -> LiveData.BANKROLL
GAME -> LiveData.GAME
LOCATION -> LiveData.LOCATION
TOURNAMENT_TYPE -> LiveData.TOURNAMENT_TYPE
TRANSACTION_TYPE -> LiveData.TRANSACTION_TYPE
}
}
}

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.adapter.components package net.pokeranalytics.android.ui.view
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -6,10 +6,11 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.row_title_value_action.view.* import kotlinx.android.synthetic.main.row_title_value_action.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDataSource
interface DynamicHolder { interface DynamicHolder {
fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate? = null, listener: View.OnClickListener, actionListener: View.OnClickListener? = null) {} fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource? = null, listener: View.OnClickListener, actionListener: View.OnClickListener? = null) {}
} }
@ -20,33 +21,37 @@ enum class RowViewType {
TITLE_VALUE, TITLE_VALUE,
TITLE_VALUE_ACTION; TITLE_VALUE_ACTION;
inner class FakeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { inner class FakeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { DynamicHolder {
override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) {
} }
} }
inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { DynamicHolder {
override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) {
itemView.title.text = row.localizedTitle(itemView.context) itemView.title.text = row.localizedTitle(itemView.context)
itemView.container.setOnClickListener(listener) itemView.container.setOnClickListener(listener)
} }
} }
inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { DynamicHolder {
override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) {
itemView.title.text = row.localizedTitle(itemView.context) itemView.title.text = row.localizedTitle(itemView.context)
delegate?.let { rowRepresentableDataSource?.let {
itemView.value.text = it.stringForRow(row) itemView.value.text = it.stringForRow(row)
} }
itemView.container.setOnClickListener(listener) itemView.container.setOnClickListener(listener)
} }
} }
inner class TitleValueActionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { inner class TitleValueActionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { DynamicHolder {
override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) {
itemView.title.text = row.localizedTitle(itemView.context) itemView.title.text = row.localizedTitle(itemView.context)
delegate?.let { rowDelegate -> rowRepresentableDataSource?.let { rowDelegate ->
val value = rowDelegate.stringForRow(row) val value = rowDelegate.stringForRow(row)
itemView.value.text = value itemView.value.text = value

@ -1,20 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
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:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
tools:context=".ui.activity.HomeActivity">
<androidx.appcompat.widget.AppCompatTextView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/title" android:id="@+id/recyclerView"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:text="Stats"
android:textSize="48sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

@ -27,4 +27,21 @@
<string name="add">Add</string> <string name="add">Add</string>
<string name="done">Done</string> <string name="done">Done</string>
<string name="net_result">Net Result</string>
<string name="hourly_rate">Hourly Rate</string>
<string name="average">Average</string>
<string name="number_of_groups">Number of groups</string>
<string name="number_of_games">Number of games</string>
<string name="duration">Duration</string>
<string name="average_duration">Average duration</string>
<string name="net_bb_per_100_hands">Net(BB) per 100 hands</string>
<string name="hourly_rate_bb">Hourly rate (BB)</string>
<string name="average_net_bb">Average net (BB)</string>
<string name="win_ratio">Win ratio</string>
<string name="average_buyin">Average buyin</string>
<string name="roi">ROI</string>
<string name="standard_deviation">Standard deviation</string>
<string name="standard_deviation_hourly">Standard deviation hourly</string>
<string name="standard_deviation_bb_per_100_hands">Standard deviation BB per 100 hands</string>
<string name="hands_played">Hands played</string>
</resources> </resources>

Loading…
Cancel
Save