diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 84e047e409..0d9e818d67 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -176,7 +176,6 @@ import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.HtmlUtil; import org.thoughtcrime.securesms.util.LifecycleDisposable; import org.thoughtcrime.securesms.util.MessageRecordUtil; -import org.thoughtcrime.securesms.util.ProfileUtil; import org.thoughtcrime.securesms.util.Projection; import org.thoughtcrime.securesms.util.RemoteDeleteUtil; import org.thoughtcrime.securesms.util.SaveAttachmentTask; @@ -1047,14 +1046,14 @@ public class ConversationFragment extends LoggingFragment implements Multiselect } private AlertDialog.Builder buildRemoteDeleteConfirmationDialog(Set messageRecords) { - Context context = requireActivity(); int messagesCount = messageRecords.size(); AlertDialog.Builder builder = new MaterialAlertDialogBuilder(getActivity()); builder.setTitle(getActivity().getResources().getQuantityString(R.plurals.ConversationFragment_delete_selected_messages, messagesCount, messagesCount)); builder.setCancelable(true); - builder.setPositiveButton(R.string.ConversationFragment_delete_for_me, (dialog, which) -> { + int deleteForMeResId = isNoteToSelfDelete(messageRecords) ? R.string.ConversationFragment_delete_on_this_device : R.string.ConversationFragment_delete_for_me; + builder.setPositiveButton(deleteForMeResId, (dialog, which) -> { new ProgressDialogAsyncTask(getActivity(), R.string.ConversationFragment_deleting, R.string.ConversationFragment_deleting_messages) @@ -1083,14 +1082,20 @@ public class ConversationFragment extends LoggingFragment implements Multiselect }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }); + int deleteForEveryoneResId = isNoteToSelfDelete(messageRecords) ? R.string.ConversationFragment_delete_everywhere : R.string.ConversationFragment_delete_for_everyone; + if (RemoteDeleteUtil.isValidSend(messageRecords, System.currentTimeMillis())) { - builder.setNeutralButton(R.string.ConversationFragment_delete_for_everyone, (dialog, which) -> handleDeleteForEveryone(messageRecords)); + builder.setNeutralButton(deleteForEveryoneResId, (dialog, which) -> handleDeleteForEveryone(messageRecords)); } builder.setNegativeButton(android.R.string.cancel, null); return builder; } + private static boolean isNoteToSelfDelete(Set messageRecords) { + return messageRecords.stream().allMatch(messageRecord -> messageRecord.isOutgoing() && messageRecord.getRecipient().isSelf()); + } + private void handleDeleteForEveryone(Set messageRecords) { Runnable deleteForEveryone = () -> { SignalExecutors.BOUNDED.execute(() -> { @@ -1100,7 +1105,7 @@ public class ConversationFragment extends LoggingFragment implements Multiselect }); }; - if (SignalStore.uiHints().hasConfirmedDeleteForEveryoneOnce()) { + if (SignalStore.uiHints().hasConfirmedDeleteForEveryoneOnce() || isNoteToSelfDelete(messageRecords)) { deleteForEveryone.run(); } else { new MaterialAlertDialogBuilder(requireActivity()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeleteUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeleteUtil.java index fc9409a00f..813471bca4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeleteUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteDeleteUtil.java @@ -29,7 +29,7 @@ public final class RemoteDeleteUtil { return isValidIncomingOutgoing && isValidSender && - (deleteServerTimestamp - messageTimestamp) < RECEIVE_THRESHOLD; + (((deleteServerTimestamp - messageTimestamp) < RECEIVE_THRESHOLD) || (deleteSender.isSelf() && targetMessage.isOutgoing())); } public static boolean isValidSend(@NonNull Collection targetMessages, long currentTime) { @@ -42,9 +42,8 @@ public final class RemoteDeleteUtil { message.isOutgoing() && message.isPush() && (!message.getRecipient().isGroup() || message.getRecipient().isActiveGroup()) && - !message.getRecipient().isSelf() && !message.isRemoteDelete() && !MessageRecordUtil.hasGiftBadge(message) && - (currentTime - message.getDateSent()) < SEND_THRESHOLD; + (((currentTime - message.getDateSent()) < SEND_THRESHOLD) || message.getRecipient().isSelf()); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3143d45982..0dbacc9c9f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -450,6 +450,10 @@ Deleting messages… Delete for me Delete for everyone + + Delete on this device + + Delete everywhere This message will be deleted for everyone in the conversation if they’re on a recent version of Signal. They will be able to see that you deleted a message. Original message not found Original message no longer available