diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 051b401268..6ba1d873f2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -155,7 +155,6 @@ import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.contactshare.ContactShareEditActivity; import org.thoughtcrime.securesms.contactshare.ContactUtil; import org.thoughtcrime.securesms.contactshare.SimpleTextWatcher; -import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory; import org.thoughtcrime.securesms.conversation.drafts.DraftViewModel; import org.thoughtcrime.securesms.conversation.ui.groupcall.GroupCallViewModel; import org.thoughtcrime.securesms.conversation.ui.inlinequery.InlineQuery; @@ -176,7 +175,6 @@ import org.thoughtcrime.securesms.database.ThreadTable; import org.thoughtcrime.securesms.database.identity.IdentityRecordList; import org.thoughtcrime.securesms.database.model.GroupRecord; import org.thoughtcrime.securesms.database.model.IdentityRecord; -import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.Mention; import org.thoughtcrime.securesms.database.model.MessageId; import org.thoughtcrime.securesms.database.model.MessageRecord; @@ -237,7 +235,6 @@ import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.ImageSlide; import org.thoughtcrime.securesms.mms.MediaConstraints; import org.thoughtcrime.securesms.mms.OutgoingMessage; -import org.thoughtcrime.securesms.mms.QuoteId; import org.thoughtcrime.securesms.mms.QuoteModel; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideDeck; @@ -1681,7 +1678,21 @@ public class ConversationParentFragment extends Fragment break; case Draft.QUOTE: SettableFuture quoteResult = new SettableFuture<>(); - new QuoteRestorationTask(draft.getValue(), quoteResult).execute(); + disposables.add(draftViewModel.loadDraftQuote(draft.getValue()).subscribe( + conversationMessage -> { + handleReplyMessage(conversationMessage); + quoteResult.set(true); + }, + err -> { + Log.e(TAG, "Failed to restore a quote from a draft.", err); + quoteResult.set(false); + }, + () -> { + Log.e(TAG, "Failed to restore a quote from a draft. No matching message record."); + quoteResult.set(false); + } + )); + quoteResult.addListener(listener); break; case Draft.VOICE_NOTE: @@ -4259,50 +4270,6 @@ public class ConversationParentFragment extends Fragment } } - private class QuoteRestorationTask extends AsyncTask { - - private final String serialized; - private final SettableFuture future; - - QuoteRestorationTask(@NonNull String serialized, @NonNull SettableFuture future) { - this.serialized = serialized; - this.future = future; - } - - @Override - protected ConversationMessage doInBackground(Void... voids) { - QuoteId quoteId = QuoteId.deserialize(ApplicationDependencies.getApplication(), serialized); - - if (quoteId == null) { - return null; - } - - Context context = ApplicationDependencies.getApplication(); - - MessageRecord messageRecord = SignalDatabase.messages().getMessageFor(quoteId.getId(), quoteId.getAuthor()); - if (messageRecord == null) { - return null; - } - - if (messageRecord instanceof MediaMmsMessageRecord) { - messageRecord = ((MediaMmsMessageRecord) messageRecord).withAttachments(context, SignalDatabase.attachments().getAttachmentsForMessage(messageRecord.getId())); - } - - return ConversationMessageFactory.createWithUnresolvedData(context, messageRecord); - } - - @Override - protected void onPostExecute(ConversationMessage conversationMessage) { - if (conversationMessage != null) { - handleReplyMessage(conversationMessage); - future.set(true); - } else { - Log.e(TAG, "Failed to restore a quote from a draft. No matching message record."); - future.set(false); - } - } - } - private final class VoiceNotePlayerViewListener implements VoiceNotePlayerView.Listener { @Override public void onCloseRequested(@NonNull Uri uri) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt index efc0074132..2e4c3fe8a2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt @@ -4,10 +4,13 @@ import android.content.Context import android.net.Uri import android.text.Spannable import android.text.SpannableString +import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.concurrent.SignalExecutors import org.thoughtcrime.securesms.components.mention.MentionAnnotation +import org.thoughtcrime.securesms.conversation.ConversationMessage +import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory import org.thoughtcrime.securesms.conversation.MessageStyler import org.thoughtcrime.securesms.database.DraftTable import org.thoughtcrime.securesms.database.DraftTable.Drafts @@ -16,9 +19,12 @@ import org.thoughtcrime.securesms.database.MessageTypes import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.ThreadTable import org.thoughtcrime.securesms.database.adjustBodyRanges +import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord import org.thoughtcrime.securesms.database.model.Mention +import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList import org.thoughtcrime.securesms.dependencies.ApplicationDependencies +import org.thoughtcrime.securesms.mms.QuoteId import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.Base64 @@ -80,5 +86,20 @@ class DraftRepository( }.subscribeOn(Schedulers.io()) } + fun loadDraftQuote(serialized: String): Maybe { + return Maybe.fromCallable { + val quoteId: QuoteId = QuoteId.deserialize(context, serialized) ?: return@fromCallable null + val messageRecord: MessageRecord = SignalDatabase.messages.getMessageFor(quoteId.id, quoteId.author)?.let { + if (it is MediaMmsMessageRecord) { + it.withAttachments(context, SignalDatabase.attachments.getAttachmentsForMessage(it.id)) + } else { + it + } + } ?: return@fromCallable null + + ConversationMessageFactory.createWithUnresolvedData(context, messageRecord) + } + } + data class DatabaseDraft(val drafts: Drafts, val updatedText: CharSequence?) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt index e8b91f9ad3..8ad5e37476 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftViewModel.kt @@ -3,8 +3,11 @@ package org.thoughtcrime.securesms.conversation.drafts import androidx.lifecycle.ViewModel import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.schedulers.Schedulers import org.thoughtcrime.securesms.components.location.SignalPlace +import org.thoughtcrime.securesms.conversation.ConversationMessage import org.thoughtcrime.securesms.database.DraftTable.Draft import org.thoughtcrime.securesms.database.MentionUtil import org.thoughtcrime.securesms.database.model.Mention @@ -122,6 +125,12 @@ class DraftViewModel @JvmOverloads constructor( } .observeOn(AndroidSchedulers.mainThread()) } + + fun loadDraftQuote(serialized: String): Maybe { + return repository.loadDraftQuote(serialized) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + } } private fun String.toTextDraft(): Draft? {