mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-24 21:15:48 +00:00
Exit edit message mode on message send.
This commit is contained in:
@@ -1085,6 +1085,10 @@ public class ConversationFragment extends LoggingFragment implements Multiselect
|
||||
return null;
|
||||
}
|
||||
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
|
||||
for (MessageRecord messageRecord : messageRecords) {
|
||||
listener.onDeleteMessage(messageRecord.getId());
|
||||
}
|
||||
});
|
||||
|
||||
int deleteForEveryoneResId = isNoteToSelfDelete ? R.string.ConversationFragment_delete_everywhere : R.string.ConversationFragment_delete_for_everyone;
|
||||
@@ -1110,6 +1114,9 @@ public class ConversationFragment extends LoggingFragment implements Multiselect
|
||||
|
||||
private void handleDeleteForEveryone(Set<MessageRecord> messageRecords) {
|
||||
Runnable deleteForEveryone = () -> {
|
||||
for (MessageRecord messageRecord : messageRecords) {
|
||||
listener.onRemoteDeleteMessage(messageRecord.getId());
|
||||
}
|
||||
SignalExecutors.BOUNDED.execute(() -> {
|
||||
for (MessageRecord message : messageRecords) {
|
||||
MessageSender.sendRemoteDelete(message.getId());
|
||||
@@ -1477,6 +1484,8 @@ public class ConversationFragment extends LoggingFragment implements Multiselect
|
||||
void onRegisterVoiceNoteCallbacks(@NonNull Observer<VoiceNotePlaybackState> onPlaybackStartObserver);
|
||||
void onUnregisterVoiceNoteCallbacks(@NonNull Observer<VoiceNotePlaybackState> onPlaybackStartObserver);
|
||||
void onInviteToSignal();
|
||||
void onDeleteMessage(long id);
|
||||
void onRemoteDeleteMessage(long targetId);
|
||||
boolean isInBubble();
|
||||
}
|
||||
|
||||
|
||||
@@ -4054,6 +4054,22 @@ public class ConversationParentFragment extends Fragment
|
||||
handleInviteLink();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeleteMessage(long id) {
|
||||
MessageId messageId = inputPanel.getEditMessageId();
|
||||
if (messageId != null && messageId.getId() == id) {
|
||||
inputPanel.exitEditMessageMode();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRemoteDeleteMessage(long targetId) {
|
||||
MessageId messageId = inputPanel.getEditMessageId();
|
||||
if (messageId != null && messageId.getId() == targetId) {
|
||||
inputPanel.exitEditMessageMode();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCursorChanged() {
|
||||
if (!reactionDelegate.isShowing()) {
|
||||
|
||||
@@ -2119,10 +2119,17 @@ class ConversationFragment :
|
||||
}
|
||||
|
||||
private fun handleDeleteMessages(messageParts: Set<MultiselectPart>) {
|
||||
val records = messageParts.map(MultiselectPart::getMessageRecord).toSet()
|
||||
disposables += DeleteDialog.show(
|
||||
context = requireContext(),
|
||||
messageRecords = messageParts.map(MultiselectPart::getMessageRecord).toSet()
|
||||
).subscribe()
|
||||
messageRecords = records
|
||||
).subscribe { (deleted: Boolean, _: Boolean) ->
|
||||
if (!deleted) return@subscribe
|
||||
val editMessageId = inputPanel.editMessageId?.id
|
||||
if (editMessageId != null && records.any { it.id == editMessageId }) {
|
||||
inputPanel.exitEditMessageMode()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private inner class SwipeAvailabilityProvider : ConversationItemSwipeCallback.SwipeAvailabilityProvider {
|
||||
|
||||
@@ -45,7 +45,7 @@ object StoryContextMenu {
|
||||
title = context.getString(R.string.MyStories__delete_story),
|
||||
message = context.getString(R.string.MyStories__this_story_will_be_deleted),
|
||||
forceRemoteDelete = true
|
||||
)
|
||||
).map { (_, deletedThread) -> deletedThread }
|
||||
}
|
||||
|
||||
fun save(context: Context, messageRecord: MessageRecord) {
|
||||
|
||||
@@ -312,7 +312,7 @@ class StoryGroupReplyFragment :
|
||||
}
|
||||
|
||||
private fun onDeleteClick(messageRecord: MessageRecord) {
|
||||
lifecycleDisposable += DeleteDialog.show(requireActivity(), setOf(messageRecord)).subscribe { didDeleteThread ->
|
||||
lifecycleDisposable += DeleteDialog.show(requireActivity(), setOf(messageRecord)).subscribe { (_, didDeleteThread) ->
|
||||
if (didDeleteThread) {
|
||||
throw AssertionError("We should never end up deleting a Group Thread like this.")
|
||||
}
|
||||
|
||||
@@ -23,7 +23,8 @@ object DeleteDialog {
|
||||
* @param message The dialog message, or null
|
||||
* @param forceRemoteDelete Allow remote deletion, even if it would normally be disallowed
|
||||
*
|
||||
* @return a Single, who's value notes whether or not a thread deletion occurred.
|
||||
* @return a Single, who's value is a pair that notes whether or not a deletion attempt
|
||||
* happened at all, as well as if a thread deletion occurred.
|
||||
*/
|
||||
fun show(
|
||||
context: Context,
|
||||
@@ -31,7 +32,7 @@ object DeleteDialog {
|
||||
title: CharSequence = context.resources.getQuantityString(R.plurals.ConversationFragment_delete_selected_messages, messageRecords.size, messageRecords.size),
|
||||
message: CharSequence? = null,
|
||||
forceRemoteDelete: Boolean = false
|
||||
): Single<Boolean> = Single.create { emitter ->
|
||||
): Single<Pair<Boolean, Boolean>> = Single.create { emitter ->
|
||||
val builder = MaterialAlertDialogBuilder(context)
|
||||
|
||||
builder.setTitle(title)
|
||||
@@ -44,7 +45,9 @@ object DeleteDialog {
|
||||
builder.setPositiveButton(R.string.ConversationFragment_delete_for_everyone) { _, _ -> deleteForEveryone(messageRecords, emitter) }
|
||||
} else {
|
||||
builder.setPositiveButton(if (isNoteToSelfDelete) R.string.ConversationFragment_delete_on_this_device else R.string.ConversationFragment_delete_for_me) { _, _ ->
|
||||
DeleteProgressDialogAsyncTask(context, messageRecords, emitter::onSuccess).executeOnExecutor(SignalExecutors.BOUNDED)
|
||||
DeleteProgressDialogAsyncTask(context, messageRecords) {
|
||||
emitter.onSuccess(Pair(true, it))
|
||||
}.executeOnExecutor(SignalExecutors.BOUNDED)
|
||||
}
|
||||
|
||||
if (MessageConstraintsUtil.isValidRemoteDeleteSend(messageRecords, System.currentTimeMillis()) && (!isNoteToSelfDelete || TextSecurePreferences.isMultiDevice(context))) {
|
||||
@@ -52,8 +55,8 @@ object DeleteDialog {
|
||||
}
|
||||
}
|
||||
|
||||
builder.setNegativeButton(android.R.string.cancel) { _, _ -> emitter.onSuccess(false) }
|
||||
builder.setOnCancelListener { emitter.onSuccess(false) }
|
||||
builder.setNegativeButton(android.R.string.cancel) { _, _ -> emitter.onSuccess(Pair(false, false)) }
|
||||
builder.setOnCancelListener { emitter.onSuccess(Pair(false, false)) }
|
||||
builder.show()
|
||||
}
|
||||
|
||||
@@ -61,8 +64,8 @@ object DeleteDialog {
|
||||
return messageRecords.all { messageRecord: MessageRecord -> messageRecord.isOutgoing && messageRecord.toRecipient.isSelf }
|
||||
}
|
||||
|
||||
private fun handleDeleteForEveryone(context: Context, messageRecords: Set<MessageRecord>, emitter: SingleEmitter<Boolean>) {
|
||||
if (SignalStore.uiHints().hasConfirmedDeleteForEveryoneOnce() || isNoteToSelfDelete(messageRecords)) {
|
||||
private fun handleDeleteForEveryone(context: Context, messageRecords: Set<MessageRecord>, emitter: SingleEmitter<Pair<Boolean, Boolean>>) {
|
||||
if (SignalStore.uiHints().hasConfirmedDeleteForEveryoneOnce()) {
|
||||
deleteForEveryone(messageRecords, emitter)
|
||||
} else {
|
||||
MaterialAlertDialogBuilder(context)
|
||||
@@ -71,19 +74,19 @@ object DeleteDialog {
|
||||
SignalStore.uiHints().markHasConfirmedDeleteForEveryoneOnce()
|
||||
deleteForEveryone(messageRecords, emitter)
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> emitter.onSuccess(false) }
|
||||
.setOnCancelListener { emitter.onSuccess(false) }
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> emitter.onSuccess(Pair(false, false)) }
|
||||
.setOnCancelListener { emitter.onSuccess(Pair(false, false)) }
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun deleteForEveryone(messageRecords: Set<MessageRecord>, emitter: SingleEmitter<Boolean>) {
|
||||
private fun deleteForEveryone(messageRecords: Set<MessageRecord>, emitter: SingleEmitter<Pair<Boolean, Boolean>>) {
|
||||
SignalExecutors.BOUNDED.execute {
|
||||
messageRecords.forEach { message ->
|
||||
MessageSender.sendRemoteDelete(message.id)
|
||||
}
|
||||
|
||||
emitter.onSuccess(false)
|
||||
emitter.onSuccess(Pair(true, false))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user