diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8cf3f769..04c3d2ef 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -74,6 +74,11 @@
android:launchMode="singleTop"
android:screenOrientation="portrait" />
+
+
()
+ if (isTournament()) {
+
+ tournamentEntryFee?.let {
+ parameters.add(it.toCurrency(currency))
+ }
+
+ tournamentName?.let {
+ parameters.add(it.name)
+ } ?: run {
+ parameters.add(getFormattedGame())
+ tournamentType?.let { type ->
+ parameters.add(TournamentType.values()[type].localizedTitle(context))
+ }
+ }
+ if (parameters.size == 0) {
+ parameters.add(context.getString(R.string.tournament).capitalize())
+ }
+ } else {
+ if (cgSmallBlind != null && cgBigBlind != null) {
+ parameters.add(getFormattedBlinds())
+ }
+ game?.let {
+ parameters.add(getFormattedGame())
+ }
+
+ if (parameters.size == 0) {
+ parameters.add(context.getString(R.string.cash_game).capitalize())
+ }
+ }
+ return parameters.joinToString(separator = " ")
}
val AbstractList.hourlyDuration: Double
@@ -95,4 +137,4 @@ fun MutableList.update(timeInterval: TimeInterval): MutableList BankrollActivity.newInstance(requireContext())
+ MoreTabRow.TOP_10 -> Top10Activity.newInstance(requireContext())
MoreTabRow.SETTINGS -> SettingsActivity.newInstance(requireContext())
}
}
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/Top10Fragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/Top10Fragment.kt
new file mode 100644
index 00000000..9dfc8361
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/Top10Fragment.kt
@@ -0,0 +1,154 @@
+package net.pokeranalytics.android.ui.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.google.android.material.tabs.TabLayout
+import io.realm.RealmModel
+import io.realm.RealmResults
+import io.realm.Sort
+import io.realm.kotlin.where
+import kotlinx.android.synthetic.main.fragment_feed.*
+import net.pokeranalytics.android.R
+import net.pokeranalytics.android.model.realm.Session
+import net.pokeranalytics.android.model.realm.Transaction
+import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
+import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
+import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
+import net.pokeranalytics.android.ui.fragment.components.RealmFragment
+import net.pokeranalytics.android.ui.view.RowRepresentable
+import net.pokeranalytics.android.ui.view.RowViewType
+import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
+
+
+class Top10Fragment : RealmFragment(), RowRepresentableDataSource, RowRepresentableDelegate {
+
+ private enum class Tab {
+ CASH_GAMES,
+ TOURNAMENTS
+ }
+
+ companion object {
+ fun newInstance(): Top10Fragment {
+ val fragment = Top10Fragment()
+ val bundle = Bundle()
+ fragment.arguments = bundle
+ return fragment
+ }
+ }
+
+ private lateinit var dataListAdapter: RowRepresentableAdapter
+ private lateinit var realmCashGames: RealmResults
+ private lateinit var realmTournaments: RealmResults
+
+ private var currentTab: Tab = Tab.CASH_GAMES
+
+ override val observedEntities: List> = listOf(Session::class.java, Transaction::class.java)
+
+ override fun entitiesChanged(clazz: Class) {
+ super.entitiesChanged(clazz)
+ when (clazz.kotlin) {
+ Session::class -> {
+ this.dataListAdapter.notifyDataSetChanged()
+ }
+ }
+ }
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ super.onCreateView(inflater, container, savedInstanceState)
+ return inflater.inflate(R.layout.fragment_top_10, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initUI()
+ initData()
+ }
+
+ override fun adapterRows(): List? {
+ return when (currentTab) {
+ Tab.CASH_GAMES -> realmCashGames
+ Tab.TOURNAMENTS -> realmTournaments
+ }
+ }
+
+ override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
+ return when (currentTab) {
+ Tab.CASH_GAMES -> realmCashGames[position]
+ Tab.TOURNAMENTS -> realmTournaments[position]
+ }
+ }
+
+ override fun numberOfRows(): Int {
+ return when (currentTab) {
+ Tab.CASH_GAMES -> realmCashGames.size
+ Tab.TOURNAMENTS -> realmTournaments.size
+ }
+ }
+
+ override fun viewTypeForPosition(position: Int): Int {
+ return RowViewType.ROW_TOP_10.ordinal
+ }
+
+ /**
+ * Init UI
+ */
+ private fun initUI() {
+
+ setDisplayHomeAsUpEnabled(true)
+
+ tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
+ override fun onTabSelected(tab: TabLayout.Tab) {
+ when (tab.position) {
+ 0 -> {
+ currentTab = Tab.CASH_GAMES
+ dataListAdapter.notifyDataSetChanged()
+ }
+ 1 -> {
+ currentTab = Tab.TOURNAMENTS
+ }
+ }
+ dataListAdapter.notifyDataSetChanged()
+ }
+
+ override fun onTabUnselected(tab: TabLayout.Tab) {
+ }
+
+ override fun onTabReselected(tab: TabLayout.Tab) {
+ }
+ })
+
+
+ val viewManager = SmoothScrollLinearLayoutManager(requireContext())
+ recyclerView.apply {
+ setHasFixedSize(true)
+ layoutManager = viewManager
+ }
+
+ }
+
+ /**
+ * Init data
+ */
+ private fun initData() {
+
+ this.realmCashGames = getRealm().where()
+ .equalTo("type", Session.Type.CASH_GAME.ordinal)
+ .greaterThanOrEqualTo("result.net", 0.0)
+ .sort("result.net", Sort.DESCENDING)
+ .limit(10)
+ .findAll()
+
+ this.realmTournaments = getRealm().where()
+ .equalTo("type", Session.Type.TOURNAMENT.ordinal)
+ .greaterThanOrEqualTo("result.net", 0.0)
+ .sort("result.net", Sort.DESCENDING)
+ .limit(10)
+ .findAll()
+
+ dataListAdapter = RowRepresentableAdapter(this, this)
+ recyclerView.adapter = dataListAdapter
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
index 12ccaece..3ad02065 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
@@ -26,6 +26,7 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.calculus.bankroll.BankrollReport
+import net.pokeranalytics.android.model.extensions.getFormattedGameType
import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.Transaction
@@ -37,6 +38,7 @@ import net.pokeranalytics.android.ui.extensions.setTextFormat
import net.pokeranalytics.android.ui.graph.AxisFormatting
import net.pokeranalytics.android.ui.graph.setStyle
import net.pokeranalytics.android.ui.view.rowrepresentable.*
+import net.pokeranalytics.android.util.extensions.longDate
/**
* An interface used to factor the configuration of RecyclerView.ViewHolder
@@ -78,6 +80,7 @@ enum class RowViewType(private var layoutRes: Int) {
// Custom row
ROW_SESSION(R.layout.row_feed_session),
ROW_TRANSACTION(R.layout.row_transaction),
+ ROW_TOP_10(R.layout.row_top_10),
ROW_BUTTON(R.layout.row_button),
ROW_FOLLOW_US(R.layout.row_follow_us),
STATS(R.layout.row_stats_title_value),
@@ -110,6 +113,10 @@ enum class RowViewType(private var layoutRes: Int) {
// Row Transaction
ROW_TRANSACTION -> RowTransactionViewHolder(layout)
+ // Row Transaction
+ ROW_TOP_10 -> RowTop10ViewHolder(layout)
+
+
// Row Button
ROW_BUTTON -> RowButtonViewHolder(layout)
@@ -513,6 +520,46 @@ enum class RowViewType(private var layoutRes: Int) {
}
}
+
+ /**
+ * Display a top 10 row
+ */
+ inner class RowTop10ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
+ override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
+
+ if (row is Session) {
+
+ itemView.findViewById(R.id.gameResult)?.let { gameResult ->
+ val result = row.result?.net ?: 0.0
+ val formattedStat = ComputedStat(Stat.NET_RESULT, result, currency = row.currency).format()
+ gameResult.setTextFormat(formattedStat, itemView.context)
+ }
+
+ itemView.findViewById(R.id.top10ResultPart1)?.let { part1 ->
+ part1.text = row.getFormattedGameType(itemView.context)
+ }
+
+ itemView.findViewById(R.id.top10ResultPart2)?.let { part2 ->
+ var content = row.getFormattedDuration()
+
+ if (!row.location?.name.isNullOrEmpty()) {
+ content += " - " + row.location?.name
+ } else if (!row.bankroll?.name.isNullOrEmpty()) {
+ content += " - " + row.bankroll?.name
+ }
+
+ part2.text = content
+ }
+
+ itemView.findViewById(R.id.top10ResultPart3)?.let { part3 ->
+ part3.text = row.creationDate.longDate()
+ }
+ }
+
+ }
+ }
+
+
/**
* Display a separator
*/
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt
index 40db96da..69edd181 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt
@@ -11,15 +11,14 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.TableSize
-import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.extensions.SessionState
+import net.pokeranalytics.android.model.extensions.getFormattedGameType
import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.extensions.setTextFormat
import net.pokeranalytics.android.util.extensions.getDayNumber
import net.pokeranalytics.android.util.extensions.getShortDayName
import net.pokeranalytics.android.util.extensions.shortTime
-import net.pokeranalytics.android.util.extensions.toCurrency
/**
* Display a row session
@@ -65,41 +64,7 @@ class SessionRowView : FrameLayout {
rowSession.dateNumber.text = date.getDayNumber()
// Title / Game type
-
- var parameters = mutableListOf()
- if (session.isTournament()) {
-
- session.tournamentEntryFee?.let {
- parameters.add(it.toCurrency(session.currency))
- }
-
- session.tournamentName?.let {
- parameters.add(it.name)
- } ?: run {
- parameters.add(session.getFormattedGame())
- session.tournamentType?.let { type ->
- parameters.add(TournamentType.values()[type].localizedTitle(context))
- }
- }
-
- if (parameters.size == 0) {
- parameters.add(context.getString(R.string.tournament).capitalize())
- }
- } else {
- if (session.cgSmallBlind != null && session.cgBigBlind != null) {
- parameters.add(session.getFormattedBlinds())
- }
- session.game?.let {
- parameters.add(session.getFormattedGame())
- }
-
- if (parameters.size == 0) {
- parameters.add(context.getString(R.string.cash_game).capitalize())
- }
- }
- val title = parameters.joinToString(separator = " ")
-
- rowSession.sessionTitle.text = title
+ rowSession.sessionTitle.text = session.getFormattedGameType(context)
// Duration
rowSession.sessionInfoDurationValue.text = session.getFormattedDuration()
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/MoreTabRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/MoreTabRow.kt
index 4e2fe8bc..3885a4a1 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/MoreTabRow.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/MoreTabRow.kt
@@ -9,12 +9,14 @@ import net.pokeranalytics.android.ui.view.RowViewType
*/
enum class MoreTabRow : RowRepresentable {
BANKROLL,
+ TOP_10,
SETTINGS;
override val resId: Int?
get() {
return when(this) {
BANKROLL -> R.string.bankroll
+ TOP_10 -> R.string.top_10
SETTINGS -> R.string.services
}
}
@@ -23,6 +25,7 @@ enum class MoreTabRow : RowRepresentable {
get() {
return when(this) {
BANKROLL -> R.drawable.ic_outline_lock
+ TOP_10 -> R.drawable.ic_outline_star
SETTINGS -> R.drawable.ic_outline_settings
}
}
diff --git a/app/src/main/res/drawable/ic_outline_star.xml b/app/src/main/res/drawable/ic_outline_star.xml
new file mode 100644
index 00000000..3fc251d1
--- /dev/null
+++ b/app/src/main/res/drawable/ic_outline_star.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_top_10.xml b/app/src/main/res/layout/activity_top_10.xml
new file mode 100644
index 00000000..44318e12
--- /dev/null
+++ b/app/src/main/res/layout/activity_top_10.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_top_10.xml b/app/src/main/res/layout/fragment_top_10.xml
new file mode 100644
index 00000000..07d841a5
--- /dev/null
+++ b/app/src/main/res/layout/fragment_top_10.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/row_top_10.xml b/app/src/main/res/layout/row_top_10.xml
new file mode 100644
index 00000000..6d143692
--- /dev/null
+++ b/app/src/main/res/layout/row_top_10.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index eecdebee..43efcfbc 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -228,6 +228,22 @@
- @color/green
+
+
+
+
+
+