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 8531efc4..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 @@ -1,12 +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.ui.view.RowRepresentable -enum class ManageableStatus { +enum class SaveValidityStatus { VALID, ALREADY_EXISTS, DATA_INVALID; @@ -24,20 +24,17 @@ 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).and().notEqualTo("id", this.id).findAll().isNotEmpty() } - 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") - } + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { + throw ModelException("${this::class.java} getFailedSaveMessage for $status not handled") } + + override fun getFailedDeleteMessage(): Int { + return R.string.relationship_error + } } @@ -69,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 } @@ -102,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 72534702..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 { - 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 { - 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 fc9fe15d..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,24 +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 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. + 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(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 1fd25d5e..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 @@ -21,7 +22,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 @@ -49,17 +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 getFailedDeleteMessage(): Int { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + 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 af2f2ebc..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 @@ -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 { @@ -372,20 +372,12 @@ open class Session : RealmObject(), Identifiable, Manageable, StaticRowRepresent return this.bankroll != null } - override fun alreadyExists(): Boolean { + override fun alreadyExists(realm: Realm): Boolean { return false } - override fun getFailedSaveMessage(status: ManageableStatus): Int { - return 0 // @todo - } - - override fun isValidForDelete(): Boolean { - return true - } - - override fun getFailedDeleteMessage(): Int { - return 0 // @todo + override fun getFailedSaveMessage(status: SaveValidityStatus): Int { + 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..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,10 +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 @@ -62,17 +64,15 @@ 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 - return super.getFailedSaveMessage(status) - } - - override fun isValidForDelete(): Boolean { - return this.realm.where().equalTo("tournamentFeatures.id", id).findAll().isEmpty() + 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 getFailedDeleteMessage(): Int { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + 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 4d0781f7..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,9 +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.model.interfaces.ManageableStatus +import net.pokeranalytics.android.R +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 @@ -56,17 +58,15 @@ open class TournamentName : RealmObject(), NameManageable, StaticRowRepresentabl return row.editingDescriptors(mapOf("defaultValue" to this.name)) } - 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 - 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 getFailedDeleteMessage(): Int { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + 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..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 @@ -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 @@ -11,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 @@ -22,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 { @@ -70,7 +71,7 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc EditableDataActivity.newInstance( requireContext(), it.ordinal, - (row as Manageable).id + (row as Identifiable).id ) } } @@ -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 Deletable).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 Deletable).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 806660a7..83ba73b6 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,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.Manageable +import net.pokeranalytics.android.model.interfaces.Editable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.activity.SessionActivity import net.pokeranalytics.android.ui.adapter.HistorySessionRowRepresentableAdapter @@ -126,6 +126,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..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 @@ -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,7 @@ 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.SaveValidityStatus import net.pokeranalytics.android.model.realm.Location import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.utils.FavoriteSessionFinder @@ -133,8 +135,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() + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eea01e60..4c30ab41 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,7 +12,10 @@ Pending Poker Analytics is a poker tracking app. We’re currently on our way to reproduce the iOS app and you’re currently using a lighter version. The app will work with a US$29.99 yearly subscription for an unlimited usage, but will be free until reaching the appropriate feature coverage. I understand - + 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.