Always ensure the send type matches the send button.

fork-5.53.8
Greyson Parrelli 2022-06-21 17:27:57 -04:00 zatwierdzone przez Alex Hart
rodzic 852989ce48
commit 4c4cfe917d
2 zmienionych plików z 38 dodań i 48 usunięć

Wyświetl plik

@ -832,7 +832,6 @@ public class ConversationParentFragment extends Fragment
}
long expiresIn = TimeUnit.SECONDS.toMillis(recipient.get().getExpiresInSeconds());
int subscriptionId = sendButton.getSelectedSendType().getSimSubscriptionIdOr(-1);
boolean initiating = threadId == -1;
QuoteModel quote = result.isViewOnce() ? null : inputPanel.getQuote().orElse(null);
SlideDeck slideDeck = new SlideDeck();
@ -853,7 +852,7 @@ public class ConversationParentFragment extends Fragment
final Context context = requireContext().getApplicationContext();
sendMediaMessage(result.getRecipientId(),
result.getMessageSendType().usesSmsTransport(),
result.getMessageSendType(),
result.getBody(),
slideDeck,
quote,
@ -862,7 +861,6 @@ public class ConversationParentFragment extends Fragment
mentions,
expiresIn,
result.isViewOnce(),
subscriptionId,
initiating,
true,
null).addListener(new AssertedSuccessListener<Void>() {
@ -2758,11 +2756,10 @@ public class ConversationParentFragment extends Fragment
}
private void sendSharedContact(List<Contact> contacts) {
int subscriptionId = sendButton.getSelectedSendType().getSimSubscriptionIdOr(-1);
long expiresIn = TimeUnit.SECONDS.toMillis(recipient.get().getExpiresInSeconds());
boolean initiating = threadId == -1;
sendMediaMessage(recipient.getId(), isSmsForced(), "", attachmentManager.buildSlideDeck(), null, contacts, Collections.emptyList(), Collections.emptyList(), expiresIn, false, subscriptionId, initiating, false, null);
sendMediaMessage(recipient.getId(), sendButton.getSelectedSendType(), "", attachmentManager.buildSlideDeck(), null, contacts, Collections.emptyList(), Collections.emptyList(), expiresIn, false, initiating, false, null);
}
private void selectContactInfo(ContactData contactData) {
@ -3060,8 +3057,6 @@ public class ConversationParentFragment extends Fragment
String message = getMessage();
MessageSendType sendType = sendButton.getSelectedSendType();
boolean forceSms = (recipient.isForceSmsSelection() || sendButton.isManualSelection()) && sendType.usesSmsTransport();
int subscriptionId = sendButton.getSelectedSendType().getSimSubscriptionIdOr(-1);
long expiresIn = TimeUnit.SECONDS.toMillis(recipient.getExpiresInSeconds());
boolean initiating = threadId == -1;
boolean needsSplit = !sendType.usesSmsTransport() && message.length() > sendType.calculateCharacters(message).maxPrimaryMessageSize;
@ -3073,16 +3068,16 @@ public class ConversationParentFragment extends Fragment
linkPreviewViewModel.hasLinkPreview() ||
needsSplit;
Log.i(TAG, "[sendMessage] recipient: " + recipient.getId() + ", threadId: " + threadId + ", forceSms: " + forceSms + ", isManual: " + sendButton.isManualSelection());
Log.i(TAG, "[sendMessage] recipient: " + recipient.getId() + ", threadId: " + threadId + ", sendType: " + (sendType.usesSignalTransport() ? "signal" : "sms") + ", isManual: " + sendButton.isManualSelection());
if ((recipient.isMmsGroup() || recipient.getEmail().isPresent()) && !isMmsEnabled) {
handleManualMmsRequired();
} else if (!forceSms && (identityRecords.isUnverified(true) || identityRecords.isUntrusted(true))) {
} else if (sendType.usesSignalTransport() && (identityRecords.isUnverified(true) || identityRecords.isUntrusted(true))) {
handleRecentSafetyNumberChange();
} else if (isMediaMessage) {
sendMediaMessage(forceSms, expiresIn, false, subscriptionId, initiating, metricId);
sendMediaMessage(sendType, expiresIn, false, initiating, metricId);
} else {
sendTextMessage(forceSms, expiresIn, subscriptionId, initiating, metricId);
sendTextMessage(sendType, expiresIn, initiating, metricId);
}
} catch (RecipientFormattingException ex) {
Toast.makeText(requireContext(),
@ -3124,13 +3119,13 @@ public class ConversationParentFragment extends Fragment
}, this::sendComplete);
}
private void sendMediaMessage(final boolean forceSms, final long expiresIn, final boolean viewOnce, final int subscriptionId, final boolean initiating, @Nullable String metricId)
private void sendMediaMessage(@NonNull MessageSendType sendType, final long expiresIn, final boolean viewOnce, final boolean initiating, @Nullable String metricId)
throws InvalidMessageException
{
Log.i(TAG, "Sending media message...");
List<LinkPreview> linkPreviews = linkPreviewViewModel.onSend();
sendMediaMessage(recipient.getId(),
forceSms,
sendType,
getMessage(),
attachmentManager.buildSlideDeck(),
inputPanel.getQuote().orElse(null),
@ -3139,14 +3134,13 @@ public class ConversationParentFragment extends Fragment
composeText.getMentions(),
expiresIn,
viewOnce,
subscriptionId,
initiating,
true,
metricId);
}
private ListenableFuture<Void> sendMediaMessage(@NonNull RecipientId recipientId,
final boolean forceSms,
@NonNull MessageSendType sendType,
@NonNull String body,
SlideDeck slideDeck,
QuoteModel quote,
@ -3155,17 +3149,16 @@ public class ConversationParentFragment extends Fragment
List<Mention> mentions,
final long expiresIn,
final boolean viewOnce,
final int subscriptionId,
final boolean initiating,
final boolean clearComposeBox,
final @Nullable String metricId)
{
if (!isDefaultSms && (!isSecureText || forceSms) && recipient.get().hasSmsAddress()) {
if (!isDefaultSms && sendType.usesSmsTransport() && recipient.get().hasSmsAddress()) {
showDefaultSmsPrompt();
return new SettableFuture<>(null);
}
final boolean sendPush = (isSecureText && !forceSms) || recipient.get().isServiceIdOnly();
final boolean sendPush = sendType.usesSignalTransport();
final long thread = this.threadId;
if (sendPush) {
@ -3177,7 +3170,7 @@ public class ConversationParentFragment extends Fragment
}
}
OutgoingMediaMessage outgoingMessageCandidate = new OutgoingMediaMessage(Recipient.resolved(recipientId), slideDeck, body, System.currentTimeMillis(), subscriptionId, expiresIn, viewOnce, distributionType, StoryType.NONE, null, false, quote, contacts, previews, mentions, null);
OutgoingMediaMessage outgoingMessageCandidate = new OutgoingMediaMessage(Recipient.resolved(recipientId), slideDeck, body, System.currentTimeMillis(), sendType.getSimSubscriptionIdOr(-1), expiresIn, viewOnce, distributionType, StoryType.NONE, null, false, quote, contacts, previews, mentions, null);
final SettableFuture<Void> future = new SettableFuture<>();
final Context context = requireContext().getApplicationContext();
@ -3205,7 +3198,7 @@ public class ConversationParentFragment extends Fragment
final long id = fragment.stageOutgoingMessage(outgoingMessage);
SimpleTask.run(() -> {
return MessageSender.send(context, outgoingMessage, thread, forceSms, metricId, null);
return MessageSender.send(context, outgoingMessage, thread, sendType.usesSmsTransport(), metricId, null);
}, result -> {
sendComplete(result);
future.set(null);
@ -3217,10 +3210,10 @@ public class ConversationParentFragment extends Fragment
return future;
}
private void sendTextMessage(final boolean forceSms, final long expiresIn, final int subscriptionId, final boolean initiating, final @Nullable String metricId)
private void sendTextMessage(@NonNull MessageSendType sendType, final long expiresIn, final boolean initiating, final @Nullable String metricId)
throws InvalidMessageException
{
if (!isDefaultSms && (!isSecureText || forceSms) && recipient.get().hasSmsAddress()) {
if (!isDefaultSms && sendType.usesSmsTransport() && recipient.get().hasSmsAddress()) {
showDefaultSmsPrompt();
return;
}
@ -3228,7 +3221,7 @@ public class ConversationParentFragment extends Fragment
final long thread = this.threadId;
final Context context = requireContext().getApplicationContext();
final String messageBody = getMessage();
final boolean sendPush = (isSecureText && !forceSms) || recipient.get().isServiceIdOnly();
final boolean sendPush = sendType.usesSignalTransport();
OutgoingTextMessage message;
@ -3236,7 +3229,7 @@ public class ConversationParentFragment extends Fragment
message = new OutgoingEncryptedMessage(recipient.get(), messageBody, expiresIn);
ApplicationDependencies.getTypingStatusSender().onTypingStopped(thread);
} else {
message = new OutgoingTextMessage(recipient.get(), messageBody, expiresIn, subscriptionId);
message = new OutgoingTextMessage(recipient.get(), messageBody, expiresIn, sendType.getSimSubscriptionIdOr(-1));
}
Permissions.with(this)
@ -3246,7 +3239,7 @@ public class ConversationParentFragment extends Fragment
.onAllGranted(() -> {
final long id = new SecureRandom().nextLong();
SimpleTask.run(() -> {
return MessageSender.send(context, message, thread, forceSms, metricId, null);
return MessageSender.send(context, message, thread, sendType.usesSmsTransport(), metricId, null);
}, this::sendComplete);
silentlySetComposeText("");
@ -3455,16 +3448,14 @@ public class ConversationParentFragment extends Fragment
}
private void sendVoiceNote(@NonNull Uri uri, long size) {
boolean forceSms = sendButton.isManualSelection() && sendButton.getSelectedSendType().usesSmsTransport();
boolean initiating = threadId == -1;
int subscriptionId = sendButton.getSelectedSendType().getSimSubscriptionIdOr(-1);
long expiresIn = TimeUnit.SECONDS.toMillis(recipient.get().getExpiresInSeconds());
AudioSlide audioSlide = new AudioSlide(requireContext(), uri, size, MediaUtil.AUDIO_AAC, true);
SlideDeck slideDeck = new SlideDeck();
slideDeck.addSlide(audioSlide);
ListenableFuture<Void> sendResult = sendMediaMessage(recipient.getId(),
forceSms,
sendButton.getSelectedSendType(),
"",
slideDeck,
inputPanel.getQuote().orElse(null),
@ -3473,7 +3464,6 @@ public class ConversationParentFragment extends Fragment
composeText.getMentions(),
expiresIn,
false,
subscriptionId,
initiating,
true,
null);
@ -3504,7 +3494,6 @@ public class ConversationParentFragment extends Fragment
}
long expiresIn = TimeUnit.SECONDS.toMillis(recipient.get().getExpiresInSeconds());
int subscriptionId = sendButton.getSelectedSendType().getSimSubscriptionIdOr(-1);
boolean initiating = threadId == -1;
MessageSendType sendType = sendButton.getSelectedSendType();
SlideDeck slideDeck = new SlideDeck();
@ -3512,7 +3501,7 @@ public class ConversationParentFragment extends Fragment
slideDeck.addSlide(stickerSlide);
sendMediaMessage(recipient.getId(), sendType.usesSmsTransport(), "", slideDeck, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), expiresIn, false, subscriptionId, initiating, clearCompose, null);
sendMediaMessage(recipient.getId(), sendType, "", slideDeck, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), expiresIn, false, initiating, clearCompose, null);
}
private void silentlySetComposeText(String text) {
@ -4155,7 +4144,6 @@ public class ConversationParentFragment extends Fragment
}
long expiresIn = TimeUnit.SECONDS.toMillis(recipient.get().getExpiresInSeconds());
int subscriptionId = sendButton.getSelectedSendType().getSimSubscriptionIdOr(-1);
boolean initiating = threadId == -1;
SlideDeck slideDeck = new SlideDeck();
@ -4168,7 +4156,7 @@ public class ConversationParentFragment extends Fragment
}
sendMediaMessage(recipient.getId(),
isSmsForced(),
sendButton.getSelectedSendType(),
"",
slideDeck,
null,
@ -4177,7 +4165,6 @@ public class ConversationParentFragment extends Fragment
composeText.getMentions(),
expiresIn,
false,
subscriptionId,
initiating,
false,
null);

