Improve deletion system and add deletion for bankroll

dev
Aurelien Hubert 7 years ago
parent 91c9973ee0
commit 0bc502e468
  1. 20
      app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt
  2. 22
      app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
  3. 9
      app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt
  4. 9
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/ui/activity/BankrollActivity.kt
  6. 7
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt
  7. 15
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt
  8. 3
      app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt

@ -12,6 +12,13 @@ enum class SaveValidityStatus {
DATA_INVALID; DATA_INVALID;
} }
enum class DeleteValidityStatus {
VALID,
INVALID,
SESSIONS_LINKED,
TRANSACTIONS_LINKED;
}
/** /**
* An interface to grouped object which are managed by the database * An interface to grouped object which are managed by the database
*/ */
@ -32,7 +39,7 @@ interface NameManageable: Manageable {
throw ModelException("${this::class.java} getFailedSaveMessage for $status not handled") throw ModelException("${this::class.java} getFailedSaveMessage for $status not handled")
} }
override fun getFailedDeleteMessage(): Int { override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
return R.string.relationship_error return R.string.relationship_error
} }
} }
@ -101,8 +108,17 @@ interface Deletable : Identifiable {
*/ */
fun isValidForDelete(realm: Realm): Boolean fun isValidForDelete(realm: Realm): Boolean
fun getDeleteStatus(realm: Realm): DeleteValidityStatus {
if (!isValidForDelete(realm)) {
return DeleteValidityStatus.INVALID
}
return DeleteValidityStatus.VALID
}
/** /**
* A method to get the reason why the object can't be deleted * A method to get the reason why the object can't be deleted
*/ */
fun getFailedDeleteMessage(): Int fun getFailedDeleteMessage(status: DeleteValidityStatus): Int
} }

@ -7,6 +7,7 @@ import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus
import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
@ -66,12 +67,25 @@ open class Bankroll : RealmObject(), NameManageable, RowRepresentable {
override fun isValidForDelete(realm: Realm): Boolean { override fun isValidForDelete(realm: Realm): Boolean {
return realm.where<Session>().equalTo("bankroll.id", id).findAll().isEmpty() return realm.where<Session>().equalTo("bankroll.id", id).findAll().isEmpty()
//TODO: Check transactions && realm.where<Transaction>().equalTo("bankroll.id", id).findAll().isEmpty()
//&& realm.where<Transaction>().equalTo("bankroll.id", id).findAll().isEmpty()
} }
override fun getFailedDeleteMessage(): Int { override fun getDeleteStatus(realm: Realm): DeleteValidityStatus {
return R.string.bankroll_relationship_error return if (!realm.where<Session>().equalTo("bankroll.id", id).findAll().isEmpty()) {
DeleteValidityStatus.SESSIONS_LINKED
} else if (!realm.where<Transaction>().equalTo("bankroll.id", id).findAll().isEmpty()) {
DeleteValidityStatus.TRANSACTIONS_LINKED
} else {
DeleteValidityStatus.VALID
}
}
override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
return when (status) {
DeleteValidityStatus.SESSIONS_LINKED -> R.string.bankroll_relationship_error
DeleteValidityStatus.TRANSACTIONS_LINKED -> R.string.bankroll_relationship_error_transactions
else -> super.getFailedDeleteMessage(status)
}
} }
override fun getFailedSaveMessage(status: SaveValidityStatus): Int { override fun getFailedSaveMessage(status: SaveValidityStatus): Int {

@ -10,10 +10,7 @@ import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.calculus.TextFormat import net.pokeranalytics.android.calculus.TextFormat
import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.DatedValue import net.pokeranalytics.android.model.interfaces.*
import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.model.interfaces.TimeFilterable
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.graph.GraphUnderlyingEntry import net.pokeranalytics.android.ui.graph.GraphUnderlyingEntry
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
@ -115,8 +112,8 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo
return true return true
} }
override fun getFailedDeleteMessage(): Int { override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates. return R.string.relationship_error
} }
override fun getSaveValidityStatus(realm: Realm): SaveValidityStatus { override fun getSaveValidityStatus(realm: Realm): SaveValidityStatus {

@ -3,6 +3,8 @@ package net.pokeranalytics.android.model.realm
import io.realm.Realm import io.realm.Realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus
import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
@ -88,11 +90,12 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab
} }
override fun isValidForDelete(realm: Realm): Boolean { override fun isValidForDelete(realm: Realm): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates. return true
} }
override fun getFailedDeleteMessage(): Int { override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates. return R.string.relationship_error
} }
} }

