diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt index 35349fc7..52e4a81e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt @@ -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"), } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index 27b1d366..15f72051 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -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 = ArrayList() //private var stat: Stat = Stat.NETRESULT //private var entries: List = ArrayList() @@ -40,6 +52,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment() { initUI() } + override fun adapterRows(): List? { + 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 } /* 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 76254452..725517b6 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 @@ -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(R.id.stat1Name)?.let { view -> + row.computedStat1?.stat?.resId?.let { + view.text = view.context.getString(it) + } + } + + itemView.findViewById(R.id.stat1Value)?.let { view -> + row.computedStat1?.format(view.context)?.let { + view.setTextFormat(it, itemView.context) + } + } + + // Stat 2 + itemView.findViewById(R.id.stat2Name)?.let { view -> + row.computedStat2?.stat?.resId?.let { + view.text = view.context.getString(it) + } + } + + itemView.findViewById(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(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(R.id.container)?.setOnClickListener(listener) + } + } + + /** * Display a button in a row */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt new file mode 100644 index 00000000..4290aa75 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GraphRow.kt @@ -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 + +} diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatDoubleRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatDoubleRow.kt new file mode 100644 index 00000000..6c27eadd --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatDoubleRow.kt @@ -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 + +} diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt index 7dd06355..44abd20e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt @@ -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 diff --git a/app/src/main/res/layout/row_calendar_stat.xml b/app/src/main/res/layout/row_calendar_stat.xml deleted file mode 100644 index 269a6378..00000000 --- a/app/src/main/res/layout/row_calendar_stat.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/row_graph.xml b/app/src/main/res/layout/row_graph.xml new file mode 100644 index 00000000..dd4dc1f9 --- /dev/null +++ b/app/src/main/res/layout/row_graph.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_stats_double.xml b/app/src/main/res/layout/row_stats_double.xml new file mode 100644 index 00000000..cbe84c14 --- /dev/null +++ b/app/src/main/res/layout/row_stats_double.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + \ No newline at end of file