From 49cc962bdef9c5fbe92dec3c0e1f7dac77204599 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 29 Jul 2022 15:55:05 -0300 Subject: [PATCH] Fix bug where share intent data would be redisplayed. --- .../conversation/ConversationActivity.kt | 20 ++++++++++++++ .../conversation/ConversationIntents.java | 27 +++++++++++++++---- .../ConversationParentFragment.java | 18 +++++++------ .../securesms/sharing/v2/ShareActivity.kt | 1 + 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.kt index 01e716d007..c21996f801 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.kt @@ -22,7 +22,12 @@ import org.thoughtcrime.securesms.util.views.Stub open class ConversationActivity : PassphraseRequiredActivity(), ConversationParentFragment.Callback, DonationPaymentComponent { + companion object { + private const val STATE_WATERMARK = "share_data_watermark" + } + private lateinit var fragment: ConversationParentFragment + private var shareDataTimestamp: Long = -1L private val dynamicTheme: DynamicTheme = DynamicNoActionBarTheme() override fun onPreCreate() { @@ -30,6 +35,8 @@ open class ConversationActivity : PassphraseRequiredActivity(), ConversationPare } override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { + shareDataTimestamp = savedInstanceState?.getLong(STATE_WATERMARK, -1L) ?: -1L + setContentView(R.layout.conversation_parent_fragment_container) if (savedInstanceState == null) { @@ -39,6 +46,11 @@ open class ConversationActivity : PassphraseRequiredActivity(), ConversationPare } } + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putLong(STATE_WATERMARK, shareDataTimestamp) + } + override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) @@ -64,6 +76,14 @@ open class ConversationActivity : PassphraseRequiredActivity(), ConversationPare dynamicTheme.onResume(this) } + override fun getShareDataTimestamp(): Long { + return shareDataTimestamp + } + + override fun setShareDataTimestamp(timestamp: Long) { + shareDataTimestamp = timestamp + } + override fun onInitializeToolbar(toolbar: Toolbar) { toolbar.navigationIcon = AppCompatResources.getDrawable(this, R.drawable.ic_arrow_left_24) toolbar.setNavigationOnClickListener { finish() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java index e4ad45d894..3bad3a663d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java @@ -36,6 +36,7 @@ public class ConversationIntents { private static final String EXTRA_FIRST_TIME_IN_SELF_CREATED_GROUP = "first_time_in_group"; private static final String EXTRA_WITH_SEARCH_OPEN = "with_search_open"; private static final String EXTRA_GIFT_BADGE = "gift_badge"; + private static final String EXTRA_SHARE_DATA_TIMESTAMP = "share_data_timestamp"; private static final String INTENT_DATA = "intent_data"; private static final String INTENT_TYPE = "intent_type"; @@ -99,7 +100,8 @@ public class ConversationIntents { private final int startingPosition; private final boolean firstTimeInSelfCreatedGroup; private final boolean withSearchOpen; - private final Badge giftBadge; + private final Badge giftBadge; + private final long shareDataTimestamp; static Args from(@NonNull Bundle arguments) { Uri intentDataUri = getIntentData(arguments); @@ -114,7 +116,8 @@ public class ConversationIntents { -1, false, false, - null); + null, + -1L); } return new Args(RecipientId.from(Objects.requireNonNull(arguments.getString(EXTRA_RECIPIENT))), @@ -127,7 +130,8 @@ public class ConversationIntents { arguments.getInt(EXTRA_STARTING_POSITION, -1), arguments.getBoolean(EXTRA_FIRST_TIME_IN_SELF_CREATED_GROUP, false), arguments.getBoolean(EXTRA_WITH_SEARCH_OPEN, false), - arguments.getParcelable(EXTRA_GIFT_BADGE)); + arguments.getParcelable(EXTRA_GIFT_BADGE), + arguments.getLong(EXTRA_SHARE_DATA_TIMESTAMP, -1L)); } private Args(@NonNull RecipientId recipientId, @@ -140,7 +144,8 @@ public class ConversationIntents { int startingPosition, boolean firstTimeInSelfCreatedGroup, boolean withSearchOpen, - @Nullable Badge giftBadge) + @Nullable Badge giftBadge, + long shareDataTimestamp) { this.recipientId = recipientId; this.threadId = threadId; @@ -152,7 +157,8 @@ public class ConversationIntents { this.startingPosition = startingPosition; this.firstTimeInSelfCreatedGroup = firstTimeInSelfCreatedGroup; this.withSearchOpen = withSearchOpen; - this.giftBadge = giftBadge; + this.giftBadge = giftBadge; + this.shareDataTimestamp = shareDataTimestamp; } public @NonNull RecipientId getRecipientId() { @@ -206,6 +212,10 @@ public class ConversationIntents { public @Nullable Badge getGiftBadge() { return giftBadge; } + + public long getShareDataTimestamp() { + return shareDataTimestamp; + } } public final static class Builder { @@ -225,6 +235,7 @@ public class ConversationIntents { private boolean firstTimeInSelfCreatedGroup; private boolean withSearchOpen; private Badge giftBadge; + private long shareDataTimestamp = -1L; private Builder(@NonNull Context context, @NonNull RecipientId recipientId, @@ -298,6 +309,11 @@ public class ConversationIntents { this.giftBadge = badge; return this; } + + public Builder withShareDataTimestamp(long timestamp) { + this.shareDataTimestamp = timestamp; + return this; + } public @NonNull Intent build() { if (stickerLocator != null && media != null) { @@ -325,6 +341,7 @@ public class ConversationIntents { intent.putExtra(EXTRA_FIRST_TIME_IN_SELF_CREATED_GROUP, firstTimeInSelfCreatedGroup); intent.putExtra(EXTRA_WITH_SEARCH_OPEN, withSearchOpen); intent.putExtra(EXTRA_GIFT_BADGE, giftBadge); + intent.putExtra(EXTRA_SHARE_DATA_TIMESTAMP, shareDataTimestamp); if (draftText != null) { intent.putExtra(EXTRA_TEXT, draftText); 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 f53c8036bc..e3fc29b148 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -455,7 +455,6 @@ public class ConversationParentFragment extends Fragment private int distributionType; private int reactWithAnyEmojiStartPage = -1; private boolean isSearchRequested = false; - private boolean hasProcessedShareData = false; private final LifecycleDisposable disposables = new LifecycleDisposable(); private final Debouncer optionsMenuDebouncer = new Debouncer(50); @@ -525,10 +524,6 @@ public class ConversationParentFragment extends Fragment .commitNow(); } - if (savedInstanceState != null) { - hasProcessedShareData = savedInstanceState.getBoolean("SHARED", false); - } - initializeReceivers(); initializeViews(view); updateWallpaper(args.getWallpaper()); @@ -794,7 +789,6 @@ 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 @@ -1604,10 +1598,16 @@ public class ConversationParentFragment extends Fragment private ListenableFuture initializeDraft(@NonNull ConversationIntents.Args args) { final SettableFuture result = new SettableFuture<>(); + long sharedDataTimestamp = args.getShareDataTimestamp(); + long lastTimestamp = callback.getShareDataTimestamp(); + boolean hasProcessedShareData = sharedDataTimestamp > 0 && sharedDataTimestamp <= lastTimestamp; if (hasProcessedShareData) { Log.d(TAG, "Already processed this share data. Skipping."); result.set(false); return result; + } else { + Log.d(TAG, "Have not processed this share data. Proceeding."); + callback.setShareDataTimestamp(sharedDataTimestamp); } final CharSequence draftText = args.getDraftText(); @@ -1618,8 +1618,6 @@ 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); @@ -4232,6 +4230,10 @@ public class ConversationParentFragment extends Fragment } public interface Callback { + long getShareDataTimestamp(); + + void setShareDataTimestamp(long timestamp); + default void onInitializeToolbar(@NonNull Toolbar toolbar) { } diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt index 8dd131b850..ae79d8ae41 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt @@ -193,6 +193,7 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C .withDraftText(multiShareArgs.draftText) .withStickerLocator(multiShareArgs.stickerLocator) .asBorderless(multiShareArgs.isBorderless) + .withShareDataTimestamp(System.currentTimeMillis()) finish() startActivity(conversationIntentBuilder.build())