Prevent double tap send on camera first flow.

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

Spelling.
fork-5.53.8
Alan Evans 2021-02-25 12:33:39 -04:00
rodzic e0d9c3f149
commit e6f4b0976f
9 zmienionych plików z 49 dodań i 53 usunięć

Wyświetl plik

@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.wallpaper.ChatWallpaper;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
public class ConversationIntents {
@ -162,15 +163,15 @@ public class ConversationIntents {
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,
@ -265,7 +266,7 @@ public class ConversationIntents {
}
if (media != null) {
intent.putParcelableArrayListExtra(EXTRA_MEDIA, media);
intent.putParcelableArrayListExtra(EXTRA_MEDIA, new ArrayList<>(media));
}
if (stickerLocator != null) {

Wyświetl plik

@ -217,7 +217,7 @@ final class ManageGroupRepository {
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();

Wyświetl plik

@ -48,6 +48,7 @@ import org.thoughtcrime.securesms.util.Util;
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 {
@ -332,7 +333,7 @@ public class ManageGroupViewModel extends ViewModel {
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);
}
});

Wyświetl plik

@ -569,22 +569,14 @@ public class MediaSendActivity extends PassphraseRequiredActivity implements Med
@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) {
@ -600,7 +592,7 @@ public class MediaSendActivity extends PassphraseRequiredActivity implements Med
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);

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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