Improve calendar & details

feature/top10
Aurelien Hubert 7 years ago
parent e11f2a0ced
commit 7acf1ea7b8
  1. 26
      app/src/main/java/net/pokeranalytics/android/ui/activity/CalendarDetailsActivity.kt
  2. 35
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt
  3. 61
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt
  4. 46
      app/src/main/res/layout/fragment_calendar_details.xml

@ -4,34 +4,26 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.GraphParameters
class CalendarDetailsActivity : PokerAnalyticsActivity() { class CalendarDetailsActivity : PokerAnalyticsActivity() {
private enum class IntentKey(val keyName: String) {
STAT("STAT"),
ENTRIES("ENTRIES"),
}
companion object { companion object {
// Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects var computedResults: ComputedResults? = null
var parameters: GraphParameters? = null var sessionTypeCondition: QueryCondition? = null
var title: String? = null
/** /**
* Default constructor * Default constructor
*/ */
fun newInstance(context: Context) { fun newInstance(context: Context, computedResults: ComputedResults, sessionTypeCondition: QueryCondition?, title: String?) {
val intent = Intent(context, CalendarDetailsActivity::class.java) this.computedResults = computedResults
context.startActivity(intent) this.sessionTypeCondition = sessionTypeCondition
} this.title = title
fun newInstance(context: Context, stat: Stat, report: Report) {
parameters = GraphParameters(stat, report)
val intent = Intent(context, CalendarDetailsActivity::class.java) val intent = Intent(context, CalendarDetailsActivity::class.java)
context.startActivity(intent) context.startActivity(intent)
} }

@ -7,10 +7,14 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.Entry
import com.google.android.material.tabs.TabLayout
import kotlinx.android.synthetic.main.fragment_calendar_details.* import kotlinx.android.synthetic.main.fragment_calendar_details.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.extensions.toast
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
class CalendarDetailsFragment : PokerAnalyticsFragment() { class CalendarDetailsFragment : PokerAnalyticsFragment() {
@ -50,6 +54,37 @@ class CalendarDetailsFragment : PokerAnalyticsFragment() {
parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
setHasOptionsMenu(true) setHasOptionsMenu(true)
toolbar.title = CalendarDetailsActivity.title
tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
toast("Tab: ${tab.position}")
}
override fun onTabUnselected(tab: TabLayout.Tab) {
}
override fun onTabReselected(tab: TabLayout.Tab) {
}
})
CalendarDetailsActivity.sessionTypeCondition?.let {
when(it) {
QueryCondition.CASH -> tabs.getTabAt(1)?.select()
QueryCondition.TOURNAMENT -> tabs.getTabAt(2)?.select()
else -> tabs.getTabAt(0)?.select()
}
}
CalendarDetailsActivity.computedResults?.let { computedResults ->
//computedResults.group.conditions
}
/* /*
toolbar.title = stat.localizedTitle(requireContext()) toolbar.title = stat.localizedTitle(requireContext())

@ -18,6 +18,7 @@ import net.pokeranalytics.android.calculus.ComputedResults
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.comparison.Comparator import net.pokeranalytics.android.model.comparison.Comparator
import net.pokeranalytics.android.model.comparison.combined import net.pokeranalytics.android.model.comparison.combined
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
@ -27,10 +28,7 @@ import net.pokeranalytics.android.ui.view.CalendarTabs
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.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.util.extensions.getDateMonth import net.pokeranalytics.android.util.extensions.*
import net.pokeranalytics.android.util.extensions.getDateYear
import net.pokeranalytics.android.util.extensions.startOfMonth
import net.pokeranalytics.android.util.extensions.startOfYear
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@ -38,11 +36,7 @@ import kotlin.coroutines.CoroutineContext
class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate { class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRepresentableDataSource, RowRepresentableDelegate {
private enum class SessionType { enum class TimeFilter {
ALL, CASH, TOURNAMENT
}
private enum class TimeFilter {
MONTH, YEAR MONTH, YEAR
} }
@ -70,8 +64,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
private var sortedYearlyReports: SortedMap<Date, ComputedResults> = HashMap<Date, ComputedResults>().toSortedMap() private var sortedYearlyReports: SortedMap<Date, ComputedResults> = HashMap<Date, ComputedResults>().toSortedMap()
private var datesForRows: HashMap<CustomizableRowRepresentable, Date> = HashMap() private var datesForRows: HashMap<CustomizableRowRepresentable, Date> = HashMap()
private var currentSessionType = SessionType.ALL private var sessionTypeCondition: QueryCondition? = null
private var currentTimeFilter = TimeFilter.MONTH private var currentTimeFilter: TimeFilter = TimeFilter.MONTH
private var currentStat = Stat.NETRESULT private var currentStat = Stat.NETRESULT
// Life Cycle // Life Cycle
@ -93,8 +87,21 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
} }
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
Timber.d("Open ${datesForRows[row]}")
CalendarDetailsActivity.newInstance(requireContext()) when (currentTimeFilter) {
TimeFilter.MONTH -> {
val date = datesForRows[row]
sortedMonthlyReports[datesForRows[row]]?.let {
CalendarDetailsActivity.newInstance(requireContext(), it, sessionTypeCondition, date?.getMonthAndYear())
}
}
TimeFilter.YEAR -> {
val date = datesForRows[row]
sortedYearlyReports[datesForRows[row]]?.let {
CalendarDetailsActivity.newInstance(requireContext(), it, sessionTypeCondition, date?.getDateYear())
}
}
}
} }
override fun sessionsChanged() { override fun sessionsChanged() {
@ -145,31 +152,31 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
// Manage session type filter // Manage session type filter
filterSessionAll.setOnCheckedChangeListener { _, isChecked -> filterSessionAll.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) { if (isChecked) {
currentSessionType = SessionType.ALL sessionTypeCondition = null
filterSessionCash.isChecked = false filterSessionCash.isChecked = false
filterSessionTournament.isChecked = false filterSessionTournament.isChecked = false
launchStatComputation() launchStatComputation()
} else if (currentSessionType == SessionType.ALL) { } else if (sessionTypeCondition == null) {
filterSessionAll.isChecked = true filterSessionAll.isChecked = true
} }
} }
filterSessionCash.setOnCheckedChangeListener { _, isChecked -> filterSessionCash.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) { if (isChecked) {
currentSessionType = SessionType.CASH sessionTypeCondition = QueryCondition.CASH
filterSessionAll.isChecked = false filterSessionAll.isChecked = false
filterSessionTournament.isChecked = false filterSessionTournament.isChecked = false
launchStatComputation() launchStatComputation()
} else if (currentSessionType == SessionType.CASH) { } else if (sessionTypeCondition == QueryCondition.CASH) {
filterSessionCash.isChecked = true filterSessionCash.isChecked = true
} }
} }
filterSessionTournament.setOnCheckedChangeListener { _, isChecked -> filterSessionTournament.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) { if (isChecked) {
currentSessionType = SessionType.TOURNAMENT sessionTypeCondition = QueryCondition.TOURNAMENT
filterSessionAll.isChecked = false filterSessionAll.isChecked = false
filterSessionCash.isChecked = false filterSessionCash.isChecked = false
launchStatComputation() launchStatComputation()
} else if (currentSessionType == SessionType.TOURNAMENT) { } else if (sessionTypeCondition == QueryCondition.TOURNAMENT) {
filterSessionTournament.isChecked = true filterSessionTournament.isChecked = true
} }
} }
@ -225,10 +232,10 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
// Compute data per YEAR and MONTH // Compute data per YEAR and MONTH
val monthConditions = when (currentSessionType) { val monthConditions = when (sessionTypeCondition) {
SessionType.ALL -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined() QueryCondition.CASH -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.CASH).combined()
SessionType.CASH -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.CASH).combined() QueryCondition.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.TOURNAMENT).combined()
SessionType.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR, Comparator.TOURNAMENT).combined() else -> listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR).combined()
} }
monthConditions.forEach { conditions -> monthConditions.forEach { conditions ->
@ -253,10 +260,10 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
calendar.time = Date().startOfYear() calendar.time = Date().startOfYear()
// Compute data per YEAR // Compute data per YEAR
val yearConditions = when (currentSessionType) { val yearConditions = when (sessionTypeCondition) {
SessionType.ALL -> listOf(Comparator.YEAR).combined() QueryCondition.CASH -> listOf(Comparator.YEAR, Comparator.CASH).combined()
SessionType.CASH -> listOf(Comparator.YEAR, Comparator.CASH).combined() QueryCondition.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.TOURNAMENT).combined()
SessionType.TOURNAMENT -> listOf(Comparator.YEAR, Comparator.TOURNAMENT).combined() else -> listOf(Comparator.YEAR).combined()
} }
yearConditions.forEach { conditions -> yearConditions.forEach { conditions ->

@ -5,6 +5,15 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:theme="@style/PokerAnalyticsTheme.Toolbar.Session"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -14,13 +23,40 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:title="@string/app_name" /> tools:title="@string/app_name" />
<FrameLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/container" android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.tabs.TabItem
android:id="@+id/tabAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/all"/>
<com.google.android.material.tabs.TabItem
android:id="@+id/tabCash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cash_game"/>
<com.google.android.material.tabs.TabItem
android:id="@+id/tabTournament"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tournament"/>
</com.google.android.material.tabs.TabLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@+id/appBar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar" /> app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

Loading…
Cancel
Save