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

feature/top10
Laurent 7 years ago
commit b8b88eb872
  1. 2
      app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt
  2. 2
      app/src/main/java/net/pokeranalytics/android/model/Limit.kt
  3. 2
      app/src/main/java/net/pokeranalytics/android/model/TableSize.kt
  4. 2
      app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
  6. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
  7. 5
      app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt
  8. 35
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  9. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
  10. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt
  11. 5
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  12. 2
      app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt
  13. 56
      app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt
  14. 12
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  15. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
  16. 12
      app/src/main/java/net/pokeranalytics/android/ui/view/DynamicValueTextView.kt
  17. 57
      app/src/main/java/net/pokeranalytics/android/ui/view/HistorySessionDiffCallback.kt
  18. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt
  19. 10
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  20. 32
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  21. 4
      app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt
  22. 3
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt
  23. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt
  24. 4
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt
  25. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt
  26. 6
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt
  27. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt
  28. 2
      app/src/main/res/layout/activity_home.xml
  29. 2
      app/src/main/res/layout/row_header_title_amount.xml
  30. 2
      app/src/main/res/layout/row_header_title_amount_big.xml
  31. 2
      app/src/main/res/layout/row_header_title_value.xml
  32. 17
      app/src/main/res/layout/row_history_session_header.xml
  33. 2
      app/src/main/res/layout/row_session_view.xml
  34. 2
      app/src/main/res/values/attrs.xml

