kopia lustrzana https://github.com/ryukoposting/Signal-Android
Prevent double tap send on camera first flow.
Defensive array list copies where used in builders and Intent#putParcelableArrayListExtra. Spelling.fork-5.53.8
rodzic
e0d9c3f149
commit
e6f4b0976f
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -103,7 +103,7 @@ public class ShareViewModel extends ViewModel {
|
|||
externalShare = false;
|
||||
}
|
||||
|
||||
public void onSuccessulShare() {
|
||||
public void onSuccessfulShare() {
|
||||
mediaUsed = true;
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue