mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 01:40:07 +01:00
Remove more SMS vestiges.
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user