Improve CustomField, work in progress

dev
Aurelien Hubert 7 years ago
parent c3fb50ef52
commit 245c47d1bc
  1. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  2. 3
      app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt
  3. 7
      app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt
  4. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt
  5. 13
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt
  6. 10
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  7. 53
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  8. 13
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt
  9. 20
      app/src/main/res/layout/row_list.xml

@ -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)
}

@ -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

@ -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
*/

@ -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() {

@ -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<RowRepresentableEditDescriptor>? {
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) {

@ -62,6 +62,16 @@ interface Displayable : Localizable {
get() {
return BottomSheetType.NONE
}
val selectedChoice: Int
get() {
return -1
}
val choices: List<*>?
get() {
return null
}
}
/**

@ -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<ChipGroup>(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
*/

@ -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
}
}
}

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:orientation="vertical">
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:chipSpacing="16dp"
app:singleSelection="true">
</com.google.android.material.chip.ChipGroup>
</LinearLayout>
Loading…
Cancel
Save