From 2c4acfdeccf0605098d38f360b317cd1d1d66089 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 19 Mar 2020 14:12:54 +0100 Subject: [PATCH] Feed: Change hands grouping by day --- .../model/interfaces/TimeFilterable.kt | 8 ++-- .../android/model/realm/Filter.kt | 14 +++--- .../model/realm/handhistory/HandHistory.kt | 6 ++- .../ui/adapter/ComparisonChartPagerAdapter.kt | 2 +- .../ui/adapter/FilterSectionAdapter.kt | 1 + .../android/ui/adapter/HomePagerAdapter.kt | 11 +++-- .../android/ui/modules/feed/FeedFragment.kt | 33 ++++++++----- .../FeedHandHistoryRowRepresentableAdapter.kt | 48 +++++++------------ .../FeedSessionRowRepresentableAdapter.kt | 10 ++-- .../FeedTransactionRowRepresentableAdapter.kt | 10 ++-- .../android/util/extensions/DateExtension.kt | 5 ++ 11 files changed, 83 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/TimeFilterable.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/TimeFilterable.kt index a83cc2e1..d9b5ce8b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/TimeFilterable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/TimeFilterable.kt @@ -19,10 +19,10 @@ interface TimeFilterable { startDate?.let { val cal = Calendar.getInstance() cal.time = it - dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - dayOfMonth = cal.get(Calendar.DAY_OF_MONTH) - month = cal.get(Calendar.MONTH) - year = cal.get(Calendar.YEAR) + this.dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) + this.dayOfMonth = cal.get(Calendar.DAY_OF_MONTH) + this.month = cal.get(Calendar.MONTH) + this.year = cal.get(Calendar.YEAR) } } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index 00f9ff51..f3d9fe71 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -153,22 +153,22 @@ open class Filter : RealmObject(), RowRepresentable, Editable, Deletable, Counta } } - inline fun query(firstField: String? = null, secondField: String? = null): RealmQuery { + inline fun query(firstField: String? = null, vararg remainingFields: String): RealmQuery { val realmQuery = realm.where() - if (firstField != null && secondField != null) { - return this.query.queryWith(realmQuery).distinct(firstField, secondField) - } +// if (firstField != null && secondField != null) { +// return this.query.queryWith(realmQuery).distinct(firstField, secondField) +// } if (firstField != null) { - return this.query.queryWith(realmQuery).distinct(firstField) + return this.query.queryWith(realmQuery).distinct(firstField, *remainingFields) } return this.query.queryWith(realmQuery) } - inline fun results(firstField: String? = null, secondField: String? = null): RealmResults { - return this.query(firstField, secondField).findAll() + inline fun results(firstField: String? = null, vararg remainingFields: String): RealmResults { + return this.query(firstField, *remainingFields).findAll() } val query: Query diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt index 1cd19d92..067781ab 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt @@ -44,9 +44,13 @@ open class HandHistory : RealmObject(), Deletable, RowRepresentable, Filterable, var date: Date = Date() set(value) { field = value - this.updateTimeParameter(field) + this.updateTimeParameter(value) } + init { + this.date = Date() // force the custom setter call + } + /*** * The session whose hand was played */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt index 961d8554..6e46c561 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt @@ -7,7 +7,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.fragment.CalendarFragment -import net.pokeranalytics.android.ui.fragment.FeedFragment +import net.pokeranalytics.android.ui.modules.feed.FeedFragment import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.fragment.components.BaseFragment import java.lang.ref.WeakReference diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FilterSectionAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FilterSectionAdapter.kt index 6b4a124d..f8ad8cb4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FilterSectionAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FilterSectionAdapter.kt @@ -12,6 +12,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.realm.Filter +import net.pokeranalytics.android.ui.modules.feed.FeedTransactionRowRepresentableAdapter import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.NULL_TEXT 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 b4acc402..615392c2 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 @@ -6,6 +6,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter import net.pokeranalytics.android.ui.fragment.* import net.pokeranalytics.android.ui.fragment.components.BaseFragment +import net.pokeranalytics.android.ui.modules.feed.FeedFragment import java.lang.ref.WeakReference /** @@ -13,7 +14,7 @@ import java.lang.ref.WeakReference */ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) { - var weakReferences = SparseArray>() + private var weakReferences = SparseArray>() override fun getItem(position: Int): BaseFragment { return when (position) { @@ -32,12 +33,12 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { super.destroyItem(container, position, `object`) - weakReferences.remove(position) + this.weakReferences.remove(position) } override fun instantiateItem(container: ViewGroup, position: Int): Any { val fragment = super.instantiateItem(container, position) as BaseFragment - weakReferences.put(position, WeakReference(fragment)) + this.weakReferences.put(position, WeakReference(fragment)) return fragment } @@ -56,8 +57,8 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda * Return the fragment at the position key */ fun getFragment(key: Int): BaseFragment? { - if (weakReferences.get(key) != null) { - return weakReferences.get(key).get() + if (this.weakReferences.get(key) != null) { + return this.weakReferences.get(key).get() } return null } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt index 1ec77784..3804dece 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.ui.fragment +package net.pokeranalytics.android.ui.modules.feed import android.app.Activity.RESULT_OK import android.content.Intent @@ -24,9 +24,6 @@ import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.model.realm.handhistory.HandHistory import net.pokeranalytics.android.ui.activity.* import net.pokeranalytics.android.ui.activity.components.RequestCode -import net.pokeranalytics.android.ui.adapter.FeedHandHistoryRowRepresentableAdapter -import net.pokeranalytics.android.ui.adapter.FeedSessionRowRepresentableAdapter -import net.pokeranalytics.android.ui.adapter.FeedTransactionRowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.FilterableFragment import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode @@ -53,7 +50,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate { companion object { fun newInstance(): FeedFragment { - val fragment = FeedFragment() + val fragment = + FeedFragment() val bundle = Bundle() fragment.arguments = bundle return fragment @@ -63,7 +61,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate { private var menuPosition: Int = 0 - private var currentTab = Tab.SESSIONS + private var currentTab = + Tab.SESSIONS private lateinit var sessionAdapter: FeedSessionRowRepresentableAdapter private lateinit var transactionAdapter: FeedTransactionRowRepresentableAdapter @@ -247,7 +246,11 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate { */ private fun initUI() { - this.sessionAdapter = FeedSessionRowRepresentableAdapter(getRealm(), this) + this.sessionAdapter = + FeedSessionRowRepresentableAdapter( + getRealm(), + this + ) registerForContextMenu(this.menuRecyclerView) @@ -394,12 +397,13 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate { this.realmHandHistories = this.realmHandHistories.sort("date", Sort.DESCENDING) this.realmHandHistories.forEach { - Timber.d("date = ${it.date}, year=${it.year}, month = ${it.month}") + Timber.d("date = ${it.date}, year=${it.year}, month = ${it.month}, day = ${it.dayOfMonth}") } - var distinctDates = handHistoryFilter?.results("year", "month") ?: run { - getRealm().where().distinct("year", "month").findAll() - } + var distinctDates = handHistoryFilter?.results("year", "month", "dayOfMonth") + ?: run { + getRealm().where().distinct("year", "month", "dayOfMonth").findAll() + } distinctDates = distinctDates.sort("date", Sort.DESCENDING) this.handHistoryAdapter = FeedHandHistoryRowRepresentableAdapter( @@ -467,6 +471,13 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate { */ private fun createNewHandHistory() { + AppGuard.endOfUse?.let { endDate -> + if (Date().after(endDate)) { + this.showEndOfUseMessage() + return + } + } + // gets the first session of the adapter - the last created - to preconfigure the HH if (this.sessionAdapter.itemCount > 0) { this.sessionAdapter.sessionForPosition(0)?.let { session -> diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedHandHistoryRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedHandHistoryRowRepresentableAdapter.kt index 56361296..3dc43c57 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedHandHistoryRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedHandHistoryRowRepresentableAdapter.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.ui.adapter +package net.pokeranalytics.android.ui.modules.feed import android.view.LayoutInflater import android.view.View @@ -9,10 +9,13 @@ import io.realm.RealmResults import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.handhistory.HandHistory +import net.pokeranalytics.android.ui.adapter.BindableHolder +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.modules.handhistory.views.RowHandHistoryViewHolder import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.NULL_TEXT -import net.pokeranalytics.android.util.extensions.getMonthAndYear +import net.pokeranalytics.android.util.extensions.fullDate +import net.pokeranalytics.android.util.extensions.longDate import java.util.* import kotlin.collections.HashMap @@ -35,28 +38,6 @@ class FeedHandHistoryRowRepresentableAdapter( refreshData() } -// inner class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), -// BindableHolder { -// -//// override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { -//// itemView.handHistoryRow.setData(row as HandHistory) -//// val listener = View.OnClickListener { -//// adapter.delegate?.onRowSelected(position, row) -//// } -//// itemView.handHistoryRow.setOnClickListener(listener) -//// } -// -// fun bind(position: Int, row: HandHistory?, adapter: FeedHandHistoryRowRepresentableAdapter) { -// -// itemView.handHistoryRow.setData(row as HandHistory) -// val listener = View.OnClickListener { -// adapter.delegate?.onRowSelected(position, row) -// } -// itemView.handHistoryRow.setOnClickListener(listener) -// } -// -// } - /** * Display a header */ @@ -85,7 +66,6 @@ class FeedHandHistoryRowRepresentableAdapter( return if (this.sortedHeaders.containsKey(position)) { RowViewType.HEADER_TITLE.ordinal } else { -// 1 RowViewType.HAND_HISTORY.ordinal } } @@ -109,7 +89,7 @@ class FeedHandHistoryRowRepresentableAdapter( private fun getHeaderForPosition(position: Int): String { if (this.sortedHeaders.containsKey(position)) { val realmHeaderPosition = this.sortedHeaders.keys.indexOf(position) - return this.distinctHandHistoryHeaders[realmHeaderPosition]?.date?.getMonthAndYear() ?: "" + return this.distinctHandHistoryHeaders[realmHeaderPosition]?.date?.longDate() ?: "" } return NULL_TEXT } @@ -141,16 +121,18 @@ class FeedHandHistoryRowRepresentableAdapter( var previousYear = Int.MAX_VALUE var previousMonth = Int.MAX_VALUE + var previousDay = Int.MAX_VALUE val calendar = Calendar.getInstance() // Add headers if the date doesn't exist yet for ((index, handHistory) in this.realmHandHistories.withIndex()) { calendar.time = handHistory.date - if (checkHeaderCondition(calendar, previousYear, previousMonth)) { + if (checkHeaderCondition(calendar, previousYear, previousMonth, previousDay)) { this.headersPositions[index + this.headersPositions.size] = handHistory.date previousYear = calendar.get(Calendar.YEAR) previousMonth = calendar.get(Calendar.MONTH) + previousDay = calendar.get(Calendar.DAY_OF_MONTH) } } @@ -163,9 +145,15 @@ class FeedHandHistoryRowRepresentableAdapter( /** * Check if we need to add a header */ - private fun checkHeaderCondition(currentCalendar: Calendar, previousYear: Int, previousMonth: Int): Boolean { - return currentCalendar.get(Calendar.YEAR) == previousYear && currentCalendar.get(Calendar.MONTH) < previousMonth || (currentCalendar.get( - Calendar.YEAR) < previousYear) + private fun checkHeaderCondition(currentCalendar: Calendar, previousYear: Int, previousMonth: Int, previousDay: Int): Boolean { + + val year = currentCalendar.get(Calendar.YEAR) + val month = currentCalendar.get(Calendar.MONTH) + val day = currentCalendar.get(Calendar.DAY_OF_MONTH) + + return (year == previousYear && month == previousMonth && day < previousDay) + || (year == previousYear && month < previousMonth) + || year < previousYear } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt index 1e20d60d..90c7a99c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.ui.adapter +package net.pokeranalytics.android.ui.modules.feed import android.content.Context import android.view.LayoutInflater @@ -15,6 +15,8 @@ import kotlinx.android.synthetic.main.row_feed_session.view.* import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.adapter.BindableHolder +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.extensions.getMonthAndYear import timber.log.Timber @@ -70,7 +72,8 @@ class FeedSessionRowRepresentableAdapter( /** * Display a session view */ - inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { fun bind(position: Int, row: Session?, adapter: FeedSessionRowRepresentableAdapter) { @@ -91,7 +94,8 @@ class FeedSessionRowRepresentableAdapter( /** * Display a session view */ - inner class HeaderTitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + inner class HeaderTitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { fun bind(title: String) { // Title itemView.findViewById(net.pokeranalytics.android.R.id.title)?.let { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt index 5f97e69e..3d8afe9f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.ui.adapter +package net.pokeranalytics.android.ui.modules.feed import android.view.LayoutInflater import android.view.View @@ -9,6 +9,8 @@ import io.realm.RealmResults import kotlinx.android.synthetic.main.row_transaction.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Transaction +import net.pokeranalytics.android.ui.adapter.BindableHolder +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.getMonthAndYear @@ -38,7 +40,8 @@ class FeedTransactionRowRepresentableAdapter( /** * Display a transaction view */ - inner class RowTransactionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + inner class RowTransactionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { fun bind(position: Int, row: Transaction?, adapter: FeedTransactionRowRepresentableAdapter) { @@ -53,7 +56,8 @@ class FeedTransactionRowRepresentableAdapter( /** * Display a header */ - inner class HeaderTitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + inner class HeaderTitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { fun bind(title: String) { // Title itemView.findViewById(R.id.title)?.let { diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt index 2b7f5cf5..d153943e 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt @@ -113,6 +113,11 @@ fun Date.getMonthAndYear(): String { return SimpleDateFormat("MMMM yyyy", Locale.getDefault()).format(this).capitalize() } +// Return the month & year of the date +fun Date.getDayMonthYear(): String { + return SimpleDateFormat("dd MMMM yyyy", Locale.getDefault()).format(this).capitalize() +} + // Return the netDuration between two dates fun Date.getFormattedDuration(toDate: Date): String { val difference = (toDate.time - this.time).toInt()