From cf344b718020eb573a123f36d6c959c8a180a753 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Wed, 16 Oct 2024 17:24:57 +1100 Subject: [PATCH] Simplified deletion dialog to be reused for note to self and the rest as only the labels change --- .../conversation/v2/ConversationV2Dialogs.kt | 95 +++---------------- .../conversation/v2/ConversationViewModel.kt | 32 +++---- 2 files changed, 30 insertions(+), 97 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationV2Dialogs.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationV2Dialogs.kt index b9756a13be..a958f9d84d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationV2Dialogs.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationV2Dialogs.kt @@ -19,6 +19,8 @@ import network.loki.messenger.R import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY import org.session.libsession.utilities.StringSubstitutionConstants.EMOJI_KEY import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.Commands.* +import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.DeleteForEveryoneDialogData +import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.ui.AlertDialog import org.thoughtcrime.securesms.ui.DialogButtonModel import org.thoughtcrime.securesms.ui.GetString @@ -48,9 +50,10 @@ fun ConversationV2Dialogs( ) } - // delete message(s) for everyone + // delete message(s) if(dialogsState.deleteEveryone != null){ - var deleteForEveryone by remember { mutableStateOf(dialogsState.deleteEveryone.defaultToEveryone)} + val data = dialogsState.deleteEveryone + var deleteForEveryone by remember { mutableStateOf(data.defaultToEveryone)} AlertDialog( onDismissRequest = { @@ -59,17 +62,17 @@ fun ConversationV2Dialogs( }, title = pluralStringResource( R.plurals.deleteMessage, - dialogsState.deleteEveryone.messages.size, - dialogsState.deleteEveryone.messages.size + data.messages.size, + data.messages.size ), text = pluralStringResource( R.plurals.deleteMessageConfirm, - dialogsState.deleteEveryone.messages.size, - dialogsState.deleteEveryone.messages.size + data.messages.size, + data.messages.size ), content = { // add warning text, if any - dialogsState.deleteEveryone.warning?.let { + data.warning?.let { Text( text = it, textAlign = TextAlign.Center, @@ -103,9 +106,9 @@ fun ConversationV2Dialogs( ), option = RadioOption( value = Unit, - title = GetString(stringResource(R.string.deleteMessageEveryone)), + title = GetString(data.deleteForEveryoneLabel), selected = deleteForEveryone, - enabled = dialogsState.deleteEveryone.everyoneEnabled + enabled = data.everyoneEnabled ) ) { deleteForEveryone = true @@ -119,9 +122,9 @@ fun ConversationV2Dialogs( // delete messages based on chosen option sendCommand( if(deleteForEveryone) MarkAsDeletedForEveryone( - dialogsState.deleteEveryone.copy(defaultToEveryone = deleteForEveryone) + data.copy(defaultToEveryone = deleteForEveryone) ) - else MarkAsDeletedLocally(dialogsState.deleteEveryone.messages) + else MarkAsDeletedLocally(data.messages) ) } ), @@ -132,76 +135,6 @@ fun ConversationV2Dialogs( ) } - // delete message(s) for all my devices - if(dialogsState.deleteAllDevices != null){ - var deleteAllDevices by remember { mutableStateOf(dialogsState.deleteAllDevices.defaultToEveryone) } - - AlertDialog( - onDismissRequest = { - // hide dialog - sendCommand(HideDeleteAllDevicesDialog) - }, - title = pluralStringResource( - R.plurals.deleteMessage, - dialogsState.deleteAllDevices.messages.size, - dialogsState.deleteAllDevices.messages.size - ), - text = pluralStringResource( - R.plurals.deleteMessageConfirm, - dialogsState.deleteAllDevices.messages.size, - dialogsState.deleteAllDevices.messages.size - ), - content = { - TitledRadioButton( - contentPadding = PaddingValues( - horizontal = LocalDimensions.current.xxsSpacing, - vertical = 0.dp - ), - option = RadioOption( - value = Unit, - title = GetString(stringResource(R.string.deleteMessageDeviceOnly)), - selected = !deleteAllDevices - ) - ) { - deleteAllDevices = false - } - - TitledRadioButton( - contentPadding = PaddingValues( - horizontal = LocalDimensions.current.xxsSpacing, - vertical = 0.dp - ), - option = RadioOption( - value = Unit, - title = GetString(stringResource(R.string.deleteMessageDevicesAll)), - selected = deleteAllDevices - ) - ) { - deleteAllDevices = true - } - }, - buttons = listOf( - DialogButtonModel( - text = GetString(stringResource(id = R.string.delete)), - color = LocalColors.current.danger, - onClick = { - // delete messages based on chosen option - sendCommand( - if(deleteAllDevices) MarkAsDeletedForEveryone( - dialogsState.deleteAllDevices.copy(defaultToEveryone = deleteAllDevices) - ) - else MarkAsDeletedLocally(dialogsState.deleteAllDevices.messages) - ) - } - ), - DialogButtonModel( - GetString(stringResource(R.string.cancel)) - ) - ) - ) - } - - // Clear emoji if(dialogsState.clearAllEmoji != null){ AlertDialog( diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt index 29a9b9d79d..c3ad458428 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt @@ -245,12 +245,12 @@ class ConversationViewModel( // hashes are required if wanting to delete messages from the 'storage server' // They are not required for communities OR if all messages are outgoing - // also we can only delete deleted messages (marked as deleted) locally + // also we can only delete deleted messages and control messages (marked as deleted) locally val canDeleteForEveryone = messages.all{ !it.isDeleted && !it.isControlMessage } && ( messages.all { it.isOutgoing } || conversationType == MessageType.COMMUNITY || - messages.all { lokiMessageDb.getMessageServerHash(it.id, it.isMms) != null - }) + messages.all { lokiMessageDb.getMessageServerHash(it.id, it.isMms) != null } + ) // There are three types of dialogs for deletion: // 1- Delete on device only OR all devices - Used for Note to self @@ -260,11 +260,16 @@ class ConversationViewModel( // the conversation is a note to self conversationType == MessageType.NOTE_TO_SELF -> { _dialogsState.update { - it.copy(deleteAllDevices = DeleteForEveryoneDialogData( + it.copy(deleteEveryone = DeleteForEveryoneDialogData( messages = messages, defaultToEveryone = false, - everyoneEnabled = true, - messageType = conversationType + everyoneEnabled = canDeleteForEveryone, + messageType = conversationType, + deleteForEveryoneLabel = application.getString(R.string.deleteMessageDevicesAll), + warning = if(canDeleteForEveryone) null else + application.resources.getQuantityString( + R.plurals.deleteMessageNoteToSelfWarning, messages.count(), messages.count() + ) ) ) } @@ -278,6 +283,7 @@ class ConversationViewModel( messages = messages, defaultToEveryone = isAdmin.value, everyoneEnabled = true, + deleteForEveryoneLabel = application.getString(R.string.deleteMessageEveryone), messageType = conversationType ) ) @@ -293,6 +299,7 @@ class ConversationViewModel( defaultToEveryone = false, everyoneEnabled = false, // disable 'delete for everyone' - can only delete locally in this case messageType = conversationType, + deleteForEveryoneLabel = application.getString(R.string.deleteMessageEveryone), warning = application.resources.getQuantityString( R.plurals.deleteMessageWarning, messages.count(), messages.count() ) @@ -548,7 +555,7 @@ class ConversationViewModel( ).show() } - _dialogsState.update { it.copy(deleteAllDevices = data) } + _dialogsState.update { it.copy(deleteEveryone = data) } } // hide loading indicator @@ -731,12 +738,6 @@ class ConversationViewModel( } } - is Commands.HideDeleteAllDevicesDialog -> { - _dialogsState.update { - it.copy(deleteAllDevices = null) - } - } - is Commands.MarkAsDeletedLocally -> { // hide dialog first _dialogsState.update { @@ -818,8 +819,7 @@ class ConversationViewModel( data class DialogsState( val openLinkDialogUrl: String? = null, val clearAllEmoji: ClearAllEmoji? = null, - val deleteEveryone: DeleteForEveryoneDialogData? = null, - val deleteAllDevices: DeleteForEveryoneDialogData? = null, + val deleteEveryone: DeleteForEveryoneDialogData? = null ) data class DeleteForEveryoneDialogData( @@ -827,6 +827,7 @@ class ConversationViewModel( val messageType: MessageType, val defaultToEveryone: Boolean, val everyoneEnabled: Boolean, + val deleteForEveryoneLabel: String, val warning: String? = null ) @@ -841,7 +842,6 @@ class ConversationViewModel( data class ClearEmoji(val emoji:String, val messageId: MessageId) : Commands() data object HideDeleteEveryoneDialog : Commands() - data object HideDeleteAllDevicesDialog : Commands() data object HideClearEmoji : Commands() data class MarkAsDeletedLocally(val messages: Set): Commands()