From 4b4346310dc20cccd528dab3456c5506b8175bd9 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 31 May 2019 11:47:45 +0200 Subject: [PATCH] Make transaction type additive changes impossible when used --- .../android/model/realm/TransactionType.kt | 9 +- .../ui/activity/EditableDataActivity.kt | 1 + .../ui/adapter/RowRepresentableDataSource.kt | 15 +++- .../ui/fragment/BankrollDetailsFragment.kt | 2 +- .../ui/fragment/data/EditableDataFragment.kt | 33 ++++---- .../data/TransactionTypeDataFragment.kt | 82 +++++++++++++++++++ .../android/ui/view/RowViewType.kt | 6 +- .../rowrepresentable/TransactionTypeRow.kt | 2 + 8 files changed, 127 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index d511ca28..7fd61148 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt @@ -45,10 +45,15 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab @PrimaryKey override var id = UUID.randomUUID().toString() - // The name of the transaction type + /** + * The name of the transaction type + */ override var name: String = "" - // Whether or not the amount is added, or subtracted to the bankroll total + /** + * Whether or not the amount is added, or subtracted to the bankroll total + * The value can only be changed if no transaction is linked to this type + */ var additive: Boolean = false // Whether or not the type can be deleted by the user diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt index a8af3f8a..dacbc126 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt @@ -64,6 +64,7 @@ class EditableDataActivity : PokerAnalyticsActivity() { LiveData.LOCATION.ordinal -> LocationDataFragment() LiveData.TRANSACTION.ordinal -> TransactionDataFragment() LiveData.CUSTOM_FIELD.ordinal -> CustomFieldDataFragment() + LiveData.TRANSACTION_TYPE.ordinal -> TransactionTypeDataFragment() else -> EditableDataFragment() } 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 a33c6a6e..26dec55a 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 @@ -1,9 +1,9 @@ package net.pokeranalytics.android.ui.adapter import android.content.Context -import net.pokeranalytics.android.util.TextFormat import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor +import net.pokeranalytics.android.util.TextFormat /** * Base Interface to provide the RowRepresentable to the adapter @@ -145,6 +145,19 @@ interface DisplayableDataSource { return 0 } + /** + * Returns whether the row, or its component, shoudl be enabled + */ + fun isEnabled(row: RowRepresentable): Boolean { + return true + } + + /** + * Returns whether the row, or its component, shoudl be enabled + */ + fun isSelectable(row: RowRepresentable): Boolean { + return true + } } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt index d7954df0..ab2175f2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt @@ -58,7 +58,7 @@ class BankrollDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_EDIT && resultCode == RESULT_OK) { - if (data != null && data.getStringExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName) != null) { + if (data?.getStringExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName) != null) { activity?.setResult(RESULT_OK, data) activity?.finish() } else { 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 f5690b8e..bbc9ec70 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 @@ -36,6 +36,22 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat initUI() } + open fun initData() { + + val dataSource = getDataSource() + this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) + //this.rowRepresentableAdapter.setHasStableIds(true) + this.recyclerView.adapter = rowRepresentableAdapter + + // When creating an object, open automatically the keyboard for the first row + if (!deleteButtonShouldAppear && shouldOpenKeyboard) { + val row = dataSource.adapterRows()?.firstOrNull() + row?.let { + onRowSelected(0, it) + } + } + } + /** * Set fragment data */ @@ -46,7 +62,6 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - BottomSheetFragment.create(fragmentManager, row, this, getDataSource().editDescriptors(row)) } @@ -87,20 +102,4 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat return this.item as RowRepresentableDataSource } - open fun initData() { - - val dataSource = getDataSource() - this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) - //this.rowRepresentableAdapter.setHasStableIds(true) - this.recyclerView.adapter = rowRepresentableAdapter - - // When creating an object, open automatically the keyboard for the first row - if (!deleteButtonShouldAppear && shouldOpenKeyboard) { - val row = dataSource.adapterRows()?.firstOrNull() - row?.let { - onRowSelected(0, it) - } - } - } - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt new file mode 100644 index 00000000..cb94c782 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt @@ -0,0 +1,82 @@ +package net.pokeranalytics.android.ui.fragment.data + +import net.pokeranalytics.android.model.realm.Transaction +import net.pokeranalytics.android.model.realm.TransactionType +import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor +import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow +import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionTypeRow + +class TransactionTypeDataFragment : EditableDataFragment(), RowRepresentableDataSource { + + val transactionType: TransactionType + get() { + return this.item as TransactionType + } + + // RowRepresentableDataSource + + override fun adapterRows(): List? { + return this.transactionType.adapterRows() + } + + override fun rowRepresentableForPosition(position: Int): RowRepresentable? { + return this.transactionType.rowRepresentableForPosition(position) + } + + override fun numberOfRows(): Int { + return this.transactionType.numberOfRows() + } + + override fun viewTypeForPosition(position: Int): Int { + return this.transactionType.viewTypeForPosition(position) + } + + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> this.transactionType.name + else -> return super.stringForRow(row) + } + } + + override fun boolForRow(row: RowRepresentable): Boolean { + return when (row) { + TransactionTypeRow.TRANSACTION_ADDITIVE -> this.transactionType.additive + else -> super.boolForRow(row) + } + } + + override fun editDescriptors(row: RowRepresentable): ArrayList? { + return row.editingDescriptors(mapOf("defaultValue" to this.transactionType.name)) + } + + override fun isEnabled(row: RowRepresentable): Boolean { + return when (row) { + TransactionTypeRow.TRANSACTION_ADDITIVE -> { + val realm = getRealm() + val useCount = realm.where(Transaction::class.java) + .equalTo("type.id", this.transactionType.id).findAll().size + return useCount == 0 + } + else -> super.isEnabled(row) + } + } + + override fun isSelectable(row: RowRepresentable): Boolean { + return when (row) { + TransactionTypeRow.TRANSACTION_ADDITIVE -> { + val realm = getRealm() + val useCount = realm.where(Transaction::class.java) + .equalTo("type.id", this.transactionType.id).findAll().size + return useCount == 0 + } + else -> super.isSelectable(row) + } + } + + override fun getDataSource(): RowRepresentableDataSource { + return this + } + +} \ 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 499fe8dd..12ccaece 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 @@ -139,7 +139,6 @@ enum class RowViewType(private var layoutRes: Int) { inner class RowViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { - if (row is CustomizableRowRepresentable) { // Customizable Row @@ -218,7 +217,9 @@ enum class RowViewType(private var layoutRes: Int) { // Listener val listener = View.OnClickListener { itemView.findViewById(R.id.switchView)?.let { - it.isChecked = !it.isChecked + if (adapter.dataSource.isEnabled(row)) { + it.isChecked = !it.isChecked + } } ?: run { adapter.delegate?.onRowSelected(position, row) } @@ -230,6 +231,7 @@ enum class RowViewType(private var layoutRes: Int) { // Switch itemView.findViewById(R.id.switchView)?.let { it.isChecked = adapter.dataSource.boolForRow(row) + it.isEnabled = adapter.dataSource.isEnabled(row) it.setOnCheckedChangeListener { _, isChecked -> adapter.delegate?.onRowValueChanged(isChecked, row) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionTypeRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionTypeRow.kt index 2a98cfd7..a54484b1 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionTypeRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionTypeRow.kt @@ -30,4 +30,6 @@ enum class TransactionTypeRow : RowRepresentable, DefaultEditDataSource { } } + + }