diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 2bcfedfe..19026d74 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -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 -> { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index 632f4209..346f46b5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -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 = ArrayList() 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 9b3e2464..27550eb2 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 @@ -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,98 +49,35 @@ enum class RowViewType { } } - inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + inner class HeaderTitleValueViewHolder(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.rowHeaderTitleValue_title.text = row.localizedTitle(itemView.context) + adapter.dataSource?.let { + itemView.rowHeaderTitleValue_value.text = it.stringForRow(row, itemView.context) } - - 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) { - itemView.rowHeaderTitleValue_title.text = row.localizedTitle(itemView.context) - adapter.dataSource?.let { - itemView.rowHeaderTitleValue_value.text = it.stringForRow(row, itemView.context) - } - 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, diff --git a/app/src/main/res/layout/row_header_title_amount.xml b/app/src/main/res/layout/row_header_title_amount.xml new file mode 100644 index 00000000..03fd1b70 --- /dev/null +++ b/app/src/main/res/layout/row_header_title_amount.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file