diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HistoryRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HistoryRowRepresentableAdapter.kt index 35000ea8..60a872c4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/HistoryRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/HistoryRowRepresentableAdapter.kt @@ -4,15 +4,17 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.AppCompatTextView -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import io.realm.RealmResults import kotlinx.android.synthetic.main.row_history_session.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.view.BindableHolder -import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.util.extensions.getMonthAndYear +import timber.log.Timber +import java.util.* +import kotlin.collections.HashMap /** @@ -23,35 +25,15 @@ import net.pokeranalytics.android.ui.view.RowViewType class HistoryRowRepresentableAdapter( var realmResults: RealmResults, var delegate: RowRepresentableDelegate? = null, - var headers: ArrayList + var headers: RealmResults ) : RecyclerView.Adapter() { - private var headersPositions: HashMap = HashMap() - private var headersDisplayed: ArrayList = ArrayList() - private var headersPositions2: HashMap = HashMap() - - private var viewTypesPositions: ArrayList = ArrayList() + private var headersPositions = HashMap() + private lateinit var sortedHeaders: SortedMap init { - - val start = System.currentTimeMillis() - - headersPositions2.clear() - viewTypesPositions.clear() - - /* - for (session in realmResults) { - if (!headersPositions2.containsValue(session.groupByMonth)) { - headersPositions2[viewTypesPositions.size] = session.groupByMonth - viewTypesPositions.add(RowViewType.HEADER_TITLE.ordinal) - } - viewTypesPositions.add(RowViewType.ROW_SESSION.ordinal) - } - - Timber.d("Create viewTypesPositions in: ${System.currentTimeMillis() - start}ms") - */ - + refreshData() } /** @@ -72,58 +54,15 @@ class HistoryRowRepresentableAdapter( * Display a session view */ inner class HeaderTitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - fun bind(position: Int, value: String?, adapter: HistoryRowRepresentableAdapter) { - + fun bind(position: Int, session: Session?, adapter: HistoryRowRepresentableAdapter) { // Title itemView.findViewById(R.id.title)?.let { - it.text = value ?: "" + it.text = session?.creationDate?.getMonthAndYear() } } } - override fun getItemViewType(position: Int): Int { - - return viewTypesPositions[position] - - /* - if (position < headers.size) { - return RowViewType.HEADER_TITLE.ordinal - } else { - return RowViewType.ROW_SESSION.ordinal - }*/ - - - - /* - - var nbHeaders = 0 - for (key in headersPositions2.keys) { - if (position < key) { - nbHeaders++ - } - } - - val realIndex = position - nbHeaders - - - - //val realIndex = getRealIndex(position)//position - headersPositions.size - val month = realmResults[realIndex]?.groupByMonth ?: "" - - if (headersPositions.containsKey(month) || headersPositions[month] == position) { - return RowViewType.ROW_SESSION.ordinal//this.dataSource.viewTypeForPosition(position) - } else { - headersPositions[month] = position - return RowViewType.HEADER_TITLE.ordinal - } - */ - - } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - //val rowViewType: RowViewType = RowViewType.values()[viewType] - //return rowViewType.viewHolder(parent) - if (viewType == RowViewType.ROW_SESSION.ordinal) { val layout = LayoutInflater.from(parent.context).inflate(R.layout.row_history_session, parent, false) return RowSessionViewHolder(layout) @@ -134,81 +73,77 @@ class HistoryRowRepresentableAdapter( } - var size = 0 - - override fun getItemCount(): Int { - size++ + override fun getItemViewType(position: Int): Int { + if (sortedHeaders.containsKey(position)) { + return RowViewType.HEADER_TITLE.ordinal + } else { + return RowViewType.ROW_SESSION.ordinal + } + } - return realmResults.size + headers.size + size + override fun getItemCount(): Int { + return realmResults.size + headers.size } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is RowSessionViewHolder) { holder.bind(position, realmResults[getRealIndex(position)], this) - } else if (holder is HeaderTitleViewHolder) { holder.bind(position, headers[getRealIndex(position)], this) } - - /* - this.dataSource.rowRepresentableForPosition(position)?.let { - (holder as RowSessionViewHolder).bind(position, getItem(position), this) - } - */ } /** * Get real index */ - private fun getRealIndex(position: Int) : Int { - - val sorted = headersPositions2.toSortedMap() + private fun getRealIndex(position: Int): Int { - if (sorted.containsKey(position)) { - return sorted.keys.indexOf(position) + if (sortedHeaders.containsKey(position)) { + // Header position + //Timber.d("getRealIndex: Header: ${sortedHeaders.keys.indexOf(position)}") + return sortedHeaders.keys.indexOf(position) } else { - var nbHeadersBefore = 0 - for (key in sorted.keys) { - if (key < position) { - nbHeadersBefore++ + // Row position + var headersBefore = 0 + for (key in sortedHeaders.keys) { + if (position > key) { + headersBefore++ } else { break } } - return position - nbHeadersBefore - + //Timber.d("getRealIndex: Row: $position $headersBefore") + return position - headersBefore } } - /** - * Refresh the row in the adapter + * Refresh headers positions */ - fun refreshRow(row: RowRepresentable) { + fun refreshData() { - /* - if (row.viewType == RowViewType.TITLE_SWITCH.ordinal) { - // Avoid to refresh the view because it will refresh itself - // Caution if we want to update the title for example - return - } + headersPositions.clear() + val start = System.currentTimeMillis() + + var previousYear = 0 + var previousMonth = 0 + + val calendar = Calendar.getInstance() - val index = this.dataSource.indexForRow(row) - if (index >= 0) { - Timber.d("refreshRow: $index") - notifyItemChanged(index) + for ((index, session) in realmResults.withIndex()) { + calendar.time = session.creationDate + if (calendar.get(Calendar.YEAR) == previousYear && calendar.get(Calendar.MONTH) < previousMonth || (calendar.get(Calendar.YEAR) < previousYear) || index == 0) { + headersPositions[index + headersPositions.size] = session.creationDate + previousYear = calendar.get(Calendar.YEAR) + previousMonth = calendar.get(Calendar.MONTH) + } } - */ - } - /** - * Update UI - */ - fun updateRows(diffResult: DiffUtil.DiffResult) { - diffResult.dispatchUpdatesTo(this) - } + sortedHeaders = headersPositions.toSortedMap() + Timber.d("Create viewTypesPositions in: ${System.currentTimeMillis() - start}ms") + } } \ No newline at end of file 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 175adfc9..bd61a032 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,31 +4,20 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.view.isVisible -import androidx.recyclerview.widget.DiffUtil 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.Manageable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.activity.SessionActivity +import net.pokeranalytics.android.ui.adapter.HistoryRowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource -import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter 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.SmoothScrollLinearLayoutManager -import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable -import net.pokeranalytics.android.util.extensions.getMonthAndYear -import net.pokeranalytics.android.util.extensions.isSameDay -import net.pokeranalytics.android.util.extensions.isSameMonth -import net.pokeranalytics.android.util.extensions.longDate import java.util.* class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { @@ -42,7 +31,9 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource } } - private lateinit var historyAdapter: RowRepresentableAdapter + private lateinit var historyAdapter: HistoryRowRepresentableAdapter + // Old + //private lateinit var historyAdapter: HistoryRowRepresentableAdapter private lateinit var realmSessions: RealmResults private val sessions: ArrayList = ArrayList() private val rows: ArrayList = ArrayList() @@ -65,10 +56,8 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource override fun onResume() { super.onResume() - - //rows.clear() - //endedSessions.addAll(getRealm().copyFromRealm(realmSessions)) - createSessionsHeaders() + // Old + //createSessionsHeaders() } /** @@ -95,7 +84,18 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource realmSessions = getRealm().where().findAll().sort("creationDate", Sort.DESCENDING) val viewManager = SmoothScrollLinearLayoutManager(requireContext()) - historyAdapter = RowRepresentableAdapter(this, this) + + realmSessions.addChangeListener { t, changeSet -> + if (changeSet.insertions.isNotEmpty() || changeSet.deletions.isNotEmpty()) { + historyAdapter.refreshData() + } + historyAdapter.notifyDataSetChanged() + } + val months = getRealm().where().distinct("year", "month").findAll().sort("creationDate", Sort.DESCENDING) + historyAdapter = HistoryRowRepresentableAdapter(realmSessions, this, months) + + // Old + //historyAdapter = RowRepresentableAdapter(this, this) recyclerView.apply { setHasFixedSize(true) @@ -106,9 +106,13 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource /** * Create the endedSessions headers + * TODO: Remove */ private fun createSessionsHeaders() { + /* + val start = System.currentTimeMillis() + val oldRows = ArrayList() oldRows.addAll(rows) @@ -154,10 +158,12 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource newSessionCreated = false recyclerView.smoothScrollToPosition(0) } + + Timber.d("createSessionsHeaders in: ${System.currentTimeMillis() - start}ms") } + */ } - override fun rowRepresentableForPosition(position: Int): RowRepresentable? { return this.rows[position] }