diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt index c9645405..e5ad1468 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt @@ -21,7 +21,7 @@ import java.util.* open class CustomField : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable { enum class Type(var resId: Int) { - LIST(R.string.items_list), + LIST(R.string.enum_custom_field_type), NUMBER(R.string.number), AMOUNT(R.string.amount) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt index 49b51960..39b2b41b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt @@ -47,7 +47,8 @@ class RowRepresentableAdapter( */ fun refreshRow(row: RowRepresentable) { - if (row.viewType == RowViewType.TITLE_SWITCH.ordinal) { + if (row.viewType == RowViewType.TITLE_SWITCH.ordinal || + row.viewType == RowViewType.LIST.ordinal) { // Avoid to refresh the view because it will refresh itself // Caution if we want to update the title for example return diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt index 63dab8ef..b06073a2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt @@ -118,6 +118,13 @@ interface DisplayableDataSource { return false } + /** + * Returns a int for a specific row + */ + fun intForRow(row: RowRepresentable): Int { + return -1 + } + /** * Returns a localized string for a specific row */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt index 3d96f88f..8c8f2b78 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt @@ -118,7 +118,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() { } this.chipGroup.isVisible = displayAggregationChoices - this.chipGroup.setSingleSelection(true) + this.chipGroup.isSingleSelection = true this.chipGroup.check(0) this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt index 95beb10d..b4adce52 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt @@ -10,6 +10,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.util.NULL_TEXT +import timber.log.Timber import java.util.* /** @@ -50,6 +51,13 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa } } + override fun intForRow(row: RowRepresentable): Int { + return when(row) { + CustomFieldRow.TYPE -> customField.type + else -> super.intForRow(row) + } + } + override fun editDescriptors(row: RowRepresentable): ArrayList? { return when (row) { SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.customField.name)) @@ -65,7 +73,10 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa override fun onRowValueChanged(value: Any?, row: RowRepresentable) { super.onRowValueChanged(value, row) - rowRepresentableAdapter.refreshRow(row) + + Timber.d("onRowValueChanged: $row => $value") + + //rowRepresentableAdapter.refreshRow(row) /* GlobalScope.launch(Dispatchers.Main) { 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 0aa25f23..0eb9a166 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 @@ -62,6 +62,16 @@ interface Displayable : Localizable { get() { return BottomSheetType.NONE } + + val selectedChoice: Int + get() { + return -1 + } + + val choices: List<*>? + get() { + return null + } } /** 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 f4c6a62f..717aeeac 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 @@ -17,22 +17,24 @@ import com.github.mikephil.charting.data.BarData import com.github.mikephil.charting.data.BarDataSet import com.github.mikephil.charting.data.LineData import com.github.mikephil.charting.data.LineDataSet +import com.google.android.material.chip.Chip +import com.google.android.material.chip.ChipGroup import kotlinx.android.synthetic.main.row_feed_session.view.* import kotlinx.android.synthetic.main.row_transaction.view.* 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.realm.CustomField 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.ChipGroupExtension +import net.pokeranalytics.android.ui.extensions.px 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.CustomizableRowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.GraphRow -import net.pokeranalytics.android.ui.view.rowrepresentable.StatDoubleRow -import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow +import net.pokeranalytics.android.ui.view.rowrepresentable.* /** * An interface used to factor the configuration of RecyclerView.ViewHolder @@ -79,6 +81,7 @@ enum class RowViewType(private var layoutRes: Int) { STATS_DOUBLE(R.layout.row_stats_double), GRAPH(R.layout.row_graph), LEGEND_DEFAULT(R.layout.row_legend_default), + LIST(R.layout.row_list), // Separator SEPARATOR(R.layout.row_separator); @@ -110,6 +113,9 @@ enum class RowViewType(private var layoutRes: Int) { // Row Follow Us ROW_FOLLOW_US -> RowFollowUsViewHolder(layout) + // Row List - ChipGroup + LIST -> ListViewHolder(layout) + // Row Stats STATS -> StatsTitleValueViewHolder(layout) STATS_DOUBLE -> StatsDoubleViewHolder(layout) @@ -393,6 +399,45 @@ enum class RowViewType(private var layoutRes: Int) { } } + /** + * Display a list of chips + */ + inner class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + + if (row is CustomFieldRow) { + + itemView.findViewById(R.id.chipGroup)?.let { chipGroup -> + + CustomField.Type.values().forEach { type -> + val chip = Chip(itemView.context) + chip.id = type.ordinal + chip.text = itemView.context.getString(type.resId) + chip.chipStartPadding = 8f.px + chip.chipEndPadding = 8f.px + chip.isChecked = adapter.dataSource.intForRow(row) == type.ordinal + chipGroup.addView(chip) + } + + chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { + override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { + super.onCheckedChanged(group, checkedId) + + @SuppressWarnings + if (checkedId < 0) { // when unchecked, checkedId returns -1, causing a crash + return + } + + adapter.delegate?.onRowValueChanged(CustomField.Type.values()[checkedId], row) + } + }) + + } + } + } + } + /** * Display a button in a row */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt index cea01661..f4df59a2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt @@ -1,24 +1,28 @@ package net.pokeranalytics.android.ui.view.rowrepresentable import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.view.DefaultEditDataSource import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType enum class CustomFieldRow : RowRepresentable, DefaultEditDataSource { + TYPE, COPY_ON_DUPLICATE; override val resId: Int? get() { return when (this) { COPY_ON_DUPLICATE -> R.string.copy_on_duplicate + else -> null } } override val viewType: Int get() { return when (this) { + TYPE -> RowViewType.LIST.ordinal COPY_ON_DUPLICATE -> RowViewType.TITLE_SWITCH.ordinal } } @@ -26,8 +30,17 @@ enum class CustomFieldRow : RowRepresentable, DefaultEditDataSource { override val bottomSheetType: BottomSheetType get() { return when (this) { + TYPE -> BottomSheetType.NONE COPY_ON_DUPLICATE -> BottomSheetType.NONE } } + + override val choices: List<*>? + get() { + return when(this) { + TYPE -> CustomField.Type.values().toList() + else -> null + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/row_list.xml b/app/src/main/res/layout/row_list.xml new file mode 100644 index 00000000..f31fbcc6 --- /dev/null +++ b/app/src/main/res/layout/row_list.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file