diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainNavigator.java b/app/src/main/java/org/thoughtcrime/securesms/MainNavigator.java index de99a33b52..67a2915381 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainNavigator.java +++ b/app/src/main/java/org/thoughtcrime/securesms/MainNavigator.java @@ -9,7 +9,7 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; -import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.conversationlist.ConversationListArchiveFragment; import org.thoughtcrime.securesms.conversationlist.ConversationListFragment; import org.thoughtcrime.securesms.groups.ui.creategroup.CreateGroupActivity; @@ -59,7 +59,10 @@ public class MainNavigator { } public void goToConversation(@NonNull RecipientId recipientId, long threadId, int distributionType, int startingPosition) { - Intent intent = ConversationActivity.buildIntent(activity, recipientId, threadId, distributionType, startingPosition); + Intent intent = ConversationIntents.createBuilder(activity, recipientId, threadId) + .withDistributionType(distributionType) + .withStartingPosition(startingPosition) + .build(); activity.startActivity(intent); activity.overridePendingTransition(R.anim.slide_from_end, R.anim.fade_scale_out); diff --git a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index 95e60257d6..f6b8768e97 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -25,6 +25,7 @@ import androidx.appcompat.app.AlertDialog; import org.thoughtcrime.securesms.contacts.sync.DirectoryHelper; import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.groups.ui.creategroup.CreateGroupActivity; @@ -99,15 +100,13 @@ public class NewConversationActivity extends ContactSelectionActivity } private void launch(Recipient recipient) { - Intent intent = new Intent(this, ConversationActivity.class); - intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId().serialize()); - intent.putExtra(ConversationActivity.TEXT_EXTRA, getIntent().getStringExtra(ConversationActivity.TEXT_EXTRA)); - intent.setDataAndType(getIntent().getData(), getIntent().getType()); + long existingThread = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(recipient.getId()); + Intent intent = ConversationIntents.createBuilder(this, recipient.getId(), existingThread) + .withDraftText(getIntent().getStringExtra(Intent.EXTRA_TEXT)) + .withDataUri(getIntent().getData()) + .withDataType(getIntent().getType()) + .build(); - long existingThread = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(recipient.getId()); - - intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, existingThread); - intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT); startActivity(intent); finish(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/SmsSendtoActivity.java b/app/src/main/java/org/thoughtcrime/securesms/SmsSendtoActivity.java index 036f16292f..258969b43e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/SmsSendtoActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/SmsSendtoActivity.java @@ -5,14 +5,14 @@ import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.provider.ContactsContract; -import androidx.annotation.NonNull; import android.text.TextUtils; - -import org.thoughtcrime.securesms.conversation.ConversationActivity; -import org.thoughtcrime.securesms.logging.Log; import android.widget.Toast; +import androidx.annotation.NonNull; + +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.Rfc5724Uri; @@ -44,16 +44,15 @@ public class SmsSendtoActivity extends Activity { if (TextUtils.isEmpty(destination.destination)) { nextIntent = new Intent(this, NewConversationActivity.class); - nextIntent.putExtra(ConversationActivity.TEXT_EXTRA, destination.getBody()); + nextIntent.putExtra(Intent.EXTRA_TEXT, destination.getBody()); Toast.makeText(this, R.string.ConversationActivity_specify_recipient, Toast.LENGTH_LONG).show(); } else { Recipient recipient = Recipient.external(this, destination.getDestination()); long threadId = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(recipient.getId()); - nextIntent = new Intent(this, ConversationActivity.class); - nextIntent.putExtra(ConversationActivity.TEXT_EXTRA, destination.getBody()); - nextIntent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); - nextIntent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId().serialize()); + nextIntent = ConversationIntents.createBuilder(this, recipient.getId(), threadId) + .withDraftText(destination.getBody()) + .build(); } return nextIntent; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteNotificationManager.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteNotificationManager.java index d0439941e6..7ca014e801 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteNotificationManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteNotificationManager.java @@ -17,8 +17,7 @@ import com.google.android.exoplayer2.ui.PlayerNotificationManager; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.color.MaterialColor; import org.thoughtcrime.securesms.contacts.avatars.ContactColors; -import org.thoughtcrime.securesms.conversation.ConversationActivity; -import org.thoughtcrime.securesms.database.ThreadDatabase; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.notifications.NotificationChannels; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -103,11 +102,9 @@ class VoiceNoteNotificationManager { notificationManager.setColor(color.toNotificationColor(context)); - Intent conversationActivity = ConversationActivity.buildIntent(context, - recipientId, - threadId, - ThreadDatabase.DistributionTypes.DEFAULT, - startingPosition); + Intent conversationActivity = ConversationIntents.createBuilder(context, recipientId, threadId) + .withStartingPosition(startingPosition) + .build(); conversationActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index b596753ac5..4304efbee1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -320,15 +320,6 @@ public class ConversationActivity extends PassphraseRequiredActivity private static final String STATE_REACT_WITH_ANY_PAGE = "STATE_REACT_WITH_ANY_PAGE"; - public static final String RECIPIENT_EXTRA = "recipient_id"; - public static final String THREAD_ID_EXTRA = "thread_id"; - public static final String TEXT_EXTRA = "draft_text"; - public static final String MEDIA_EXTRA = "media_list"; - public static final String STICKER_EXTRA = "sticker_extra"; - public static final String BORDERLESS_EXTRA = "borderless_extra"; - public static final String DISTRIBUTION_TYPE_EXTRA = "distribution_type"; - public static final String STARTING_POSITION_EXTRA = "starting_position"; - private static final int PICK_GALLERY = 1; private static final int PICK_DOCUMENT = 2; private static final int PICK_AUDIO = 3; @@ -398,35 +389,6 @@ public class ConversationActivity extends PassphraseRequiredActivity private final DynamicTheme dynamicTheme = new DynamicDarkToolbarTheme(); private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); - public static @NonNull Intent buildIntent(@NonNull Context context, - @NonNull RecipientId recipientId, - long threadId, - int distributionType, - int startingPosition) - { - Intent intent = buildIntent(context, recipientId, threadId); - intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, distributionType); - intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, startingPosition); - - return intent; - } - - public static @NonNull Intent buildIntent(@NonNull Context context, - @NonNull RecipientId recipientId, - long threadId) - { - Intent intent = new Intent(context, ConversationActivity.class); - intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipientId.serialize()); - intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); - intent.setAction(Intent.ACTION_DEFAULT); - - return intent; - } - - public static @NonNull RecipientId getRecipientId(@NonNull Intent intent) { - return RecipientId.from(Objects.requireNonNull(intent.getStringExtra(RECIPIENT_EXTRA))); - } - @Override protected void onPreCreate() { dynamicTheme.onCreate(this); @@ -435,7 +397,7 @@ public class ConversationActivity extends PassphraseRequiredActivity @Override protected void onCreate(Bundle state, boolean ready) { - if (getIntent().getStringExtra(RECIPIENT_EXTRA) == null) { + if (ConversationIntents.isInvalid(getIntent())) { Log.w(TAG, "[onCreate] Missing recipientId!"); // TODO [greyson] Navigation startActivity(new Intent(this, MainActivity.class)); @@ -443,9 +405,9 @@ public class ConversationActivity extends PassphraseRequiredActivity return; } - RecipientId recipientId = getRecipientId(getIntent()); + ConversationIntents.Args args = ConversationIntents.Args.from(getIntent()); - reportShortcutLaunch(recipientId); + reportShortcutLaunch(args.getRecipientId()); setContentView(R.layout.conversation_activity); getWindow().getDecorView().setBackgroundResource(R.color.signal_background_primary); @@ -455,11 +417,11 @@ public class ConversationActivity extends PassphraseRequiredActivity initializeReceivers(); initializeActionBar(); initializeViews(); - initializeResources(); + initializeResources(args); initializeLinkPreviewObserver(); initializeSearchObserver(); initializeStickerObserver(); - initializeViewModel(); + initializeViewModel(args); initializeGroupViewModel(); initializeMentionsViewModel(); initializeEnabledCheck(); @@ -470,7 +432,7 @@ public class ConversationActivity extends PassphraseRequiredActivity public void onSuccess(Boolean result) { initializeProfiles(); initializeGv1Migration(); - initializeDraft().addListener(new AssertedSuccessListener() { + initializeDraft(args).addListener(new AssertedSuccessListener() { @Override public void onSuccess(Boolean loadedDraft) { if (loadedDraft != null && loadedDraft) { @@ -513,9 +475,7 @@ public class ConversationActivity extends PassphraseRequiredActivity silentlySetComposeText(""); } - RecipientId recipientId = getRecipientId(intent); - - if (recipientId == null) { + if (ConversationIntents.isInvalid(intent)) { Log.w(TAG, "[onNewIntent] Missing recipientId!"); // TODO [greyson] Navigation startActivity(new Intent(this, MainActivity.class)); @@ -523,13 +483,16 @@ public class ConversationActivity extends PassphraseRequiredActivity return; } - reportShortcutLaunch(recipientId); setIntent(intent); - initializeResources(); + + viewModel.setArgs(ConversationIntents.Args.from(intent)); + + reportShortcutLaunch(viewModel.getArgs().getRecipientId()); + initializeResources(viewModel.getArgs()); initializeSecurity(recipient.get().isRegistered(), isDefaultSms).addListener(new AssertedSuccessListener() { @Override public void onSuccess(Boolean result) { - initializeDraft(); + initializeDraft(viewModel.getArgs()); } }); @@ -1454,16 +1417,16 @@ public class ConversationActivity extends PassphraseRequiredActivity ///// Initializers - private ListenableFuture initializeDraft() { + private ListenableFuture initializeDraft(@NonNull ConversationIntents.Args args) { final SettableFuture result = new SettableFuture<>(); - final CharSequence draftText = getIntent().getCharSequenceExtra(TEXT_EXTRA); + final CharSequence draftText = args.getDraftText(); final Uri draftMedia = getIntent().getData(); final String draftContentType = getIntent().getType(); final MediaType draftMediaType = MediaType.from(draftContentType); - final List mediaList = getIntent().getParcelableArrayListExtra(MEDIA_EXTRA); - final StickerLocator stickerLocator = getIntent().getParcelableExtra(STICKER_EXTRA); - final boolean borderless = getIntent().getBooleanExtra(BORDERLESS_EXTRA, false); + final List mediaList = args.getMedia(); + final StickerLocator stickerLocator = args.getStickerLocator(); + final boolean borderless = args.isBorderless(); if (stickerLocator != null && draftMedia != null) { Log.d(TAG, "Handling shared sticker."); @@ -1972,14 +1935,14 @@ public class ConversationActivity extends PassphraseRequiredActivity supportActionBar.setDisplayShowTitleEnabled(false); } - private void initializeResources() { + private void initializeResources(@NonNull ConversationIntents.Args args) { if (recipient != null) { recipient.removeObservers(this); } - recipient = Recipient.live(getRecipientId(getIntent())); - threadId = getIntent().getLongExtra(THREAD_ID_EXTRA, -1); - distributionType = getIntent().getIntExtra(DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT); + recipient = Recipient.live(args.getRecipientId()); + threadId = args.getThreadId(); + distributionType = args.getDistributionType(); glideRequests = GlideApp.with(this); recipient.observe(this, this::onRecipientChanged); @@ -2049,8 +2012,10 @@ public class ConversationActivity extends PassphraseRequiredActivity }); } - private void initializeViewModel() { + private void initializeViewModel(@NonNull ConversationIntents.Args args) { this.viewModel = ViewModelProviders.of(this, new ConversationViewModel.Factory()).get(ConversationViewModel.class); + + this.viewModel.setArgs(args); } private void initializeGroupViewModel() { @@ -3572,9 +3537,9 @@ public class ConversationActivity extends PassphraseRequiredActivity } private void presentMessageRequestState(@Nullable MessageRequestViewModel.MessageData messageData) { - if ((getIntent().hasExtra(TEXT_EXTRA) && !Util.isEmpty(getIntent().getStringExtra(TEXT_EXTRA))) || - getIntent().hasExtra(MEDIA_EXTRA) || - getIntent().hasExtra(STICKER_EXTRA)) + if (!Util.isEmpty(viewModel.getArgs().getDraftText()) || + viewModel.getArgs().getMedia() != null || + viewModel.getArgs().getStickerLocator() != null) { Log.d(TAG, "[presentMessageRequestState] Have extra, so ignoring provided state."); messageRequestBottomView.setVisibility(View.GONE); 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 3edd4b272f..bd8dd8f686 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -114,7 +114,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment; import org.thoughtcrime.securesms.revealable.ViewOnceMessageActivity; import org.thoughtcrime.securesms.revealable.ViewOnceUtil; -import org.thoughtcrime.securesms.sharing.ShareActivity; +import org.thoughtcrime.securesms.sharing.ShareIntents; import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.stickers.StickerLocator; @@ -389,7 +389,7 @@ public class ConversationFragment extends LoggingFragment { } private int getStartPosition() { - return requireActivity().getIntent().getIntExtra(ConversationActivity.STARTING_POSITION_EXTRA, -1); + return conversationViewModel.getArgs().getStartingPosition(); } private void initializeMessageRequestViewModel() { @@ -481,8 +481,8 @@ public class ConversationFragment extends LoggingFragment { int startingPosition = getStartPosition(); - this.recipient = Recipient.live(ConversationActivity.getRecipientId(requireActivity().getIntent())); - this.threadId = this.getActivity().getIntent().getLongExtra(ConversationActivity.THREAD_ID_EXTRA, -1); + this.recipient = Recipient.live(conversationViewModel.getArgs().getRecipientId()); + this.threadId = conversationViewModel.getArgs().getThreadId(); this.markReadHelper = new MarkReadHelper(threadId, requireContext()); conversationViewModel.onConversationDataAvailable(threadId, startingPosition); @@ -773,8 +773,8 @@ public class ConversationFragment extends LoggingFragment { listener.onForwardClicked(); SimpleTask.run(getLifecycle(), () -> { - Intent composeIntent = new Intent(getActivity(), ShareActivity.class); - composeIntent.putExtra(Intent.EXTRA_TEXT, conversationMessage.getDisplayBody(requireContext())); + ShareIntents.Builder shareIntentBuilder = new ShareIntents.Builder(requireActivity()); + shareIntentBuilder.setText(conversationMessage.getDisplayBody(requireContext())); if (conversationMessage.getMessageRecord().isMms()) { MmsMessageRecord mediaMessage = (MmsMessageRecord) conversationMessage.getMessageRecord(); @@ -810,31 +810,24 @@ public class ConversationFragment extends LoggingFragment { } if (!mediaList.isEmpty()) { - composeIntent.putExtra(ConversationActivity.MEDIA_EXTRA, mediaList); + shareIntentBuilder.setMedia(mediaList); } } else if (mediaMessage.containsMediaSlide()) { Slide slide = mediaMessage.getSlideDeck().getSlides().get(0); - composeIntent.putExtra(Intent.EXTRA_STREAM, slide.getUri()); - composeIntent.setType(slide.getContentType()); - composeIntent.putExtra(ConversationActivity.BORDERLESS_EXTRA, slide.isBorderless()); - - if (slide.hasSticker()) { - composeIntent.putExtra(ConversationActivity.STICKER_EXTRA, slide.asAttachment().getSticker()); - composeIntent.setType(slide.asAttachment().getContentType()); - } + shareIntentBuilder.setSlide(slide); } if (mediaMessage.getSlideDeck().getTextSlide() != null && mediaMessage.getSlideDeck().getTextSlide().getUri() != null) { try (InputStream stream = PartAuthority.getAttachmentStream(requireContext(), mediaMessage.getSlideDeck().getTextSlide().getUri())) { String fullBody = Util.readFullyAsString(stream); - composeIntent.putExtra(Intent.EXTRA_TEXT, fullBody); + shareIntentBuilder.setText(fullBody); } catch (IOException e) { Log.w(TAG, "Failed to read long message text when forwarding."); } } } - return composeIntent; + return shareIntentBuilder.build(); }, this::startActivity); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java new file mode 100644 index 0000000000..0006519147 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java @@ -0,0 +1,229 @@ +package org.thoughtcrime.securesms.conversation; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.thoughtcrime.securesms.database.ThreadDatabase; +import org.thoughtcrime.securesms.mediasend.Media; +import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.sharing.ShareIntents; +import org.thoughtcrime.securesms.stickers.StickerLocator; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Objects; + +public class ConversationIntents { + + private static final String EXTRA_RECIPIENT = "recipient_id"; + private static final String EXTRA_THREAD_ID = "thread_id"; + private static final String EXTRA_TEXT = "draft_text"; + private static final String EXTRA_MEDIA = "media_list"; + private static final String EXTRA_STICKER = "sticker_extra"; + private static final String EXTRA_BORDERLESS = "borderless_extra"; + private static final String EXTRA_DISTRIBUTION_TYPE = "distribution_type"; + private static final String EXTRA_STARTING_POSITION = "starting_position"; + + private ConversationIntents() { + } + + public static @NonNull Builder createBuilder(@NonNull Context context, @NonNull RecipientId recipientId, long threadId) { + return new Builder(context, recipientId, threadId); + } + + public static @NonNull Builder createPopUpBuilder(@NonNull Context context, @NonNull RecipientId recipientId, long threadId) { + return new Builder(context, ConversationPopupActivity.class, recipientId, threadId); + } + + static boolean isInvalid(@NonNull Intent intent) { + return !intent.hasExtra(EXTRA_RECIPIENT); + } + + final static class Args { + private final RecipientId recipientId; + private final long threadId; + private final String draftText; + private final ArrayList media; + private final StickerLocator stickerLocator; + private final boolean isBorderless; + private final int distributionType; + private final int startingPosition; + + static Args from(@NonNull Intent intent) { + return new Args(RecipientId.from(Objects.requireNonNull(intent.getStringExtra(EXTRA_RECIPIENT))), + intent.getLongExtra(EXTRA_THREAD_ID, -1), + intent.getStringExtra(EXTRA_TEXT), + intent.getParcelableArrayListExtra(EXTRA_MEDIA), + intent.getParcelableExtra(EXTRA_STICKER), + intent.getBooleanExtra(EXTRA_BORDERLESS, false), + intent.getIntExtra(EXTRA_DISTRIBUTION_TYPE, ThreadDatabase.DistributionTypes.DEFAULT), + intent.getIntExtra(EXTRA_STARTING_POSITION, -1)); + } + + private Args(@NonNull RecipientId recipientId, + long threadId, + @Nullable String draftText, + @Nullable ArrayList media, + @Nullable StickerLocator stickerLocator, + boolean isBorderless, + int distributionType, + int startingPosition) + { + this.recipientId = recipientId; + this.threadId = threadId; + this.draftText = draftText; + this.media = media; + this.stickerLocator = stickerLocator; + this.isBorderless = isBorderless; + this.distributionType = distributionType; + this.startingPosition = startingPosition; + } + + public @NonNull RecipientId getRecipientId() { + return recipientId; + } + + public long getThreadId() { + return threadId; + } + + public @Nullable String getDraftText() { + return draftText; + } + + public @Nullable ArrayList getMedia() { + return media; + } + + public @Nullable StickerLocator getStickerLocator() { + return stickerLocator; + } + + public int getDistributionType() { + return distributionType; + } + + public int getStartingPosition() { + return startingPosition; + } + + public boolean isBorderless() { + return isBorderless; + } + } + + public final static class Builder { + private final Context context; + private final Class conversationActivityClass; + private final RecipientId recipientId; + private final long threadId; + + private String draftText; + private ArrayList media; + private StickerLocator stickerLocator; + private boolean isBorderless; + private int distributionType = ThreadDatabase.DistributionTypes.DEFAULT; + private int startingPosition = -1; + private Uri dataUri; + private String dataType; + + private Builder(@NonNull Context context, + @NonNull RecipientId recipientId, + long threadId) + { + this(context, ConversationActivity.class, recipientId, threadId); + } + + private Builder(@NonNull Context context, + @NonNull Class conversationActivityClass, + @NonNull RecipientId recipientId, + long threadId) + { + this.context = context; + this.conversationActivityClass = conversationActivityClass; + this.recipientId = recipientId; + this.threadId = threadId; + } + + public @NonNull Builder withDraftText(@Nullable String draftText) { + this.draftText = draftText; + return this; + } + + public @NonNull Builder withMedia(@Nullable Collection media) { + this.media = media != null ? new ArrayList<>(media) : null; + return this; + } + + public @NonNull Builder withStickerLocator(@Nullable StickerLocator stickerLocator) { + this.stickerLocator = stickerLocator; + return this; + } + + public @NonNull Builder asBorderless(boolean isBorderless) { + this.isBorderless = isBorderless; + return this; + } + + public @NonNull Builder withDistributionType(int distributionType) { + this.distributionType = distributionType; + return this; + } + + public @NonNull Builder withStartingPosition(int startingPosition) { + this.startingPosition = startingPosition; + return this; + } + + public @NonNull Builder withDataUri(@Nullable Uri dataUri) { + this.dataUri = dataUri; + return this; + } + + public @NonNull Builder withDataType(@Nullable String dataType) { + this.dataType = dataType; + return this; + } + + public @NonNull Intent build() { + if (stickerLocator != null && media != null) { + throw new IllegalStateException("Cannot have both sticker and media array"); + } + + Intent intent = new Intent(context, conversationActivityClass); + + intent.setAction(Intent.ACTION_DEFAULT); + intent.putExtra(EXTRA_RECIPIENT, recipientId.serialize()); + intent.putExtra(EXTRA_THREAD_ID, threadId); + intent.putExtra(EXTRA_DISTRIBUTION_TYPE, distributionType); + intent.putExtra(EXTRA_STARTING_POSITION, startingPosition); + intent.putExtra(EXTRA_BORDERLESS, isBorderless); + + if (draftText != null) { + intent.putExtra(EXTRA_TEXT, draftText); + } + + if (media != null) { + intent.putParcelableArrayListExtra(EXTRA_MEDIA, media); + } + + if (stickerLocator != null) { + intent.putExtra(EXTRA_STICKER, stickerLocator); + } + + if (dataUri != null && dataType != null) { + intent.setDataAndType(dataUri, dataType); + } else if (dataUri != null) { + intent.setData(dataUri); + } else if (dataType != null) { + intent.setType(dataType); + } + + return intent; + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java index d4136de99c..432a071d72 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java @@ -1,13 +1,7 @@ package org.thoughtcrime.securesms.conversation; import android.content.Intent; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; import android.os.Bundle; -import androidx.core.app.ActivityOptionsCompat; - -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.logging.Log; import android.view.Display; import android.view.Gravity; import android.view.Menu; @@ -16,6 +10,10 @@ import android.view.MenuItem; import android.view.View; import android.view.WindowManager; +import androidx.core.app.ActivityOptionsCompat; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import java.util.concurrent.ExecutionException; @@ -83,9 +81,8 @@ public class ConversationPopupActivity extends ConversationActivity { @Override public void onSuccess(Long result) { ActivityOptionsCompat transition = ActivityOptionsCompat.makeScaleUpAnimation(getWindow().getDecorView(), 0, 0, getWindow().getAttributes().width, getWindow().getAttributes().height); - Intent intent = new Intent(ConversationPopupActivity.this, ConversationActivity.class); - intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, getRecipient().getId().serialize()); - intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, result); + Intent intent = ConversationIntents.createBuilder(ConversationPopupActivity.this, getRecipient().getId(), result) + .build(); startActivity(intent, transition.toBundle()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java index 91ee2e948f..70b557b6d3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java @@ -4,6 +4,7 @@ import android.app.Application; import androidx.annotation.MainThread; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.Transformations; @@ -39,6 +40,7 @@ class ConversationViewModel extends ViewModel { private final MutableLiveData showScrollButtons; private final MutableLiveData hasUnreadMentions; + private ConversationIntents.Args args; private int jumpToPosition; private ConversationViewModel() { @@ -147,6 +149,14 @@ class ConversationViewModel extends ViewModel { return conversationMetadata.getValue() != null ? conversationMetadata.getValue().getLastSeenPosition() : 0; } + void setArgs(@NonNull ConversationIntents.Args args) { + this.args = args; + } + + @NonNull ConversationIntents.Args getArgs() { + return Objects.requireNonNull(args); + } + @Override protected void onCleared() { super.onCleared(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java index 476e9c9769..c5f0856979 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsActivity.java @@ -12,7 +12,7 @@ import androidx.navigation.Navigation; import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.groups.ui.managegroup.dialogs.GroupInviteSentDialog; import org.thoughtcrime.securesms.recipients.Recipient; @@ -73,11 +73,8 @@ public class AddGroupDetailsActivity extends PassphraseRequiredActivity implemen } void goToConversation(@NonNull RecipientId recipientId, long threadId) { - Intent intent = ConversationActivity.buildIntent(this, - recipientId, - threadId, - ThreadDatabase.DistributionTypes.DEFAULT, - -1); + Intent intent = ConversationIntents.createBuilder(this, recipientId, threadId) + .build(); startActivity(intent); setResult(RESULT_OK); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java index 6f708bec7b..71f55228ab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/joining/GroupJoinBottomSheetDialogFragment.java @@ -23,7 +23,7 @@ import org.thoughtcrime.securesms.color.MaterialColor; import org.thoughtcrime.securesms.components.AvatarImageView; import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; -import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.groups.v2.GroupInviteLinkUrl; import org.thoughtcrime.securesms.jobs.RetrieveProfileJob; @@ -152,7 +152,8 @@ public final class GroupJoinBottomSheetDialogFragment extends BottomSheetDialogF viewModel.getJoinSuccess().observe(getViewLifecycleOwner(), joinGroupSuccess -> { Log.i(TAG, "Group joined, navigating to group"); - Intent intent = ConversationActivity.buildIntent(requireContext(), joinGroupSuccess.getGroupRecipient().getId(), joinGroupSuccess.getGroupThreadId()); + Intent intent = ConversationIntents.createBuilder(requireContext(), joinGroupSuccess.getGroupRecipient().getId(), joinGroupSuccess.getGroupThreadId()) + .build(); requireActivity().startActivity(intent); dismiss(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java index badca09e9c..799282e146 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java @@ -47,6 +47,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.contactshare.ContactUtil; import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MentionUtil; import org.thoughtcrime.securesms.database.MmsSmsColumns; @@ -135,12 +136,11 @@ public class DefaultMessageNotifier implements MessageNotifier { if (visibleThread == threadId) { sendInThreadNotification(context, recipient); } else { - Intent intent = new Intent(context, ConversationActivity.class); - intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId().serialize()); - intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); - intent.setData((Uri.parse("custom://" + System.currentTimeMillis()))); - + Intent intent = ConversationIntents.createBuilder(context, recipient.getId(), threadId) + .withDataUri(Uri.parse("custom://" + System.currentTimeMillis())) + .build(); FailedNotificationBuilder builder = new FailedNotificationBuilder(context, TextSecurePreferences.getNotificationPrivacy(context), intent); + ((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE)) .notify((int)threadId, builder.build()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationItem.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationItem.java index a1d5a124ae..66b679d54f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationItem.java @@ -9,7 +9,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.TaskStackBuilder; -import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.mms.SlideDeck; import org.thoughtcrime.securesms.recipients.Recipient; @@ -90,7 +90,9 @@ public class NotificationItem { Recipient recipient = threadRecipient != null ? threadRecipient : conversationRecipient; int startingPosition = jumpToMessage ? getStartingPosition(context, threadId, messageReceivedTimestamp) : -1; - Intent intent = ConversationActivity.buildIntent(context, recipient.getId(), threadId, 0, startingPosition); + Intent intent = ConversationIntents.createBuilder(context, recipient.getId(), threadId) + .withStartingPosition(startingPosition) + .build(); makeIntentUniqueToPreventMerging(intent); diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationState.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationState.java index b06f8023d4..220b4ca75b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationState.java @@ -10,6 +10,7 @@ import androidx.annotation.Nullable; import org.thoughtcrime.securesms.contacts.TurnOffContactJoinedNotificationsActivity; import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.conversation.ConversationPopupActivity; import org.thoughtcrime.securesms.database.RecipientDatabase.VibrateState; import org.thoughtcrime.securesms.logging.Log; @@ -181,10 +182,9 @@ public class NotificationState { public PendingIntent getQuickReplyIntent(Context context, Recipient recipient) { if (threads.size() != 1) throw new AssertionError("We only support replies to single thread notifications! " + threads.size()); - Intent intent = new Intent(context, ConversationPopupActivity.class); - intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId().serialize()); - intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, (long)threads.toArray()[0]); - intent.setData((Uri.parse("custom://"+System.currentTimeMillis()))); + Intent intent = ConversationIntents.createPopUpBuilder(context, recipient.getId(), (long) threads.toArray()[0]) + .withDataUri(Uri.parse("custom://"+System.currentTimeMillis())) + .build(); return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java index 3eb07934af..55c40a9cf4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java @@ -20,32 +20,29 @@ package org.thoughtcrime.securesms.sharing; import android.content.Intent; import android.net.Uri; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.lifecycle.ViewModelProviders; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.Toolbar; +import androidx.lifecycle.ViewModelProviders; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import org.thoughtcrime.securesms.ContactSelectionListFragment; import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.SearchToolbar; import org.thoughtcrime.securesms.contacts.ContactsCursorLoader.DisplayMode; -import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.logging.Log; -import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.stickers.StickerLocator; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; @@ -56,7 +53,6 @@ import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicReference; @@ -300,37 +296,30 @@ public class ShareActivity extends PassphraseRequiredActivity } private void openConversation(long threadId, @NonNull RecipientId recipientId, @Nullable ShareData shareData) { - Intent intent = new Intent(this, ConversationActivity.class); - CharSequence textExtra = getIntent().getCharSequenceExtra(Intent.EXTRA_TEXT); - ArrayList mediaExtra = getIntent().getParcelableArrayListExtra(ConversationActivity.MEDIA_EXTRA); - StickerLocator stickerExtra = getIntent().getParcelableExtra(ConversationActivity.STICKER_EXTRA); - boolean borderlessExtra = getIntent().getBooleanExtra(ConversationActivity.BORDERLESS_EXTRA, false); - - intent.putExtra(ConversationActivity.TEXT_EXTRA, textExtra); - intent.putExtra(ConversationActivity.MEDIA_EXTRA, mediaExtra); - intent.putExtra(ConversationActivity.STICKER_EXTRA, stickerExtra); - intent.putExtra(ConversationActivity.BORDERLESS_EXTRA, borderlessExtra); + ShareIntents.Args args = ShareIntents.Args.from(getIntent()); + ConversationIntents.Builder builder = ConversationIntents.createBuilder(this, recipientId, threadId) + .withMedia(args.getExtraMedia()) + .withDraftText(args.getExtraText() != null ? args.getExtraText().toString() : null) + .withStickerLocator(args.getExtraSticker()) + .asBorderless(args.isBorderless()); if (shareData != null && shareData.isForIntent()) { Log.i(TAG, "Shared data is a single file."); - intent.setDataAndType(shareData.getUri(), shareData.getMimeType()); + builder.withDataUri(shareData.getUri()) + .withDataType(shareData.getMimeType()); } else if (shareData != null && shareData.isForMedia()) { Log.i(TAG, "Shared data is set of media."); - intent.putExtra(ConversationActivity.MEDIA_EXTRA, shareData.getMedia()); + builder.withMedia(shareData.getMedia()); } else if (shareData != null && shareData.isForPrimitive()) { Log.i(TAG, "Shared data is a primitive type."); - } else if (shareData == null && stickerExtra != null) { - intent.setType(getIntent().getType()); + } else if (shareData == null && args.getExtraSticker() != null) { + builder.withDataType(getIntent().getType()); } else { Log.i(TAG, "Shared data was not external."); } - intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipientId.serialize()); - intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); - intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT); - viewModel.onSuccessulShare(); - startActivity(intent); + startActivity(builder.build()); } } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareIntents.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareIntents.java new file mode 100644 index 0000000000..fb674651bd --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareIntents.java @@ -0,0 +1,120 @@ +package org.thoughtcrime.securesms.sharing; + +import android.content.Context; +import android.content.Intent; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.thoughtcrime.securesms.mediasend.Media; +import org.thoughtcrime.securesms.mms.Slide; +import org.thoughtcrime.securesms.stickers.StickerLocator; + +import java.util.ArrayList; +import java.util.Collection; + +public final class ShareIntents { + + private static final String EXTRA_MEDIA = "extra_media"; + private static final String EXTRA_BORDERLESS = "extra_borderless"; + private static final String EXTRA_STICKER = "extra_sticker"; + + private ShareIntents() { + } + + public static final class Args { + + private final CharSequence extraText; + private final ArrayList extraMedia; + private final StickerLocator extraSticker; + private final boolean isBorderless; + + public static Args from(@NonNull Intent intent) { + return new Args(intent.getStringExtra(Intent.EXTRA_TEXT), + intent.getParcelableArrayListExtra(EXTRA_MEDIA), + intent.getParcelableExtra(EXTRA_STICKER), + intent.getBooleanExtra(EXTRA_BORDERLESS, false)); + } + + private Args(@Nullable CharSequence extraText, + @Nullable ArrayList extraMedia, + @Nullable StickerLocator extraSticker, + boolean isBorderless) + { + this.extraText = extraText; + this.extraMedia = extraMedia; + this.extraSticker = extraSticker; + this.isBorderless = isBorderless; + } + + public @Nullable ArrayList getExtraMedia() { + return extraMedia; + } + + public @Nullable CharSequence getExtraText() { + return extraText; + } + + public @Nullable StickerLocator getExtraSticker() { + return extraSticker; + } + + public boolean isBorderless() { + return isBorderless; + } + } + + public static final class Builder { + + private final Context context; + + private String extraText; + private ArrayList extraMedia; + private Slide slide; + + public Builder(@NonNull Context context) { + this.context = context; + } + + public @NonNull Builder setText(@NonNull CharSequence extraText) { + this.extraText = extraText.toString(); + return this; + } + + public @NonNull Builder setMedia(@NonNull Collection extraMedia) { + this.extraMedia = new ArrayList<>(extraMedia); + return this; + } + + public @NonNull Builder setSlide(@NonNull Slide slide) { + this.slide = slide; + return this; + } + + public @NonNull Intent build() { + if (slide != null && extraMedia != null) { + throw new IllegalStateException("Cannot create intent with both Slide and [Media]"); + } + + Intent intent = new Intent(context, ShareActivity.class); + + intent.putExtra(Intent.EXTRA_TEXT, extraText); + + if (extraMedia != null) { + intent.putParcelableArrayListExtra(EXTRA_MEDIA, extraMedia); + } else if (slide != null) { + intent.putExtra(Intent.EXTRA_STREAM, slide.getUri()); + intent.putExtra(EXTRA_BORDERLESS, slide.isBorderless()); + + if (slide.hasSticker()) { + intent.putExtra(EXTRA_STICKER, slide.asAttachment().getSticker()); + intent.setType(slide.asAttachment().getContentType()); + } else { + intent.setType(slide.getContentType()); + } + } + + return intent; + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java b/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java index 4fb9460d05..79a4afc6fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java @@ -23,6 +23,7 @@ import androidx.fragment.app.FragmentActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.WebRtcCallActivity; import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.groups.GroupId; @@ -103,12 +104,12 @@ public class CommunicationActions { @Override protected void onPostExecute(Long threadId) { - Intent intent = ConversationActivity.buildIntent(context, recipient.getId(), threadId); - + ConversationIntents.Builder builder = ConversationIntents.createBuilder(context, recipient.getId(), threadId); if (!TextUtils.isEmpty(text)) { - intent.putExtra(ConversationActivity.TEXT_EXTRA, text); + builder.withDraftText(text); } + Intent intent = builder.build(); if (backStack != null) { backStack.addNextIntent(intent); backStack.startActivities(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ConversationUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ConversationUtil.java index 64d5441d7b..3f41d7dd7c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ConversationUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ConversationUtil.java @@ -15,6 +15,7 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.conversation.ConversationActivity; +import org.thoughtcrime.securesms.conversation.ConversationIntents; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.groups.GroupId; @@ -176,7 +177,7 @@ public final class ConversationUtil { return new ShortcutInfo.Builder(context, getShortcutId(resolved)) .setLongLived(true) - .setIntent(ConversationActivity.buildIntent(context, resolved.getId(), threadId)) + .setIntent(ConversationIntents.createBuilder(context, resolved.getId(), threadId).build()) .setShortLabel(shortName) .setLongLabel(longName) .setIcon(AvatarUtil.getIconForShortcut(context, resolved))