From c9e160798745db075abcfc428f9ab9e85c58ea2c Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 18 Jul 2022 12:41:05 -0300 Subject: [PATCH] Ensure share intents are not re-used for draft data. --- .../ConversationParentFragment.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) 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 5ea93c17f0..23ae484986 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -454,6 +454,7 @@ public class ConversationParentFragment extends Fragment private boolean isMmsEnabled = true; private boolean isSecurityInitialized = false; private boolean isSearchRequested = false; + private boolean hasProcessedShareData = false; private final LifecycleDisposable disposables = new LifecycleDisposable(); private final Debouncer optionsMenuDebouncer = new Debouncer(50); @@ -519,6 +520,10 @@ public class ConversationParentFragment extends Fragment final boolean typingIndicatorsEnabled = TextSecurePreferences.isTypingIndicatorsEnabled(requireContext()); + if (savedInstanceState != null) { + hasProcessedShareData = savedInstanceState.getBoolean("SHARED", false); + } + initializeReceivers(); initializeViews(view); updateWallpaper(args.getWallpaper()); @@ -549,6 +554,8 @@ public class ConversationParentFragment extends Fragment initializeProfiles(); initializeGv1Migration(); + + Log.d(TAG, "Initializing data from onViewCreated..."); initializeDraft(args).addListener(new AssertedSuccessListener() { @Override public void onSuccess(Boolean loadedDraft) { @@ -635,10 +642,13 @@ public class ConversationParentFragment extends Fragment reportShortcutLaunch(viewModel.getArgs().getRecipientId()); initializeResources(viewModel.getArgs()); + initializeSecurity(recipient.get().isRegistered(), isDefaultSms).addListener(new AssertedSuccessListener() { @Override public void onSuccess(Boolean result) { if (getContext() != null) { + Log.d(TAG, "Initializing draft from new intent..."); + hasProcessedShareData = false; initializeDraft(viewModel.getArgs()); } } @@ -886,6 +896,7 @@ public class ConversationParentFragment extends Fragment outState.putInt(STATE_REACT_WITH_ANY_PAGE, reactWithAnyEmojiStartPage); outState.putBoolean(STATE_IS_SEARCH_REQUESTED, isSearchRequested); + outState.putBoolean("SHARED", hasProcessedShareData); } @Override @@ -1657,6 +1668,12 @@ public class ConversationParentFragment extends Fragment private ListenableFuture initializeDraft(@NonNull ConversationIntents.Args args) { final SettableFuture result = new SettableFuture<>(); + if (hasProcessedShareData) { + Log.d(TAG, "Already processed this share data. Skipping."); + result.set(false); + return result; + } + final CharSequence draftText = args.getDraftText(); final Uri draftMedia = requireActivity().getIntent().getData(); final String draftContentType = requireActivity().getIntent().getType(); @@ -1665,6 +1682,8 @@ public class ConversationParentFragment extends Fragment final StickerLocator stickerLocator = args.getStickerLocator(); final boolean borderless = args.isBorderless(); + hasProcessedShareData = true; + if (stickerLocator != null && draftMedia != null) { Log.d(TAG, "Handling shared sticker."); sendSticker(stickerLocator, Objects.requireNonNull(draftContentType), draftMedia, 0, true); @@ -1672,6 +1691,7 @@ public class ConversationParentFragment extends Fragment } if (draftMedia != null && draftContentType != null && borderless) { + Log.d(TAG, "Handling borderless draft media with content type " + draftContentType); SimpleTask.run(getLifecycle(), () -> getKeyboardImageDetails(draftMedia), details -> sendKeyboardImage(draftMedia, draftContentType, details));