Add Manageable and Deletable interfaces to manage clean deletion

feature/top10
Aurelien Hubert 7 years ago
parent 9a26ba2b3f
commit 1ea7391ccb
  1. 6
      app/src/main/java/net/pokeranalytics/android/model/LiveData.kt
  2. 31
      app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt
  3. 13
      app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
  4. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt
  6. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  7. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
  8. 3
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt
  9. 3
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  10. 15
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt
  11. 3
      app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt
  12. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt

@ -5,7 +5,7 @@ import io.realm.RealmObject
import io.realm.RealmResults import io.realm.RealmResults
import io.realm.Sort import io.realm.Sort
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.view.Localizable import net.pokeranalytics.android.ui.view.Localizable
@ -57,11 +57,11 @@ enum class LiveData : Localizable {
} }
} }
fun deleteData(realm:Realm, data:Savable) { fun deleteData(realm: Realm, data: Manageable) {
realm.where(this.relatedEntity).equalTo("id", data.uniqueIdentifier()).findAll().deleteAllFromRealm() realm.where(this.relatedEntity).equalTo("id", data.uniqueIdentifier()).findAll().deleteAllFromRealm()
} }
fun updateOrCreate(realm:Realm, primaryKey:String?): RealmObject { fun updateOrCreate(realm: Realm, primaryKey: String?): RealmObject {
val proxyItem: RealmObject? = this.getData(realm, primaryKey) val proxyItem: RealmObject? = this.getData(realm, primaryKey)
proxyItem?.let { proxyItem?.let {
return realm.copyFromRealm(it) return realm.copyFromRealm(it)

@ -3,6 +3,14 @@ package net.pokeranalytics.android.model.interfaces
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
/**
* An interface to grouped object which are managed by the database
*/
interface Manageable : Savable, Deletable, Identifiable
/**
* An interface associate a unique identifier to an object
*/
interface Identifiable { interface Identifiable {
/** /**
@ -15,7 +23,7 @@ interface Identifiable {
/** /**
* An interface to easily handle the validity of any object we want to save * An interface to easily handle the validity of any object we want to save
*/ */
interface Savable : Identifiable { interface Savable {
/** /**
* A method to define if an object is safe for saving in database * A method to define if an object is safe for saving in database
*/ */
@ -37,3 +45,24 @@ interface Savable : Identifiable {
*/ */
fun updateValue(value: Any?, row: RowRepresentable) fun updateValue(value: Any?, row: RowRepresentable)
} }
/**
* An interface to easily handle the validity of any object we want to delete
*/
interface Deletable {
/**
* A method to define if an object is safe for deletion in database
*/
fun isValidForDelete(): Boolean {
return true
}
/**
* A method to get the reason why the object can't be deleted
*/
fun getFailedDeleteMessage(): Int {
return R.string.none
}
}

@ -3,8 +3,9 @@ package net.pokeranalytics.android.model.realm
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Manageable
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
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
@ -13,7 +14,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Bankroll(name: String = "") : RealmObject(), Savable, open class Bankroll(name: String = "") : RealmObject(), Manageable,
StaticRowRepresentableDataSource, RowRepresentable { StaticRowRepresentableDataSource, RowRepresentable {
companion object { companion object {
@ -99,4 +100,12 @@ open class Bankroll(name: String = "") : RealmObject(), Savable,
return R.string.empty_name_for_br_error return R.string.empty_name_for_br_error
} }
override fun isValidForDelete(): Boolean {
return this.realm.where<Session>().equalTo("bankroll.id", id).findAll().isEmpty()
}
override fun getFailedDeleteMessage(): Int {
return R.string.bankroll_relationship_error
}
} }

@ -3,7 +3,7 @@ package net.pokeranalytics.android.model.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.R
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Manageable
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
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
@ -12,7 +12,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable { open class Game : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()

@ -5,7 +5,7 @@ import io.realm.RealmObject
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Manageable
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
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
@ -15,7 +15,7 @@ import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable { open class Location : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()

@ -18,7 +18,7 @@ import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TableSize
import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.SessionState
import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.interfaces.Timed import net.pokeranalytics.android.model.interfaces.Timed
import net.pokeranalytics.android.model.utils.SessionSetManager import net.pokeranalytics.android.model.utils.SessionSetManager
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
@ -34,7 +34,7 @@ import java.util.*
import java.util.Currency import java.util.Currency
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Session : RealmObject(), SessionInterface, Savable, StaticRowRepresentableDataSource, RowRepresentable, open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepresentableDataSource, RowRepresentable,
Timed { Timed {
enum class Type { enum class Type {

@ -3,7 +3,7 @@ package net.pokeranalytics.android.model.realm
import android.text.InputType import android.text.InputType
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Manageable
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
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
@ -12,7 +12,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.TournamentFeatureRow
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class TournamentFeature : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable { open class TournamentFeature : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()

@ -3,6 +3,7 @@ package net.pokeranalytics.android.model.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.R
import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
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
@ -12,7 +13,7 @@ import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class TournamentType : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable { open class TournamentType : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()

@ -3,6 +3,7 @@ package net.pokeranalytics.android.model.realm
import android.text.InputType import android.text.InputType
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
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
@ -13,7 +14,7 @@ import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class TransactionType : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable { open class TransactionType : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable {
@PrimaryKey @PrimaryKey
var id = UUID.randomUUID().toString() var id = UUID.randomUUID().toString()

@ -12,7 +12,7 @@ import io.realm.RealmObject
import io.realm.RealmResults import io.realm.RealmResults
import kotlinx.android.synthetic.main.fragment_data_list.* import kotlinx.android.synthetic.main.fragment_data_list.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource
@ -23,6 +23,7 @@ import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback
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.SettingRow import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow
import net.pokeranalytics.android.util.showAlertDialog
class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate {
@ -69,7 +70,7 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc
EditableDataActivity.newInstance( EditableDataActivity.newInstance(
requireContext(), requireContext(),
it.ordinal, it.ordinal,
(row as Savable).uniqueIdentifier() (row as Manageable).uniqueIdentifier()
) )
} }
} }
@ -98,12 +99,18 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc
lastDeletedItemPosition = position lastDeletedItemPosition = position
if (mRecentlyDeletedItem is RealmObject) { if (mRecentlyDeletedItem is RealmObject) {
if ((mRecentlyDeletedItem as Manageable).isValidForDelete()) {
deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem)
getRealm().executeTransaction { getRealm().executeTransaction {
mRecentlyDeletedItem.deleteFromRealm() mRecentlyDeletedItem.deleteFromRealm()
} }
dataListAdapter.notifyItemRemoved(position) dataListAdapter.notifyItemRemoved(position)
showUndoSnackBar() showUndoSnackBar()
} else {
dataListAdapter.notifyItemChanged(position)
showAlertDialog(R.string.warning, (mRecentlyDeletedItem as Manageable).getFailedDeleteMessage())
}
} }
} }
@ -134,9 +141,9 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc
val message = String.format(getString(R.string.data_deleted), this.dataType.localizedTitle(requireContext())) val message = String.format(getString(R.string.data_deleted), this.dataType.localizedTitle(requireContext()))
val snackBar = Snackbar.make(constraintLayout, message, Snackbar.LENGTH_LONG) val snackBar = Snackbar.make(constraintLayout, message, Snackbar.LENGTH_LONG)
snackBar.setAction(R.string.cancel) { snackBar.setAction(R.string.cancel) {
getRealm().executeTransaction {realm -> getRealm().executeTransaction { realm ->
deletedItem?.let { deletedItem?.let {
realm.copyToRealm(it) realm.copyToRealmOrUpdate(it)
dataListAdapter.notifyItemInserted(lastDeletedItemPosition) dataListAdapter.notifyItemInserted(lastDeletedItemPosition)
} }
} }

@ -13,6 +13,7 @@ import kotlinx.android.synthetic.main.fragment_editable_data.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
@ -167,7 +168,7 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele
.setPositiveButton(R.string.yes) { _, _ -> .setPositiveButton(R.string.yes) { _, _ ->
//TODO: Maybe update this code, does the object need to be managed? //TODO: Maybe update this code, does the object need to be managed?
this.getRealm().executeTransaction { this.getRealm().executeTransaction {
this.liveDataType.deleteData(it, (this.item as Savable)) this.liveDataType.deleteData(it, (this.item as Manageable))
} }
this.activity?.finish() this.activity?.finish()
} }

@ -13,7 +13,7 @@ import kotlinx.android.synthetic.main.fragment_history.*
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.activity.SessionActivity import net.pokeranalytics.android.ui.activity.SessionActivity
import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource
@ -175,6 +175,6 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource
} }
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
SessionActivity.newInstance(requireContext(), sessionId = (row as Savable).uniqueIdentifier()) SessionActivity.newInstance(requireContext(), sessionId = (row as Manageable).uniqueIdentifier())
} }
} }
Loading…
Cancel
Save