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

@ -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>()
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 <reified T : Filterable> results(firstField: String? = null, secondField: String? = null): RealmResults<T> {
return this.query<T>(firstField, secondField).findAll()
inline fun <reified T : Filterable> results(firstField: String? = null, vararg remainingFields: String): RealmResults<T> {
return this.query<T>(firstField, *remainingFields).findAll()
}
val query: Query

@ -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
*/

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

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

@ -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<WeakReference<BaseFragment>>()
private var weakReferences = SparseArray<WeakReference<BaseFragment>>()
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
}

@ -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<HandHistory>().distinct("year", "month").findAll()
}
var distinctDates = handHistoryFilter?.results("year", "month", "dayOfMonth")
?: run {
getRealm().where<HandHistory>().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 ->

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

@ -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<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.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<AppCompatTextView>(R.id.title)?.let {

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

Loading…
Cancel
Save