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