Wyświetl plik

@ -7,8 +7,8 @@ import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import kotlinx.parcelize.Parcelize
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.util.CharacterCalculator
import org.thoughtcrime.securesms.util.MmsCharacterCalculator
import org.thoughtcrime.securesms.util.PushCharacterCalculator
@ -125,6 +125,9 @@ sealed class MessageSendType(
}
companion object {
private val TAG = Log.tag(MessageSendType::class.java)
/**
* Returns a list of all available [MessageSendType]s. Requires [Manifest.permission.READ_PHONE_STATE] in order to get available
* SMS options.
@ -135,22 +138,22 @@ sealed class MessageSendType(
options += SignalMessageSendType
if (!Permissions.hasAll(context, Manifest.permission.READ_PHONE_STATE)) {
return options
}
try {
val subscriptions: Collection<SubscriptionInfoCompat> = SubscriptionManagerCompat(context).activeAndReadySubscriptionInfos
val subscriptions: Collection<SubscriptionInfoCompat> = SubscriptionManagerCompat(context).activeAndReadySubscriptionInfos
if (subscriptions.size < 2) {
options += if (isMedia) MmsMessageSendType() else SmsMessageSendType()
} else {
options += subscriptions.map {
if (isMedia) {
MmsMessageSendType(simName = it.displayName, simSubscriptionId = it.subscriptionId)
} else {
SmsMessageSendType(simName = it.displayName, simSubscriptionId = it.subscriptionId)
if (subscriptions.size < 2) {
options += if (isMedia) MmsMessageSendType() else SmsMessageSendType()
} else {
options += subscriptions.map {
if (isMedia) {
MmsMessageSendType(simName = it.displayName, simSubscriptionId = it.subscriptionId)
} else {
SmsMessageSendType(simName = it.displayName, simSubscriptionId = it.subscriptionId)
}
}
}
} catch (e: SecurityException) {
Log.w(TAG, "Did not have permission to get SMS subscription details!")
}
return options