Add pending and failed states for admin delete.

This commit is contained in:
Michelle Tang
2026-03-03 11:14:11 -05:00
committed by Greyson Parrelli
parent 3af8b6050c
commit 74d9e3248b
19 changed files with 247 additions and 46 deletions

View File

@@ -183,7 +183,9 @@ public final class SafetyNumberChangeRepository {
}
}
if (messageRecord.isOutgoing()) {
if (messageRecord.isFailedAdminDelete()) {
processAdminDeletedMessageRecord(changedRecipients, messageRecord);
} else if (messageRecord.isOutgoing()) {
processOutgoingMessageRecord(changedRecipients, messageRecord);
}
@@ -223,6 +225,24 @@ public final class SafetyNumberChangeRepository {
}
}
@WorkerThread
private void processAdminDeletedMessageRecord(@NonNull List<ChangedRecipient> changedRecipients, @NonNull MessageRecord messageRecord) {
Log.d(TAG, "processAdminDeletedMessageRecord");
Set<RecipientId> resendIds = new HashSet<>();
for (ChangedRecipient changedRecipient : changedRecipients) {
RecipientId id = changedRecipient.getRecipient().getId();
IdentityKey identityKey = changedRecipient.getIdentityRecord().getIdentityKey();
SignalDatabase.messages().removeMismatchedIdentity(messageRecord.getId(), id, identityKey);
resendIds.add(id);
}
if (Util.hasItems(resendIds) ) {
MessageSender.resendAdminDelete(messageRecord, resendIds.stream().collect(Collectors.toList()));
}
}
static final class SafetyNumberChangeState {
private final List<ChangedRecipient> changedRecipients;

View File

@@ -94,6 +94,25 @@ object ConversationDialogs {
.show()
}
fun displayDeletionFailedDialog(context: Context, messageRecord: MessageRecord, canRetry: Boolean) {
if (canRetry) {
MaterialAlertDialogBuilder(context)
.setMessage(R.string.conversation_activity__message_failed_to_delete_retry)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.conversation_activity__send) { _, _ ->
SignalExecutors.BOUNDED.execute {
MessageSender.resendAdminDelete(messageRecord, messageRecord.networkFailures.map { it.recipientId })
}
}
.show()
} else {
MaterialAlertDialogBuilder(context)
.setMessage(R.string.conversation_activity__message_failed_to_delete)
.setPositiveButton(android.R.string.ok, null)
.show()
}
}
@JvmStatic
fun displayDeleteDialog(context: Context, recipient: Recipient, onDelete: () -> Unit) {
MaterialAlertDialogBuilder(context)

View File

@@ -3344,9 +3344,18 @@ class ConversationFragment :
override fun onMessageWithErrorClicked(messageRecord: MessageRecord) {
val recipientId = viewModel.recipientSnapshot?.id ?: return
if (messageRecord.isIdentityMismatchFailure) {
if (messageRecord.isFailedAdminDelete) {
val canRetry = MessageConstraintsUtil.isValidAdminDeleteSend(message = messageRecord, currentTime = System.currentTimeMillis(), isAdmin = conversationGroupViewModel.isAdmin(), isResend = true)
if (messageRecord.isIdentityMismatchFailure && canRetry) {
SafetyNumberBottomSheet
.forIncomingMessageRecord(messageRecord, viewModel.recipientSnapshot!!)
.show(childFragmentManager)
} else {
ConversationDialogs.displayDeletionFailedDialog(requireContext(), messageRecord, canRetry)
}
} else if (messageRecord.isIdentityMismatchFailure) {
SafetyNumberBottomSheet
.forMessageRecord(requireContext(), messageRecord)
.forOutgoingMessageRecord(requireContext(), messageRecord)
.show(childFragmentManager)
} else if (messageRecord.hasFailedWithNetworkFailures()) {
ConversationDialogs.displayMessageCouldNotBeSentDialog(requireContext(), messageRecord)