From d3178e656b4eb204cb765cd645b8f3f9439617fa Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 10 May 2019 15:32:22 +0200 Subject: [PATCH 1/4] Update models, migrations and UI --- .../android/PokerAnalyticsApplication.kt | 2 +- .../migrations/PokerAnalyticsMigration.kt | 67 +++++++------- .../android/model/realm/CustomField.kt | 42 ++++++--- .../android/model/realm/CustomFieldEntry.kt | 15 ++++ .../fragment/data/CustomFieldDataFragment.kt | 79 ++++++++++++++--- .../android/ui/view/RowViewType.kt | 4 +- .../main/res/layout/fragment_custom_view.xml | 87 +++++++++++++++++++ 7 files changed, 234 insertions(+), 62 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt create mode 100644 app/src/main/res/layout/fragment_custom_view.xml diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 239300b6..d9c7f7fa 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -34,7 +34,7 @@ class PokerAnalyticsApplication : Application() { Realm.init(this) val realmConfiguration = RealmConfiguration.Builder() .name(Realm.DEFAULT_REALM_NAME) - .schemaVersion(7) + .schemaVersion(6) .migration(PokerAnalyticsMigration()) .initialData(Seed(this)) .build() diff --git a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt index a0fe661d..a9127c93 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt @@ -2,11 +2,10 @@ package net.pokeranalytics.android.model.migrations import io.realm.DynamicRealm import io.realm.RealmMigration +import net.pokeranalytics.android.model.realm.CustomFieldEntry import timber.log.Timber - - class PokerAnalyticsMigration : RealmMigration { override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) { @@ -51,41 +50,41 @@ class PokerAnalyticsMigration : RealmMigration { schema.get("Filter")?.removeField("entityType") - schema.get("Session")?.let { - it.addField("blinds", String::class.java).transform { + schema.get("Session")?.let { + it.addField("blinds", String::class.java).transform { - } - } - - schema.get("FilterCondition")?.let { - it.removeField("blindValues") - it.removeField("numericValues") + } + } - it.addField("operator", Integer::class.java) - it.addField("intValue", Integer::class.java) - it.addRealmListField("intValues", Integer::class.java) - it.addField("doubleValue", Double::class.java).setNullable("doubleValue", true) - it.addRealmListField("doubleValues", Double::class.java) - if(it.isRequired("doubleValues")) { - it.setRequired("doubleValues", false) - } - it.addField("stringValue", String::class.java) - } + schema.get("FilterCondition")?.let { + it.removeField("blindValues") + it.removeField("numericValues") + + it.addField("operator", Integer::class.java) + it.addField("intValue", Integer::class.java) + it.addRealmListField("intValues", Integer::class.java) + it.addField("doubleValue", Double::class.java).setNullable("doubleValue", true) + it.addRealmListField("doubleValues", Double::class.java) + if (it.isRequired("doubleValues")) { + it.setRequired("doubleValues", false) + } + it.addField("stringValue", String::class.java) + } schema.get("ComputableResult")?.removeField("sessionSet") schema.get("Bankroll")?.addField("initialValue", Double::class.java) - currentVersion++ + currentVersion++ } - // Migrate to version 4 - if (currentVersion == 3) { - Timber.d("*** Running migration ${currentVersion + 1}") + // Migrate to version 4 + if (currentVersion == 3) { + Timber.d("*** Running migration ${currentVersion + 1}") - schema.get("Result")?.addField("numberOfRebuy", Double::class.java)?.setNullable("numberOfRebuy", true) - currentVersion++ - } + schema.get("Result")?.addField("numberOfRebuy", Double::class.java)?.setNullable("numberOfRebuy", true) + currentVersion++ + } // Migrate to version 5 if (currentVersion == 4) { @@ -103,20 +102,18 @@ class PokerAnalyticsMigration : RealmMigration { it.addField("year", Integer::class.java) it.addField("dayOfMonth", Integer::class.java) } - currentVersion++ - } - - // Migrate to version 7 - if (currentVersion == 6) { - Timber.d("*** Running migration ${currentVersion + 1}") + schema.create("CustomFieldEntry")?.let { + it.addField("id", String::class.java).setRequired("id", true) + it.addField("value", String::class.java).setNullable("type", false) + it.addField("order", Integer::class.java).setNullable("type", false) + } schema.get("CustomField")?.let { it.addField("type", Integer::class.java).setNullable("type", false) it.addField("duplicateValue", Boolean::class.java) - it.addRealmListField("entries", String::class.java) + it.addRealmListField("entries", CustomFieldEntry::class.java) } currentVersion++ } - } override fun equals(other: Any?): Boolean { 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 73d4e635..8f31431b 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 @@ -13,7 +13,9 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow +import timber.log.Timber import java.util.* @@ -25,16 +27,6 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa AMOUNT(R.string.amount) } - companion object { - val rowRepresentation: List by lazy { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(CustomFieldRow.values()) - rows - } - } - - @PrimaryKey override var id = UUID.randomUUID().toString() @@ -43,8 +35,13 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa // Migration var type: Int = Type.LIST.ordinal + set(value) { + field = value + this.updateRowRepresentation() + } + var duplicateValue: Boolean = false - var entries: RealmList = RealmList() + var entries: RealmList = RealmList() // @todo @@ -56,8 +53,11 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa @Ignore override val viewType: Int = RowViewType.TITLE_VALUE_ARROW.ordinal + @Ignore + private var rowRepresentation: List = mutableListOf() override fun adapterRows(): List? { + Timber.d("adapterRows: ${rowRepresentation.size}") return rowRepresentation } @@ -93,4 +93,24 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa return R.string.relationship_error } + + private fun updatedRowRepresentationForCurrentState(): List { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.add(CustomFieldRow.TYPE) + + if (type == Type.LIST.ordinal && entries.size >= 0) { + rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, R.string.items_list)) + entries.forEach {entry -> + rows.add(CustomizableRowRepresentable(RowViewType.TITLE, title = entry.value)) + } + } + + return rows + } + + fun updateRowRepresentation() { + this.rowRepresentation = this.updatedRowRepresentationForCurrentState() + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt new file mode 100644 index 00000000..767d0f4a --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt @@ -0,0 +1,15 @@ +package net.pokeranalytics.android.model.realm + +import io.realm.RealmObject +import io.realm.annotations.PrimaryKey +import java.util.* + + +open class CustomFieldEntry : RealmObject() { + + @PrimaryKey + var id = UUID.randomUUID().toString() + var value: String = "" + var order: Int = 0 + +} \ No newline at end of file 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 403796d5..d379d96d 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 @@ -1,11 +1,19 @@ package net.pokeranalytics.android.ui.fragment.data import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import androidx.interpolator.view.animation.FastOutSlowInInterpolator +import androidx.recyclerview.widget.DiffUtil +import kotlinx.android.synthetic.main.fragment_custom_view.* +import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource +import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableDiffCallback import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow @@ -24,9 +32,18 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa return this.item as CustomField } + private val oldRows: ArrayList = ArrayList() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + super.onCreateView(inflater, container, savedInstanceState) + return inflater.inflate(R.layout.fragment_custom_view, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - shouldOpenKeyboard = false + //shouldOpenKeyboard = false + initUI() } override fun getDataSource(): RowRepresentableDataSource { @@ -72,22 +89,56 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa } override fun onRowValueChanged(value: Any?, row: RowRepresentable) { - super.onRowValueChanged(value, row) + //super.onRowValueChanged(value, row) Timber.d("onRowValueChanged: $row => $value") + customField.updateValue(value, row) + updateUI() + updateAdapterUI() + } + + /** + * Init UI + */ + private fun initUI() { + customField.updateRowRepresentation() + bottomBar.translationY = 72f.px + bottomBar.visibility = View.VISIBLE + + addItem.setOnClickListener { + Timber.d("Click on add item") + } + + updateUI() + updateAdapterUI() + } + + /** + * Update UI + */ + private fun updateUI() { + if (customField.type == CustomField.Type.LIST.ordinal) { + bottomBar.animate().translationY(0f.px) + .setInterpolator(FastOutSlowInInterpolator()) + .start() + } else { + bottomBar.animate().translationY(72f.px) + .setInterpolator(FastOutSlowInInterpolator()) + .withEndAction { } + .start() + } + } + + /** + * Update adapter UI + */ + private fun updateAdapterUI() { + customField.adapterRows()?.let { + val diffResult = DiffUtil.calculateDiff(RowRepresentableDiffCallback(it, oldRows)) + rowRepresentableAdapter.updateRows(diffResult) - //rowRepresentableAdapter.refreshRow(row) - - /* - GlobalScope.launch(Dispatchers.Main) { - delay(200) - when(row) { - TransactionRow.BANKROLL -> onRowSelected(0, TransactionRow.TYPE) - TransactionRow.TYPE -> onRowSelected(0, TransactionRow.AMOUNT) - TransactionRow.AMOUNT -> onRowSelected(0, TransactionRow.DATE) - TransactionRow.DATE -> onRowSelected(0, TransactionRow.COMMENT) - } + oldRows.clear() + oldRows.addAll(it) } - */ } } \ No newline at end of file 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 717aeeac..314fbae6 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 @@ -410,6 +410,9 @@ enum class RowViewType(private var layoutRes: Int) { itemView.findViewById(R.id.chipGroup)?.let { chipGroup -> + chipGroup.removeAllViews() + chipGroup.setOnCheckedChangeListener(null) + CustomField.Type.values().forEach { type -> val chip = Chip(itemView.context) chip.id = type.ordinal @@ -432,7 +435,6 @@ enum class RowViewType(private var layoutRes: Int) { adapter.delegate?.onRowValueChanged(CustomField.Type.values()[checkedId], row) } }) - } } } diff --git a/app/src/main/res/layout/fragment_custom_view.xml b/app/src/main/res/layout/fragment_custom_view.xml new file mode 100644 index 00000000..1ccb0e2f --- /dev/null +++ b/app/src/main/res/layout/fragment_custom_view.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From d0128700d675722b71cd78aa54f9adc5b7836fd5 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 10 May 2019 17:30:29 +0200 Subject: [PATCH 2/4] Improve custom field, add move, work in progress --- .../android/model/realm/CustomField.kt | 45 +++++-- .../android/model/realm/CustomFieldEntry.kt | 32 ++++- .../fragment/data/CustomFieldDataFragment.kt | 111 ++++++++++++++++-- .../ui/fragment/data/EditableDataFragment.kt | 1 + 4 files changed, 172 insertions(+), 17 deletions(-) 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 8f31431b..0a6f59e4 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 @@ -11,12 +11,14 @@ import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import timber.log.Timber import java.util.* +import kotlin.collections.ArrayList open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDataSource, RowRepresentable { @@ -35,10 +37,10 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa // Migration var type: Int = Type.LIST.ordinal - set(value) { - field = value - this.updateRowRepresentation() - } + set(value) { + field = value + this.updateRowRepresentation() + } var duplicateValue: Boolean = false var entries: RealmList = RealmList() @@ -57,7 +59,6 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa private var rowRepresentation: List = mutableListOf() override fun adapterRows(): List? { - Timber.d("adapterRows: ${rowRepresentation.size}") return rowRepresentation } @@ -93,6 +94,16 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa return R.string.relationship_error } + override fun editDescriptors(row: RowRepresentable): ArrayList? { + return when (row) { + is CustomFieldEntry -> row.editingDescriptors( + mapOf( + "defaultValue" to row.value + ) + ) + else -> null + } + } private fun updatedRowRepresentationForCurrentState(): List { val rows = ArrayList() @@ -101,11 +112,14 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa if (type == Type.LIST.ordinal && entries.size >= 0) { rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, R.string.items_list)) - entries.forEach {entry -> - rows.add(CustomizableRowRepresentable(RowViewType.TITLE, title = entry.value)) + if (entries.isNotEmpty()) { + Timber.d("entries: ${entries.size}") + entries.sortBy { it.order } + rows.addAll(entries) } } + Timber.d("rows: ${rows.size}") return rows } @@ -113,4 +127,21 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa this.rowRepresentation = this.updatedRowRepresentationForCurrentState() } + /** + * Add entry + */ + fun addEntry() { + val entry = CustomFieldEntry() + entry.order = (entries.lastOrNull()?.order ?: 0) + 1 + entries.add(entry) + updateRowRepresentation() + } + + /** + * + */ + fun deleteEntry() { + + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt index 767d0f4a..fed2340d 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt @@ -1,15 +1,45 @@ package net.pokeranalytics.android.model.realm +import android.content.Context +import android.text.InputType import io.realm.RealmObject +import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor +import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.util.NULL_TEXT import java.util.* -open class CustomFieldEntry : RealmObject() { +open class CustomFieldEntry : RealmObject(), RowRepresentable { @PrimaryKey var id = UUID.randomUUID().toString() var value: String = "" var order: Int = 0 + @Ignore + override val viewType: Int = RowViewType.TITLE.ordinal + + @Ignore + override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT + + override fun localizedTitle(context: Context): String { + return context.getString(R.string.value) + } + + override fun getDisplayName(): String { + return if (value.isNotEmpty()) value else NULL_TEXT + } + + override fun editingDescriptors(map: Map): ArrayList? { + val defaultValue: Any? by map + return arrayListOf( + RowRepresentableEditDescriptor(defaultValue, R.string.value, InputType.TYPE_CLASS_TEXT) + ) + } + } \ No newline at end of file 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 d379d96d..10786d0f 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 @@ -5,15 +5,17 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.interpolator.view.animation.FastOutSlowInInterpolator -import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.fragment_custom_view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.CustomField +import net.pokeranalytics.android.model.realm.CustomFieldEntry import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.extensions.px +import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowRepresentableDiffCallback import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow @@ -34,6 +36,71 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa private val oldRows: ArrayList = ArrayList() + + private val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() { + + var dragFrom = -1 + var dragTo = -1 + + override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { + return if (viewHolder.adapterPosition <= 2) { + return 0 + } else { + makeFlag( + ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.DOWN + or ItemTouchHelper.UP or ItemTouchHelper.START or ItemTouchHelper.END + ) + } + } + + override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { + if (target.adapterPosition <= 2) { + return false + } + + val fromPosition = viewHolder.adapterPosition + val toPosition = target.adapterPosition + + if (dragFrom == -1) { + dragFrom = viewHolder.adapterPosition - 1 // Header + } + dragTo = target.adapterPosition - 1 // Header + + rowRepresentableAdapter.notifyItemMoved(fromPosition, toPosition) + + /* + adapterRows()?.filter { it is CustomFieldEntry }?.forEachIndexed { index, rowRepresentable -> + val entry = rowRepresentable as CustomFieldEntry + Timber.d("$index ${entry.value} ${entry.order}") + } + */ + + + return true + } + + override fun onMoved(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, fromPos: Int, target: RecyclerView.ViewHolder, toPos: Int, x: Int, y: Int) { + super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y) + + Collections.swap(customField.entries, fromPos - (CustomFieldRow.values().size + 1), toPos - (CustomFieldRow.values().size + 1)) + customField.entries.forEachIndexed { index, rowRepresentable -> + val entry = rowRepresentable as CustomFieldEntry + entry.order = index + } + + } + + override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + super.clearView(recyclerView, viewHolder) + dragFrom = -1 + dragTo = -1 + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + } + }) + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater.inflate(R.layout.fragment_custom_view, container, false) @@ -69,7 +136,7 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa } override fun intForRow(row: RowRepresentable): Int { - return when(row) { + return when (row) { CustomFieldRow.TYPE -> customField.type else -> super.intForRow(row) } @@ -78,22 +145,36 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa override fun editDescriptors(row: RowRepresentable): ArrayList? { return when (row) { SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.customField.name)) + is CustomFieldEntry -> row.editingDescriptors(mapOf("defaultValue" to row.value)) else -> null } } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (row) { + is CustomFieldEntry -> { + val data = customField.editDescriptors(row) + Timber.d("data: $data") + BottomSheetFragment.create(fragmentManager, row, this, data, false) + } else -> super.onRowSelected(position, row, fromAction) } } override fun onRowValueChanged(value: Any?, row: RowRepresentable) { - //super.onRowValueChanged(value, row) Timber.d("onRowValueChanged: $row => $value") - customField.updateValue(value, row) - updateUI() - updateAdapterUI() + when (row) { + is CustomFieldEntry -> { + row.value = value as String? ?: "" + rowRepresentableAdapter.refreshRow(row) + } + CustomFieldRow.TYPE -> { + customField.updateValue(value, row) + updateUI() + updateAdapterUI() + } + } + } /** @@ -104,8 +185,11 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa bottomBar.translationY = 72f.px bottomBar.visibility = View.VISIBLE + itemTouchHelper.attachToRecyclerView(recyclerView) + addItem.setOnClickListener { - Timber.d("Click on add item") + customField.addEntry() + updateAdapterUI() } updateUI() @@ -123,7 +207,6 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa } else { bottomBar.animate().translationY(72f.px) .setInterpolator(FastOutSlowInInterpolator()) - .withEndAction { } .start() } } @@ -132,6 +215,15 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa * Update adapter UI */ private fun updateAdapterUI() { + rowRepresentableAdapter.notifyDataSetChanged() + /* + //TODO: Code to animate changes + + // Test: + // not really, i agree with your part about performance but notifyDataSetChanged() does not kill animations, + // to animate using notifyDataSetChanged(), a) call setHasStableIds(true) on your RecyclerView.Adapter object and b) + // override getItemId inside your Adapter to return a unique long value for each row and check it out, the animations do work + customField.adapterRows()?.let { val diffResult = DiffUtil.calculateDiff(RowRepresentableDiffCallback(it, oldRows)) rowRepresentableAdapter.updateRows(diffResult) @@ -139,6 +231,7 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa oldRows.clear() oldRows.addAll(it) } + */ } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index 58784f62..5d3d6148 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -70,6 +70,7 @@ open class EditableDataFragment : RealmFragment(), RowRepresentableDelegate { } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + BottomSheetFragment.create(fragmentManager, row, this, getDataSource().editDescriptors(row)) } From faa6f902f5034acd0661c4089240340f60e9dee6 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 10 May 2019 17:33:15 +0200 Subject: [PATCH 3/4] Clean code --- .../ui/fragment/data/CustomFieldDataFragment.kt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) 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 10786d0f..e5b4d65d 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 @@ -62,20 +62,12 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa val toPosition = target.adapterPosition if (dragFrom == -1) { - dragFrom = viewHolder.adapterPosition - 1 // Header + dragFrom = viewHolder.adapterPosition - 1 } - dragTo = target.adapterPosition - 1 // Header + dragTo = target.adapterPosition - 1 rowRepresentableAdapter.notifyItemMoved(fromPosition, toPosition) - /* - adapterRows()?.filter { it is CustomFieldEntry }?.forEachIndexed { index, rowRepresentable -> - val entry = rowRepresentable as CustomFieldEntry - Timber.d("$index ${entry.value} ${entry.order}") - } - */ - - return true } From 337db5b559d9f89949dfbbadf1d816ae9cbc95b2 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 10 May 2019 17:38:32 +0200 Subject: [PATCH 4/4] Add reorder icon --- app/src/main/res/drawable/ic_reorder.xml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/src/main/res/drawable/ic_reorder.xml diff --git a/app/src/main/res/drawable/ic_reorder.xml b/app/src/main/res/drawable/ic_reorder.xml new file mode 100644 index 00000000..abf6041a --- /dev/null +++ b/app/src/main/res/drawable/ic_reorder.xml @@ -0,0 +1,9 @@ + + +