Remove more SMS vestiges.

This commit is contained in:
Greyson Parrelli
2024-03-12 13:47:18 -04:00
parent 6754fef164
commit 825ca0d737
94 changed files with 60 additions and 8017 deletions

View File

@@ -54,7 +54,6 @@ import androidx.annotation.ColorInt;
import androidx.annotation.DimenRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LifecycleOwner;
import androidx.media3.common.MediaItem;
@@ -107,8 +106,6 @@ import org.thoughtcrime.securesms.conversation.v2.items.InteractiveConversationE
import org.thoughtcrime.securesms.conversation.v2.items.V2ConversationItemUtils;
import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.MediaTable;
import org.thoughtcrime.securesms.database.MessageTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.database.model.Quote;
@@ -118,8 +115,6 @@ import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicy;
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicyEnforcer;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob;
import org.thoughtcrime.securesms.jobs.MmsSendJob;
import org.thoughtcrime.securesms.jobs.SmsSendJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory;
@@ -2687,8 +2682,6 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
if (eventListener != null) {
eventListener.onIncomingIdentityMismatchClicked(messageRecord.getFromRecipient().getId());
}
} else if (messageRecord.isPendingInsecureSmsFallback()) {
handleMessageApproval();
}
}
}
@@ -2782,45 +2775,4 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
footer.setAudioDuration(durationMillis, playheadMillis);
}
}
private void handleMessageApproval() {
final int title;
final int message;
if (messageRecord.isMms()) title = R.string.ConversationItem_click_to_approve_unencrypted_mms_dialog_title;
else title = R.string.ConversationItem_click_to_approve_unencrypted_sms_dialog_title;
message = R.string.ConversationItem_click_to_approve_unencrypted_dialog_message;
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(context);
builder.setTitle(title);
if (message > -1) builder.setMessage(message);
builder.setPositiveButton(R.string.yes, (dialogInterface, i) -> {
MessageTable db = SignalDatabase.messages();
db.markAsInsecure(messageRecord.getId());
db.markAsOutbox(messageRecord.getId());
db.markAsForcedSms(messageRecord.getId());
if (messageRecord.isMms()) {
MmsSendJob.enqueue(context,
ApplicationDependencies.getJobManager(),
messageRecord.getId());
} else {
ApplicationDependencies.getJobManager().add(new SmsSendJob(messageRecord.getId(),
messageRecord.getToRecipient()));
}
});
builder.setNegativeButton(R.string.no, (dialogInterface, i) -> {
if (messageRecord.isMms()) {
SignalDatabase.messages().markAsSentFailed(messageRecord.getId());
} else {
SignalDatabase.messages().markAsSentFailed(messageRecord.getId());
}
});
builder.show();
}
}

View File

@@ -8,9 +8,7 @@ import androidx.annotation.StringRes
import kotlinx.parcelize.Parcelize
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.util.CharacterCalculator
import org.thoughtcrime.securesms.util.MmsCharacterCalculator
import org.thoughtcrime.securesms.util.PushCharacterCalculator
import org.thoughtcrime.securesms.util.SmsCharacterCalculator
import java.lang.IllegalArgumentException
/**
@@ -29,15 +27,9 @@ sealed class MessageSendType(
@ColorRes
val backgroundColorRes: Int,
val transportType: TransportType,
val characterCalculator: CharacterCalculator,
open val simName: CharSequence? = null,
open val simSubscriptionId: Int? = null
val characterCalculator: CharacterCalculator
) : Parcelable {
@get:JvmName("usesSmsTransport")
val usesSmsTransport
get() = transportType == TransportType.SMS
@get:JvmName("usesSignalTransport")
val usesSignalTransport
get() = transportType == TransportType.SIGNAL
@@ -50,54 +42,6 @@ sealed class MessageSendType(
return context.getString(titleRes)
}
/**
* A type representing an SMS message, with optional SIM fields for multi-SIM devices.
*/
@Parcelize
data class SmsMessageSendType(override val simName: CharSequence? = null, override val simSubscriptionId: Int? = null) : MessageSendType(
titleRes = R.string.ConversationActivity_transport_insecure_sms,
composeHintRes = R.string.conversation_activity__type_message_sms_insecure,
buttonDrawableRes = R.drawable.ic_send_unlock_24,
menuDrawableRes = R.drawable.ic_insecure_24,
backgroundColorRes = R.color.core_grey_50,
transportType = TransportType.SMS,
characterCalculator = SmsCharacterCalculator(),
simName = simName,
simSubscriptionId = simSubscriptionId
) {
override fun getTitle(context: Context): String {
return if (simName == null) {
super.getTitle(context)
} else {
context.getString(R.string.ConversationActivity_transport_insecure_sms_with_sim, simName)
}
}
}
/**
* A type representing an MMS message, with optional SIM fields for multi-SIM devices.
*/
@Parcelize
data class MmsMessageSendType(override val simName: CharSequence? = null, override val simSubscriptionId: Int? = null) : MessageSendType(
titleRes = R.string.ConversationActivity_transport_insecure_mms,
composeHintRes = R.string.conversation_activity__type_message_mms_insecure,
buttonDrawableRes = R.drawable.ic_send_unlock_24,
menuDrawableRes = R.drawable.ic_insecure_24,
backgroundColorRes = R.color.core_grey_50,
transportType = TransportType.SMS,
characterCalculator = MmsCharacterCalculator(),
simName = simName,
simSubscriptionId = simSubscriptionId
) {
override fun getTitle(context: Context): String {
return if (simName == null) {
super.getTitle(context)
} else {
context.getString(R.string.ConversationActivity_transport_insecure_sms_with_sim, simName)
}
}
}
/**
* A type representing a basic Signal message.
*/

