diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt index 2dc0f8b7..06390a19 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -95,8 +95,6 @@ enum class Stat : RowRepresentable { } override val viewType: Int = RowViewType.TITLE_VALUE.ordinal - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() } /** diff --git a/app/src/main/java/net/pokeranalytics/android/model/Limit.kt b/app/src/main/java/net/pokeranalytics/android/model/Limit.kt index 3a907b02..beba08e6 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Limit.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Limit.kt @@ -37,8 +37,6 @@ enum class Limit : RowRepresentable { return this.longName } - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() } /* diff --git a/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt b/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt index df445b25..f4a4d55e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt @@ -34,6 +34,4 @@ class TableSize(var numberOfPlayer: Int) : RowRepresentable { override val viewType: Int get() = RowViewType.TITLE_GRID.ordinal - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() } diff --git a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt index a2019f09..278ece74 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt @@ -18,7 +18,7 @@ enum class SessionState { fun Session.getState(): SessionState { if (timeFrame == null) { - return SessionState.INVALID + return SessionState.PENDING } val endDate = timeFrame?.endDate diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index 5af300a9..904f8fbd 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -96,8 +96,4 @@ open class Bankroll(name: String = "") : RealmObject(), Savable, return this.name.isNotEmpty() } - @Ignore - override var displayHeader: Boolean = false - @Ignore - override var headerValues: ArrayList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index 43dedd4e..42478cff 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -77,8 +77,4 @@ open class Game : RealmObject(), Savable, RowRepresentableDataSource, return this.name.isNotEmpty() } - @Ignore - override var displayHeader: Boolean = false - @Ignore - override var headerValues: ArrayList = ArrayList() } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index f334b695..d82185e1 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -1,7 +1,6 @@ package net.pokeranalytics.android.model.realm import io.realm.RealmObject -import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource @@ -14,65 +13,61 @@ import java.util.* open class Location : RealmObject(), Savable, RowRepresentableDataSource, RowRepresentable { - @PrimaryKey - var id = UUID.randomUUID().toString() + @PrimaryKey + var id = UUID.randomUUID().toString() - // The name of the location - var name: String = "" + // The name of the location + var name: String = "" - // the longitude of the location - var longitude: Double? = null + // the longitude of the location + var longitude: Double? = null - // the latitude of the location - var latitude: Double? = null + // the latitude of the location + var latitude: Double? = null - override fun getDisplayName(): String { - return this.name - } + override fun getDisplayName(): String { + return this.name + } - override fun uniqueIdentifier(): String { - return this.id - } + override fun uniqueIdentifier(): String { + return this.id + } - override fun adapterRows(): ArrayList { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(LocationRow.values()) - return rows - } + override fun adapterRows(): ArrayList { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(LocationRow.values()) + return rows + } - override fun stringForRow(row: RowRepresentable): String { - return when (row) { - SimpleRow.NAME -> this.name - else -> return super.stringForRow(row) - } - } + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> this.name + else -> return super.stringForRow(row) + } + } - override fun editDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() - when (row) { - SimpleRow.NAME -> data.add( - RowRepresentableEditDescriptor( - this.name, - SimpleRow.NAME.resId - ) - ) - } - return data - } + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() + when (row) { + SimpleRow.NAME -> data.add( + RowRepresentableEditDescriptor( + this.name, + SimpleRow.NAME.resId + ) + ) + } + return data + } - override fun updateValue(value: Any?, row: RowRepresentable) { - when (row) { - SimpleRow.NAME -> this.name = value as String? ?: "" - } - } + override fun updateValue(value: Any?, row: RowRepresentable) { + when (row) { + SimpleRow.NAME -> this.name = value as String? ?: "" + } + } - override fun isValidForSave(): Boolean { - return this.name.isNotEmpty() - } + override fun isValidForSave(): Boolean { + return this.name.isNotEmpty() + } - @Ignore - override var displayHeader: Boolean = false - @Ignore - override var headerValues: ArrayList = ArrayList() } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 34be3cc8..142b13fd 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -33,11 +33,6 @@ open class Session : RealmObject(), SessionInterface, Savable, } companion object { - - // Type: cash game = 0, tournament = 1 - const val TYPE_GAME = 0 - const val TYPE_TOURNAMENT = 1 - fun newInstance(): Session { val session = Session() session.result = Result() @@ -52,7 +47,7 @@ open class Session : RealmObject(), SessionInterface, Savable, /** * 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 var result: Result? = null @@ -122,16 +117,24 @@ open class Session : RealmObject(), SessionInterface, Savable, // The features of the tournament, like Knockout, Shootout, Turbo... var tournamentFeatures: RealmList = 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 = 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 { when (getState()) { SessionState.PENDING -> { @@ -152,7 +155,7 @@ open class Session : RealmObject(), SessionInterface, Savable, /** * Pause a session */ - fun pauseSession() { + fun pause() { realm.executeTransaction { when (getState()) { SessionState.STARTED -> { @@ -166,7 +169,7 @@ open class Session : RealmObject(), SessionInterface, Savable, /** * Stop a session */ - fun stopSession() { + fun stop() { realm.executeTransaction { when (getState()) { SessionState.STARTED, SessionState.PAUSED -> { @@ -182,7 +185,7 @@ open class Session : RealmObject(), SessionInterface, Savable, /** * Restart a session */ - fun restartSession() { + fun restart() { realm.executeTransaction { this.timeFrame?.paused = false this.timeFrame?.pauseDate = null @@ -341,7 +344,7 @@ open class Session : RealmObject(), SessionInterface, Savable, ) ) - if (type == TYPE_GAME) { + if (!isTournament()) { rows.add( HeaderRowRepresentable( RowViewType.HEADER_TITLE_VALUE, diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index fcb91e91..0f8976ce 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -67,8 +67,4 @@ open class TournamentFeature : RealmObject(), Savable, RowRepresentableDataSourc return this.name.isNotEmpty() } - @Ignore - override var displayHeader: Boolean = false - @Ignore - override var headerValues: ArrayList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt index 5d9f69a5..fbf73592 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt @@ -1,7 +1,6 @@ package net.pokeranalytics.android.model.realm import io.realm.RealmObject -import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable 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 = ArrayList() - } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index a90c5007..6e3df58f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt @@ -2,7 +2,6 @@ package net.pokeranalytics.android.model.realm import android.text.InputType import io.realm.RealmObject -import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource @@ -76,10 +75,6 @@ open class TransactionType : RealmObject(), Savable, RowRepresentableDataSource, return this.name.isNotEmpty() } - @Ignore - override var displayHeader: Boolean = false - @Ignore - override var headerValues: ArrayList = ArrayList() } enum class TransactionKind { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt index 41cc6926..17a16d3a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt @@ -27,7 +27,7 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda } override fun getCount(): Int { - return 5 + return 3 } override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index 5190d51e..ed0bffeb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -4,11 +4,14 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import io.realm.RealmResults import io.realm.Sort import io.realm.kotlin.where import kotlinx.android.synthetic.main.fragment_history.* +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Savable 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.RowRepresentableDelegate 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.RowViewType +import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentable import net.pokeranalytics.android.util.getMonthAndYear import net.pokeranalytics.android.util.isSameDay import net.pokeranalytics.android.util.isSameMonth import net.pokeranalytics.android.util.longDate +import timber.log.Timber import java.util.* class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, RowRepresentableDelegate { @@ -39,6 +45,7 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro private lateinit var historyAdapter: RowRepresentableAdapter private lateinit var realmSessions: RealmResults private val sessions: ArrayList = ArrayList() + private val rows: ArrayList = ArrayList() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_history, container, false) @@ -57,10 +64,9 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro override fun onResume() { super.onResume() - historyAdapter.notifyDataSetChanged() - sessions.clear() - sessions.addAll(getRealm().copyFromRealm(realmSessions)) + //rows.clear() + //sessions.addAll(getRealm().copyFromRealm(realmSessions)) createSessionsHeaders() } @@ -88,8 +94,6 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro val viewManager = LinearLayoutManager(requireContext()) historyAdapter = RowRepresentableAdapter(this, this) - createSessionsHeaders() - recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager @@ -102,45 +106,69 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro */ private fun createSessionsHeaders() { - val groupedByDay = false + Timber.d("createSessionsHeaders") - val calendar = Calendar.getInstance() - val currentCalendar = Calendar.getInstance() + val oldRows = ArrayList() + oldRows.addAll(rows) - for ((index, session) in sessions.withIndex()) { - currentCalendar.time = session.creationDate - if (groupedByDay) { - if (!calendar.isSameDay(currentCalendar) || index == 0) { - calendar.time = currentCalendar.time - session.displayHeader = true - session.headerValues = arrayListOf(session.creationDate.longDate(), "$ 123") - } - } else { - if (!calendar.isSameMonth(currentCalendar) || index == 0) { - calendar.time = currentCalendar.time - session.displayHeader = true - session.headerValues = arrayListOf(session.creationDate.getMonthAndYear(), "$ 123") + rows.clear() + sessions.clear() + sessions.addAll(getRealm().copyFromRealm(realmSessions)) + + GlobalScope.launch { + + val groupedByDay = false + val calendar = Calendar.getInstance() + val currentCalendar = Calendar.getInstance() + + for ((index, session) in sessions.withIndex()) { + currentCalendar.time = session.creationDate + if (groupedByDay) { + if (!calendar.isSameDay(currentCalendar) || index == 0) { + calendar.time = currentCalendar.time + val header = HeaderRowRepresentable( + customViewType = RowViewType.HEADER_SESSION, + title = session.creationDate.longDate() + ) + rows.add(header) + } + } else { + if (!calendar.isSameMonth(currentCalendar) || index == 0) { + calendar.time = currentCalendar.time + val header = HeaderRowRepresentable( + 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 { - return this.sessions[position] + return this.rows[position] } override fun numberOfRows(): Int { - return this.sessions.size + return this.rows.size } 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 { - return this.sessions.indexOf(row) + return this.rows.indexOf(row) } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index 993febf9..573a1e34 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -234,10 +234,10 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott private fun manageSessionState() { when (currentSession.getState()) { SessionState.PENDING, SessionState.PAUSED -> { - currentSession.startSession() + currentSession.startOrContinue() } SessionState.STARTED -> { - currentSession.pauseSession() + currentSession.pause() } else -> { } @@ -249,7 +249,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott * Stop the current session */ private fun stopSession() { - currentSession.stopSession() + currentSession.stop() updateSessionUI() } @@ -257,7 +257,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott * Restart timer */ private fun restartTimer() { - currentSession.restartSession() + currentSession.restart() updateSessionUI() } @@ -281,12 +281,12 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott } else { realm.beginTransaction() 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() } 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) recyclerView.adapter = sessionAdapter diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt index b402ce8a..df9c1b38 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt @@ -94,7 +94,7 @@ class StatsFragment : PokerAnalyticsFragment(), RowRepresentableDataSource { val tSessions = mutableListOf() allSessions.forEach { session -> - if (session.type == Session.Type.CASH_GAME.ordinal) { + if (session.isCashGame()) { cgSessions.add(session) } else { tSessions.add(session) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/PokerAnalyticsTextView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/DynamicValueTextView.kt similarity index 73% rename from app/src/main/java/net/pokeranalytics/android/ui/view/PokerAnalyticsTextView.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/DynamicValueTextView.kt index 5f187ecc..0e5e3d58 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/PokerAnalyticsTextView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/DynamicValueTextView.kt @@ -7,7 +7,11 @@ import androidx.core.content.ContextCompat import net.pokeranalytics.android.R 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 amount: Double = 0.0 @@ -32,10 +36,10 @@ class PokerAnalyticsTextView: AppCompatTextView { * Init class */ 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 { - isCurrency = getBoolean(R.styleable.PokerAnalyticsTextView_isCurrency, false) - amount = getFloat(R.styleable.PokerAnalyticsTextView_amount, 0f).toDouble() + isCurrency = getBoolean(R.styleable.DynamicValueTextView_isCurrency, false) + amount = getFloat(R.styleable.DynamicValueTextView_amount, 0f).toDouble() updateUI() } finally { recycle() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/HistorySessionDiffCallback.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/HistorySessionDiffCallback.kt new file mode 100644 index 00000000..a0badd28 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/HistorySessionDiffCallback.kt @@ -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, var oldRows: List) : + 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) + } +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/PokerAnalyticsViewPager.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt similarity index 85% rename from app/src/main/java/net/pokeranalytics/android/ui/view/PokerAnalyticsViewPager.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt index 830ed374..2802f2fb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/PokerAnalyticsViewPager.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/HomeViewPager.kt @@ -8,7 +8,7 @@ import androidx.viewpager.widget.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 diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index fdeb4c73..2358c012 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -45,16 +45,6 @@ interface Displayable : Localizable { get() { return BottomSheetType.NONE } - - val displayHeader: Boolean - get() { - return false - } - - val headerValues: ArrayList - get() { - return ArrayList() - } } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index e09bb440..0287aab7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -3,13 +3,13 @@ package net.pokeranalytics.android.ui.view import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_bottom_sheet_grid_title.view.* import kotlinx.android.synthetic.main.row_bottom_sheet_title.view.* import kotlinx.android.synthetic.main.row_header_title_amount.view.* import kotlinx.android.synthetic.main.row_header_title_value.view.* import kotlinx.android.synthetic.main.row_history_session.view.* +import kotlinx.android.synthetic.main.row_history_session_header.view.* import kotlinx.android.synthetic.main.row_stats_title_value.view.* import kotlinx.android.synthetic.main.row_title.view.* import kotlinx.android.synthetic.main.row_title_switch.view.* @@ -27,7 +27,7 @@ interface BindableHolder { fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { - } + } } @@ -37,6 +37,7 @@ enum class RowViewType { HEADER_TITLE_VALUE, HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT_BIG, + HEADER_SESSION, EDIT_TEXT, TITLE, TITLE_VALUE, @@ -92,7 +93,8 @@ enum class RowViewType { LayoutInflater.from(parent.context).inflate( R.layout.row_bottom_sheet_grid_title, parent, - false) + false + ) ) TITLE_SWITCH -> TitleSwitchViewHolder( LayoutInflater.from(parent.context).inflate( @@ -122,11 +124,21 @@ enum class RowViewType { false ) ) + HEADER_SESSION -> { + HeaderSessionViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_history_session_header, + parent, + false + ) + ) + } ROW_SESSION -> RowSessionViewHolder( LayoutInflater.from(parent.context).inflate( R.layout.row_history_session, parent, - false) + false + ) ) STAT -> StatsTitleValueViewHolder( LayoutInflater.from(parent.context).inflate( @@ -176,29 +188,28 @@ enum class RowViewType { } } - inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowTitle_title.text = row.localizedTitle(itemView.context) - val listener = View.OnClickListener { - adapter.delegate?.onRowSelected(position, row) - } - itemView.rowTitle_container.setOnClickListener(listener) + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.rowTitle_container.setOnClickListener(listener) } } inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowTitleValue_title.text = row.localizedTitle(itemView.context) - adapter.dataSource?.let { + adapter.dataSource?.let { itemView.rowTitleValue_value.text = it.stringForRow(row, itemView.context) } - val listener = View.OnClickListener { - adapter.delegate?.onRowSelected(position, row) - } - itemView.rowTitleValue_container.setOnClickListener(listener) + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.rowTitleValue_container.setOnClickListener(listener) itemView.rowTitleValue_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE } } @@ -232,45 +243,45 @@ enum class RowViewType { inner class TitleSwitchViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowTitleSwitch_title.text = row.localizedTitle(itemView.context) - adapter.dataSource.let { + adapter.dataSource.let { itemView.rowTitleSwitch_switch.isChecked = it.boolForRow(row) - itemView.rowTitleSwitch_switch.setOnCheckedChangeListener { buttonView, isChecked -> - adapter.delegate?.onRowValueChanged(isChecked, row) - } + itemView.rowTitleSwitch_switch.setOnCheckedChangeListener { buttonView, isChecked -> + adapter.delegate?.onRowValueChanged(isChecked, row) + } } - val listener = View.OnClickListener { - itemView.rowTitleSwitch_switch.isChecked = !itemView.rowTitleSwitch_switch.isChecked - } - itemView.rowTitleSwitch_container.setOnClickListener(listener) - itemView.rowTitleSwitch_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE + val listener = View.OnClickListener { + itemView.rowTitleSwitch_switch.isChecked = !itemView.rowTitleSwitch_switch.isChecked + } + itemView.rowTitleSwitch_container.setOnClickListener(listener) + itemView.rowTitleSwitch_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE } } inner class TitleValueActionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowTitleValueAction_title.text = row.localizedTitle(itemView.context) adapter.dataSource.let { rowDelegate -> val value = rowDelegate.stringForRow(row, itemView.context) itemView.rowTitleValueAction_value.text = value 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) } } - val listener = View.OnClickListener { - adapter.delegate?.onRowSelected(position, row) - } - val actionListener = View.OnClickListener { - adapter.delegate?.onRowSelected(position, row, true) - } - itemView.rowTitleValueAction_container.setOnClickListener(listener) + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + val actionListener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row, true) + } + itemView.rowTitleValueAction_container.setOnClickListener(listener) itemView.rowTitleValueAction_action.setOnClickListener(actionListener) } } @@ -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), BindableHolder { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + //TODO: Header + /* if (row.displayHeader) { itemView.sessionHeader.isVisible = true itemView.sessionHeader.text = row.headerValues.firstOrNull() ?: "" } else { itemView.sessionHeader.isVisible = false } + */ itemView.sessionRow.setData(row as Session) val listener = View.OnClickListener { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt index d40ad77b..89262a63 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt @@ -64,7 +64,7 @@ class SessionRowView : FrameLayout { // Title / Game type var title = "" - if (session.type == Session.TYPE_TOURNAMENT) { + if (session.isTournament()) { if (session.tournamentEntryFee != null) { title += session.tournamentEntryFee?.toCurrency() } @@ -76,7 +76,7 @@ class SessionRowView : FrameLayout { title = context.getString(R.string.tournament).capitalize() } - } else if (session.type == Session.TYPE_GAME) { + } else { if (session.cgSmallBlind != null && session.cgBigBlind != null) { title += session.getBlinds() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt index 905925f3..68eb181d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt @@ -30,7 +30,4 @@ enum class BankrollRow : RowRepresentable { } } - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt index 68e70018..0c4234fc 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt @@ -29,6 +29,4 @@ enum class GameRow : RowRepresentable { } } - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt index d95411fb..bec9dfe3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt @@ -8,7 +8,7 @@ import net.pokeranalytics.android.ui.view.RowViewType * A class to display headers as row representable */ class HeaderRowRepresentable( - customViewType: RowViewType? = RowViewType.HEADER, + var customViewType: RowViewType? = RowViewType.HEADER, override var resId: Int? = null, var title: String? = null, var value: String? = null @@ -27,7 +27,5 @@ class HeaderRowRepresentable( override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER.ordinal - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt index 2651073c..2cc89860 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt @@ -30,6 +30,4 @@ enum class LocationRow : RowRepresentable { } } - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt index 408babda..6a9b70b8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt @@ -36,7 +36,7 @@ enum class SessionRow : RowRepresentable { */ fun getRows(type: Int, sessionState: SessionState): ArrayList { when (type) { - Session.TYPE_TOURNAMENT -> { + Session.Type.TOURNAMENT.ordinal -> { return when (sessionState) { SessionState.PENDING -> { arrayListOf( @@ -54,7 +54,7 @@ enum class SessionRow : RowRepresentable { else -> arrayListOf() } } - Session.TYPE_GAME -> { + Session.Type.CASH_GAME.ordinal -> { return when (sessionState) { SessionState.PENDING -> { 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 = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt index fcdf9b6a..95c0c1df 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt @@ -12,6 +12,4 @@ enum class SimpleRow : RowRepresentable { override val resId: Int? = R.string.name override val viewType: Int = RowViewType.TITLE_VALUE.ordinal override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 670ad70c..09f1bbc4 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -25,7 +25,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/toolbar" /> --> - - - - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_session_view.xml b/app/src/main/res/layout/row_session_view.xml index bac1d7a1..e2e98e19 100644 --- a/app/src/main/res/layout/row_session_view.xml +++ b/app/src/main/res/layout/row_session_view.xml @@ -151,7 +151,7 @@ app:layout_constraintEnd_toStartOf="@+id/nextArrow" app:layout_constraintTop_toTopOf="@+id/sessionTitle"> - - +