From 5661ef2742333e6561d784436d5ba78b7834b2fb Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Wed, 3 Apr 2019 11:36:09 +0200 Subject: [PATCH 1/3] improve consistency for manageable interface, add missing loc --- .../android/model/interfaces/Manageable.kt | 11 ++++++----- .../pokeranalytics/android/model/realm/Bankroll.kt | 2 +- .../net/pokeranalytics/android/model/realm/Game.kt | 5 ----- .../pokeranalytics/android/model/realm/Location.kt | 6 +----- .../pokeranalytics/android/model/realm/Session.kt | 12 ++---------- .../android/model/realm/TournamentFeature.kt | 9 +++------ .../android/model/realm/TournamentName.kt | 9 +++------ app/src/main/res/values/strings.xml | 4 ++++ 8 files changed, 20 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt index 8531efc4..f2dbe4f9 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt @@ -4,6 +4,7 @@ import io.realm.RealmModel import io.realm.RealmObject import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.ModelException +import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.ui.view.RowRepresentable enum class ManageableStatus { @@ -32,12 +33,12 @@ interface NameManageable: Manageable { } override fun getFailedSaveMessage(status: ManageableStatus): Int { - return when (status) { - ManageableStatus.ALREADY_EXISTS -> R.string.duplicate_bankroll_name_error - ManageableStatus.DATA_INVALID -> R.string.empty_name_for_br_error - else -> throw ModelException("object should be savable") - } + throw ModelException("${this::class.java} getFailedSaveMessage for $status not handled") } + + override fun getFailedDeleteMessage(): Int { + return R.string.relationship_error + } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index 72534702..081e5d78 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -96,7 +96,7 @@ open class Bankroll() : RealmObject(), NameManageable, StaticRowRepresentableDat } override fun getFailedDeleteMessage(): Int { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + return R.string.bankroll_relationship_error } override fun getFailedSaveMessage(status: ManageableStatus): Int { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index fc9fe15d..021ae841 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -89,9 +89,4 @@ open class Game : RealmObject(), NameManageable, StaticRowRepresentableDataSourc override fun isValidForDelete(): Boolean { return this.realm.where().equalTo("game.id", id).findAll().isEmpty() } - - - override fun getFailedDeleteMessage(): Int { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index 1fd25d5e..b118d044 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -21,7 +21,7 @@ open class Location : RealmObject(), NameManageable, RowRepresentable { override var name: String = "" // The readable address of the location - private var address: String = "" + private var address: String? = null // the longitude of the location var longitude: Double? = null @@ -58,8 +58,4 @@ open class Location : RealmObject(), NameManageable, RowRepresentable { override fun isValidForDelete(): Boolean { return this.realm.where().equalTo("location.id", id).findAll().isEmpty() } - - override fun getFailedDeleteMessage(): Int { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index af2f2ebc..03a296ab 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -40,7 +40,7 @@ import java.util.* import java.util.Currency import kotlin.collections.ArrayList -open class Session : RealmObject(), Identifiable, Manageable, StaticRowRepresentableDataSource, RowRepresentable, Timed, +open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed, TimeFilterable { enum class Type { @@ -377,15 +377,7 @@ open class Session : RealmObject(), Identifiable, Manageable, StaticRowRepresent } override fun getFailedSaveMessage(status: ManageableStatus): Int { - return 0 // @todo - } - - override fun isValidForDelete(): Boolean { - return true - } - - override fun getFailedDeleteMessage(): Int { - return 0 // @todo + return R.string.no_br_popup_message } // States diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index e4419570..d0232692 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -3,6 +3,7 @@ package net.pokeranalytics.android.model.realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey import io.realm.kotlin.where +import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.CountableUsage import net.pokeranalytics.android.model.interfaces.ManageableStatus import net.pokeranalytics.android.model.interfaces.NameManageable @@ -63,16 +64,12 @@ open class TournamentFeature : RealmObject(), NameManageable, StaticRowRepresent } override fun getFailedSaveMessage(status: ManageableStatus): Int { - //TODO if (status == ManageableStatus.DATA_INVALID) R.string.tournament_feature_empty_field_error - //TODO else if (status == ManageableStatus.ALREADY_EXISTS) R.string.duplicate_tournament_feature_error + if (status == ManageableStatus.DATA_INVALID) R.string.tournament_feature_empty_field_error + else if (status == ManageableStatus.ALREADY_EXISTS) R.string.duplicate_tournament_feature_error return super.getFailedSaveMessage(status) } override fun isValidForDelete(): Boolean { return this.realm.where().equalTo("tournamentFeatures.id", id).findAll().isEmpty() } - - override fun getFailedDeleteMessage(): Int { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt index 4d0781f7..f5cc84a6 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt @@ -3,6 +3,7 @@ package net.pokeranalytics.android.model.realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey import io.realm.kotlin.where +import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.ManageableStatus import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -57,16 +58,12 @@ open class TournamentName : RealmObject(), NameManageable, StaticRowRepresentabl } override fun getFailedSaveMessage(status: ManageableStatus): Int { - //TODO if (status == ManageableStatus.DATA_INVALID) R.string.tournament_name_empty_field_error - //TODO else if (status == ManageableStatus.ALREADY_EXISTS) R.string.duplicate_tournament_name_error + if (status == ManageableStatus.DATA_INVALID) R.string.tournament_name_empty_field_error + else if (status == ManageableStatus.ALREADY_EXISTS) R.string.duplicate_tournament_name_error return super.getFailedSaveMessage(status) } override fun isValidForDelete(): Boolean { return this.realm.where().equalTo("tournamentName.id", id).findAll().isEmpty() } - - override fun getFailedDeleteMessage(): Int { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0b873457..5fac897f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,6 +10,10 @@ Tournament Name Tournament Feature Pending + You need to give a name to this tournament feature + A tournament feature with the same name already exists. + A tournament name can not be empty. + This name already exists. From a86a3691f8404bb6b0ba405dfb47c881ca0779af Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Wed, 3 Apr 2019 13:22:33 +0200 Subject: [PATCH 2/3] add isValidForDelete management / fix issues with isValidForSave --- .../unitTests/DeleteInstrumentedUnitTest.kt | 50 +++++++++++++++++++ .../pokeranalytics/android/model/LiveData.kt | 8 +-- .../android/model/interfaces/Manageable.kt | 30 +++++------ .../android/model/realm/Bankroll.kt | 17 ++++--- .../android/model/realm/Game.kt | 29 +++++------ .../android/model/realm/Location.kt | 17 ++++--- .../android/model/realm/Session.kt | 4 +- .../android/model/realm/TournamentFeature.kt | 17 ++++--- .../android/model/realm/TournamentName.kt | 17 ++++--- .../android/model/realm/Transaction.kt | 9 ++-- .../android/model/realm/TransactionType.kt | 3 +- .../android/ui/fragment/DataListFragment.kt | 8 ++- .../ui/fragment/EditableDataFragment.kt | 28 +++++++---- .../android/ui/fragment/HistoryFragment.kt | 3 +- .../android/ui/fragment/SessionFragment.kt | 14 +++++- 15 files changed, 168 insertions(+), 86 deletions(-) create mode 100644 app/src/androidTest/java/net/pokeranalytics/android/unitTests/DeleteInstrumentedUnitTest.kt diff --git a/app/src/androidTest/java/net/pokeranalytics/android/unitTests/DeleteInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/DeleteInstrumentedUnitTest.kt new file mode 100644 index 00000000..cc304e89 --- /dev/null +++ b/app/src/androidTest/java/net/pokeranalytics/android/unitTests/DeleteInstrumentedUnitTest.kt @@ -0,0 +1,50 @@ +package net.pokeranalytics.android.unitTests + +import net.pokeranalytics.android.components.RealmInstrumentedUnitTest +import net.pokeranalytics.android.model.realm.Bankroll +import net.pokeranalytics.android.model.realm.Currency +import org.junit.Assert +import org.junit.Test + +class DeleteInstrumentedUnitTest : RealmInstrumentedUnitTest() { + + @Test + fun testDeleteValidation() { + + val realm = this.mockRealm + realm.beginTransaction() + + val s1 = newSessionInstance(realm) + val s2 = newSessionInstance(realm) + + val br1 = realm.createObject(Bankroll::class.java, "1") + val br2 = realm.createObject(Bankroll::class.java, "2") + + val c1 = realm.createObject(Currency::class.java, "1") + val c2 = realm.createObject(Currency::class.java, "2") + c1.rate = 0.1 + c2.rate = 2.0 + br1.currency = c1 + br2.currency = c2 + + s1.bankroll = br1 + s2.bankroll = br2 + + s1.result?.netResult = 100.0 + s2.result?.netResult = 200.0 + + realm.commitTransaction() + + var isValidForDelete = br1.isValidForDelete(realm) + Assert.assertEquals(false, isValidForDelete) + + realm.where(Bankroll::class.java).equalTo("id", "1").findFirst()?.let { + isValidForDelete = it.isValidForDelete(realm) + Assert.assertEquals(false, isValidForDelete) + + isValidForDelete = realm.copyFromRealm(it).isValidForDelete(realm) + Assert.assertEquals(false, isValidForDelete) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt index b271423e..b59df116 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -8,7 +8,7 @@ import io.realm.Sort import io.realm.kotlin.where import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.CountableUsage -import net.pokeranalytics.android.model.interfaces.Manageable +import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.ui.view.Localizable @@ -104,9 +104,9 @@ enum class LiveData : Localizable { } } - fun deleteData(realm: Realm, data: Manageable) { - realm.where(this.relatedEntity).equalTo("id", data.id).findAll().deleteAllFromRealm() - } + fun deleteData(realm: Realm, data: Deletable) { + realm.where(this.relatedEntity).equalTo("id", data.id).findAll().deleteAllFromRealm() + } fun updateOrCreate(realm: Realm, primaryKey: String?): RealmObject { val proxyItem: RealmObject? = this.getData(realm, primaryKey) diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt index f2dbe4f9..01fc7256 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt @@ -1,13 +1,12 @@ package net.pokeranalytics.android.model.interfaces +import io.realm.Realm import io.realm.RealmModel -import io.realm.RealmObject import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.ModelException -import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.ui.view.RowRepresentable -enum class ManageableStatus { +enum class SaveValidityStatus { VALID, ALREADY_EXISTS, DATA_INVALID; @@ -25,14 +24,11 @@ interface NameManageable: Manageable { return this.name.isNotEmpty() } - override fun alreadyExists(): Boolean { - if (this is RealmObject && this.realm != null) { - return (this as RealmObject).realm.where(this::class.java).equalTo("name", this.name).findAll().isNotEmpty() - } - return false + override fun alreadyExists(realm: Realm): Boolean { + return realm.where(this::class.java).equalTo("name", this.name).findAll().isNotEmpty() } - override fun getFailedSaveMessage(status: ManageableStatus): Int { + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { throw ModelException("${this::class.java} getFailedSaveMessage for $status not handled") } @@ -70,28 +66,28 @@ interface Editable : Identifiable { interface Savable : Identifiable { fun isValidForSave(): Boolean - fun alreadyExists(): Boolean + fun alreadyExists(realm: Realm): Boolean /** * A method to define if an object is safe for saving in database */ - fun saveStatus(): ManageableStatus { + fun getSaveValidityStatus(realm: Realm): SaveValidityStatus { if (!isValidForSave()) { - return ManageableStatus.DATA_INVALID + return SaveValidityStatus.DATA_INVALID } - if (alreadyExists()) { - return ManageableStatus.ALREADY_EXISTS + if (alreadyExists(realm)) { + return SaveValidityStatus.ALREADY_EXISTS } - return ManageableStatus.VALID + return SaveValidityStatus.VALID } /** * A method to get the reason why the object can't be saved */ - fun getFailedSaveMessage(status:ManageableStatus): Int + fun getFailedSaveMessage(status:SaveValidityStatus): Int } @@ -103,7 +99,7 @@ interface Deletable : Identifiable { /** * A method to define if an object is safe for deletion in database */ - fun isValidForDelete(): Boolean + fun isValidForDelete(realm: Realm): Boolean /** * A method to get the reason why the object can't be deleted diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index 081e5d78..b5ce8238 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -1,11 +1,12 @@ package net.pokeranalytics.android.model.realm +import io.realm.Realm import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.interfaces.ManageableStatus +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable @@ -91,17 +92,19 @@ open class Bankroll() : RealmObject(), NameManageable, StaticRowRepresentableDat } } - override fun isValidForDelete(): Boolean { - return this.realm.where().equalTo("bankroll.id", id).findAll().isEmpty() + override fun isValidForDelete(realm: Realm): Boolean { + return realm.where().equalTo("bankroll.id", id).findAll().isEmpty() } override fun getFailedDeleteMessage(): Int { return R.string.bankroll_relationship_error } - override fun getFailedSaveMessage(status: ManageableStatus): Int { - if (status == ManageableStatus.DATA_INVALID) R.string.empty_name_for_br_error - else if (status == ManageableStatus.ALREADY_EXISTS) R.string.duplicate_bankroll_name_error - return super.getFailedSaveMessage(status) + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { + return when (status) { + SaveValidityStatus.DATA_INVALID -> R.string.empty_name_for_br_error + SaveValidityStatus.ALREADY_EXISTS -> R.string.duplicate_bankroll_name_error + else -> super.getFailedSaveMessage(status) + } } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index 021ae841..b767184e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -1,11 +1,12 @@ package net.pokeranalytics.android.model.realm +import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.CountableUsage -import net.pokeranalytics.android.model.interfaces.ManageableStatus +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable @@ -74,19 +75,19 @@ open class Game : RealmObject(), NameManageable, StaticRowRepresentableDataSourc return name.isNotEmpty() && !shortName.isNullOrEmpty() } - override fun getFailedSaveMessage(status: ManageableStatus): Int { - if (status == ManageableStatus.DATA_INVALID) { - return if (name.isEmpty()) { - R.string.variant_empty_name_error - } else { - R.string.variant_empty_shortname_error - } - } - else if (status == ManageableStatus.ALREADY_EXISTS) return R.string.duplicate_variant_error - return super.getFailedSaveMessage(status) - } + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { + return when (status) { + SaveValidityStatus.DATA_INVALID -> if (name.isEmpty()) { + R.string.variant_empty_name_error + } else { + R.string.variant_empty_shortname_error + } + SaveValidityStatus.ALREADY_EXISTS -> R.string.duplicate_variant_error + else -> super.getFailedSaveMessage(status) + } + } - override fun isValidForDelete(): Boolean { - return this.realm.where().equalTo("game.id", id).findAll().isEmpty() + override fun isValidForDelete(realm: Realm): Boolean { + return realm.where().equalTo("game.id", id).findAll().isEmpty() } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index b118d044..acbf0c63 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -1,11 +1,12 @@ package net.pokeranalytics.android.model.realm import com.google.android.libraries.places.api.model.Place +import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.interfaces.ManageableStatus +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow @@ -49,13 +50,15 @@ open class Location : RealmObject(), NameManageable, RowRepresentable { this.longitude = place.latLng?.longitude } - override fun getFailedSaveMessage(status: ManageableStatus): Int { - if (status == ManageableStatus.DATA_INVALID) R.string.location_empty_field_error - else if (status == ManageableStatus.ALREADY_EXISTS) R.string.duplicate_location_error - return super.getFailedSaveMessage(status) + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { + return when (status) { + SaveValidityStatus.DATA_INVALID -> R.string.location_empty_field_error + SaveValidityStatus.ALREADY_EXISTS -> R.string.duplicate_location_error + else -> super.getFailedSaveMessage(status) + } } - override fun isValidForDelete(): Boolean { - return this.realm.where().equalTo("location.id", id).findAll().isEmpty() + override fun isValidForDelete(realm: Realm): Boolean { + return realm.where().equalTo("location.id", id).findAll().isEmpty() } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 03a296ab..e2e8487c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -372,11 +372,11 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return this.bankroll != null } - override fun alreadyExists(): Boolean { + override fun alreadyExists(realm: Realm): Boolean { return false } - override fun getFailedSaveMessage(status: ManageableStatus): Int { + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { return R.string.no_br_popup_message } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index d0232692..9ad58aad 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -1,11 +1,12 @@ package net.pokeranalytics.android.model.realm +import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.CountableUsage -import net.pokeranalytics.android.model.interfaces.ManageableStatus +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable @@ -63,13 +64,15 @@ open class TournamentFeature : RealmObject(), NameManageable, StaticRowRepresent } } - override fun getFailedSaveMessage(status: ManageableStatus): Int { - if (status == ManageableStatus.DATA_INVALID) R.string.tournament_feature_empty_field_error - else if (status == ManageableStatus.ALREADY_EXISTS) R.string.duplicate_tournament_feature_error - return super.getFailedSaveMessage(status) + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { + return when (status) { + SaveValidityStatus.DATA_INVALID -> R.string.tournament_feature_empty_field_error + SaveValidityStatus.ALREADY_EXISTS -> R.string.duplicate_tournament_feature_error + else -> super.getFailedSaveMessage(status) + } } - override fun isValidForDelete(): Boolean { - return this.realm.where().equalTo("tournamentFeatures.id", id).findAll().isEmpty() + override fun isValidForDelete(realm: Realm): Boolean { + return realm.where().equalTo("tournamentFeatures.id", id).findAll().isEmpty() } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt index f5cc84a6..1e7f21b9 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt @@ -1,10 +1,11 @@ package net.pokeranalytics.android.model.realm +import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.interfaces.ManageableStatus +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable @@ -57,13 +58,15 @@ open class TournamentName : RealmObject(), NameManageable, StaticRowRepresentabl return row.editingDescriptors(mapOf("defaultValue" to this.name)) } - override fun getFailedSaveMessage(status: ManageableStatus): Int { - if (status == ManageableStatus.DATA_INVALID) R.string.tournament_name_empty_field_error - else if (status == ManageableStatus.ALREADY_EXISTS) R.string.duplicate_tournament_name_error - return super.getFailedSaveMessage(status) + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { + return when (status) { + SaveValidityStatus.DATA_INVALID -> R.string.tournament_name_empty_field_error + SaveValidityStatus.ALREADY_EXISTS -> R.string.duplicate_tournament_name_error + else -> super.getFailedSaveMessage(status) + } } - override fun isValidForDelete(): Boolean { - return this.realm.where().equalTo("tournamentName.id", id).findAll().isEmpty() + override fun isValidForDelete(realm: Realm): Boolean { + return realm.where().equalTo("tournamentName.id", id).findAll().isEmpty() } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt index fcf0b0f7..f53f8583 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt @@ -1,11 +1,12 @@ package net.pokeranalytics.android.model.realm +import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Manageable -import net.pokeranalytics.android.model.interfaces.ManageableStatus +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -63,11 +64,11 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo return bankroll != null && type != null && amount != 0.0 } - override fun alreadyExists(): Boolean { + override fun alreadyExists(realm: Realm): Boolean { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun getFailedSaveMessage(status: ManageableStatus): Int { + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { return if (bankroll == null) { R.string.no_br_popup_message } else if (type == null || amount == 0.0) { @@ -77,7 +78,7 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo } } - override fun isValidForDelete(): Boolean { + override fun isValidForDelete(realm: Realm): Boolean { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } 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 e1652108..eba342a5 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 @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import io.realm.Realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.NameManageable @@ -62,7 +63,7 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab } } - override fun isValidForDelete(): Boolean { + override fun isValidForDelete(realm: Realm): Boolean { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index 83bba8fc..93799320 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar @@ -101,7 +102,7 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc if (mRecentlyDeletedItem is RealmObject) { // Check if the object is valid for the deletion - if ((mRecentlyDeletedItem as Manageable).isValidForDelete()) { + if ((mRecentlyDeletedItem as Manageable).isValidForDelete(this.getRealm())) { deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) getRealm().executeTransaction { mRecentlyDeletedItem.deleteFromRealm() @@ -110,7 +111,10 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc showUndoSnackBar() } else { dataListAdapter.notifyItemChanged(position) - showAlertDialog(R.string.warning, (mRecentlyDeletedItem as Manageable).getFailedDeleteMessage()) + val builder = AlertDialog.Builder(requireContext()) + .setMessage((mRecentlyDeletedItem as Manageable).getFailedDeleteMessage()) + .setNegativeButton(R.string.ok, null) + builder.show() } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index c7dd2591..7c4afe21 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -12,10 +12,7 @@ import kotlinx.android.synthetic.main.fragment_editable_data.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.ConfigurationException import net.pokeranalytics.android.model.LiveData -import net.pokeranalytics.android.model.interfaces.Editable -import net.pokeranalytics.android.model.interfaces.Manageable -import net.pokeranalytics.android.model.interfaces.ManageableStatus -import net.pokeranalytics.android.model.interfaces.Savable +import net.pokeranalytics.android.model.interfaces.* import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -147,9 +144,9 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele val savable = this.item when (savable) { is Savable -> { - val status = savable.saveStatus() + val status = savable.getSaveValidityStatus(realm = this.getRealm()) when (status) { - ManageableStatus.VALID -> { + SaveValidityStatus.VALID -> { this.getRealm().executeTransaction { val managedItem = it.copyToRealmOrUpdate(this.item) if (managedItem is Savable) { @@ -190,11 +187,20 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele .setMessage(R.string.are_you_sure_you_want_to_do_that_) .setNegativeButton(R.string.no, null) .setPositiveButton(R.string.yes) { _, _ -> - //TODO: Maybe update this code, does the object need to be managed? - this.getRealm().executeTransaction { - this.liveDataType.deleteData(it, (this.item as Manageable)) - } - this.activity?.finish() + val deletable = this.item as Deletable + val realm = this.getRealm() + if (deletable.isValidForDelete(realm)) { + realm.executeTransaction { + this.liveDataType.deleteData(it, deletable) + } + this.activity?.finish() + } else { + val message = deletable.getFailedDeleteMessage() + val builder = AlertDialog.Builder(requireContext()) + .setMessage(message) + .setNegativeButton(R.string.ok, null) + builder.show() + } } builder.show() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index f135ad97..37f6323b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -9,6 +9,7 @@ import io.realm.Sort import io.realm.kotlin.where import kotlinx.android.synthetic.main.fragment_history.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.interfaces.Editable import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.activity.SessionActivity @@ -117,6 +118,6 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - SessionActivity.newInstance(requireContext(), sessionId = (row as Manageable).id) + SessionActivity.newInstance(requireContext(), sessionId = (row as Editable).id) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index fe2a7dc6..cb0c0ba3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -5,6 +5,7 @@ import android.os.Handler import android.view.* import android.view.animation.OvershootInterpolator import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.recyclerview.widget.DiffUtil @@ -13,6 +14,8 @@ import kotlinx.android.synthetic.main.fragment_session.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState +import net.pokeranalytics.android.model.interfaces.Manageable +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.realm.Location import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.utils.FavoriteSessionFinder @@ -133,8 +136,15 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate { } floatingActionButton.setOnClickListener { - sessionHasBeenCustomized = true - manageSessionState() + if (this.currentSession.isValidForSave()) { + sessionHasBeenCustomized = true + manageSessionState() + } else { + val builder = AlertDialog.Builder(requireContext()) + .setMessage(this.currentSession.getFailedSaveMessage(SaveValidityStatus.DATA_INVALID)) + .setNegativeButton(R.string.ok, null) + builder.show() + } } } From 7717c3ea10e4dc0648f5c4ea2fed6a6be353776b Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Wed, 3 Apr 2019 13:33:46 +0200 Subject: [PATCH 3/3] update interface casting to the relevant one --- .../android/model/interfaces/Manageable.kt | 2 +- .../android/ui/fragment/DataListFragment.kt | 10 +++++----- .../android/ui/fragment/HistoryFragment.kt | 1 - .../android/ui/fragment/SessionFragment.kt | 1 - 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt index 01fc7256..6ea3ecca 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt @@ -25,7 +25,7 @@ interface NameManageable: Manageable { } override fun alreadyExists(realm: Realm): Boolean { - return realm.where(this::class.java).equalTo("name", this.name).findAll().isNotEmpty() + return realm.where(this::class.java).equalTo("name", this.name).and().notEqualTo("id", this.id).findAll().isNotEmpty() } override fun getFailedSaveMessage(status: SaveValidityStatus): Int { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index 93799320..2127315e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -12,7 +12,8 @@ import io.realm.RealmObject import io.realm.RealmResults import kotlinx.android.synthetic.main.fragment_data_list.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.interfaces.Manageable +import net.pokeranalytics.android.model.interfaces.Deletable +import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource @@ -23,7 +24,6 @@ import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow -import net.pokeranalytics.android.util.extensions.showAlertDialog class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { @@ -71,7 +71,7 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc EditableDataActivity.newInstance( requireContext(), it.ordinal, - (row as Manageable).id + (row as Identifiable).id ) } } @@ -102,7 +102,7 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc if (mRecentlyDeletedItem is RealmObject) { // Check if the object is valid for the deletion - if ((mRecentlyDeletedItem as Manageable).isValidForDelete(this.getRealm())) { + if ((mRecentlyDeletedItem as Deletable).isValidForDelete(this.getRealm())) { deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) getRealm().executeTransaction { mRecentlyDeletedItem.deleteFromRealm() @@ -112,7 +112,7 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc } else { dataListAdapter.notifyItemChanged(position) val builder = AlertDialog.Builder(requireContext()) - .setMessage((mRecentlyDeletedItem as Manageable).getFailedDeleteMessage()) + .setMessage((mRecentlyDeletedItem as Deletable).getFailedDeleteMessage()) .setNegativeButton(R.string.ok, null) builder.show() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index 37f6323b..67d8d915 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -10,7 +10,6 @@ import io.realm.kotlin.where import kotlinx.android.synthetic.main.fragment_history.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Editable -import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.activity.SessionActivity import net.pokeranalytics.android.ui.adapter.HistorySessionRowRepresentableAdapter diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index cb0c0ba3..ddf62652 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -14,7 +14,6 @@ import kotlinx.android.synthetic.main.fragment_session.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState -import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.realm.Location import net.pokeranalytics.android.model.realm.Session