View File

@@ -1,20 +1,9 @@
package org.thoughtcrime.securesms.conversation.mutiselect
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.net.Uri
import androidx.core.content.ContextCompat
import org.thoughtcrime.securesms.attachments.Attachment
import org.thoughtcrime.securesms.conversation.ConversationMessage
import org.thoughtcrime.securesms.conversation.MessageSendType
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.mms.MediaConstraints
import org.thoughtcrime.securesms.mms.SlideDeck
import org.thoughtcrime.securesms.mms.TextSlide
import org.thoughtcrime.securesms.util.Util
/**
* General helper object for all things multiselect. This is only utilized by
@@ -65,51 +54,4 @@ object Multiselect {
return parts
}
fun canSendToNonPush(context: Context, multiselectPart: MultiselectPart): Boolean {
return when (multiselectPart) {
is MultiselectPart.Attachments -> canSendAllAttachmentsToNonPush(context, multiselectPart.conversationMessage.messageRecord)
is MultiselectPart.Message -> canSendAllAttachmentsToNonPush(context, multiselectPart.conversationMessage.messageRecord)
is MultiselectPart.Text -> true
is MultiselectPart.Update -> throw AssertionError("Should never get to here.")
}
}
/**
* Helper function to determine whether a given attachment can be sent via MMS.
*/
fun isMmsSupported(context: Context, mediaUri: Uri, mediaType: String, mediaSize: Long): Boolean {
val canReadPhoneState = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
if (!Util.isDefaultSmsProvider(context) || !canReadPhoneState || !Util.isMmsCapable(context) || !SignalStore.misc().smsExportPhase.allowSmsFeatures()) {
return false
}
val sendType: MessageSendType = MessageSendType.getFirstForTransport(MessageSendType.TransportType.SMS)
val mmsConstraints = MediaConstraints.getMmsMediaConstraints(sendType.simSubscriptionId ?: -1)
return mmsConstraints.isSatisfied(context, mediaUri, mediaType, mediaSize) || mmsConstraints.canResize(mediaType)
}
private fun canSendAllAttachmentsToNonPush(context: Context, messageRecord: MessageRecord): Boolean {
return if (messageRecord is MmsMessageRecord) {
messageRecord.slideDeck.asAttachments().all { isMmsSupported(context, it) }
} else {
true
}
}
/**
* Helper function to determine whether a given attachment can be sent via MMS.
*/
private fun isMmsSupported(context: Context, attachment: Attachment): Boolean {
val canReadPhoneState = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
if (!Util.isDefaultSmsProvider(context) || !canReadPhoneState || !Util.isMmsCapable(context) || !SignalStore.misc().smsExportPhase.allowSmsFeatures()) {
return false
}
val sendType: MessageSendType = MessageSendType.getFirstForTransport(MessageSendType.TransportType.SMS)
val mmsConstraints = MediaConstraints.getMmsMediaConstraints(sendType.simSubscriptionId ?: -1)
return mmsConstraints.isSatisfied(context, attachment) || mmsConstraints.canResize(attachment)
}
}

View File

