Improve Calendar details

feature/top10
Aurelien Hubert 7 years ago
parent ebb31da9d5
commit 079a8397bd
  1. 2
      app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt
  2. 41
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt
  3. 79
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  4. 21
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt
  5. 13
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatDoubleRow.kt
  6. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt
  7. 106
      app/src/main/res/layout/row_calendar_stat.xml
  8. 19
      app/src/main/res/layout/row_graph.xml
  9. 51
      app/src/main/res/layout/row_stats_double.xml

@ -14,7 +14,7 @@ import net.pokeranalytics.android.ui.fragment.GraphParameters
class StatisticDetailsActivity : PokerAnalyticsActivity() {
private enum class IntentKey(val keyName: String) {
STAT("STAT"),
STAT("STATS"),
ENTRIES("ENTRIES"),
}

@ -6,6 +6,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import com.github.mikephil.charting.data.Entry
import com.google.android.material.tabs.TabLayout
import kotlinx.android.synthetic.main.fragment_calendar_details.*
@ -14,10 +15,18 @@ 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.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.extensions.toast
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.GraphRow
import net.pokeranalytics.android.ui.view.rowrepresentable.StatDoubleRow
class CalendarDetailsFragment : PokerAnalyticsFragment() {
class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate {
companion object {
fun newInstance(context: Context) {
@ -27,6 +36,9 @@ class CalendarDetailsFragment : PokerAnalyticsFragment() {
}
private lateinit var parentActivity: PokerAnalyticsActivity
private lateinit var statsAdapter: RowRepresentableAdapter
private var rowRepresentables: ArrayList<RowRepresentable> = ArrayList()
//private var stat: Stat = Stat.NETRESULT
//private var entries: List<Entry> = ArrayList()
@ -40,6 +52,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment() {
initUI()
}
override fun adapterRows(): List<RowRepresentable>? {
return rowRepresentables
}
/**
* Init UI
*/
@ -80,9 +96,32 @@ class CalendarDetailsFragment : PokerAnalyticsFragment() {
CalendarDetailsActivity.computedResults?.let { computedResults ->
rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.net_result))
rowRepresentables.add(GraphRow(Stat.NETRESULT, null, ""))
rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.NETRESULT), computedResults.computedStat(Stat.HOURLY_RATE)))
rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.LOCATIONS_PLAYED), computedResults.computedStat(Stat.LONGEST_STREAKS)))
rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.distribution))
rowRepresentables.add(GraphRow(Stat.NETRESULT, null, ""))
rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.WIN_RATIO)))
rowRepresentables.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, resId = R.string.volume))
rowRepresentables.add(GraphRow(Stat.NETRESULT, null, ""))
rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DURATION), computedResults.computedStat(Stat.AVERAGE_DURATION)))
rowRepresentables.add(StatDoubleRow(computedResults.computedStat(Stat.DAYS_PLAYED)))
//computedResults.group.conditions
}
statsAdapter = RowRepresentableAdapter(this, this)
val viewManager = LinearLayoutManager(requireContext())
recyclerView.apply {
setHasFixedSize(true)
layoutManager = viewManager
adapter = statsAdapter
}
/*

@ -13,12 +13,13 @@ import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.row_history_session.view.*
import kotlinx.android.synthetic.main.row_transaction.view.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow
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.extensions.setTextFormat
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.StatDoubleRow
import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow
/**
* An interface used to factor the configuration of RecyclerView.ViewHolder
@ -61,7 +62,9 @@ enum class RowViewType(private var layoutRes: Int) {
ROW_TRANSACTION(R.layout.row_transaction),
ROW_BUTTON(R.layout.row_button),
ROW_FOLLOW_US(R.layout.row_follow_us),
STAT(R.layout.row_stats_title_value),
STATS(R.layout.row_stats_title_value),
STATS_DOUBLE(R.layout.row_stats_double),
GRAPH(R.layout.row_graph),
// Separator
SEPARATOR(R.layout.row_separator);
@ -93,8 +96,10 @@ enum class RowViewType(private var layoutRes: Int) {
// Row Follow Us
ROW_FOLLOW_US -> RowFollowUsViewHolder(layout)
// Row Stat
STAT -> StatsTitleValueViewHolder(layout)
// Row Stats
STATS -> StatsTitleValueViewHolder(layout)
STATS_DOUBLE -> StatsDoubleViewHolder(layout)
GRAPH -> GraphViewHolder(layout)
// Separator
SEPARATOR -> SeparatorViewHolder(layout)
@ -248,6 +253,72 @@ enum class RowViewType(private var layoutRes: Int) {
}
}
/**
* Display a stat
*/
inner class StatsDoubleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
if (row is StatDoubleRow) {
// Stat 1
itemView.findViewById<AppCompatTextView?>(R.id.stat1Name)?.let { view ->
row.computedStat1?.stat?.resId?.let {
view.text = view.context.getString(it)
}
}
itemView.findViewById<AppCompatTextView?>(R.id.stat1Value)?.let { view ->
row.computedStat1?.format(view.context)?.let {
view.setTextFormat(it, itemView.context)
}
}
// Stat 2
itemView.findViewById<AppCompatTextView?>(R.id.stat2Name)?.let { view ->
row.computedStat2?.stat?.resId?.let {
view.text = view.context.getString(it)
}
}
itemView.findViewById<AppCompatTextView?>(R.id.stat2Value)?.let { view ->
row.computedStat2?.format(view.context)?.let {
view.setTextFormat(it, itemView.context)
}
}
}
// Listener
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.findViewById<View?>(R.id.container)?.setOnClickListener(listener)
}
}
/**
* Display a stat
*/
inner class GraphViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
//TODO: Implementation
// Listener
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.findViewById<View?>(R.id.container)?.setOnClickListener(listener)
}
}
/**
* Display a button in a row
*/

