diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Player.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Player.kt index ce3f537f..b4176788 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Player.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Player.kt @@ -6,25 +6,16 @@ import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey -import io.realm.kotlin.where import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.* -import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowUpdatable import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.ui.view.rows.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rows.PlayerPropertiesRow -import net.pokeranalytics.android.ui.view.rows.SeparatorRow -import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.RANDOM_PLAYER -import net.pokeranalytics.android.util.extensions.isSameDay -import net.pokeranalytics.android.util.extensions.mediumDate import java.util.* -import kotlin.collections.ArrayList -open class Player : RealmObject(), NameManageable, Savable, Deletable, StaticRowRepresentableDataSource, RowRepresentable, RowUpdatable { +open class Player : RealmObject(), NameManageable, Savable, Deletable, RowRepresentable, RowUpdatable { @PrimaryKey override var id = UUID.randomUUID().toString() @@ -44,13 +35,6 @@ open class Player : RealmObject(), NameManageable, Savable, Deletable, StaticRow @Ignore override val viewType: Int = RowViewType.ROW_PLAYER.ordinal - @Ignore - private var rowRepresentation: List = mutableListOf() - - @Ignore - private var commentsToDelete: ArrayList = ArrayList() - - override fun isValidForDelete(realm: Realm): Boolean { //TODO return true @@ -69,25 +53,10 @@ open class Player : RealmObject(), NameManageable, Savable, Deletable, StaticRow return R.string.relationship_error } - override fun adapterRows(): List? { - return rowRepresentation - } - override fun getDisplayName(context: Context): String { return this.name } - override fun charSequenceForRow( - row: RowRepresentable, - context: Context, - tag: Int - ): CharSequence { - return when (row) { - PlayerPropertiesRow.NAME -> if (this.name.isNotEmpty()) this.name else NULL_TEXT - else -> return super.charSequenceForRow(row, context, 0) - } - } - override fun updateValue(value: Any?, row: RowRepresentable) { when (row) { PlayerPropertiesRow.NAME -> this.name = value as String? ?: "" @@ -96,45 +65,6 @@ open class Player : RealmObject(), NameManageable, Savable, Deletable, StaticRow } } - /** - * Update the row representation - */ - private fun updatedRowRepresentationForCurrentState(): List { - val rows = ArrayList() - rows.add(PlayerPropertiesRow.IMAGE) - rows.add(PlayerPropertiesRow.NAME) - rows.add(PlayerPropertiesRow.SUMMARY) - - if (comments.size > 0) { - // Adds Comments section - rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, R.string.comments)) - - val currentCommentCalendar = Calendar.getInstance() - val currentDateCalendar = Calendar.getInstance() - - val commentsToDisplay = ArrayList() - commentsToDisplay.addAll(comments) - commentsToDisplay.sortByDescending { it.date } - - commentsToDisplay.forEachIndexed { index, comment -> - currentCommentCalendar.time = comment.date - - if (!currentCommentCalendar.isSameDay(currentDateCalendar) || index == 0) { - currentDateCalendar.time = currentCommentCalendar.time - // Adds day sub section - rows.add(CustomizableRowRepresentable(RowViewType.HEADER_SUBTITLE, title = currentDateCalendar.time.mediumDate())) - } - - // Adds comment - rows.add(comment) - } - - rows.add(SeparatorRow()) - } - - return rows - } - /** * Return if the player has a picture */ @@ -142,57 +72,6 @@ open class Player : RealmObject(), NameManageable, Savable, Deletable, StaticRow return picture != null && picture?.isNotEmpty() == true } - /** - * Update row representation - */ - fun updateRowRepresentation() { - this.rowRepresentation = this.updatedRowRepresentationForCurrentState() - } - - - /** - * Add an entry - */ - fun addComment(): Comment { - val entry = Comment() - this.comments.add(entry) - updateRowRepresentation() - return entry - } - - /** - * Delete an entry - */ - fun deleteComment(comment: Comment) { - commentsToDelete.add(comment) - this.comments.remove(comment) - updateRowRepresentation() - } - - /** - * Clean up deleted entries - */ - fun cleanupComments() { // called when saving the custom field - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - this.commentsToDelete.forEach { // entries are out of realm - realm.where().equalTo("id", it.id).findFirst()?.deleteFromRealm() - } - } - realm.close() - this.commentsToDelete.clear() - } - - override fun editDescriptors(row: RowRepresentable): List? { - - when (row) { - PlayerPropertiesRow.NAME -> return row.editingDescriptors(mapOf("defaultValue" to this.name)) - PlayerPropertiesRow.SUMMARY -> return row.editingDescriptors(mapOf("defaultValue" to this.summary)) - } - - return null - } - val initials: String get() { return if (this.name.isNotEmpty()) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt index bd1c5fff..69c66230 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt @@ -27,6 +27,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rows.PlayerPropertiesRow +import net.pokeranalytics.android.ui.viewmodel.DataManagerViewModel import net.pokeranalytics.android.util.NULL_TEXT import java.io.File @@ -35,6 +36,11 @@ import java.io.File */ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSource { + private val playerModel: PlayerDataViewModel + get() { return this.model as PlayerDataViewModel } + + override val modelClass: Class = PlayerDataViewModel::class.java + companion object { const val REQUEST_CODE_PICK_COLOR = 1000 } @@ -82,14 +88,14 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou private fun initUI() { mediaActivity = parentActivity as MediaActivity? - player.updateRowRepresentation() + this.playerModel.updateRowRepresentation() if (!deleteButtonShouldAppear) { onRowSelected(0, PlayerPropertiesRow.NAME) } binding.addComment.setOnClickListener { - val comment = player.addComment() + val comment = this.playerModel.addComment() rowRepresentableAdapter.notifyDataSetChanged() onRowSelected(-1, comment) } @@ -107,8 +113,8 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou return this } - override fun adapterRows(): List? { - return player.adapterRows() + override fun adapterRows(): List { + return this.playerModel.adapterRows() } override fun viewTypeForPosition(position: Int): Int { @@ -152,7 +158,7 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou when (row) { is Comment -> { row.updateValue(value, row) - player.updateRowRepresentation() + this.playerModel.updateRowRepresentation() rowRepresentableAdapter.notifyDataSetChanged() } else -> { @@ -173,7 +179,7 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou GlobalScope.launch(Dispatchers.Main) { delay(300) showAlertDialog(requireContext(), messageResId = R.string.are_you_sure_you_want_to_delete, showCancelButton = true, positiveAction = { - player.deleteComment(row) + playerModel.deleteComment(row) rowRepresentableAdapter.notifyDataSetChanged() }) } @@ -218,7 +224,7 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou override fun onDataSaved() { super.onDataSaved() - player.cleanupComments() + this.playerModel.cleanupComments() } override fun editDescriptors(row: RowRepresentable): List? { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataViewModel.kt new file mode 100644 index 00000000..a151b100 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataViewModel.kt @@ -0,0 +1,134 @@ +package net.pokeranalytics.android.ui.modules.data + +import android.content.Context +import io.realm.Realm +import io.realm.kotlin.where +import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.realm.Comment +import net.pokeranalytics.android.model.realm.Player +import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor +import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.ui.view.rows.CustomizableRowRepresentable +import net.pokeranalytics.android.ui.view.rows.PlayerPropertiesRow +import net.pokeranalytics.android.ui.view.rows.SeparatorRow +import net.pokeranalytics.android.ui.viewmodel.DataManagerViewModel +import net.pokeranalytics.android.util.NULL_TEXT +import net.pokeranalytics.android.util.extensions.isSameDay +import net.pokeranalytics.android.util.extensions.mediumDate +import java.util.* + +class PlayerDataViewModel : DataManagerViewModel(), StaticRowRepresentableDataSource { + + private var rowRepresentation: List = mutableListOf() + + private var commentsToDelete: ArrayList = ArrayList() + + private val player: Player + get() { + return this.item as Player + } + + override fun adapterRows(): List { + return this.rowRepresentation + } + + override fun charSequenceForRow( + row: RowRepresentable, + context: Context, + tag: Int + ): CharSequence { + return when (row) { + PlayerPropertiesRow.NAME -> this.player.name.ifEmpty { NULL_TEXT } + else -> return super.charSequenceForRow(row, context, 0) + } + } + + fun updateRowRepresentation() { + this.rowRepresentation = this.updatedRowRepresentationForCurrentState() + } + + /** + * Update the row representation + */ + private fun updatedRowRepresentationForCurrentState(): List { + val rows = ArrayList() + rows.add(PlayerPropertiesRow.IMAGE) + rows.add(PlayerPropertiesRow.NAME) + rows.add(PlayerPropertiesRow.SUMMARY) + + if (this.player.comments.size > 0) { + // Adds Comments section + rows.add(CustomizableRowRepresentable(RowViewType.HEADER_TITLE, R.string.comments)) + + val currentCommentCalendar = Calendar.getInstance() + val currentDateCalendar = Calendar.getInstance() + + val commentsToDisplay = ArrayList() + commentsToDisplay.addAll(this.player.comments) + commentsToDisplay.sortByDescending { it.date } + + commentsToDisplay.forEachIndexed { index, comment -> + currentCommentCalendar.time = comment.date + + if (!currentCommentCalendar.isSameDay(currentDateCalendar) || index == 0) { + currentDateCalendar.time = currentCommentCalendar.time + // Adds day sub section + rows.add(CustomizableRowRepresentable(RowViewType.HEADER_SUBTITLE, title = currentDateCalendar.time.mediumDate())) + } + + // Adds comment + rows.add(comment) + } + + rows.add(SeparatorRow()) + } + + return rows + } + + /** + * Add an entry + */ + fun addComment(): Comment { + val entry = Comment() + this.player.comments.add(entry) + updateRowRepresentation() + return entry + } + + /** + * Delete an entry + */ + fun deleteComment(comment: Comment) { + commentsToDelete.add(comment) + this.player.comments.remove(comment) + updateRowRepresentation() + } + + /** + * Clean up deleted entries + */ + fun cleanupComments() { // called when saving the custom field + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + this.commentsToDelete.forEach { // entries are out of realm + realm.where().equalTo("id", it.id).findFirst()?.deleteFromRealm() + } + } + realm.close() + this.commentsToDelete.clear() + } + + override fun editDescriptors(row: RowRepresentable): List? { + + when (row) { + PlayerPropertiesRow.NAME -> return row.editingDescriptors(mapOf("defaultValue" to this.player.name)) + PlayerPropertiesRow.SUMMARY -> return row.editingDescriptors(mapOf("defaultValue" to this.player.summary)) + } + + return null + } + +} \ No newline at end of file