@ -95,8 +95,6 @@ enum class Stat : RowRepresentable {
} }
override val viewType: Int = RowViewType.TITLE_VALUE.ordinal override val viewType: Int = RowViewType.TITLE_VALUE.ordinal
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }
/** /**

@ -37,8 +37,6 @@ enum class Limit : RowRepresentable {
return this.longName return this.longName
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }
/* /*

@ -34,6 +34,4 @@ class TableSize(var numberOfPlayer: Int) : RowRepresentable {
override val viewType: Int override val viewType: Int
get() = RowViewType.TITLE_GRID.ordinal get() = RowViewType.TITLE_GRID.ordinal
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -18,7 +18,7 @@ enum class SessionState {
fun Session.getState(): SessionState { fun Session.getState(): SessionState {
if (timeFrame == null) { if (timeFrame == null) {
return SessionState.INVALID return SessionState.PENDING
} }
val endDate = timeFrame?.endDate val endDate = timeFrame?.endDate

@ -96,8 +96,4 @@ open class Bankroll(name: String = "") : RealmObject(), Savable,
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -77,8 +77,4 @@ open class Game : RealmObject(), Savable, RowRepresentableDataSource,
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -1,7 +1,6 @@
package net.pokeranalytics.android.model.realm package net.pokeranalytics.android.model.realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore
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.RowRepresentableDataSource
@ -71,8 +70,4 @@ open class Location : RealmObject(), Savable, RowRepresentableDataSource, RowRep
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -33,11 +33,6 @@ open class Session : RealmObject(), SessionInterface, Savable,
} }
companion object { companion object {
// Type: cash game = 0, tournament = 1
const val TYPE_GAME = 0
const val TYPE_TOURNAMENT = 1
fun newInstance(): Session { fun newInstance(): Session {
val session = Session() val session = Session()
session.result = Result() session.result = Result()
@ -52,7 +47,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
/** /**
* Indicates the type of session, cash game or tournament * Indicates the type of session, cash game or tournament
*/ */
var type: Int = TYPE_GAME var type: Int = Type.CASH_GAME.ordinal
// The result of the main user // The result of the main user
var result: Result? = null var result: Result? = null
@ -122,16 +117,24 @@ open class Session : RealmObject(), SessionInterface, Savable,
// The features of the tournament, like Knockout, Shootout, Turbo... // The features of the tournament, like Knockout, Shootout, Turbo...
var tournamentFeatures: RealmList<TournamentFeature> = RealmList() var tournamentFeatures: RealmList<TournamentFeature> = RealmList()
@Ignore /**
override var displayHeader: Boolean = false * Return if this session is a tournament
*/
fun isTournament(): Boolean {
return type == Type.TOURNAMENT.ordinal
}
@Ignore /**
override var headerValues: ArrayList<String> = ArrayList() * Return if this session is a cash game
*/
fun isCashGame(): Boolean {
return type == Type.CASH_GAME.ordinal
}
/** /**
* Start a session * Start or continue a session
*/ */
fun startSession() { fun startOrContinue() {
realm.executeTransaction { realm.executeTransaction {
when (getState()) { when (getState()) {
SessionState.PENDING -> { SessionState.PENDING -> {
@ -152,7 +155,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
/** /**
* Pause a session * Pause a session
*/ */
fun pauseSession() { fun pause() {
realm.executeTransaction { realm.executeTransaction {
when (getState()) { when (getState()) {
SessionState.STARTED -> { SessionState.STARTED -> {
@ -166,7 +169,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
/** /**
* Stop a session * Stop a session
*/ */
fun stopSession() { fun stop() {
realm.executeTransaction { realm.executeTransaction {
when (getState()) { when (getState()) {
SessionState.STARTED, SessionState.PAUSED -> { SessionState.STARTED, SessionState.PAUSED -> {
@ -182,7 +185,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
/** /**
* Restart a session * Restart a session
*/ */
fun restartSession() { fun restart() {
realm.executeTransaction { realm.executeTransaction {
this.timeFrame?.paused = false this.timeFrame?.paused = false
this.timeFrame?.pauseDate = null this.timeFrame?.pauseDate = null
@ -341,7 +344,7 @@ open class Session : RealmObject(), SessionInterface, Savable,
) )
) )
if (type == TYPE_GAME) { if (!isTournament()) {
rows.add( rows.add(
HeaderRowRepresentable( HeaderRowRepresentable(
RowViewType.HEADER_TITLE_VALUE, RowViewType.HEADER_TITLE_VALUE,

@ -67,8 +67,4 @@ open class TournamentFeature : RealmObject(), Savable, RowRepresentableDataSourc
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -1,7 +1,6 @@
package net.pokeranalytics.android.model.realm package net.pokeranalytics.android.model.realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore
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.RowRepresentableDataSource
@ -32,9 +31,4 @@ open class TournamentType : RealmObject(), Savable, RowRepresentableDataSource,
} }
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -2,7 +2,6 @@ package net.pokeranalytics.android.model.realm
import android.text.InputType import android.text.InputType
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore
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.RowRepresentableDataSource
@ -76,10 +75,6 @@ open class TransactionType : RealmObject(), Savable, RowRepresentableDataSource,
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }
enum class TransactionKind { enum class TransactionKind {

@ -27,7 +27,7 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda
} }
override fun getCount(): Int { override fun getCount(): Int {
return 5 return 3
} }
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {

@ -4,11 +4,14 @@ 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.DiffUtil
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.RealmResults import io.realm.RealmResults
import io.realm.Sort import io.realm.Sort
import io.realm.kotlin.where import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_history.* import kotlinx.android.synthetic.main.fragment_history.*
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
@ -17,12 +20,15 @@ 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.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.HistorySessionDiffCallback
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentable
import net.pokeranalytics.android.util.getMonthAndYear import net.pokeranalytics.android.util.getMonthAndYear
import net.pokeranalytics.android.util.isSameDay import net.pokeranalytics.android.util.isSameDay
import net.pokeranalytics.android.util.isSameMonth import net.pokeranalytics.android.util.isSameMonth
import net.pokeranalytics.android.util.longDate import net.pokeranalytics.android.util.longDate
import timber.log.Timber
import java.util.* import java.util.*
class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, RowRepresentableDelegate { class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, RowRepresentableDelegate {
@ -39,6 +45,7 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro
private lateinit var historyAdapter: RowRepresentableAdapter private lateinit var historyAdapter: RowRepresentableAdapter
private lateinit var realmSessions: RealmResults<Session> private lateinit var realmSessions: RealmResults<Session>
private val sessions: ArrayList<Session> = ArrayList() private val sessions: ArrayList<Session> = ArrayList()
private val rows: ArrayList<RowRepresentable> = ArrayList()
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_history, container, false) return inflater.inflate(R.layout.fragment_history, container, false)
@ -57,10 +64,9 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
historyAdapter.notifyDataSetChanged()
sessions.clear() //rows.clear()
sessions.addAll(getRealm().copyFromRealm(realmSessions)) //sessions.addAll(getRealm().copyFromRealm(realmSessions))
createSessionsHeaders() createSessionsHeaders()
} }
@ -88,8 +94,6 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
historyAdapter = RowRepresentableAdapter(this, this) historyAdapter = RowRepresentableAdapter(this, this)
createSessionsHeaders()
recyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager layoutManager = viewManager
@ -102,8 +106,18 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro
*/ */
private fun createSessionsHeaders() { private fun createSessionsHeaders() {
val groupedByDay = false Timber.d("createSessionsHeaders")
val oldRows = ArrayList<RowRepresentable>()
oldRows.addAll(rows)
rows.clear()
sessions.clear()
sessions.addAll(getRealm().copyFromRealm(realmSessions))
GlobalScope.launch {
val groupedByDay = false
val calendar = Calendar.getInstance() val calendar = Calendar.getInstance()
val currentCalendar = Calendar.getInstance() val currentCalendar = Calendar.getInstance()
@ -112,35 +126,49 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro
if (groupedByDay) { if (groupedByDay) {
if (!calendar.isSameDay(currentCalendar) || index == 0) { if (!calendar.isSameDay(currentCalendar) || index == 0) {
calendar.time = currentCalendar.time calendar.time = currentCalendar.time
session.displayHeader = true val header = HeaderRowRepresentable(
session.headerValues = arrayListOf(session.creationDate.longDate(), "$ 123") customViewType = RowViewType.HEADER_SESSION,
title = session.creationDate.longDate()
)
rows.add(header)
} }
} else { } else {
if (!calendar.isSameMonth(currentCalendar) || index == 0) { if (!calendar.isSameMonth(currentCalendar) || index == 0) {
calendar.time = currentCalendar.time calendar.time = currentCalendar.time
session.displayHeader = true val header = HeaderRowRepresentable(
session.headerValues = arrayListOf(session.creationDate.getMonthAndYear(), "$ 123") customViewType = RowViewType.HEADER_SESSION,
title = session.creationDate.getMonthAndYear()
)
rows.add(header)
} }
} }
rows.add(session)
} }
val diffResult = DiffUtil.calculateDiff(HistorySessionDiffCallback(rows, oldRows))
historyAdapter.updateRows(diffResult)
}
} }
override fun rowRepresentableForPosition(position: Int): RowRepresentable { override fun rowRepresentableForPosition(position: Int): RowRepresentable {
return this.sessions[position] return this.rows[position]
} }
override fun numberOfRows(): Int { override fun numberOfRows(): Int {
return this.sessions.size return this.rows.size
} }
override fun viewTypeForPosition(position: Int): Int { override fun viewTypeForPosition(position: Int): Int {
return RowViewType.ROW_SESSION.ordinal return if (rows[position].viewType == RowViewType.HEADER_SESSION.ordinal) {
RowViewType.HEADER_SESSION.ordinal
} else {
RowViewType.ROW_SESSION.ordinal
}
} }
override fun indexForRow(row: RowRepresentable): Int { override fun indexForRow(row: RowRepresentable): Int {
return this.sessions.indexOf(row) return this.rows.indexOf(row)
} }
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {

@ -234,10 +234,10 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
private fun manageSessionState() { private fun manageSessionState() {
when (currentSession.getState()) { when (currentSession.getState()) {
SessionState.PENDING, SessionState.PAUSED -> { SessionState.PENDING, SessionState.PAUSED -> {
currentSession.startSession() currentSession.startOrContinue()
} }
SessionState.STARTED -> { SessionState.STARTED -> {
currentSession.pauseSession() currentSession.pause()
} }
else -> { else -> {
} }
@ -249,7 +249,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
* Stop the current session * Stop the current session
*/ */
private fun stopSession() { private fun stopSession() {
currentSession.stopSession() currentSession.stop()
updateSessionUI() updateSessionUI()
} }
@ -257,7 +257,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
* Restart timer * Restart timer
*/ */
private fun restartTimer() { private fun restartTimer() {
currentSession.restartSession() currentSession.restart()
updateSessionUI() updateSessionUI()
} }
@ -281,12 +281,12 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
} else { } else {
realm.beginTransaction() realm.beginTransaction()
currentSession = realm.createObject(Session::class.java, UUID.randomUUID().toString()) currentSession = realm.createObject(Session::class.java, UUID.randomUUID().toString())
currentSession.type = if (isTournament) Session.TYPE_TOURNAMENT else Session.TYPE_GAME currentSession.type = if (isTournament) Session.Type.TOURNAMENT.ordinal else Session.Type.CASH_GAME.ordinal
realm.commitTransaction() realm.commitTransaction()
} }
toolbar.title = toolbar.title =
if (currentSession.type == Session.TYPE_TOURNAMENT) getString(R.string.tournament) else getString(R.string.cash_game) if (currentSession.isTournament()) getString(R.string.tournament) else getString(R.string.cash_game)
sessionAdapter = RowRepresentableAdapter(currentSession, this) sessionAdapter = RowRepresentableAdapter(currentSession, this)
recyclerView.adapter = sessionAdapter recyclerView.adapter = sessionAdapter

@ -94,7 +94,7 @@ class StatsFragment : PokerAnalyticsFragment(), RowRepresentableDataSource {
val tSessions = mutableListOf<Session>() val tSessions = mutableListOf<Session>()
allSessions.forEach { session -> allSessions.forEach { session ->
if (session.type == Session.Type.CASH_GAME.ordinal) { if (session.isCashGame()) {
cgSessions.add(session) cgSessions.add(session)
} else { } else {
tSessions.add(session) tSessions.add(session)

@ -7,7 +7,11 @@ import androidx.core.content.ContextCompat
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.util.toCurrency import net.pokeranalytics.android.util.toCurrency
class PokerAnalyticsTextView: AppCompatTextView { /**
* Extended TextView to display amount in the right color / currency
* Work in progress
*/
class DynamicValueTextView: AppCompatTextView {
var isCurrency: Boolean = false var isCurrency: Boolean = false
var amount: Double = 0.0 var amount: Double = 0.0
@ -32,10 +36,10 @@ class PokerAnalyticsTextView: AppCompatTextView {
* Init class * Init class
*/ */
private fun init(attrs: AttributeSet?) { private fun init(attrs: AttributeSet?) {
context.theme.obtainStyledAttributes( attrs, R.styleable.PokerAnalyticsTextView, 0, 0).apply { context.theme.obtainStyledAttributes( attrs, R.styleable.DynamicValueTextView, 0, 0).apply {
try { try {
isCurrency = getBoolean(R.styleable.PokerAnalyticsTextView_isCurrency, false) isCurrency = getBoolean(R.styleable.DynamicValueTextView_isCurrency, false)
amount = getFloat(R.styleable.PokerAnalyticsTextView_amount, 0f).toDouble() amount = getFloat(R.styleable.DynamicValueTextView_amount, 0f).toDouble()
updateUI() updateUI()
} finally { } finally {
recycle() recycle()

@ -0,0 +1,57 @@
package net.pokeranalytics.android.ui.view
import androidx.annotation.Nullable
import androidx.recyclerview.widget.DiffUtil
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentable
class HistorySessionDiffCallback(var newRows: List<RowRepresentable>, var oldRows: List<RowRepresentable>) :
DiffUtil.Callback() {
override fun getOldListSize(): Int {
return oldRows.size
}
override fun getNewListSize(): Int {
return newRows.size
}
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
if (oldRows[oldItemPosition] is Session && newRows[newItemPosition] is Session) {
val session1 = oldRows[oldItemPosition] as Session
val session2 = newRows[newItemPosition] as Session
return session1.id == session2.id
} else if (oldRows[oldItemPosition] is HeaderRowRepresentable && newRows[newItemPosition] is HeaderRowRepresentable) {
val header1 = oldRows[oldItemPosition] as HeaderRowRepresentable
val header2 = newRows[newItemPosition] as HeaderRowRepresentable
return header1.title == header2.title
}
return false
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
// Force to update all the rows that were already there
if (oldRows[oldItemPosition] is Session && newRows[newItemPosition] is Session) {
val session1 = oldRows[oldItemPosition] as Session
val session2 = newRows[newItemPosition] as Session
return false //session1.id == session2.id
} else if (oldRows[oldItemPosition] is HeaderRowRepresentable && newRows[newItemPosition] is HeaderRowRepresentable) {
val header1 = oldRows[oldItemPosition] as HeaderRowRepresentable
val header2 = newRows[newItemPosition] as HeaderRowRepresentable
return header1.title == header2.title
}
return false
}
@Nullable
override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
//you can return particular field for changed item.
return super.getChangePayload(oldItemPosition, newItemPosition)
}
}

@ -8,7 +8,7 @@ import androidx.viewpager.widget.ViewPager
/** /**
* Poker Analytics ViewPager * Poker Analytics ViewPager
*/ */
class PokerAnalyticsViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) { class HomeViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {
var enablePaging: Boolean = false var enablePaging: Boolean = false

@ -45,16 +45,6 @@ interface Displayable : Localizable {
get() { get() {
return BottomSheetType.NONE return BottomSheetType.NONE
} }
val displayHeader: Boolean
get() {
return false
}
val headerValues: ArrayList<String>
get() {
return ArrayList<String>()
}
} }
/** /**

@ -3,13 +3,13 @@ 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.core.view.isVisible
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_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.*
@ -37,6 +37,7 @@ enum class RowViewType {
HEADER_TITLE_VALUE, HEADER_TITLE_VALUE,
HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT,
HEADER_TITLE_AMOUNT_BIG, HEADER_TITLE_AMOUNT_BIG,
HEADER_SESSION,
EDIT_TEXT, EDIT_TEXT,
TITLE, TITLE,
TITLE_VALUE, TITLE_VALUE,
@ -92,7 +93,8 @@ enum class RowViewType {
LayoutInflater.from(parent.context).inflate( LayoutInflater.from(parent.context).inflate(
R.layout.row_bottom_sheet_grid_title, R.layout.row_bottom_sheet_grid_title,
parent, parent,
false) false
)
) )
TITLE_SWITCH -> TitleSwitchViewHolder( TITLE_SWITCH -> TitleSwitchViewHolder(
LayoutInflater.from(parent.context).inflate( LayoutInflater.from(parent.context).inflate(
@ -122,11 +124,21 @@ enum class RowViewType {
false false
) )
) )
HEADER_SESSION -> {
HeaderSessionViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_history_session_header,
parent,
false
)
)
}
ROW_SESSION -> RowSessionViewHolder( ROW_SESSION -> RowSessionViewHolder(
LayoutInflater.from(parent.context).inflate( LayoutInflater.from(parent.context).inflate(
R.layout.row_history_session, R.layout.row_history_session,
parent, parent,
false) false
)
) )
STAT -> StatsTitleValueViewHolder( STAT -> StatsTitleValueViewHolder(
LayoutInflater.from(parent.context).inflate( LayoutInflater.from(parent.context).inflate(
@ -176,7 +188,6 @@ enum class RowViewType {
} }
} }
inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), inner class TitleViewHolder(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) {
@ -260,7 +271,7 @@ enum class RowViewType {
val value = rowDelegate.stringForRow(row, itemView.context) val value = rowDelegate.stringForRow(row, itemView.context)
itemView.rowTitleValueAction_value.text = value itemView.rowTitleValueAction_value.text = value
itemView.rowTitleValueAction_action.visibility = if (value == "--") View.GONE else View.VISIBLE itemView.rowTitleValueAction_action.visibility = if (value == "--") View.GONE else View.VISIBLE
rowDelegate.actionIconForRow(row)?.let {icon -> rowDelegate.actionIconForRow(row)?.let { icon ->
itemView.rowTitleValueAction_action.setImageResource(icon) itemView.rowTitleValueAction_action.setImageResource(icon)
} }
} }
@ -295,17 +306,28 @@ enum class RowViewType {
} }
} }
inner class HeaderSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.sessionHeaderTitle.text = row.localizedTitle(itemView.context)
}
}
inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), inner class RowSessionViewHolder(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) {
//TODO: Header
/*
if (row.displayHeader) { if (row.displayHeader) {
itemView.sessionHeader.isVisible = true itemView.sessionHeader.isVisible = true
itemView.sessionHeader.text = row.headerValues.firstOrNull() ?: "" itemView.sessionHeader.text = row.headerValues.firstOrNull() ?: ""
} else { } else {
itemView.sessionHeader.isVisible = false itemView.sessionHeader.isVisible = false
} }
*/
itemView.sessionRow.setData(row as Session) itemView.sessionRow.setData(row as Session)
val listener = View.OnClickListener { val listener = View.OnClickListener {

@ -64,7 +64,7 @@ class SessionRowView : FrameLayout {
// Title / Game type // Title / Game type
var title = "" var title = ""
if (session.type == Session.TYPE_TOURNAMENT) { if (session.isTournament()) {
if (session.tournamentEntryFee != null) { if (session.tournamentEntryFee != null) {
title += session.tournamentEntryFee?.toCurrency() title += session.tournamentEntryFee?.toCurrency()
} }
@ -76,7 +76,7 @@ class SessionRowView : FrameLayout {
title = context.getString(R.string.tournament).capitalize() title = context.getString(R.string.tournament).capitalize()
} }
} else if (session.type == Session.TYPE_GAME) { } else {
if (session.cgSmallBlind != null && session.cgBigBlind != null) { if (session.cgSmallBlind != null && session.cgBigBlind != null) {
title += session.getBlinds() title += session.getBlinds()
} }

@ -30,7 +30,4 @@ enum class BankrollRow : RowRepresentable {
} }
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -29,6 +29,4 @@ enum class GameRow : RowRepresentable {
} }
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -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(
customViewType: RowViewType? = RowViewType.HEADER, var customViewType: RowViewType? = RowViewType.HEADER,
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
@ -27,7 +27,5 @@ class HeaderRowRepresentable(
override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER.ordinal override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER.ordinal
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -30,6 +30,4 @@ enum class LocationRow : RowRepresentable {
} }
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -36,7 +36,7 @@ enum class SessionRow : RowRepresentable {
*/ */
fun getRows(type: Int, sessionState: SessionState): ArrayList<RowRepresentable> { fun getRows(type: Int, sessionState: SessionState): ArrayList<RowRepresentable> {
when (type) { when (type) {
Session.TYPE_TOURNAMENT -> { Session.Type.TOURNAMENT.ordinal -> {
return when (sessionState) { return when (sessionState) {
SessionState.PENDING -> { SessionState.PENDING -> {
arrayListOf( arrayListOf(
@ -54,7 +54,7 @@ enum class SessionRow : RowRepresentable {
else -> arrayListOf() else -> arrayListOf()
} }
} }
Session.TYPE_GAME -> { Session.Type.CASH_GAME.ordinal -> {
return when (sessionState) { return when (sessionState) {
SessionState.PENDING -> { SessionState.PENDING -> {
arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE) arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE)
@ -127,6 +127,4 @@ enum class SessionRow : RowRepresentable {
} }
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -12,6 +12,4 @@ enum class SimpleRow : RowRepresentable {
override val resId: Int? = R.string.name override val resId: Int? = R.string.name
override val viewType: Int = RowViewType.TITLE_VALUE.ordinal override val viewType: Int = RowViewType.TITLE_VALUE.ordinal
override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -25,7 +25,7 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar" /> --> app:layout_constraintTop_toBottomOf="@+id/toolbar" /> -->
<net.pokeranalytics.android.ui.view.PokerAnalyticsViewPager <net.pokeranalytics.android.ui.view.HomeViewPager
android:id="@+id/viewPager" android:id="@+id/viewPager"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"

@ -24,7 +24,7 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:text="Title" /> tools:text="Title" />
<net.pokeranalytics.android.ui.view.PokerAnalyticsTextView <net.pokeranalytics.android.ui.view.DynamicValueTextView
android:id="@+id/rowHeaderTitleAmount.value" android:id="@+id/rowHeaderTitleAmount.value"
style="@style/PokerAnalyticsTheme.TextView.RowValue" style="@style/PokerAnalyticsTheme.TextView.RowValue"
android:layout_width="0dp" android:layout_width="0dp"

@ -24,7 +24,7 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:text="Title" /> tools:text="Title" />
<net.pokeranalytics.android.ui.view.PokerAnalyticsTextView <net.pokeranalytics.android.ui.view.DynamicValueTextView
android:id="@+id/rowHeaderTitleAmount.value" android:id="@+id/rowHeaderTitleAmount.value"
style="@style/PokerAnalyticsTheme.TextView.RowValue" style="@style/PokerAnalyticsTheme.TextView.RowValue"
android:layout_width="0dp" android:layout_width="0dp"

@ -22,7 +22,7 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:text="Title" /> tools:text="Title" />
<net.pokeranalytics.android.ui.view.PokerAnalyticsTextView <net.pokeranalytics.android.ui.view.DynamicValueTextView
android:id="@+id/rowHeaderTitleValue.value" android:id="@+id/rowHeaderTitleValue.value"
style="@style/PokerAnalyticsTheme.TextView.RowValue" style="@style/PokerAnalyticsTheme.TextView.RowValue"
android:layout_width="0dp" android:layout_width="0dp"

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/sessionHeaderTitle"
style="@style/PokerAnalyticsTheme.TextView.SessionHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
tools:text="Header" />
</LinearLayout>

@ -151,7 +151,7 @@
app:layout_constraintEnd_toStartOf="@+id/nextArrow" app:layout_constraintEnd_toStartOf="@+id/nextArrow"
app:layout_constraintTop_toTopOf="@+id/sessionTitle"> app:layout_constraintTop_toTopOf="@+id/sessionTitle">
<net.pokeranalytics.android.ui.view.PokerAnalyticsTextView <net.pokeranalytics.android.ui.view.DynamicValueTextView
android:id="@+id/gameResult" android:id="@+id/gameResult"
style="@style/PokerAnalyticsTheme.TextView.SessionRow.Result" style="@style/PokerAnalyticsTheme.TextView.SessionRow.Result"
android:layout_width="wrap_content" android:layout_width="wrap_content"

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<declare-styleable name="PokerAnalyticsTextView"> <declare-styleable name="DynamicValueTextView">
<attr name="isCurrency" format="boolean" /> <attr name="isCurrency" format="boolean" />
<attr name="amount" format="float" /> <attr name="amount" format="float" />
</declare-styleable> </declare-styleable>

Loading…
Cancel
Save