Prevent double tap send on camera first flow.

Defensive array list copies where used in builders and Intent#putParcelableArrayListExtra.

Spelling.
This commit is contained in:
Alan Evans
2021-02-25 12:33:39 -04:00
parent e0d9c3f149
commit e6f4b0976f
9 changed files with 49 additions and 53 deletions

View File

@@ -18,14 +18,14 @@ import org.thoughtcrime.securesms.util.MediaUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
public final class MultiShareArgs implements Parcelable {
private static final String ARGS = "ShareInterstitialArgs";
private final Set<ShareContactAndThread> shareContactAndThreads;
private final ArrayList<Media> media;
private final List<Media> media;
private final String draftText;
private final StickerLocator stickerLocator;
private final boolean borderless;
@@ -36,7 +36,7 @@ public final class MultiShareArgs implements Parcelable {
private MultiShareArgs(@NonNull Builder builder) {
shareContactAndThreads = builder.shareContactAndThreads;
media = builder.media == null ? new ArrayList<>() : builder.media;
media = builder.media == null ? new ArrayList<>() : new ArrayList<>(builder.media);
draftText = builder.draftText;
stickerLocator = builder.stickerLocator;
borderless = builder.borderless;
@@ -47,7 +47,7 @@ public final class MultiShareArgs implements Parcelable {
}
protected MultiShareArgs(Parcel in) {
shareContactAndThreads = new HashSet<>(in.createTypedArrayList(ShareContactAndThread.CREATOR));
shareContactAndThreads = new HashSet<>(Objects.requireNonNull(in.createTypedArrayList(ShareContactAndThread.CREATOR)));
media = in.createTypedArrayList(Media.CREATOR);
draftText = in.readString();
stickerLocator = in.readParcelable(StickerLocator.class.getClassLoader());
@@ -56,9 +56,10 @@ public final class MultiShareArgs implements Parcelable {
dataType = in.readString();
viewOnce = in.readByte() != 0;
String linkedPreviewString = in.readString();
LinkPreview preview;
try {
preview = LinkPreview.deserialize(in.readString());
preview = linkedPreviewString != null ? LinkPreview.deserialize(linkedPreviewString) : null;
} catch (IOException e) {
preview = null;
}
@@ -70,7 +71,7 @@ public final class MultiShareArgs implements Parcelable {
return shareContactAndThreads;
}
public ArrayList<Media> getMedia() {
public @NonNull List<Media> getMedia() {
return media;
}
@@ -176,21 +177,21 @@ public final class MultiShareArgs implements Parcelable {
private final Set<ShareContactAndThread> shareContactAndThreads;
private ArrayList<Media> media;
private String draftText;
private StickerLocator stickerLocator;
private boolean borderless;
private Uri dataUri;
private String dataType;
private LinkPreview linkPreview;
private boolean viewOnce;
private List<Media> media;
private String draftText;
private StickerLocator stickerLocator;
private boolean borderless;
private Uri dataUri;
private String dataType;
private LinkPreview linkPreview;
private boolean viewOnce;
public Builder(@NonNull Set<ShareContactAndThread> shareContactAndThreads) {
this.shareContactAndThreads = shareContactAndThreads;
}
public @NonNull Builder withMedia(@Nullable ArrayList<Media> media) {
this.media = media;
public @NonNull Builder withMedia(@Nullable List<Media> media) {
this.media = media != null ? new ArrayList<>(media) : null;
return this;
}

View File

@@ -97,7 +97,7 @@ public final class MultiShareSender {
return new MultiShareSendResultCollection(results);
}
public static @NonNull TransportOption getWorseTransportOption(@NonNull Context context, @NonNull Set<ShareContactAndThread> shareContactAndThreads) {
public static @NonNull TransportOption getWorstTransportOption(@NonNull Context context, @NonNull Set<ShareContactAndThread> shareContactAndThreads) {
for (ShareContactAndThread shareContactAndThread : shareContactAndThreads) {
TransportOption option = resolveTransportOption(context, shareContactAndThread.isForceSms());
if (option.isSms()) {

View File

@@ -160,7 +160,7 @@ public class ShareActivity extends PassphraseRequiredActivity
switch (requestCode) {
case RESULT_MEDIA_CONFIRMATION:
case RESULT_TEXT_CONFIRMATION:
viewModel.onSuccessulShare();
viewModel.onSuccessfulShare();
finish();
break;
default:
@@ -504,7 +504,7 @@ public class ShareActivity extends PassphraseRequiredActivity
Log.i(TAG, "Shared data was not external.");
}
viewModel.onSuccessulShare();
viewModel.onSuccessfulShare();
startActivity(builder.build());
}
@@ -558,14 +558,14 @@ public class ShareActivity extends PassphraseRequiredActivity
media,
Stream.of(multiShareArgs.getShareContactAndThreads()).map(ShareContactAndThread::getRecipientId).toList(),
multiShareArgs.getDraftText(),
MultiShareSender.getWorseTransportOption(this, multiShareArgs.getShareContactAndThreads())),
MultiShareSender.getWorstTransportOption(this, multiShareArgs.getShareContactAndThreads())),
RESULT_MEDIA_CONFIRMATION);
break;
default:
//noinspection CodeBlock2Expr
MultiShareSender.send(multiShareArgs, results -> {
MultiShareDialogs.displayResultDialog(this, results, () -> {
viewModel.onSuccessulShare();
viewModel.onSuccessfulShare();
finish();
});
});

View File

@@ -12,6 +12,7 @@ import org.thoughtcrime.securesms.stickers.StickerLocator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public final class ShareIntents {
@@ -68,9 +69,9 @@ public final class ShareIntents {
private final Context context;
private String extraText;
private ArrayList<Media> extraMedia;
private Slide slide;
private String extraText;
private List<Media> extraMedia;
private Slide slide;
public Builder(@NonNull Context context) {
this.context = context;
@@ -101,7 +102,7 @@ public final class ShareIntents {
intent.putExtra(Intent.EXTRA_TEXT, extraText);
if (extraMedia != null) {
intent.putParcelableArrayListExtra(EXTRA_MEDIA, extraMedia);
intent.putParcelableArrayListExtra(EXTRA_MEDIA, new ArrayList<>(extraMedia));
} else if (slide != null) {
intent.putExtra(Intent.EXTRA_STREAM, slide.getUri());
intent.putExtra(EXTRA_BORDERLESS, slide.isBorderless());

View File

@@ -103,7 +103,7 @@ public class ShareViewModel extends ViewModel {
externalShare = false;
}
public void onSuccessulShare() {
public void onSuccessfulShare() {
mediaUsed = true;
}