From 1121003e803360e7766c58c3261cfabbcd6e6420 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Tue, 8 Oct 2024 15:09:28 +1100 Subject: [PATCH] Adding a confirmation dialog when clearing emoji --- .../conversation/v2/ConversationActivityV2.kt | 11 ++-- .../conversation/v2/ConversationV2Dialogs.kt | 36 +++++++++++-- .../conversation/v2/ConversationViewModel.kt | 53 +++++++++++++++++++ .../v2/ConversationViewModelTest.kt | 3 +- 4 files changed, 90 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 8b07747fb2..55f465169f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -1536,14 +1536,11 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe sendEmojiRemoval(emoji, message) } + /** + * Called when the user is attempting to clear all instance of a specific emoji. + */ override fun onClearAll(emoji: String, messageId: MessageId) { - reactionDb.deleteEmojiReactions(emoji, messageId) - viewModel.openGroup?.let { openGroup -> - lokiMessageDb.getServerID(messageId.id, !messageId.mms)?.let { serverId -> - OpenGroupApi.deleteAllReactions(openGroup.room, openGroup.server, serverId, emoji) - } - } - threadDb.notifyThreadUpdated(viewModel.threadId) + viewModel.onEmojiClear(emoji, messageId) } override fun onMicrophoneButtonMove(event: MotionEvent) { 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 a19c6bfca6..8eb7da924a 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 @@ -14,12 +14,11 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.squareup.phrase.Phrase import network.loki.messenger.R -import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.Commands.HideDeleteAllDevicesDialog -import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.Commands.HideDeleteEveryoneDialog -import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.Commands.MarkAsDeletedForEveryone -import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.Commands.MarkAsDeletedLocally -import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel.Commands.ShowOpenUrlDialog +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.ui.AlertDialog import org.thoughtcrime.securesms.ui.DialogButtonModel import org.thoughtcrime.securesms.ui.GetString @@ -195,6 +194,33 @@ fun ConversationV2Dialogs( ) } + // Clear emoji + if(dialogsState.clearAllEmoji != null){ + AlertDialog( + onDismissRequest = { + // hide dialog + sendCommand(HideClearEmoji) + }, + text = stringResource(R.string.emojiReactsClearAll).let { txt -> + Phrase.from(txt).put(EMOJI_KEY, dialogsState.clearAllEmoji.emoji).format().toString() + }, + buttons = listOf( + DialogButtonModel( + text = GetString(stringResource(id = R.string.clear)), + color = LocalColors.current.danger, + onClick = { + // delete emoji + sendCommand( + ClearEmoji(dialogsState.clearAllEmoji.emoji, dialogsState.clearAllEmoji.messageId) + ) + } + ), + DialogButtonModel( + GetString(stringResource(R.string.cancel)) + ) + ) + ) + } } } 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 04cd00ad85..7408cc86a4 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 @@ -37,7 +37,10 @@ import org.session.libsignal.utilities.IdPrefix import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.audio.AudioSlidePlayer import org.thoughtcrime.securesms.database.LokiMessageDatabase +import org.thoughtcrime.securesms.database.ReactionDatabase import org.thoughtcrime.securesms.database.Storage +import org.thoughtcrime.securesms.database.ThreadDatabase +import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.groups.OpenGroupManager @@ -52,6 +55,8 @@ class ConversationViewModel( private val repository: ConversationRepository, private val storage: Storage, private val messageDataProvider: MessageDataProvider, + private val threadDb: ThreadDatabase, + private val reactionDb: ReactionDatabase, private val lokiMessageDb: LokiMessageDatabase, private val textSecurePreferences: TextSecurePreferences ) : ViewModel() { @@ -716,6 +721,12 @@ class ConversationViewModel( } } + is Commands.HideClearEmoji -> { + _dialogsState.update { + it.copy(clearAllEmoji = null) + } + } + is Commands.HideDeleteAllDevicesDialog -> { _dialogsState.update { it.copy(deleteAllDevices = null) @@ -733,6 +744,34 @@ class ConversationViewModel( is Commands.MarkAsDeletedForEveryone -> { markAsDeletedForEveryone(command.data) } + + is Commands.ClearEmoji -> { + clearEmoji(command.emoji, command.messageId) + } + } + } + + private fun clearEmoji(emoji: String, messageId: MessageId){ + viewModelScope.launch(Dispatchers.Default) { + reactionDb.deleteEmojiReactions(emoji, messageId) + openGroup?.let { openGroup -> + lokiMessageDb.getServerID(messageId.id, !messageId.mms)?.let { serverId -> + OpenGroupApi.deleteAllReactions( + openGroup.room, + openGroup.server, + serverId, + emoji + ) + } + } + threadDb.notifyThreadUpdated(threadId) + } + } + + fun onEmojiClear(emoji: String, messageId: MessageId) { + // show a confirmation dialog + _dialogsState.update { + it.copy(clearAllEmoji = ClearAllEmoji(emoji, messageId)) } } @@ -749,6 +788,8 @@ class ConversationViewModel( private val repository: ConversationRepository, private val storage: Storage, private val messageDataProvider: MessageDataProvider, + private val threadDb: ThreadDatabase, + private val reactionDb: ReactionDatabase, private val lokiMessageDb: LokiMessageDatabase, private val textSecurePreferences: TextSecurePreferences ) : ViewModelProvider.Factory { @@ -761,6 +802,8 @@ class ConversationViewModel( repository = repository, storage = storage, messageDataProvider = messageDataProvider, + threadDb = threadDb, + reactionDb = reactionDb, lokiMessageDb = lokiMessageDb, textSecurePreferences = textSecurePreferences ) as T @@ -769,6 +812,7 @@ class ConversationViewModel( data class DialogsState( val openLinkDialogUrl: String? = null, + val clearAllEmoji: ClearAllEmoji? = null, val deleteEveryone: DeleteForEveryoneDialogData? = null, val deleteAllDevices: DeleteForEveryoneDialogData? = null, ) @@ -781,10 +825,19 @@ class ConversationViewModel( val warning: String? = null ) + data class ClearAllEmoji( + val emoji: String, + val messageId: MessageId + ) + sealed class Commands { data class ShowOpenUrlDialog(val url: String?) : Commands() + + 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() data class MarkAsDeletedForEveryone(val data: DeleteForEveryoneDialogData): Commands() diff --git a/app/src/test/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModelTest.kt b/app/src/test/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModelTest.kt index 3a59cff9ab..a12af5f5c1 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModelTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModelTest.kt @@ -36,7 +36,8 @@ class ConversationViewModelTest: BaseViewModelTest() { private lateinit var messageRecord: MessageRecord private val viewModel: ConversationViewModel by lazy { - ConversationViewModel(threadId, edKeyPair, application, repository, storage, mock(), mock(), mock()) + ConversationViewModel(threadId, edKeyPair, application, repository, storage, + mock(), mock(), mock(), mock(), mock()) } @Before