Clean header management

feature/top10
Aurelien Hubert 7 years ago
parent b677ac0377
commit c6aa88afb5
  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. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
  6. 5
      app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt
  7. 7
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  8. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
  9. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt
  10. 5
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  11. 57
      app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt
  12. 57
      app/src/main/java/net/pokeranalytics/android/ui/view/HistorySessionDiffCallback.kt
  13. 10
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  14. 30
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  15. 3
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt
  16. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt
  17. 4
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt
  18. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt
  19. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt
  20. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt
  21. 17
      app/src/main/res/layout/row_history_session_header.xml

@ -73,8 +73,6 @@ enum class Stat : RowRepresentable {
}
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
}
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
get() = RowViewType.TITLE_GRID.ordinal
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
}

@ -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<String> = ArrayList()
}

@ -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<String> = ArrayList()
}

@ -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
@ -71,8 +70,4 @@ open class Location : RealmObject(), Savable, RowRepresentableDataSource, RowRep
return this.name.isNotEmpty()
}
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
}

@ -27,6 +27,7 @@ import kotlin.collections.ArrayList
open class Session : RealmObject(), SessionInterface, Savable,
RowRepresentableDataSource, RowRepresentable {
enum class Type {
CASH_GAME,
TOURNAMENT
@ -122,12 +123,6 @@ open class Session : RealmObject(), SessionInterface, Savable,
// The features of the tournament, like Knockout, Shootout, Turbo...
var tournamentFeatures: RealmList<TournamentFeature> = RealmList()
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
/**
* Start a session
*/

@ -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<String> = ArrayList()
}

@ -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<String> = ArrayList()
}

@ -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<String> = ArrayList()
}
enum class TransactionKind {

@ -4,11 +4,15 @@ 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.delay
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 +21,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 +46,7 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro
private lateinit var historyAdapter: RowRepresentableAdapter
private lateinit var realmSessions: RealmResults<Session>
private val sessions: ArrayList<Session> = ArrayList()
private val rows: ArrayList<RowRepresentable> = ArrayList()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_history, container, false)
@ -57,10 +65,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 +95,6 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro
val viewManager = LinearLayoutManager(requireContext())
historyAdapter = RowRepresentableAdapter(this, this)
createSessionsHeaders()
recyclerView.apply {
setHasFixedSize(true)
layoutManager = viewManager
@ -102,8 +107,20 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro
*/
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 {
delay(100)
val groupedByDay = false
val calendar = Calendar.getInstance()
val currentCalendar = Calendar.getInstance()
@ -112,35 +129,49 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, Ro
if (groupedByDay) {
if (!calendar.isSameDay(currentCalendar) || index == 0) {
calendar.time = currentCalendar.time
session.displayHeader = true
session.headerValues = arrayListOf(session.creationDate.longDate(), "$ 123")
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
session.displayHeader = true
session.headerValues = arrayListOf(session.creationDate.getMonthAndYear(), "$ 123")
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 {
if (rows[position].viewType == RowViewType.HEADER_SESSION.ordinal) {
return RowViewType.HEADER_SESSION.ordinal
} else {
return 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) {

@ -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)
}
}

@ -44,16 +44,6 @@ interface Displayable : Localizable {
get() {
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.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.*
@ -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,7 +188,6 @@ enum class RowViewType {
}
}
inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
@ -293,17 +304,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 {

@ -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
*/
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<String> = ArrayList()
}

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

@ -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 viewType: Int = RowViewType.TITLE_VALUE.ordinal
override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
}

@ -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>
Loading…
Cancel
Save