Skip to content

Commit

Permalink
Prevent double tap send on camera first flow.
Browse files Browse the repository at this point in the history
Defensive array list copies where used in builders and Intent#putParcelableArrayListExtra.

Spelling.
  • Loading branch information
alan-signal committed Feb 25, 2021
1 parent e0d9c3f commit e6f4b09
Show file tree
Hide file tree
Showing 9 changed files with 49 additions and 53 deletions.
Expand Up @@ -16,6 +16,7 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;

public class ConversationIntents {
Expand Down Expand Up @@ -162,15 +163,15 @@ public final static class Builder {
private final RecipientId recipientId;
private final long threadId;

private String draftText;
private ArrayList<Media> media;
private StickerLocator stickerLocator;
private boolean isBorderless;
private int distributionType = ThreadDatabase.DistributionTypes.DEFAULT;
private int startingPosition = -1;
private Uri dataUri;
private String dataType;
private boolean firstTimeInSelfCreatedGroup;
private String draftText;
private List<Media> media;
private StickerLocator stickerLocator;
private boolean isBorderless;
private int distributionType = ThreadDatabase.DistributionTypes.DEFAULT;
private int startingPosition = -1;
private Uri dataUri;
private String dataType;
private boolean firstTimeInSelfCreatedGroup;

private Builder(@NonNull Context context,
@NonNull RecipientId recipientId,
Expand Down Expand Up @@ -265,7 +266,7 @@ public Builder firstTimeInSelfCreatedGroup() {
}

if (media != null) {
intent.putParcelableArrayListExtra(EXTRA_MEDIA, media);
intent.putParcelableArrayListExtra(EXTRA_MEDIA, new ArrayList<>(media));
}

if (stickerLocator != null) {
Expand Down
Expand Up @@ -217,7 +217,7 @@ public int getRemainingCapacity() {
return selectionLimits.getHardLimit() - members.size();
}

public @NonNull ArrayList<RecipientId> getMembersWithoutSelf() {
public @NonNull List<RecipientId> getMembersWithoutSelf() {
ArrayList<RecipientId> recipientIds = new ArrayList<>(members.size());
RecipientId selfId = Recipient.self().getId();

Expand Down
Expand Up @@ -48,6 +48,7 @@
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;

import java.util.ArrayList;
import java.util.List;

public class ManageGroupViewModel extends ViewModel {
Expand Down Expand Up @@ -332,7 +333,7 @@ public void onAddMembersClick(@NonNull Fragment fragment, int resultCode) {
intent.putExtra(AddMembersActivity.GROUP_ID, getGroupId().toString());
intent.putExtra(ContactSelectionListFragment.DISPLAY_MODE, ContactsCursorLoader.DisplayMode.FLAG_PUSH);
intent.putExtra(ContactSelectionListFragment.SELECTION_LIMITS, new SelectionLimits(capacity.getSelectionWarning(), capacity.getSelectionLimit()));
intent.putParcelableArrayListExtra(ContactSelectionListFragment.CURRENT_SELECTION, capacity.getMembersWithoutSelf());
intent.putParcelableArrayListExtra(ContactSelectionListFragment.CURRENT_SELECTION, new ArrayList<>(capacity.getMembersWithoutSelf()));
fragment.startActivityForResult(intent, resultCode);
}
});
Expand Down
Expand Up @@ -569,22 +569,14 @@ public void onCameraSelected() {

@Override
public void onCameraContactsSendClicked(@NonNull List<Recipient> recipients) {
MediaSendFragment fragment = getMediaSendFragment();

if (fragment != null) {
fragment.pausePlayback();

SimpleProgressDialog.DismissibleDialog dialog = SimpleProgressDialog.showDelayed(this, 300, 0);
viewModel.onSendClicked(buildModelsToTransform(fragment), recipients, composeText.getMentions()).observe(this, result -> {
dialog.dismiss();
setActivityResultAndFinish(result);
});
} else {
throw new AssertionError("No editor fragment available!");
}
onSend(recipients);
}

private void onSendClicked() {
onSend(Collections.emptyList());
}

private void onSend(@NonNull List<Recipient> recipients) {
MediaSendFragment fragment = getMediaSendFragment();

if (fragment == null) {
Expand All @@ -600,7 +592,7 @@ private void onSendClicked() {
fragment.pausePlayback();

SimpleProgressDialog.DismissibleDialog dialog = SimpleProgressDialog.showDelayed(this, 300, 0);
viewModel.onSendClicked(buildModelsToTransform(fragment), Collections.emptyList(), composeText.getMentions())
viewModel.onSendClicked(buildModelsToTransform(fragment), recipients, composeText.getMentions())
.observe(this, result -> {
dialog.dismiss();
setActivityResultAndFinish(result);
Expand Down
Expand Up @@ -18,14 +18,14 @@
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;
Expand All @@ -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;
Expand All @@ -47,7 +47,7 @@ private MultiShareArgs(@NonNull Builder builder) {
}

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());
Expand All @@ -56,9 +56,10 @@ protected MultiShareArgs(Parcel in) {
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;
}
Expand All @@ -70,7 +71,7 @@ public Set<ShareContactAndThread> getShareContactAndThreads() {
return shareContactAndThreads;
}

public ArrayList<Media> getMedia() {
public @NonNull List<Media> getMedia() {
return media;
}

Expand Down Expand Up @@ -176,21 +177,21 @@ public static final class Builder {

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;
}

Expand Down
Expand Up @@ -97,7 +97,7 @@ private static MultiShareSendResultCollection sendInternal(@NonNull MultiShareAr
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()) {
Expand Down
Expand Up @@ -160,7 +160,7 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
switch (requestCode) {
case RESULT_MEDIA_CONFIRMATION:
case RESULT_TEXT_CONFIRMATION:
viewModel.onSuccessulShare();
viewModel.onSuccessfulShare();
finish();
break;
default:
Expand Down Expand Up @@ -504,7 +504,7 @@ private void openConversation(long threadId, @NonNull RecipientId recipientId, @
Log.i(TAG, "Shared data was not external.");
}

viewModel.onSuccessulShare();
viewModel.onSuccessfulShare();

startActivity(builder.build());
}
Expand Down Expand Up @@ -558,14 +558,14 @@ private void openInterstitial(@NonNull Set<ShareContactAndThread> shareContactAn
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();
});
});
Expand Down
Expand Up @@ -12,6 +12,7 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public final class ShareIntents {

Expand Down Expand Up @@ -68,9 +69,9 @@ public static final class Builder {

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;
Expand Down Expand Up @@ -101,7 +102,7 @@ public Builder(@NonNull Context context) {
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());
Expand Down
Expand Up @@ -103,7 +103,7 @@ void onNonExternalShare() {
externalShare = false;
}

public void onSuccessulShare() {
public void onSuccessfulShare() {
mediaUsed = true;
}

Expand Down

0 comments on commit e6f4b09

Please sign in to comment.