Fix bug where share intent data would be redisplayed.
This commit is contained in:
parent
d0420ba51d
commit
49cc962bde
4 changed files with 53 additions and 13 deletions
|
@ -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() }
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
}
|
||||
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Add table
Reference in a new issue