@ -69,10 +69,12 @@ class BankrollActivity : PokerAnalyticsActivity() {
indexes.addAll(changeSet.insertions.toList()) indexes.addAll(changeSet.insertions.toList())
indexes.addAll(changeSet.deletions.toList()) indexes.addAll(changeSet.deletions.toList())
indexes.forEach { index -> indexes.forEach { index ->
if (t.isNotEmpty()) {
t[index]?.bankroll?.let { br -> t[index]?.bankroll?.let { br ->
bankrolls.add(br) bankrolls.add(br)
} }
} }
}
this.computeBankrollReports(bankrolls) this.computeBankrollReports(bankrolls)
} }

@ -3,8 +3,6 @@ package net.pokeranalytics.android.ui.fragment
import android.app.Activity.RESULT_OK import android.app.Activity.RESULT_OK
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.View import android.view.View
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.api.CurrencyConverterApi import net.pokeranalytics.android.api.CurrencyConverterApi
@ -56,11 +54,6 @@ class BankrollEditDataFragment : EditableDataFragment(), StaticRowRepresentableD
} ?: false } ?: false
} }
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
super.onCreateOptionsMenu(menu, inflater)
menu?.findItem(R.id.delete)?.isVisible = false
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)

@ -9,6 +9,7 @@ import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.github.mikephil.charting.data.LineDataSet import com.github.mikephil.charting.data.LineDataSet
import io.realm.Realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.RealmResults import io.realm.RealmResults
import kotlinx.android.synthetic.main.fragment_bankroll.* import kotlinx.android.synthetic.main.fragment_bankroll.*
@ -34,7 +35,6 @@ import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
@ -43,7 +43,7 @@ import timber.log.Timber
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
class BankrollFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate {
companion object { companion object {
@ -153,6 +153,9 @@ class BankrollFragment : RealmFragment(), StaticRowRepresentableDataSource, RowR
val bankrolls = LiveData.BANKROLL.items(getRealm()) as RealmResults<Bankroll> val bankrolls = LiveData.BANKROLL.items(getRealm()) as RealmResults<Bankroll>
bankrolls.forEach { bankrolls.forEach {
Timber.d("Bankroll: ${it.name} => isValidForDelete: ${it.isValidForDelete(Realm.getDefaultInstance())}")
val bankrollReportSetup = BankrollReportSetup(it) val bankrollReportSetup = BankrollReportSetup(it)
val bankrollReport = BankrollCalculator.computeReport(getRealm(), bankrollReportSetup) val bankrollReport = BankrollCalculator.computeReport(getRealm(), bankrollReportSetup)
val computedStat = ComputedStat(Stat.NET_RESULT, bankrollReport.total) val computedStat = ComputedStat(Stat.NET_RESULT, bankrollReport.total)
@ -217,8 +220,10 @@ class BankrollFragment : RealmFragment(), StaticRowRepresentableDataSource, RowR
if (mRecentlyDeletedItem is Bankroll) { if (mRecentlyDeletedItem is Bankroll) {
val deletableItem = (mRecentlyDeletedItem as Deletable)
// Check if the object is valid for the deletion // Check if the object is valid for the deletion
if ((mRecentlyDeletedItem as Deletable).isValidForDelete(this.getRealm())) { if (deletableItem.isValidForDelete(this.getRealm())) {
deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem)
getRealm().executeTransaction { getRealm().executeTransaction {
mRecentlyDeletedItem.deleteFromRealm() mRecentlyDeletedItem.deleteFromRealm()
@ -231,8 +236,10 @@ class BankrollFragment : RealmFragment(), StaticRowRepresentableDataSource, RowR
} else { } else {
bankrollAdapter.notifyItemChanged(position) bankrollAdapter.notifyItemChanged(position)
val status = deletableItem.getDeleteStatus(this.getRealm())
val errorMessage = deletableItem.getFailedDeleteMessage(status)
val builder = AlertDialog.Builder(requireContext()) val builder = AlertDialog.Builder(requireContext())
.setMessage((mRecentlyDeletedItem as Deletable).getFailedDeleteMessage()) .setMessage(errorMessage)
.setNegativeButton(R.string.ok, null) .setNegativeButton(R.string.ok, null)
builder.show() builder.show()
} }

@ -192,7 +192,8 @@ open class EditableDataFragment : RealmFragment(), RowRepresentableDelegate {
activity?.setResult(RESULT_OK, intent) activity?.setResult(RESULT_OK, intent)
activity?.finish() activity?.finish()
} else { } else {
val message = deletable.getFailedDeleteMessage() val status = deletable.getDeleteStatus(realm)
val message = deletable.getFailedDeleteMessage(status)
val builder = AlertDialog.Builder(requireContext()) val builder = AlertDialog.Builder(requireContext())
.setMessage(message) .setMessage(message)
.setNegativeButton(R.string.ok, null) .setNegativeButton(R.string.ok, null)

Loading…
Cancel
Save