Improve row type management for headers

feature/top10
Aurelien Hubert 7 years ago
parent 3d64dc35a1
commit 625889b462
  1. 20
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  2. 7
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  3. 175
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  4. 70
      app/src/main/res/layout/row_header_title_amount.xml

@ -15,10 +15,7 @@ import net.pokeranalytics.android.model.extensions.SessionState
import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.view.HeaderRowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.SessionRow
import net.pokeranalytics.android.ui.view.*
import net.pokeranalytics.android.util.getDuration
import net.pokeranalytics.android.util.round
import net.pokeranalytics.android.util.shortDateTime
@ -283,20 +280,25 @@ open class Session : RealmObject(), SessionInterface, Savable,
// Headers
when (getState()) {
SessionState.STARTED -> {
rows.add(HeaderRowRepresentable(title = getDuration(), value = result?.net.toString()))
rows.add(HeaderRowRepresentable(RowViewType.HEADER_TITLE_AMOUNT,title = getDuration(),
value = result?.net.toString()))
}
SessionState.PAUSED -> {
rows.add(HeaderRowRepresentable(resId = R.string.pause, value = result?.net.toString()))
rows.add(HeaderRowRepresentable(RowViewType.HEADER_TITLE_AMOUNT, resId = R.string.pause,
value = result?.net.toString()))
}
SessionState.FINISHED -> {
rows.add(
HeaderRowRepresentable(title = getDuration(), value = result?.net.toString())
HeaderRowRepresentable(RowViewType.HEADER_TITLE_AMOUNT,
title = getDuration(), value = result?.net.toString())
)
rows.add(
HeaderRowRepresentable(resId = R.string.hour_rate_without_pauses, value = result?.net.toString())
HeaderRowRepresentable(RowViewType.HEADER_TITLE_VALUE,
resId = R.string.hour_rate_without_pauses, value = result?.net.toString())
)
rows.add(
HeaderRowRepresentable(resId = R.string.bankroll_variation, value = result?.net.toString())
HeaderRowRepresentable(RowViewType.HEADER_TITLE_VALUE,
resId = R.string.bankroll_variation, value = result?.net.toString())
)
}
else -> {

@ -78,9 +78,12 @@ interface Displayable: Localizable {
/**
* A class to display headers as row representable
*/
class HeaderRowRepresentable(override var resId: Int? = null, var title: String? = null, var value: String? = null) : RowRepresentable {
class HeaderRowRepresentable(customViewType: RowViewType? = RowViewType.HEADER,
override var resId: Int? = null,
var title: String? = null,
var value: String? = null) : RowRepresentable {
override val viewType: Int = RowViewType.HEADER_DOUBLE_VALUES.ordinal
override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER.ordinal
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()

@ -7,6 +7,7 @@ import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.row_bottom_sheet_grid_title.view.*
import kotlinx.android.synthetic.main.row_bottom_sheet_title.view.*
import kotlinx.android.synthetic.main.row_header_title_amount.view.*
import kotlinx.android.synthetic.main.row_header_title_value.view.*
import kotlinx.android.synthetic.main.row_history_session.view.*
import kotlinx.android.synthetic.main.row_title.view.*
@ -31,7 +32,7 @@ interface BindableHolder {
enum class RowViewType {
HEADER,
HEADER_TITLE_VALUE,
HEADER_DOUBLE_VALUES,
HEADER_TITLE_AMOUNT,
EDIT_TEXT,
TITLE,
TITLE_VALUE,
@ -48,69 +49,6 @@ enum class RowViewType {
}
}
inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
if (row.displayHeader) {
itemView.sessionHeader.isVisible = true
itemView.sessionHeader.text = row.headerValues.firstOrNull() ?: ""
} else {
itemView.sessionHeader.isVisible = false
}
itemView.sessionRow.setData(row as Session)
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.sessionRow.setOnClickListener(listener)
}
}
inner class CellSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.title.text = row.localizedTitle(itemView.context)
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.container.setOnClickListener(listener)
}
}
inner class DataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.rowTitle_title.text = row.getDisplayName()
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.rowTitle_container.setOnClickListener(listener)
}
}
inner class BottomSheetDataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.rowBottomSheet_title.text = row.getDisplayName()
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.rowBottomSheet_container.setOnClickListener(listener)
}
}
inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.rowTitle_title.text = row.localizedTitle(itemView.context)
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.rowTitle_container.setOnClickListener(listener)
}
}
inner class HeaderTitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
@ -121,25 +59,25 @@ enum class RowViewType {
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.rowHeaderTitleValue_container.setOnClickListener(listener)
//itemView.rowHeaderTitleValue_container.setOnClickListener(listener)
itemView.rowHeaderTitleValue_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE
}
}
inner class HeaderDoubleValuesViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
inner class HeaderTitleAmountViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
if (row is HeaderRowRepresentable) {
if (row.resId != null) {
itemView.rowHeaderTitleValue_title.text = row.localizedTitle(itemView.context)
itemView.rowHeaderTitleAmount_title.text = row.localizedTitle(itemView.context)
} else if (row.title != null) {
itemView.rowHeaderTitleValue_title.text = row.title
itemView.rowHeaderTitleAmount_title.text = row.title
}
itemView.rowHeaderTitleValue_value.isCurrency = true
itemView.rowHeaderTitleValue_value.text = row.value
itemView.rowHeaderTitleAmount_value.isCurrency = true
itemView.rowHeaderTitleAmount_value.amount = row.value?.toDouble() ?: 0.0
/*
when (row) {
HeaderRowRepresentable.HEADER_SESSION_DURATION -> {
@ -158,6 +96,18 @@ enum class RowViewType {
}
}
inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.rowTitle_title.text = row.localizedTitle(itemView.context)
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.rowTitle_container.setOnClickListener(listener)
}
}
inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
@ -173,6 +123,16 @@ enum class RowViewType {
}
}
inner class TitleGridSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.title.text = row.localizedTitle(itemView.context)
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.container.setOnClickListener(listener)
}
}
inner class TitleSwitchViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
@ -217,26 +177,69 @@ enum class RowViewType {
}
}
inner class DataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.rowTitle_title.text = row.getDisplayName()
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.rowTitle_container.setOnClickListener(listener)
}
}
inner class BottomSheetDataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.rowBottomSheet_title.text = row.getDisplayName()
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.rowBottomSheet_container.setOnClickListener(listener)
}
}
inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
if (row.displayHeader) {
itemView.sessionHeader.isVisible = true
itemView.sessionHeader.text = row.headerValues.firstOrNull() ?: ""
} else {
itemView.sessionHeader.isVisible = false
}
itemView.sessionRow.setData(row as Session)
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.sessionRow.setOnClickListener(listener)
}
}
/**
* View holder
*/
fun viewHolder(parent: ViewGroup): RecyclerView.ViewHolder {
return when (this) {
TITLE -> TitleViewHolder(
HEADER_TITLE_VALUE -> HeaderTitleValueViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title,
R.layout.row_header_title_value,
parent,
false
)
)
HEADER_TITLE_VALUE -> HeaderTitleValueViewHolder(
HEADER_TITLE_AMOUNT -> HeaderTitleAmountViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_header_title_value,
R.layout.row_header_title_amount,
parent,
false
)
)
HEADER_DOUBLE_VALUES -> HeaderDoubleValuesViewHolder(
TITLE -> TitleViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_header_title_value,
R.layout.row_title,
parent,
false
)
@ -248,12 +251,11 @@ enum class RowViewType {
false
)
)
TITLE_VALUE_ACTION -> TitleValueActionViewHolder(
TITLE_GRID -> TitleGridSessionViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title_value_action,
R.layout.row_bottom_sheet_grid_title,
parent,
false
)
false)
)
TITLE_SWITCH -> TitleSwitchViewHolder(
LayoutInflater.from(parent.context).inflate(
@ -262,6 +264,13 @@ enum class RowViewType {
false
)
)
TITLE_VALUE_ACTION -> TitleValueActionViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title_value_action,
parent,
false
)
)
DATA -> DataViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title,
@ -276,12 +285,6 @@ enum class RowViewType {
false
)
)
TITLE_GRID -> CellSessionViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_bottom_sheet_grid_title,
parent,
false)
)
ROW_SESSION -> RowSessionViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_history_session,

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat 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:id="@+id/rowHeaderTitleAmount.container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/green_header">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/rowHeaderTitleAmount.title"
style="@style/PokerAnalyticsTheme.TextView.RowTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/guidelineStart"
app:layout_constraintTop_toTopOf="parent"
tools:text="Title" />
<net.pokeranalytics.android.ui.view.PokerAnalyticsTextView
android:id="@+id/rowHeaderTitleAmount.value"
style="@style/PokerAnalyticsTheme.TextView.RowValue"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:ellipsize="end"
android:gravity="end"
android:maxLines="1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/guidelineEnd"
app:layout_constraintStart_toEndOf="@+id/rowHeaderTitleAmount.title"
app:layout_constraintTop_toTopOf="parent"
tools:text="Value" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="16dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guidelineEnd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:id="@+id/rowHeaderTitleAmount.separator"
android:layout_width="match_parent"
android:layout_height="16dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible" />
</androidx.appcompat.widget.LinearLayoutCompat>
Loading…
Cancel
Save