From 54eb579558d6bb7bfba9a1229c231aa0bdf8b17d Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 11 Mar 2022 14:32:08 -0400 Subject: [PATCH] Allow external shares to a story. --- .../securesms/sharing/MultiShareSender.java | 4 ++-- .../thoughtcrime/securesms/sharing/ShareActivity.java | 9 +++++++++ .../org/thoughtcrime/securesms/sharing/ShareData.java | 11 +++++++++++ .../securesms/sharing/ShareViewModel.java | 9 ++++++--- .../org/thoughtcrime/securesms/util/MediaUtil.java | 4 ++++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java index f4f84c0df2..d79b623847 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java @@ -124,7 +124,7 @@ public final class MultiShareSender { public static @NonNull TransportOption getWorstTransportOption(@NonNull Context context, @NonNull Set shareContactAndThreads) { for (ShareContactAndThread shareContactAndThread : shareContactAndThreads) { - TransportOption option = resolveTransportOption(context, shareContactAndThread.isForceSms()); + TransportOption option = resolveTransportOption(context, shareContactAndThread.isForceSms() && !shareContactAndThread.isStory()); if (option.isSms()) { return option; } @@ -134,7 +134,7 @@ public final class MultiShareSender { } private static @NonNull TransportOption resolveTransportOption(@NonNull Context context, @NonNull Recipient recipient) { - return resolveTransportOption(context, recipient.isForceSmsSelection() || !recipient.isRegistered()); + return resolveTransportOption(context, !recipient.isDistributionList() && (recipient.isForceSmsSelection() || !recipient.isRegistered())); } public static @NonNull TransportOption resolveTransportOption(@NonNull Context context, boolean forceSms) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java index ed9308e737..5ab298b897 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareActivity.java @@ -55,6 +55,7 @@ import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionActivity; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.sharing.interstitial.ShareInterstitialActivity; +import org.thoughtcrime.securesms.stories.Stories; import org.thoughtcrime.securesms.util.ConversationUtil; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; @@ -68,6 +69,7 @@ import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import org.whispersystems.libsignal.util.guava.Optional; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; @@ -501,6 +503,11 @@ public class ShareActivity extends PassphraseRequiredActivity } private void onConfirmSingleDestination(@NonNull ShareContact shareContact) { + if (shareContact.getRecipientId().isPresent() && Recipient.resolved(shareContact.getRecipientId().get()).isDistributionList()) { + onConfirmMultipleDestinations(Collections.singleton(shareContact)); + return; + } + shareConfirm.setClickable(false); SimpleTask.run(this.getLifecycle(), () -> resolveShareContact(shareContact), @@ -552,8 +559,10 @@ public class ShareActivity extends PassphraseRequiredActivity if (mode == -1) return; boolean isMmsOrSmsSupported = data != null ? data.isMmsOrSmsSupported() : Util.isDefaultSmsProvider(this); + boolean isStoriesSupported = Stories.isFeatureEnabled() && data != null && data.isStoriesSupported(); mode = isMmsOrSmsSupported ? mode | DisplayMode.FLAG_SMS : mode & ~DisplayMode.FLAG_SMS; + mode = isStoriesSupported ? mode | DisplayMode.FLAG_STORIES : mode & ~DisplayMode.FLAG_STORIES; getIntent().putExtra(ContactSelectionListFragment.DISPLAY_MODE, mode); contactsFragment.reset(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareData.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareData.java index 52910359ca..f5eb61a477 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareData.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareData.java @@ -5,6 +5,7 @@ import android.net.Uri; import androidx.annotation.NonNull; import org.thoughtcrime.securesms.mediasend.Media; +import org.thoughtcrime.securesms.util.MediaUtil; import org.whispersystems.libsignal.util.guava.Optional; import java.util.ArrayList; @@ -69,4 +70,14 @@ class ShareData { public boolean isMmsOrSmsSupported() { return isMmsOrSmsSupported; } + + public boolean isStoriesSupported() { + if (isForIntent()) { + return MediaUtil.isStorySupportedType(getMimeType()); + } else if (isForMedia()) { + return getMedia().stream().allMatch(media -> MediaUtil.isStorySupportedType(media.getMimeType())); + } else { + return false; + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareViewModel.java index d0b02e34fb..577b53c469 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/ShareViewModel.java @@ -76,8 +76,7 @@ public class ShareViewModel extends ViewModel { if (record.isPresent() && record.get().isAnnouncementGroup() && !record.get().isAdmin(Recipient.self())) { return ContactSelectResult.FALSE_AND_SHOW_PERMISSION_TOAST; } - } else if (SmsShareRestriction.DISALLOW_SMS_CONTACTS.equals(smsShareRestriction.getValue()) && - (!recipient.isRegistered() || recipient.isForceSmsSelection())) { + } else if (SmsShareRestriction.DISALLOW_SMS_CONTACTS.equals(smsShareRestriction.getValue()) && isRecipientAnSmsContact(recipient)) { return ContactSelectResult.FALSE_AND_SHOW_SMS_MULTISELECT_TOAST; } } @@ -154,7 +153,7 @@ public class ShareViewModel extends ViewModel { if (shareContact.getRecipientId().isPresent()) { Recipient recipient = Recipient.live(shareContact.getRecipientId().get()).get(); - if (!recipient.isRegistered() || recipient.isForceSmsSelection()) { + if (isRecipientAnSmsContact(recipient)) { return SmsShareRestriction.DISALLOW_MULTI_SHARE; } else { return SmsShareRestriction.DISALLOW_SMS_CONTACTS; @@ -167,6 +166,10 @@ public class ShareViewModel extends ViewModel { } } + private static boolean isRecipientAnSmsContact(@NonNull Recipient recipient) { + return !recipient.isDistributionList() && (!recipient.isRegistered() || recipient.isForceSmsSelection()); + } + enum ContactSelectResult { TRUE, FALSE, FALSE_AND_SHOW_PERMISSION_TOAST, FALSE_AND_SHOW_SMS_MULTISELECT_TOAST } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java index e723046944..b883333152 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java @@ -320,6 +320,10 @@ public class MediaUtil { return isImageType(contentType) || isVideoType(contentType); } + public static boolean isStorySupportedType(String contentType) { + return isImageOrVideoType(contentType) && !isGif(contentType); + } + public static boolean isImageVideoOrAudioType(String contentType) { return isImageOrVideoType(contentType) || isAudioType(contentType); }