Feed: Change hands grouping by day

hh
Laurent 6 years ago
parent 30f2c2cf9b
commit 2c4acfdecc
  1. 8
      app/src/main/java/net/pokeranalytics/android/model/interfaces/TimeFilterable.kt
  2. 14
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  3. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt
  4. 2
      app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt
  5. 1
      app/src/main/java/net/pokeranalytics/android/ui/adapter/FilterSectionAdapter.kt
  6. 11
      app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt
  7. 33
      app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt
  8. 48
      app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedHandHistoryRowRepresentableAdapter.kt
  9. 10
      app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedSessionRowRepresentableAdapter.kt
  10. 10
      app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedTransactionRowRepresentableAdapter.kt
  11. 5
      app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt

@ -19,10 +19,10 @@ interface TimeFilterable {
startDate?.let { startDate?.let {
val cal = Calendar.getInstance() val cal = Calendar.getInstance()
cal.time = it cal.time = it
dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) this.dayOfWeek = cal.get(Calendar.DAY_OF_WEEK)
dayOfMonth = cal.get(Calendar.DAY_OF_MONTH) this.dayOfMonth = cal.get(Calendar.DAY_OF_MONTH)
month = cal.get(Calendar.MONTH) this.month = cal.get(Calendar.MONTH)
year = cal.get(Calendar.YEAR) this.year = cal.get(Calendar.YEAR)
} }
} }
} }

@ -153,22 +153,22 @@ open class Filter : RealmObject(), RowRepresentable, Editable, Deletable, Counta
} }
} }
inline fun <reified T : Filterable> query(firstField: String? = null, secondField: String? = null): RealmQuery<T> { inline fun <reified T : Filterable> query(firstField: String? = null, vararg remainingFields: String): RealmQuery<T> {
val realmQuery = realm.where<T>() val realmQuery = realm.where<T>()
if (firstField != null && secondField != null) { // if (firstField != null && secondField != null) {
return this.query.queryWith(realmQuery).distinct(firstField, secondField) // return this.query.queryWith(realmQuery).distinct(firstField, secondField)
} // }
if (firstField != null) { if (firstField != null) {
return this.query.queryWith(realmQuery).distinct(firstField) return this.query.queryWith(realmQuery).distinct(firstField, *remainingFields)
} }
return this.query.queryWith(realmQuery) return this.query.queryWith(realmQuery)
} }
inline fun <reified T : Filterable> results(firstField: String? = null, secondField: String? = null): RealmResults<T> { inline fun <reified T : Filterable> results(firstField: String? = null, vararg remainingFields: String): RealmResults<T> {
return this.query<T>(firstField, secondField).findAll() return this.query<T>(firstField, *remainingFields).findAll()
} }
val query: Query val query: Query

@ -44,9 +44,13 @@ open class HandHistory : RealmObject(), Deletable, RowRepresentable, Filterable,
var date: Date = Date() var date: Date = Date()
set(value) { set(value) {
field = value field = value
this.updateTimeParameter(field) this.updateTimeParameter(value)
} }
init {
this.date = Date() // force the custom setter call
}
/*** /***
* The session whose hand was played * The session whose hand was played
*/ */

@ -7,7 +7,7 @@ import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter import androidx.fragment.app.FragmentStatePagerAdapter
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.CalendarFragment 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.GraphFragment
import net.pokeranalytics.android.ui.fragment.components.BaseFragment import net.pokeranalytics.android.ui.fragment.components.BaseFragment
import java.lang.ref.WeakReference import java.lang.ref.WeakReference

@ -12,6 +12,7 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.realm.Filter 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.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT

@ -6,6 +6,7 @@ import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter import androidx.fragment.app.FragmentStatePagerAdapter
import net.pokeranalytics.android.ui.fragment.* import net.pokeranalytics.android.ui.fragment.*
import net.pokeranalytics.android.ui.fragment.components.BaseFragment import net.pokeranalytics.android.ui.fragment.components.BaseFragment
import net.pokeranalytics.android.ui.modules.feed.FeedFragment
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
/** /**
@ -13,7 +14,7 @@ import java.lang.ref.WeakReference
*/ */
class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) { class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) {
var weakReferences = SparseArray<WeakReference<BaseFragment>>() private var weakReferences = SparseArray<WeakReference<BaseFragment>>()
override fun getItem(position: Int): BaseFragment { override fun getItem(position: Int): BaseFragment {
return when (position) { return when (position) {
@ -32,12 +33,12 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
super.destroyItem(container, position, `object`) super.destroyItem(container, position, `object`)
weakReferences.remove(position) this.weakReferences.remove(position)
} }
override fun instantiateItem(container: ViewGroup, position: Int): Any { override fun instantiateItem(container: ViewGroup, position: Int): Any {
val fragment = super.instantiateItem(container, position) as BaseFragment val fragment = super.instantiateItem(container, position) as BaseFragment
weakReferences.put(position, WeakReference(fragment)) this.weakReferences.put(position, WeakReference(fragment))
return fragment return fragment
} }
@ -56,8 +57,8 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda
* Return the fragment at the position key * Return the fragment at the position key
*/ */
fun getFragment(key: Int): BaseFragment? { fun getFragment(key: Int): BaseFragment? {
if (weakReferences.get(key) != null) { if (this.weakReferences.get(key) != null) {
return weakReferences.get(key).get() return this.weakReferences.get(key).get()
} }
return null return null
} }

@ -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.app.Activity.RESULT_OK
import android.content.Intent 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.model.realm.handhistory.HandHistory
import net.pokeranalytics.android.ui.activity.* import net.pokeranalytics.android.ui.activity.*
import net.pokeranalytics.android.ui.activity.components.RequestCode 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.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.FilterableFragment import net.pokeranalytics.android.ui.fragment.components.FilterableFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode
@ -53,7 +50,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
companion object { companion object {
fun newInstance(): FeedFragment { fun newInstance(): FeedFragment {
val fragment = FeedFragment() val fragment =
FeedFragment()
val bundle = Bundle() val bundle = Bundle()
fragment.arguments = bundle fragment.arguments = bundle
return fragment return fragment
@ -63,7 +61,8 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
private var menuPosition: Int = 0 private var menuPosition: Int = 0
private var currentTab = Tab.SESSIONS private var currentTab =
Tab.SESSIONS
private lateinit var sessionAdapter: FeedSessionRowRepresentableAdapter private lateinit var sessionAdapter: FeedSessionRowRepresentableAdapter
private lateinit var transactionAdapter: FeedTransactionRowRepresentableAdapter private lateinit var transactionAdapter: FeedTransactionRowRepresentableAdapter
@ -247,7 +246,11 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
*/ */
private fun initUI() { private fun initUI() {
this.sessionAdapter = FeedSessionRowRepresentableAdapter(getRealm(), this) this.sessionAdapter =
FeedSessionRowRepresentableAdapter(
getRealm(),
this
)
registerForContextMenu(this.menuRecyclerView) registerForContextMenu(this.menuRecyclerView)
@ -394,12 +397,13 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
this.realmHandHistories = this.realmHandHistories.sort("date", Sort.DESCENDING) this.realmHandHistories = this.realmHandHistories.sort("date", Sort.DESCENDING)
this.realmHandHistories.forEach { 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 { var distinctDates = handHistoryFilter?.results("year", "month", "dayOfMonth")
getRealm().where<HandHistory>().distinct("year", "month").findAll() ?: run {
} getRealm().where<HandHistory>().distinct("year", "month", "dayOfMonth").findAll()
}
distinctDates = distinctDates.sort("date", Sort.DESCENDING) distinctDates = distinctDates.sort("date", Sort.DESCENDING)
this.handHistoryAdapter = this.handHistoryAdapter =
FeedHandHistoryRowRepresentableAdapter( FeedHandHistoryRowRepresentableAdapter(
@ -467,6 +471,13 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
*/ */
private fun createNewHandHistory() { 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 // gets the first session of the adapter - the last created - to preconfigure the HH
if (this.sessionAdapter.itemCount > 0) { if (this.sessionAdapter.itemCount > 0) {
this.sessionAdapter.sessionForPosition(0)?.let { session -> this.sessionAdapter.sessionForPosition(0)?.let { session ->

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.adapter package net.pokeranalytics.android.ui.modules.feed
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -9,10 +9,13 @@ import io.realm.RealmResults
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.realm.handhistory.HandHistory 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.modules.handhistory.views.RowHandHistoryViewHolder
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.NULL_TEXT 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 java.util.*
import kotlin.collections.HashMap import kotlin.collections.HashMap
@ -35,28 +38,6 @@ class FeedHandHistoryRowRepresentableAdapter(
refreshData() 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 * Display a header
*/ */
@ -85,7 +66,6 @@ class FeedHandHistoryRowRepresentableAdapter(
return if (this.sortedHeaders.containsKey(position)) { return if (this.sortedHeaders.containsKey(position)) {
RowViewType.HEADER_TITLE.ordinal RowViewType.HEADER_TITLE.ordinal
} else { } else {
// 1
RowViewType.HAND_HISTORY.ordinal RowViewType.HAND_HISTORY.ordinal
} }
} }
@ -109,7 +89,7 @@ class FeedHandHistoryRowRepresentableAdapter(
private fun getHeaderForPosition(position: Int): String { private fun getHeaderForPosition(position: Int): String {
if (this.sortedHeaders.containsKey(position)) { if (this.sortedHeaders.containsKey(position)) {
val realmHeaderPosition = this.sortedHeaders.keys.indexOf(position) val realmHeaderPosition = this.sortedHeaders.keys.indexOf(position)
return this.distinctHandHistoryHeaders[realmHeaderPosition]?.date?.getMonthAndYear() ?: "" return this.distinctHandHistoryHeaders[realmHeaderPosition]?.date?.longDate() ?: ""
} }
return NULL_TEXT return NULL_TEXT
} }
@ -141,16 +121,18 @@ class FeedHandHistoryRowRepresentableAdapter(
var previousYear = Int.MAX_VALUE var previousYear = Int.MAX_VALUE
var previousMonth = Int.MAX_VALUE var previousMonth = Int.MAX_VALUE
var previousDay = Int.MAX_VALUE
val calendar = Calendar.getInstance() val calendar = Calendar.getInstance()
// Add headers if the date doesn't exist yet // Add headers if the date doesn't exist yet
for ((index, handHistory) in this.realmHandHistories.withIndex()) { for ((index, handHistory) in this.realmHandHistories.withIndex()) {
calendar.time = handHistory.date calendar.time = handHistory.date
if (checkHeaderCondition(calendar, previousYear, previousMonth)) { if (checkHeaderCondition(calendar, previousYear, previousMonth, previousDay)) {
this.headersPositions[index + this.headersPositions.size] = handHistory.date this.headersPositions[index + this.headersPositions.size] = handHistory.date
previousYear = calendar.get(Calendar.YEAR) previousYear = calendar.get(Calendar.YEAR)
previousMonth = calendar.get(Calendar.MONTH) 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 * Check if we need to add a header
*/ */
private fun checkHeaderCondition(currentCalendar: Calendar, previousYear: Int, previousMonth: Int): Boolean { private fun checkHeaderCondition(currentCalendar: Calendar, previousYear: Int, previousMonth: Int, previousDay: Int): Boolean {
return currentCalendar.get(Calendar.YEAR) == previousYear && currentCalendar.get(Calendar.MONTH) < previousMonth || (currentCalendar.get(
Calendar.YEAR) < previousYear) 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
} }

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.adapter package net.pokeranalytics.android.ui.modules.feed
import android.content.Context import android.content.Context
import android.view.LayoutInflater 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.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.model.realm.Session 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.ui.view.RowViewType
import net.pokeranalytics.android.util.extensions.getMonthAndYear import net.pokeranalytics.android.util.extensions.getMonthAndYear
import timber.log.Timber import timber.log.Timber
@ -70,7 +72,8 @@ class FeedSessionRowRepresentableAdapter(
/** /**
* Display a session view * 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) { fun bind(position: Int, row: Session?, adapter: FeedSessionRowRepresentableAdapter) {
@ -91,7 +94,8 @@ class FeedSessionRowRepresentableAdapter(
/** /**
* Display a session view * 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) { fun bind(title: String) {
// Title // Title
itemView.findViewById<AppCompatTextView>(net.pokeranalytics.android.R.id.title)?.let { itemView.findViewById<AppCompatTextView>(net.pokeranalytics.android.R.id.title)?.let {

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.adapter package net.pokeranalytics.android.ui.modules.feed
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -9,6 +9,8 @@ import io.realm.RealmResults
import kotlinx.android.synthetic.main.row_transaction.view.* import kotlinx.android.synthetic.main.row_transaction.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Transaction 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.ui.view.RowViewType
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.extensions.getMonthAndYear import net.pokeranalytics.android.util.extensions.getMonthAndYear
@ -38,7 +40,8 @@ class FeedTransactionRowRepresentableAdapter(
/** /**
* Display a transaction view * 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) { fun bind(position: Int, row: Transaction?, adapter: FeedTransactionRowRepresentableAdapter) {
@ -53,7 +56,8 @@ class FeedTransactionRowRepresentableAdapter(
/** /**
* Display a header * 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) { fun bind(title: String) {
// Title // Title
itemView.findViewById<AppCompatTextView>(R.id.title)?.let { itemView.findViewById<AppCompatTextView>(R.id.title)?.let {

@ -113,6 +113,11 @@ fun Date.getMonthAndYear(): String {
return SimpleDateFormat("MMMM yyyy", Locale.getDefault()).format(this).capitalize() 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 // Return the netDuration between two dates
fun Date.getFormattedDuration(toDate: Date): String { fun Date.getFormattedDuration(toDate: Date): String {
val difference = (toDate.time - this.time).toInt() val difference = (toDate.time - this.time).toInt()

Loading…
Cancel
Save