@@ -59,7 +59,6 @@ import org.thoughtcrime.securesms.stories.settings.privacy.ChooseInitialMyStoryM
import org.thoughtcrime.securesms.util.BottomSheetUtil
import org.thoughtcrime.securesms.util.FeatureFlags
import org.thoughtcrime.securesms.util.FullscreenHelper
import org.thoughtcrime.securesms.util.Util
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.fragments.findListener
import org.thoughtcrime.securesms.util.fragments.requireListener
@@ -470,7 +469,7 @@ class MultiselectForwardFragment :
addSection(
ContactSearchConfiguration.Section.Individuals(
includeHeader = true,
transportType = if (includeSms()) ContactSearchConfiguration.TransportType.ALL else ContactSearchConfiguration.TransportType.PUSH,
transportType = ContactSearchConfiguration.TransportType.PUSH,
includeSelf = true
)
)
@@ -485,18 +484,13 @@ class MultiselectForwardFragment :
addSection(
ContactSearchConfiguration.Section.Groups(
includeHeader = true,
includeMms = includeSms()
includeHeader = true
)
)
}
}
}
private fun includeSms(): Boolean {
return Util.isDefaultSmsProvider(requireContext()) && args.canSendToNonPush
}
private fun isSelectedMediaValidForStories(): Boolean {
return !args.isViewOnce && args.multiShareArgs.all { it.isValidForStories }
}

View File

@@ -15,7 +15,6 @@ import org.thoughtcrime.securesms.attachments.Attachment
import org.thoughtcrime.securesms.color.ViewColorSet
import org.thoughtcrime.securesms.conversation.ConversationMessage
import org.thoughtcrime.securesms.conversation.MessageStyler
import org.thoughtcrime.securesms.conversation.mutiselect.Multiselect
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
@@ -23,7 +22,6 @@ import org.thoughtcrime.securesms.mediasend.Media
import org.thoughtcrime.securesms.mms.PartAuthority
import org.thoughtcrime.securesms.sharing.MultiShareArgs
import org.thoughtcrime.securesms.stories.Stories
import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.hasSharedContact
import java.util.Optional
import java.util.function.Consumer
@@ -41,7 +39,6 @@ import java.util.function.Consumer
*/
@Parcelize
data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
val canSendToNonPush: Boolean,
val multiShareArgs: List<MultiShareArgs> = listOf(),
@StringRes val title: Int = R.string.MultiselectForwardFragment__forward_to,
val forceDisableAddMessage: Boolean = false,
@@ -60,8 +57,6 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
@JvmStatic
fun create(context: Context, threadId: Long, mediaUri: Uri, mediaType: String, consumer: Consumer<MultiselectForwardFragmentArgs>) {
SignalExecutors.BOUNDED.execute {
val mediaSize = MediaUtil.getMediaSize(context, mediaUri)
val isMmsSupported = Multiselect.isMmsSupported(context, mediaUri, mediaType, mediaSize)
val multiShareArgs = MultiShareArgs.Builder(setOf())
.withDataUri(mediaUri)
.withDataType(mediaType)
@@ -76,7 +71,6 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
ThreadUtil.runOnMain {
consumer.accept(
MultiselectForwardFragmentArgs(
isMmsSupported,
listOf(multiShareArgs),
storySendRequirements = Stories.MediaTransform.SendRequirements.CAN_NOT_SEND,
sendButtonColors = sendButtonColors ?: ViewColorSet.PRIMARY
@@ -97,13 +91,11 @@ data class MultiselectForwardFragmentArgs @JvmOverloads constructor(
throw AssertionError("Cannot forward view once media")
}
val canSendToNonPush: Boolean = selectedParts.all { Multiselect.canSendToNonPush(context, it) }
val multiShareArgs: List<MultiShareArgs> = conversationMessages.map { buildMultiShareArgs(context, it, selectedParts) }
ThreadUtil.runOnMain {
consumer.accept(
MultiselectForwardFragmentArgs(
canSendToNonPush,
multiShareArgs,
storySendRequirements = Stories.MediaTransform.SendRequirements.CAN_NOT_SEND
)

View File

@@ -28,7 +28,7 @@ object ConversationDialogs {
fun displayCannotStartGroupCallDueToPermissionsDialog(context: Context) {
MaterialAlertDialogBuilder(context).setTitle(R.string.ConversationActivity_cant_start_group_call)
.setMessage(R.string.ConversationActivity_only_admins_of_this_group_can_start_a_call)
.setPositiveButton(R.string.ok) { d: DialogInterface, w: Int -> d.dismiss() }
.setPositiveButton(android.R.string.ok) { d: DialogInterface, w: Int -> d.dismiss() }
.show()
}