Make transaction type additive changes impossible when used

dev
Laurent 7 years ago
parent 8d60332e62
commit 4b4346310d
  1. 9
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  2. 1
      app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt
  3. 15
      app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt
  4. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt
  5. 33
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt
  6. 82
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt
  7. 4
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  8. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionTypeRow.kt

@ -45,10 +45,15 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab
@PrimaryKey @PrimaryKey
override var id = UUID.randomUUID().toString() override var id = UUID.randomUUID().toString()
// The name of the transaction type /**
* The name of the transaction type
*/
override var name: String = "" 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 var additive: Boolean = false
// Whether or not the type can be deleted by the user // Whether or not the type can be deleted by the user

@ -64,6 +64,7 @@ class EditableDataActivity : PokerAnalyticsActivity() {
LiveData.LOCATION.ordinal -> LocationDataFragment() LiveData.LOCATION.ordinal -> LocationDataFragment()
LiveData.TRANSACTION.ordinal -> TransactionDataFragment() LiveData.TRANSACTION.ordinal -> TransactionDataFragment()
LiveData.CUSTOM_FIELD.ordinal -> CustomFieldDataFragment() LiveData.CUSTOM_FIELD.ordinal -> CustomFieldDataFragment()
LiveData.TRANSACTION_TYPE.ordinal -> TransactionTypeDataFragment()
else -> EditableDataFragment() else -> EditableDataFragment()
} }

@ -1,9 +1,9 @@
package net.pokeranalytics.android.ui.adapter package net.pokeranalytics.android.ui.adapter
import android.content.Context import android.content.Context
import net.pokeranalytics.android.util.TextFormat
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.util.TextFormat
/** /**
* Base Interface to provide the RowRepresentable to the adapter * Base Interface to provide the RowRepresentable to the adapter
@ -145,6 +145,19 @@ interface DisplayableDataSource {
return 0 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
}
} }
/** /**

@ -58,7 +58,7 @@ class BankrollDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_EDIT && resultCode == RESULT_OK) { 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?.setResult(RESULT_OK, data)
activity?.finish() activity?.finish()
} else { } else {

@ -36,6 +36,22 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat
initUI() 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 * Set fragment data
*/ */
@ -46,7 +62,6 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat
} }
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
BottomSheetFragment.create(fragmentManager, row, this, getDataSource().editDescriptors(row)) BottomSheetFragment.create(fragmentManager, row, this, getDataSource().editDescriptors(row))
} }
@ -87,20 +102,4 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat
return this.item as RowRepresentableDataSource 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)
}
}
}
} }

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

@ -139,7 +139,6 @@ enum class RowViewType(private var layoutRes: Int) {
inner class RowViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { inner class RowViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
if (row is CustomizableRowRepresentable) { if (row is CustomizableRowRepresentable) {
// Customizable Row // Customizable Row
@ -218,7 +217,9 @@ enum class RowViewType(private var layoutRes: Int) {
// Listener // Listener
val listener = View.OnClickListener { val listener = View.OnClickListener {
itemView.findViewById<SwitchCompat?>(R.id.switchView)?.let { itemView.findViewById<SwitchCompat?>(R.id.switchView)?.let {
if (adapter.dataSource.isEnabled(row)) {
it.isChecked = !it.isChecked it.isChecked = !it.isChecked
}
} ?: run { } ?: run {
adapter.delegate?.onRowSelected(position, row) adapter.delegate?.onRowSelected(position, row)
} }
@ -230,6 +231,7 @@ enum class RowViewType(private var layoutRes: Int) {
// Switch // Switch
itemView.findViewById<SwitchCompat?>(R.id.switchView)?.let { itemView.findViewById<SwitchCompat?>(R.id.switchView)?.let {
it.isChecked = adapter.dataSource.boolForRow(row) it.isChecked = adapter.dataSource.boolForRow(row)
it.isEnabled = adapter.dataSource.isEnabled(row)
it.setOnCheckedChangeListener { _, isChecked -> it.setOnCheckedChangeListener { _, isChecked ->
adapter.delegate?.onRowValueChanged(isChecked, row) adapter.delegate?.onRowValueChanged(isChecked, row)
} }

@ -30,4 +30,6 @@ enum class TransactionTypeRow : RowRepresentable, DefaultEditDataSource {
} }
} }
} }

Loading…
Cancel
Save