@ -0,0 +1,21 @@
package net.pokeranalytics.android.ui.view.rowrepresentable
import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
class GraphRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "") : RowRepresentable {
var stat: Stat = stat
var computedStat: ComputedStat? = computedStat
var groupName: String = groupName
override val viewType: Int
get() = RowViewType.GRAPH.ordinal
override val resId: Int?
get() = this.stat.resId
}

@ -0,0 +1,13 @@
package net.pokeranalytics.android.ui.view.rowrepresentable
import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
class StatDoubleRow(var computedStat1: ComputedStat? = null, var computedStat2: ComputedStat? = null) : RowRepresentable {
override val viewType: Int
get() = RowViewType.STATS_DOUBLE.ordinal
}

@ -13,7 +13,7 @@ class StatRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "") :
var groupName: String = groupName
override val viewType: Int
get() = RowViewType.STAT.ordinal
get() = RowViewType.STATS.ordinal
override val resId: Int?
get() = this.stat.resId

@ -1,106 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<FrameLayout
android:id="@+id/chartContainer"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="2:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat1Name"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/chartContainer"
tools:text="NET RESULT" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat1Value"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsValue"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toStartOf="@+id/stat2Value"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/stat1Name"
tools:text="$2000" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat2Name"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsTitle"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/stat1Name"
app:layout_constraintTop_toBottomOf="@+id/chartContainer"
tools:text="NET RESULT" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat2Value"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/stat1Value"
app:layout_constraintTop_toBottomOf="@id/stat2Name"
tools:text="$2000" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat3Name"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/stat1Value"
tools:text="NET RESULT" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat3Value"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsValue"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/stat4Value"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/stat3Name"
tools:text="$2000" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat4Name"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsTitle"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/stat3Name"
app:layout_constraintTop_toBottomOf="@+id/stat2Value"
tools:text="NET RESULT" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat4Value"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/stat3Value"
app:layout_constraintTop_toBottomOf="@id/stat4Name"
tools:text="$2000" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<FrameLayout
android:id="@+id/chartContainer"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="2:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/green_lighter_gradient" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat1Name"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="NET RESULT" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat1Value"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsValue"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/stat2Value"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/stat1Name"
tools:text="$2000" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat2Name"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsTitle"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/stat1Name"
app:layout_constraintTop_toTopOf="parent"
tools:text="NET RESULT" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stat2Value"
style="@style/PokerAnalyticsTheme.TextView.LegendStatsValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/stat1Value"
app:layout_constraintTop_toBottomOf="@id/stat2Name"
tools:text="$2000" />
</androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save