Fix bug where share intent data would be redisplayed.

fork-5.53.8
Alex Hart 2022-07-29 15:55:05 -03:00 zatwierdzone przez Greyson Parrelli
rodzic d0420ba51d
commit 49cc962bde
4 zmienionych plików z 53 dodań i 13 usunięć

Wyświetl plik

@ -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() }

Wyświetl plik

@ -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);

Wyświetl plik

@ -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<Boolean> initializeDraft(@NonNull ConversationIntents.Args args) {
final SettableFuture<Boolean> 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) {
}

Wyświetl plik

@ -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())