kopia lustrzana https://github.com/ryukoposting/Signal-Android
Always allow remote delete in note to self.
rodzic
65a4ef2f70
commit
f96c31b38f
|
@ -176,7 +176,6 @@ import org.thoughtcrime.securesms.util.CommunicationActions;
|
||||||
import org.thoughtcrime.securesms.util.HtmlUtil;
|
import org.thoughtcrime.securesms.util.HtmlUtil;
|
||||||
import org.thoughtcrime.securesms.util.LifecycleDisposable;
|
import org.thoughtcrime.securesms.util.LifecycleDisposable;
|
||||||
import org.thoughtcrime.securesms.util.MessageRecordUtil;
|
import org.thoughtcrime.securesms.util.MessageRecordUtil;
|
||||||
import org.thoughtcrime.securesms.util.ProfileUtil;
|
|
||||||
import org.thoughtcrime.securesms.util.Projection;
|
import org.thoughtcrime.securesms.util.Projection;
|
||||||
import org.thoughtcrime.securesms.util.RemoteDeleteUtil;
|
import org.thoughtcrime.securesms.util.RemoteDeleteUtil;
|
||||||
import org.thoughtcrime.securesms.util.SaveAttachmentTask;
|
import org.thoughtcrime.securesms.util.SaveAttachmentTask;
|
||||||
|
@ -1047,14 +1046,14 @@ public class ConversationFragment extends LoggingFragment implements Multiselect
|
||||||
}
|
}
|
||||||
|
|
||||||
private AlertDialog.Builder buildRemoteDeleteConfirmationDialog(Set<MessageRecord> messageRecords) {
|
private AlertDialog.Builder buildRemoteDeleteConfirmationDialog(Set<MessageRecord> messageRecords) {
|
||||||
Context context = requireActivity();
|
|
||||||
int messagesCount = messageRecords.size();
|
int messagesCount = messageRecords.size();
|
||||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(getActivity());
|
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(getActivity());
|
||||||
|
|
||||||
builder.setTitle(getActivity().getResources().getQuantityString(R.plurals.ConversationFragment_delete_selected_messages, messagesCount, messagesCount));
|
builder.setTitle(getActivity().getResources().getQuantityString(R.plurals.ConversationFragment_delete_selected_messages, messagesCount, messagesCount));
|
||||||
builder.setCancelable(true);
|
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<Void, Void, Void>(getActivity(),
|
new ProgressDialogAsyncTask<Void, Void, Void>(getActivity(),
|
||||||
R.string.ConversationFragment_deleting,
|
R.string.ConversationFragment_deleting,
|
||||||
R.string.ConversationFragment_deleting_messages)
|
R.string.ConversationFragment_deleting_messages)
|
||||||
|
@ -1083,14 +1082,20 @@ public class ConversationFragment extends LoggingFragment implements Multiselect
|
||||||
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
}.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())) {
|
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);
|
builder.setNegativeButton(android.R.string.cancel, null);
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isNoteToSelfDelete(Set<MessageRecord> messageRecords) {
|
||||||
|
return messageRecords.stream().allMatch(messageRecord -> messageRecord.isOutgoing() && messageRecord.getRecipient().isSelf());
|
||||||
|
}
|
||||||
|
|
||||||
private void handleDeleteForEveryone(Set<MessageRecord> messageRecords) {
|
private void handleDeleteForEveryone(Set<MessageRecord> messageRecords) {
|
||||||
Runnable deleteForEveryone = () -> {
|
Runnable deleteForEveryone = () -> {
|
||||||
SignalExecutors.BOUNDED.execute(() -> {
|
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();
|
deleteForEveryone.run();
|
||||||
} else {
|
} else {
|
||||||
new MaterialAlertDialogBuilder(requireActivity())
|
new MaterialAlertDialogBuilder(requireActivity())
|
||||||
|
|
|
@ -29,7 +29,7 @@ public final class RemoteDeleteUtil {
|
||||||
|
|
||||||
return isValidIncomingOutgoing &&
|
return isValidIncomingOutgoing &&
|
||||||
isValidSender &&
|
isValidSender &&
|
||||||
(deleteServerTimestamp - messageTimestamp) < RECEIVE_THRESHOLD;
|
(((deleteServerTimestamp - messageTimestamp) < RECEIVE_THRESHOLD) || (deleteSender.isSelf() && targetMessage.isOutgoing()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isValidSend(@NonNull Collection<MessageRecord> targetMessages, long currentTime) {
|
public static boolean isValidSend(@NonNull Collection<MessageRecord> targetMessages, long currentTime) {
|
||||||
|
@ -42,9 +42,8 @@ public final class RemoteDeleteUtil {
|
||||||
message.isOutgoing() &&
|
message.isOutgoing() &&
|
||||||
message.isPush() &&
|
message.isPush() &&
|
||||||
(!message.getRecipient().isGroup() || message.getRecipient().isActiveGroup()) &&
|
(!message.getRecipient().isGroup() || message.getRecipient().isActiveGroup()) &&
|
||||||
!message.getRecipient().isSelf() &&
|
|
||||||
!message.isRemoteDelete() &&
|
!message.isRemoteDelete() &&
|
||||||
!MessageRecordUtil.hasGiftBadge(message) &&
|
!MessageRecordUtil.hasGiftBadge(message) &&
|
||||||
(currentTime - message.getDateSent()) < SEND_THRESHOLD;
|
(((currentTime - message.getDateSent()) < SEND_THRESHOLD) || message.getRecipient().isSelf());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -450,6 +450,10 @@
|
||||||
<string name="ConversationFragment_deleting_messages">Deleting messages…</string>
|
<string name="ConversationFragment_deleting_messages">Deleting messages…</string>
|
||||||
<string name="ConversationFragment_delete_for_me">Delete for me</string>
|
<string name="ConversationFragment_delete_for_me">Delete for me</string>
|
||||||
<string name="ConversationFragment_delete_for_everyone">Delete for everyone</string>
|
<string name="ConversationFragment_delete_for_everyone">Delete for everyone</string>
|
||||||
|
<!-- Dialog button for deleting one or more note-to-self messages only on this device, leaving that same message intact on other devices. -->
|
||||||
|
<string name="ConversationFragment_delete_on_this_device">Delete on this device</string>
|
||||||
|
<!-- Dialog button for deleting one or more note-to-self messages on all linked devices. -->
|
||||||
|
<string name="ConversationFragment_delete_everywhere">Delete everywhere</string>
|
||||||
<string name="ConversationFragment_this_message_will_be_deleted_for_everyone_in_the_conversation">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.</string>
|
<string name="ConversationFragment_this_message_will_be_deleted_for_everyone_in_the_conversation">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.</string>
|
||||||
<string name="ConversationFragment_quoted_message_not_found">Original message not found</string>
|
<string name="ConversationFragment_quoted_message_not_found">Original message not found</string>
|
||||||
<string name="ConversationFragment_quoted_message_no_longer_available">Original message no longer available</string>
|
<string name="ConversationFragment_quoted_message_no_longer_available">Original message no longer available</string>
|
||||||
|
|
Ładowanie…
Reference in New Issue