diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3d91544137..2aa722ea69 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -525,6 +525,7 @@ dependencies { implementation(project(":lib:photoview")) implementation(project(":core:ui")) implementation(project(":core:models")) + implementation(project(":core:models-jvm")) implementation(libs.androidx.fragment.ktx) implementation(libs.androidx.appcompat) { diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt index 5874e9633f..29a44c8788 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt @@ -20,6 +20,7 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.signal.core.models.backup.MediaName +import org.signal.core.models.media.TransformProperties import org.signal.core.util.Base64 import org.signal.core.util.Base64.decodeBase64OrThrow import org.signal.core.util.copyTo @@ -82,7 +83,7 @@ class AttachmentTableTest { val blob = BlobProvider.getInstance().forData(byteArrayOf(1, 2, 3, 4, 5)).createForSingleSessionInMemory() val highQualityProperties = createHighQualityTransformProperties() val highQualityImage = createAttachment(1, blob, highQualityProperties) - val lowQualityImage = createAttachment(1, blob, AttachmentTable.TransformProperties.empty()) + val lowQualityImage = createAttachment(1, blob, TransformProperties.empty()) val attachment = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityImage) val attachment2 = SignalDatabase.attachments.insertAttachmentForPreUpload(lowQualityImage) @@ -144,13 +145,13 @@ class AttachmentTableTest { val blobUncompressed = BlobProvider.getInstance().forData(uncompressData).createForSingleSessionInMemory() - val previousAttachment = createAttachment(1, BlobProvider.getInstance().forData(compressedData).createForSingleSessionInMemory(), AttachmentTable.TransformProperties.empty()) + val previousAttachment = createAttachment(1, BlobProvider.getInstance().forData(compressedData).createForSingleSessionInMemory(), TransformProperties.empty()) val previousDatabaseAttachmentId: AttachmentId = SignalDatabase.attachments.insertAttachmentsForMessage(1, listOf(previousAttachment), emptyList()).values.first() - val standardQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.empty()) + val standardQualityPreUpload = createAttachment(1, blobUncompressed, TransformProperties.empty()) val standardDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(standardQualityPreUpload) - val highQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.forSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH)) + val highQualityPreUpload = createAttachment(1, blobUncompressed, transformPropertiesForSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH)) val highDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityPreUpload) // WHEN @@ -179,14 +180,14 @@ class AttachmentTableTest { val uncompressData = byteArrayOf(1, 2, 3, 4, 5) val blobUncompressed = BlobProvider.getInstance().forData(uncompressData).createForSingleSessionInMemory() - val standardQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.empty()) + val standardQualityPreUpload = createAttachment(1, blobUncompressed, TransformProperties.empty()) val standardDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(standardQualityPreUpload) // WHEN - val highQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.forSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH)) + val highQualityPreUpload = createAttachment(1, blobUncompressed, transformPropertiesForSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH)) val highDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(highQualityPreUpload) - val secondHighQualityPreUpload = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.forSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH)) + val secondHighQualityPreUpload = createAttachment(1, blobUncompressed, transformPropertiesForSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH)) val secondHighDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(secondHighQualityPreUpload) // THEN @@ -204,7 +205,7 @@ class AttachmentTableTest { fun resetArchiveTransferStateByPlaintextHashAndRemoteKey_singleMatch() { // Given an attachment with some plaintextHash+remoteKey val blob = BlobProvider.getInstance().forData(byteArrayOf(1, 2, 3, 4, 5)).createForSingleSessionInMemory() - val attachment = createAttachment(1, blob, AttachmentTable.TransformProperties.empty()) + val attachment = createAttachment(1, blob, TransformProperties.empty()) val attachmentId = SignalDatabase.attachments.insertAttachmentsForMessage(-1L, listOf(attachment), emptyList()).values.first() SignalDatabase.attachments.finalizeAttachmentAfterUpload(attachmentId, AttachmentTableTestUtil.createUploadResult(attachmentId)) SignalDatabase.attachments.setArchiveTransferState(attachmentId, AttachmentTable.ArchiveTransferState.FINISHED) @@ -259,7 +260,7 @@ class AttachmentTableTest { // GIVEN val uncompressData = byteArrayOf(1, 2, 3, 4, 5) val blobUncompressed = BlobProvider.getInstance().forData(uncompressData).createForSingleSessionInMemory() - val attachment = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.empty()) + val attachment = createAttachment(1, blobUncompressed, TransformProperties.empty()) val message = createIncomingMessage(serverTime = 0.days, attachment = attachment, expiresIn = 5.minutes) val messageId = SignalDatabase.messages.insertMessageInbox(message).map { it.messageId }.get() SignalDatabase.attachments.setArchiveTransferState(AttachmentId(1L), AttachmentTable.ArchiveTransferState.NONE) @@ -278,7 +279,7 @@ class AttachmentTableTest { // GIVEN val uncompressData = byteArrayOf(1, 2, 3, 4, 5) val blobUncompressed = BlobProvider.getInstance().forData(uncompressData).createForSingleSessionInMemory() - val attachment = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.empty()) + val attachment = createAttachment(1, blobUncompressed, TransformProperties.empty()) val message = createIncomingMessage(serverTime = 0.days, attachment = attachment, expiresIn = 5.days) val messageId = SignalDatabase.messages.insertMessageInbox(message).map { it.messageId }.get() SignalDatabase.attachments.setArchiveTransferState(AttachmentId(1L), AttachmentTable.ArchiveTransferState.NONE) @@ -297,7 +298,7 @@ class AttachmentTableTest { // GIVEN val uncompressData = byteArrayOf(1, 2, 3, 4, 5) val blobUncompressed = BlobProvider.getInstance().forData(uncompressData).createForSingleSessionInMemory() - val attachment = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.empty()) + val attachment = createAttachment(1, blobUncompressed, TransformProperties.empty()) val message = createIncomingMessage(serverTime = 0.days, attachment = attachment, expiresIn = 5.days) val messageId = SignalDatabase.messages.insertMessageInbox(message).map { it.messageId }.get() SignalDatabase.messages.markExpireStarted(messageId) @@ -317,7 +318,7 @@ class AttachmentTableTest { // GIVEN val uncompressData = byteArrayOf(1, 2, 3, 4, 5) val blobUncompressed = BlobProvider.getInstance().forData(uncompressData).createForSingleSessionInMemory() - val attachment = createAttachment(1, blobUncompressed, AttachmentTable.TransformProperties.empty(), contentType = MediaUtil.LONG_TEXT) + val attachment = createAttachment(1, blobUncompressed, TransformProperties.empty(), contentType = MediaUtil.LONG_TEXT) val message = createIncomingMessage(serverTime = 0.days, attachment = attachment) val messageId = SignalDatabase.messages.insertMessageInbox(message).map { it.messageId }.get() SignalDatabase.attachments.setArchiveTransferState(AttachmentId(1L), AttachmentTable.ArchiveTransferState.NONE) @@ -612,7 +613,7 @@ class AttachmentTableTest { ) } - private fun createAttachment(id: Long, uri: Uri, transformProperties: AttachmentTable.TransformProperties, contentType: String = MediaUtil.IMAGE_JPEG): UriAttachment { + private fun createAttachment(id: Long, uri: Uri, transformProperties: TransformProperties, contentType: String = MediaUtil.IMAGE_JPEG): UriAttachment { return UriAttachmentBuilder.build( id, uri = uri, @@ -621,8 +622,8 @@ class AttachmentTableTest { ) } - private fun createHighQualityTransformProperties(): AttachmentTable.TransformProperties { - return AttachmentTable.TransformProperties.forSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH) + private fun createHighQualityTransformProperties(): TransformProperties { + return transformPropertiesForSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH) } private fun createMediaStream(byteArray: ByteArray): MediaStream { diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest_deduping.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest_deduping.kt index 2ed2f7e855..e7a47107b0 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest_deduping.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest_deduping.kt @@ -12,6 +12,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.signal.core.models.ServiceId +import org.signal.core.models.media.TransformProperties import org.signal.core.util.Base64 import org.signal.core.util.readFully import org.signal.core.util.stream.LimitedInputStream @@ -19,7 +20,6 @@ import org.signal.core.util.update import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.attachments.Cdn import org.thoughtcrime.securesms.attachments.PointerAttachment -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.mms.MediaStream import org.thoughtcrime.securesms.mms.OutgoingMessage diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/UriAttachmentBuilder.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/UriAttachmentBuilder.kt index 431c803609..2fdd34ff92 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/UriAttachmentBuilder.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/UriAttachmentBuilder.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.database import android.net.Uri +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.attachments.UriAttachment import org.thoughtcrime.securesms.audio.AudioHash import org.thoughtcrime.securesms.blurhash.BlurHash @@ -24,7 +25,7 @@ object UriAttachmentBuilder { stickerLocator: StickerLocator? = null, blurHash: BlurHash? = null, audioHash: AudioHash? = null, - transformProperties: AttachmentTable.TransformProperties? = null, + transformProperties: TransformProperties? = null, uuid: UUID? = UUID.randomUUID() ): UriAttachment { return UriAttachment( diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJobTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJobTest.kt index 11193216b8..babb0c1e2f 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJobTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJobTest.kt @@ -13,11 +13,12 @@ import assertk.assertions.isTrue import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.signal.core.models.media.TransformProperties import org.signal.core.util.StreamUtil import org.thoughtcrime.securesms.attachments.UriAttachment -import org.thoughtcrime.securesms.database.AttachmentTable import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.UriAttachmentBuilder +import org.thoughtcrime.securesms.database.transformPropertiesForSentMediaQuality import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.mms.SentMediaQuality @@ -41,7 +42,7 @@ class AttachmentCompressionJobTest { val blob = BlobProvider.getInstance().forData(imageBytes).createForSingleSessionOnDisk(AppDependencies.application) - val firstPreUpload = createAttachment(1, blob, AttachmentTable.TransformProperties.empty()) + val firstPreUpload = createAttachment(1, blob, TransformProperties.empty()) val firstDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(firstPreUpload) val firstCompressionJob: AttachmentCompressionJob = AttachmentCompressionJob.fromAttachment(firstDatabaseAttachment, false, -1) @@ -62,7 +63,7 @@ class AttachmentCompressionJobTest { } jobThread.start() - val secondPreUpload = createAttachment(1, blob, AttachmentTable.TransformProperties.forSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH)) + val secondPreUpload = createAttachment(1, blob, transformPropertiesForSentMediaQuality(Optional.empty(), SentMediaQuality.HIGH)) val secondDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(secondPreUpload) secondCompressionJob = AttachmentCompressionJob.fromAttachment(secondDatabaseAttachment, false, -1) @@ -74,7 +75,7 @@ class AttachmentCompressionJobTest { assertThat(secondJobResult!!.isSuccess).isTrue() } - private fun createAttachment(id: Long, uri: Uri, transformProperties: AttachmentTable.TransformProperties): UriAttachment { + private fun createAttachment(id: Long, uri: Uri, transformProperties: TransformProperties): UriAttachment { return UriAttachmentBuilder.build( id, uri = uri, diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageHelper.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageHelper.kt index 3b103e09b8..4076d58ce1 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageHelper.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageHelper.kt @@ -10,9 +10,9 @@ import io.mockk.every import io.mockk.mockkStatic import io.mockk.slot import io.mockk.unmockkStatic +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.attachments.Attachment import org.thoughtcrime.securesms.attachments.UriAttachment -import org.thoughtcrime.securesms.database.AttachmentTable import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.UriAttachmentBuilder import org.thoughtcrime.securesms.database.model.GroupsV2UpdateMessageConverter @@ -126,7 +126,7 @@ class MessageHelper(private val harness: SignalActivityRule, var startTime: Long id = Random.nextLong(), uri = uri, contentType = MediaUtil.IMAGE_JPEG, - transformProperties = AttachmentTable.TransformProperties(), + transformProperties = TransformProperties(), uuid = uuid ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/Attachment.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/Attachment.kt index 2b86e52265..8da6586650 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/Attachment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/Attachment.kt @@ -8,11 +8,11 @@ import android.net.Uri import android.os.Parcel import android.os.Parcelable import androidx.core.os.ParcelCompat +import org.signal.core.models.media.TransformProperties import org.signal.core.util.UuidUtil import org.thoughtcrime.securesms.audio.AudioHash import org.thoughtcrime.securesms.blurhash.BlurHash import org.thoughtcrime.securesms.database.AttachmentTable -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties import org.thoughtcrime.securesms.stickers.StickerLocator import org.thoughtcrime.securesms.util.ParcelUtil import java.util.UUID diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachment.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachment.kt index ef1f3db6bc..8818a662d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachment.kt @@ -3,10 +3,10 @@ package org.thoughtcrime.securesms.attachments import android.net.Uri import android.os.Parcel import androidx.core.os.ParcelCompat +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.audio.AudioHash import org.thoughtcrime.securesms.blurhash.BlurHash import org.thoughtcrime.securesms.database.AttachmentTable -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.stickers.StickerLocator import org.thoughtcrime.securesms.util.ParcelUtil diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/UriAttachment.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/UriAttachment.kt index 5befd1f956..7f38903355 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/UriAttachment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/UriAttachment.kt @@ -3,9 +3,9 @@ package org.thoughtcrime.securesms.attachments import android.net.Uri import android.os.Parcel import androidx.core.os.ParcelCompat +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.audio.AudioHash import org.thoughtcrime.securesms.blurhash.BlurHash -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties import org.thoughtcrime.securesms.stickers.StickerLocator import java.util.Objects import java.util.UUID diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/WallpaperAttachment.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/WallpaperAttachment.kt index 9aabf0aca2..466c1800d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/WallpaperAttachment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/WallpaperAttachment.kt @@ -6,8 +6,8 @@ package org.thoughtcrime.securesms.attachments import android.os.Parcel +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.database.AttachmentTable -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties import org.thoughtcrime.securesms.util.MediaUtil /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarPickerStorage.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarPickerStorage.kt index aa65b6f217..9f87a80a41 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarPickerStorage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarPickerStorage.kt @@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.avatar import android.content.Context import android.net.Uri import android.webkit.MimeTypeMap +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.database.SignalDatabase -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.storage.FileStorage diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarRenderer.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarRenderer.kt index 1c87941b13..996e4624e1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarRenderer.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarRenderer.kt @@ -9,8 +9,8 @@ import android.net.Uri import androidx.annotation.MainThread import androidx.appcompat.content.res.AppCompatResources import com.airbnb.lottie.SimpleColorFilter +import org.signal.core.models.media.Media import org.signal.core.util.concurrent.SignalExecutors -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.profiles.AvatarHelper import org.thoughtcrime.securesms.providers.BlobProvider diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerFragment.kt index c2444d6e01..b290b5a48b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerFragment.kt @@ -16,6 +16,7 @@ import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.viewModels import androidx.navigation.Navigation import androidx.recyclerview.widget.RecyclerView +import org.signal.core.models.media.Media import org.signal.core.util.ThreadUtil import org.signal.core.util.getParcelableExtraCompat import org.thoughtcrime.securesms.R @@ -28,7 +29,6 @@ import org.thoughtcrime.securesms.avatar.vector.VectorAvatarCreationFragment import org.thoughtcrime.securesms.components.ButtonStripItemView import org.thoughtcrime.securesms.components.recyclerview.GridDividerDecoration import org.thoughtcrime.securesms.mediasend.AvatarSelectionActivity -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.camerax.CameraXUtil import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.util.ViewUtil diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerRepository.kt index 92696bff4b..fd40da051f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerRepository.kt @@ -4,6 +4,7 @@ import android.content.Context import android.net.Uri import android.widget.Toast import io.reactivex.rxjava3.core.Single +import org.signal.core.models.media.Media import org.signal.core.util.StreamUtil import org.signal.core.util.ThreadUtil import org.signal.core.util.concurrent.SignalExecutors @@ -16,7 +17,6 @@ import org.thoughtcrime.securesms.avatar.Avatars import org.thoughtcrime.securesms.conversation.colors.AvatarColor import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.groups.GroupId -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.profiles.AvatarHelper import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.recipients.Recipient diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerViewModel.kt index f6abf97ae7..ec74cc66b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerViewModel.kt @@ -6,9 +6,9 @@ import androidx.lifecycle.ViewModelProvider import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.avatar.Avatar import org.thoughtcrime.securesms.groups.GroupId -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.util.livedata.Store sealed class AvatarPickerViewModel(private val repository: AvatarPickerRepository) : ViewModel() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/QrImageSelectionActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/QrImageSelectionActivity.kt index d954f18991..33c699eece 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/QrImageSelectionActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/QrImageSelectionActivity.kt @@ -13,8 +13,8 @@ import android.view.WindowManager import androidx.activity.result.contract.ActivityResultContract import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.v2.gallery.MediaGalleryFragment /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboard.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboard.java index ad4bd0e351..db2c1559c8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboard.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboard.java @@ -22,7 +22,7 @@ import com.google.android.material.button.MaterialButton; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.animation.AnimationCompleteListener; import org.thoughtcrime.securesms.components.InputAwareLayout; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.util.StorageUtil; import java.util.Arrays; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboardMediaAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboardMediaAdapter.java index 4d3f6c7a36..39cbae7aa8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboardMediaAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboardMediaAdapter.java @@ -12,7 +12,7 @@ import com.bumptech.glide.RequestManager; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.ThumbnailView; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.adapter.StableIdGenerator; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationArgs.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationArgs.kt index 4bd3022cf8..fe3d526e5f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationArgs.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationArgs.kt @@ -9,10 +9,10 @@ import android.os.Parcelable import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.badges.models.Badge import org.thoughtcrime.securesms.conversation.ConversationIntents.ConversationScreenType import org.thoughtcrime.securesms.conversation.colors.ChatColors -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mms.SlideFactory import org.thoughtcrime.securesms.recipients.Recipient.Companion.resolved import org.thoughtcrime.securesms.recipients.RecipientId diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java index d25b1e0075..3fe88ba09a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationIntents.java @@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.badges.models.Badge; import org.thoughtcrime.securesms.conversation.v2.ConversationActivity; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.ThreadTable; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.stickers.StickerLocator; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt index 1d850504f9..1569d03423 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt @@ -6,6 +6,7 @@ import android.text.Spannable import android.text.SpannableString import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.models.media.Media import org.signal.core.util.Base64 import org.signal.core.util.StreamUtil import org.signal.core.util.concurrent.MaybeCompat @@ -31,7 +32,6 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyboard.KeyboardUtil -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mms.GifSlide import org.thoughtcrime.securesms.mms.ImageSlide import org.thoughtcrime.securesms.mms.PartAuthority diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt index 1b282bcf46..e0ed84fb5b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs.kt @@ -7,6 +7,7 @@ import androidx.annotation.ColorInt import androidx.annotation.StringRes import androidx.annotation.WorkerThread import kotlinx.parcelize.Parcelize +import org.signal.core.models.media.Media import org.signal.core.util.StreamUtil import org.signal.core.util.ThreadUtil import org.signal.core.util.concurrent.SignalExecutors @@ -18,7 +19,6 @@ import org.thoughtcrime.securesms.conversation.MessageStyler import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.MmsMessageRecord -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.sharing.MultiShareArgs import org.thoughtcrime.securesms.stories.Stories diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts.kt index 36a8efecbf..dd38a6c800 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts.kt @@ -16,6 +16,7 @@ import android.widget.Toast import androidx.activity.result.contract.ActivityResultContract import androidx.core.content.IntentCompat import androidx.fragment.app.Fragment +import org.signal.core.models.media.Media import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.location.SignalPlace @@ -26,7 +27,6 @@ import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.conversation.v2.ConversationActivityResultContracts.Callbacks import org.thoughtcrime.securesms.giph.ui.GiphyActivity import org.thoughtcrime.securesms.maps.PlacePickerActivity -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult import org.thoughtcrime.securesms.mediasend.camerax.CameraXUtil import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionActivity diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 4d67da2d76..a1f5c0108e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -100,6 +100,8 @@ import kotlinx.coroutines.launch import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.signal.core.models.media.Media +import org.signal.core.models.media.TransformProperties import org.signal.core.util.ByteLimitInputFilter import org.signal.core.util.PendingIntentFlags import org.signal.core.util.Result @@ -228,7 +230,6 @@ import org.thoughtcrime.securesms.conversation.v2.groups.ConversationGroupViewMo import org.thoughtcrime.securesms.conversation.v2.items.ChatColorsDrawable import org.thoughtcrime.securesms.conversation.v2.items.InteractiveConversationElement import org.thoughtcrime.securesms.conversation.v2.keyboard.AttachmentKeyboardFragment -import org.thoughtcrime.securesms.database.AttachmentTable import org.thoughtcrime.securesms.database.DraftTable import org.thoughtcrime.securesms.database.model.IdentityRecord import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord @@ -279,7 +280,6 @@ import org.thoughtcrime.securesms.main.MainSnackbarHostKey import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory import org.thoughtcrime.securesms.mediapreview.MediaPreviewV2Activity -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult import org.thoughtcrime.securesms.messagedetails.MessageDetailsFragment import org.thoughtcrime.securesms.messagerequests.MessageRequestRepository @@ -1487,7 +1487,7 @@ class ConversationFragment : isVideoGif = videoGif, bucketId = null, caption = null, - transformProperties = AttachmentTable.TransformProperties.forSentMediaQuality(SignalStore.settings.sentMediaQuality.code), + transformProperties = TransformProperties.forSentMediaQuality(SignalStore.settings.sentMediaQuality.code), fileName = null ) conversationActivityResultContracts.launchMediaEditor(listOf(media), recipientId, composeText.textTrimmed) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt index 5ee9258376..b2741dd843 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt @@ -14,6 +14,7 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.kotlin.subscribeBy +import org.signal.core.models.media.Media import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.concurrent.addTo import org.thoughtcrime.securesms.LoggingFragment @@ -23,7 +24,6 @@ import org.thoughtcrime.securesms.conversation.AttachmentKeyboardButton import org.thoughtcrime.securesms.conversation.ManageContextMenu import org.thoughtcrime.securesms.conversation.v2.ConversationViewModel import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.permissions.PermissionCompat import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.recipients.Recipient diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardViewModel.kt index 364a4b7e61..ddaecdc567 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardViewModel.kt @@ -9,7 +9,7 @@ import androidx.lifecycle.ViewModel import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.BehaviorSubject -import org.thoughtcrime.securesms.mediasend.Media +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.mediasend.MediaRepository class AttachmentKeyboardViewModel( diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt index 2b766c7ccd..7a1a95186e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt @@ -20,21 +20,17 @@ import android.content.ContentValues import android.content.Context import android.database.Cursor import android.media.MediaDataSource -import android.os.Parcelable import android.text.TextUtils import androidx.annotation.VisibleForTesting import androidx.annotation.WorkerThread import androidx.core.content.contentValuesOf import com.bumptech.glide.Glide -import com.fasterxml.jackson.annotation.JsonProperty -import kotlinx.parcelize.IgnoredOnParcel -import kotlinx.parcelize.Parcelize -import kotlinx.serialization.Serializable import okio.ByteString.Companion.toByteString import org.json.JSONArray import org.json.JSONException import org.signal.core.models.backup.MediaId import org.signal.core.models.backup.MediaName +import org.signal.core.models.media.TransformProperties import org.signal.core.util.Base64 import org.signal.core.util.SqlUtil import org.signal.core.util.ThreadUtil @@ -110,7 +106,6 @@ import org.thoughtcrime.securesms.mms.DecryptableUri import org.thoughtcrime.securesms.mms.MediaStream import org.thoughtcrime.securesms.mms.MmsException import org.thoughtcrime.securesms.mms.PartAuthority -import org.thoughtcrime.securesms.mms.SentMediaQuality import org.thoughtcrime.securesms.stickers.StickerLocator import org.thoughtcrime.securesms.util.BitmapDecodingException import org.thoughtcrime.securesms.util.FileUtils @@ -124,7 +119,6 @@ import org.thoughtcrime.securesms.video.EncryptedMediaDataSource import org.whispersystems.signalservice.api.attachment.AttachmentUploadResult import org.whispersystems.signalservice.api.crypto.AttachmentCipherStreamUtil import org.whispersystems.signalservice.internal.crypto.PaddingInputStream -import org.whispersystems.signalservice.internal.util.JsonUtil import java.io.ByteArrayInputStream import java.io.File import java.io.FileNotFoundException @@ -134,7 +128,6 @@ import java.security.DigestInputStream import java.security.MessageDigest import java.security.NoSuchAlgorithmException import java.util.LinkedList -import java.util.Optional import java.util.UUID import kotlin.text.appendLine import kotlin.time.Duration @@ -2256,7 +2249,7 @@ class AttachmentTable( .where("$ID = ?", attachmentId.id) .run() .readToSingleObject { - TransformProperties.parse(it.requireString(TRANSFORM_PROPERTIES)) + parseTransformProperties(it.requireString(TRANSFORM_PROPERTIES)) } } @@ -2323,7 +2316,7 @@ class AttachmentTable( }, blurHash = if (MediaUtil.isAudioType(contentType)) null else BlurHash.parseOrNull(jsonObject.getString(BLUR_HASH)), audioHash = if (MediaUtil.isAudioType(contentType)) AudioHash.parseOrNull(jsonObject.getString(BLUR_HASH)) else null, - transformProperties = TransformProperties.parse(jsonObject.getString(TRANSFORM_PROPERTIES)), + transformProperties = parseTransformProperties(jsonObject.getString(TRANSFORM_PROPERTIES)), displayOrder = jsonObject.getInt(DISPLAY_ORDER), uploadTimestamp = jsonObject.getLong(UPLOAD_TIMESTAMP), dataHash = jsonObject.getString(DATA_HASH_END), @@ -3369,7 +3362,7 @@ class AttachmentTable( stickerLocator = cursor.readStickerLocator(), blurHash = if (MediaUtil.isAudioType(contentType)) null else BlurHash.parseOrNull(cursor.requireString(BLUR_HASH)), audioHash = if (MediaUtil.isAudioType(contentType)) AudioHash.parseOrNull(cursor.requireString(BLUR_HASH)) else null, - transformProperties = TransformProperties.parse(cursor.requireString(TRANSFORM_PROPERTIES)), + transformProperties = parseTransformProperties(cursor.requireString(TRANSFORM_PROPERTIES)), displayOrder = cursor.requireInt(DISPLAY_ORDER), uploadTimestamp = cursor.requireLong(UPLOAD_TIMESTAMP), dataHash = cursor.requireString(DATA_HASH_END), @@ -3400,7 +3393,7 @@ class AttachmentTable( random = random, hashStart = this.requireString(DATA_HASH_START), hashEnd = this.requireString(DATA_HASH_END), - transformProperties = TransformProperties.parse(this.requireString(TRANSFORM_PROPERTIES)), + transformProperties = parseTransformProperties(this.requireString(TRANSFORM_PROPERTIES)), uploadTimestamp = this.requireLong(UPLOAD_TIMESTAMP), archiveCdn = this.requireIntOrNull(ARCHIVE_CDN), archiveTransferState = this.requireInt(ARCHIVE_TRANSFER_STATE), @@ -3545,7 +3538,9 @@ class AttachmentTable( .readToSingleLong(0) } - val uniqueEligibleMediaNamesWithThumbnailsCount = readableDatabase.query("SELECT COUNT(*) FROM (SELECT DISTINCT $DATA_HASH_END, $REMOTE_KEY FROM $TABLE_NAME WHERE $DATA_HASH_END NOT NULL AND $REMOTE_KEY NOT NULL AND $THUMBNAIL_FILE NOT NULL AND $QUOTE = 0 AND $MESSAGE_ID != $WALLPAPER_MESSAGE_ID)").readToSingleLong(-1L) + val uniqueEligibleMediaNamesWithThumbnailsCount = + readableDatabase.query("SELECT COUNT(*) FROM (SELECT DISTINCT $DATA_HASH_END, $REMOTE_KEY FROM $TABLE_NAME WHERE $DATA_HASH_END NOT NULL AND $REMOTE_KEY NOT NULL AND $THUMBNAIL_FILE NOT NULL AND $QUOTE = 0 AND $MESSAGE_ID != $WALLPAPER_MESSAGE_ID)") + .readToSingleLong(-1L) val archiveStatusMediaNameThumbnailCounts: Map = ArchiveTransferState.entries.associateWith { state -> readableDatabase.query( """ @@ -3802,119 +3797,6 @@ class AttachmentTable( val random: ByteArray ) - @Serializable - @Parcelize - data class TransformProperties( - @JsonProperty("skipTransform") - @JvmField - val skipTransform: Boolean = false, - - @JsonProperty("videoTrim") - @JvmField - val videoTrim: Boolean = false, - - @JsonProperty("videoTrimStartTimeUs") - @JvmField - val videoTrimStartTimeUs: Long = 0, - - @JsonProperty("videoTrimEndTimeUs") - @JvmField - val videoTrimEndTimeUs: Long = 0, - - @JsonProperty("sentMediaQuality") - @JvmField - val sentMediaQuality: Int = SentMediaQuality.STANDARD.code, - - @JsonProperty("mp4Faststart") - @JvmField - val mp4FastStart: Boolean = false - ) : Parcelable { - fun shouldSkipTransform(): Boolean { - return skipTransform - } - - @IgnoredOnParcel - @JsonProperty("videoEdited") - val videoEdited: Boolean = videoTrim - - fun withSkipTransform(): TransformProperties { - return this.copy( - skipTransform = true - ) - } - - fun withMp4FastStart(): TransformProperties { - return this.copy(mp4FastStart = true) - } - - fun serialize(): String { - return JsonUtil.toJson(this) - } - - companion object { - private val DEFAULT_MEDIA_QUALITY = SentMediaQuality.STANDARD.code - - @JvmStatic - fun empty(): TransformProperties { - return TransformProperties( - skipTransform = false, - videoTrim = false, - videoTrimStartTimeUs = 0, - videoTrimEndTimeUs = 0, - sentMediaQuality = DEFAULT_MEDIA_QUALITY, - mp4FastStart = false - ) - } - - fun forSkipTransform(): TransformProperties { - return TransformProperties( - skipTransform = true, - videoTrim = false, - videoTrimStartTimeUs = 0, - videoTrimEndTimeUs = 0, - sentMediaQuality = DEFAULT_MEDIA_QUALITY, - mp4FastStart = false - ) - } - - fun forVideoTrim(videoTrimStartTimeUs: Long, videoTrimEndTimeUs: Long): TransformProperties { - return TransformProperties( - skipTransform = false, - videoTrim = true, - videoTrimStartTimeUs = videoTrimStartTimeUs, - videoTrimEndTimeUs = videoTrimEndTimeUs, - sentMediaQuality = DEFAULT_MEDIA_QUALITY, - mp4FastStart = false - ) - } - - @JvmStatic - fun forSentMediaQuality(currentProperties: Optional, sentMediaQuality: SentMediaQuality): TransformProperties { - val existing = currentProperties.orElse(empty()) - return existing.copy(sentMediaQuality = sentMediaQuality.code) - } - - @JvmStatic - fun forSentMediaQuality(sentMediaQuality: Int): TransformProperties { - return TransformProperties(sentMediaQuality = sentMediaQuality) - } - - @JvmStatic - fun parse(serialized: String?): TransformProperties { - return if (serialized == null) { - empty() - } else { - try { - JsonUtil.fromJson(serialized, TransformProperties::class.java) - } catch (e: IOException) { - Log.w(TAG, "Failed to parse TransformProperties!", e) - empty() - } - } - } - } - } - enum class ThumbnailRestoreState(val value: Int) { /** No thumbnail downloaded. */ NONE(0), diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/TransformPropertiesUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/database/TransformPropertiesUtil.kt new file mode 100644 index 0000000000..f57cc0e1b8 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/TransformPropertiesUtil.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database + +import org.signal.core.models.media.TransformProperties +import org.signal.core.util.logging.Log +import org.thoughtcrime.securesms.mms.SentMediaQuality +import org.whispersystems.signalservice.internal.util.JsonUtil +import java.io.IOException +import java.util.Optional + +private val TAG = Log.tag(TransformProperties::class.java) + +/** + * Serializes the TransformProperties to a JSON string using Jackson. + */ +fun TransformProperties.serialize(): String { + return JsonUtil.toJson(this) +} + +/** + * Parses a JSON string to create a TransformProperties instance. + */ +fun parseTransformProperties(serialized: String?): TransformProperties { + return if (serialized == null) { + TransformProperties.empty() + } else { + try { + JsonUtil.fromJson(serialized, TransformProperties::class.java) + } catch (e: IOException) { + Log.w(TAG, "Failed to parse TransformProperties!", e) + TransformProperties.empty() + } + } +} + +/** + * Creates TransformProperties for the given media quality, preserving existing properties. + */ +fun transformPropertiesForSentMediaQuality(currentProperties: Optional, sentMediaQuality: SentMediaQuality): TransformProperties { + val existing = currentProperties.orElse(TransformProperties.empty()) + return existing.copy(sentMediaQuality = sentMediaQuality.code) +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java index 865e5e33ef..9776cba487 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java @@ -19,7 +19,7 @@ import org.thoughtcrime.securesms.giph.mp4.GiphyMp4Fragment; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4SaveResult; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ViewModel; import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionActivity; import org.thoughtcrime.securesms.mms.SlideFactory; import org.thoughtcrime.securesms.providers.BlobProvider; diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java index 8c0087a3c6..2b144fcf9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java @@ -38,7 +38,7 @@ import org.thoughtcrime.securesms.avatar.picker.AvatarPickerFragment; import org.thoughtcrime.securesms.components.settings.app.privacy.expire.ExpireTimerSettingsFragment; import org.thoughtcrime.securesms.groups.ui.GroupMemberListView; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.mms.DecryptableUri; import org.thoughtcrime.securesms.profiles.AvatarHelper; import org.thoughtcrime.securesms.recipients.Recipient; diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsViewModel.java index e0bc13fc9c..7e79c0f766 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsViewModel.java @@ -15,7 +15,7 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.DefaultValueLiveData; import org.thoughtcrime.securesms.util.SingleLiveEvent; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java index 88fb39b67a..59c51417a7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java @@ -19,6 +19,7 @@ import org.thoughtcrime.securesms.crypto.AttachmentSecret; import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider; import org.thoughtcrime.securesms.crypto.ModernDecryptingPartInputStream; import org.thoughtcrime.securesms.crypto.ModernEncryptingPartOutputStream; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.events.PartProgressEvent; @@ -149,11 +150,11 @@ public final class AttachmentCompressionJob extends BaseJob { throw new UndeliverableMessageException("Cannot find the specified attachment."); } - AttachmentTable.TransformProperties transformProperties = databaseAttachment.transformProperties; + TransformProperties transformProperties = databaseAttachment.transformProperties; if (transformProperties == null) { Log.i(TAG, "TransformProperties were null! Using empty TransformProperties."); - transformProperties = AttachmentTable.TransformProperties.empty(); + transformProperties = TransformProperties.empty(); } if (transformProperties.shouldSkipTransform()) { @@ -227,7 +228,7 @@ public final class AttachmentCompressionJob extends BaseJob { throw new UndeliverableMessageException("Job is canceled!"); } - AttachmentTable.TransformProperties transformProperties = attachment.transformProperties; + TransformProperties transformProperties = attachment.transformProperties; boolean allowSkipOnFailure = false; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Adapter.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Adapter.kt index 845c64b808..105573e54b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Adapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Adapter.kt @@ -3,11 +3,11 @@ package org.thoughtcrime.securesms.mediapreview import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter +import org.signal.core.models.media.Media import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.attachments.Attachment import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.adapter.StableIdGenerator diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt index 76683ea6ab..c1211cf07d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt @@ -40,6 +40,7 @@ import io.reactivex.rxjava3.kotlin.subscribeBy import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import org.signal.core.models.media.Media import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.concurrent.addTo import org.signal.core.util.logging.Log @@ -61,7 +62,6 @@ import org.thoughtcrime.securesms.mediapreview.caption.ExpandingCaptionView import org.thoughtcrime.securesms.mediapreview.mediarail.CenterDecoration import org.thoughtcrime.securesms.mediapreview.mediarail.MediaRailAdapter import org.thoughtcrime.securesms.mediapreview.mediarail.MediaRailAdapter.ImageLoadingListener -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionActivity import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.recipients.Recipient diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2State.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2State.kt index bfde97ec2a..3f7191d0e1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2State.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2State.kt @@ -1,8 +1,8 @@ package org.thoughtcrime.securesms.mediapreview import android.text.SpannableString +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.database.MediaTable -import org.thoughtcrime.securesms.mediasend.Media data class MediaPreviewV2State( val mediaRecords: List = emptyList(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt index 193db6c6c7..bf7b157625 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt @@ -18,6 +18,7 @@ import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.models.media.Media import org.signal.core.util.PendingIntentFlags import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.logging.Log @@ -28,7 +29,6 @@ import org.thoughtcrime.securesms.database.MediaTable import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mms.PartUriParser import org.thoughtcrime.securesms.notifications.NotificationChannels import org.thoughtcrime.securesms.notifications.NotificationIds diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt index 0e0a9f2761..0834cd6b05 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt @@ -8,9 +8,9 @@ import com.bumptech.glide.RequestManager import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.target.Target +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ThumbnailView -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/AvatarSelectionActivity.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/AvatarSelectionActivity.java index 6e480afc46..bc72a95ccc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/AvatarSelectionActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/AvatarSelectionActivity.java @@ -15,6 +15,7 @@ import androidx.appcompat.app.AppCompatDelegate; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; +import org.signal.core.models.media.Media; import org.signal.imageeditor.core.model.EditorModel; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.mediasend.v2.gallery.MediaGalleryFragment; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java index 50ec3a2ff1..817136fba9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java @@ -42,6 +42,7 @@ import com.google.android.material.card.MaterialCardView; import org.signal.core.util.Stopwatch; import org.signal.core.util.logging.Log; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.LoggingFragment; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.animation.AnimationCompleteListener; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraFragment.java index aa64a91b2d..b480f939d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraFragment.java @@ -8,6 +8,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.mediasend.camerax.CameraXUtil; import org.thoughtcrime.securesms.mms.MediaConstraints; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java index 399e9f9f9d..cedb169670 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXFragment.java @@ -48,6 +48,7 @@ import com.google.common.util.concurrent.ListenableFuture; import org.signal.core.util.Stopwatch; import org.signal.core.util.concurrent.SimpleTask; import org.signal.core.util.logging.Log; +import org.signal.core.models.media.Media; import org.signal.qr.QrProcessor; import org.thoughtcrime.securesms.LoggingFragment; import org.thoughtcrime.securesms.R; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CompositeMediaTransform.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CompositeMediaTransform.java index ea5767d082..fee74ffad7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CompositeMediaTransform.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CompositeMediaTransform.java @@ -4,6 +4,8 @@ import android.content.Context; import androidx.annotation.NonNull; +import org.signal.core.models.media.Media; + /** * Allow multiple transforms to operate on {@link Media}. Care should * be taken on the order and implementation of combined transformers to prevent diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/ImageEditorModelRenderMediaTransform.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/ImageEditorModelRenderMediaTransform.java index 46486503b4..8379445e13 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/ImageEditorModelRenderMediaTransform.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/ImageEditorModelRenderMediaTransform.java @@ -11,6 +11,7 @@ import androidx.annotation.WorkerThread; import org.signal.core.util.StreamUtil; import org.signal.core.util.logging.Log; +import org.signal.core.models.media.Media; import org.signal.imageeditor.core.model.EditorModel; import org.thoughtcrime.securesms.fonts.FontTypefaceProvider; import org.thoughtcrime.securesms.providers.BlobProvider; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java index 004ba5679d..60f45d2b12 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java @@ -21,6 +21,8 @@ import com.annimon.stream.Stream; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; +import org.signal.core.models.media.Media; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.keyvalue.SignalStore; @@ -277,7 +279,7 @@ public class MediaRepository { long size = cursor.getLong(cursor.getColumnIndexOrThrow(Images.Media.SIZE)); long duration = !isImage ? cursor.getInt(cursor.getColumnIndexOrThrow(Video.Media.DURATION)) : 0; - media.add(fixMimeType(context, new Media(uri, mimetype, date, width, height, size, duration, false, false, bucketId, null, AttachmentTable.TransformProperties.forSentMediaQuality(SignalStore.settings().getSentMediaQuality().getCode()), null))); + media.add(fixMimeType(context, new Media(uri, mimetype, date, width, height, size, duration, false, false, bucketId, null, TransformProperties.forSentMediaQuality(SignalStore.settings().getSentMediaQuality().getCode()), null))); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt index 4930449e03..324389581a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivityResult.kt @@ -6,6 +6,7 @@ import android.os.Parcelable import kotlinx.parcelize.Parceler import kotlinx.parcelize.Parcelize import kotlinx.parcelize.TypeParceler +import org.signal.core.models.media.Media import org.signal.core.util.getParcelableExtraCompat import org.thoughtcrime.securesms.conversation.MessageSendType import org.thoughtcrime.securesms.database.model.Mention diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendDocumentFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendDocumentFragment.kt index 8d3cb35ccb..ffe8917f22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendDocumentFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendDocumentFragment.kt @@ -8,6 +8,7 @@ import android.view.View import android.widget.TextView import android.widget.Toast import androidx.fragment.app.Fragment +import org.signal.core.models.media.Media import org.signal.core.util.bytes import org.signal.core.util.getParcelableCompat import org.signal.core.util.logging.Log diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaTransform.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaTransform.java index 34a3e67ab9..2a2b738382 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaTransform.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaTransform.java @@ -5,6 +5,8 @@ import android.content.Context; import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; +import org.signal.core.models.media.Media; + public interface MediaTransform { @WorkerThread diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaUploadRepository.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaUploadRepository.java index 2887285529..1b06b7e5a3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaUploadRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaUploadRepository.java @@ -14,7 +14,8 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.AttachmentId; import org.thoughtcrime.securesms.database.AttachmentTable; -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties; +import org.signal.core.models.media.Media; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.jobmanager.JobManager; diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/SentMediaQualityTransform.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/SentMediaQualityTransform.java index d4f35d5da7..4e54e41abe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/SentMediaQualityTransform.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/SentMediaQualityTransform.java @@ -5,14 +5,17 @@ import android.content.Context; import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; -import org.thoughtcrime.securesms.database.AttachmentTable; +import org.signal.core.models.media.Media; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.mms.SentMediaQuality; import java.util.Optional; +import static org.thoughtcrime.securesms.database.TransformPropertiesUtilKt.transformPropertiesForSentMediaQuality; + /** - * Add a {@link SentMediaQuality} value for {@link AttachmentTable.TransformProperties#getSentMediaQuality()} on the + * Add a {@link SentMediaQuality} value for {@link TransformProperties#getSentMediaQuality()} on the * transformed media. Safe to use in a pipeline with other transforms. */ public final class SentMediaQualityTransform implements MediaTransform { @@ -37,7 +40,7 @@ public final class SentMediaQualityTransform implements MediaTransform { media.isVideoGif(), media.getBucketId(), media.getCaption(), - AttachmentTable.TransformProperties.forSentMediaQuality(Optional.ofNullable(media.getTransformProperties()), sentMediaQuality), + transformPropertiesForSentMediaQuality(Optional.ofNullable(media.getTransformProperties()), sentMediaQuality), media.getFileName()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoTrimTransform.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoTrimTransform.kt index 829a6ed52e..c5a32e5d02 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoTrimTransform.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoTrimTransform.kt @@ -2,7 +2,8 @@ package org.thoughtcrime.securesms.mediasend import android.content.Context import androidx.annotation.WorkerThread -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties +import org.signal.core.models.media.Media +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.mediasend.v2.videos.VideoTrimData import org.thoughtcrime.securesms.mms.SentMediaQuality diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaBuilder.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaBuilder.kt index cd4f58244b..628e61b332 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaBuilder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaBuilder.kt @@ -1,9 +1,9 @@ package org.thoughtcrime.securesms.mediasend.v2 import android.net.Uri +import org.signal.core.models.media.Media +import org.signal.core.models.media.TransformProperties import org.signal.core.util.orNull -import org.thoughtcrime.securesms.database.AttachmentTable -import org.thoughtcrime.securesms.mediasend.Media import java.util.Optional object MediaBuilder { @@ -19,7 +19,7 @@ object MediaBuilder { videoGif: Boolean = false, bucketId: Optional = Optional.empty(), caption: Optional = Optional.empty(), - transformProperties: Optional = Optional.empty(), + transformProperties: Optional = Optional.empty(), fileName: Optional = Optional.empty() ) = Media(uri, mimeType, date, width, height, size, duration, borderless, videoGif, bucketId.orNull(), caption.orNull(), transformProperties.orNull(), fileName.orNull()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt index 3a9b77bf29..a11758014e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt @@ -23,6 +23,7 @@ import androidx.transition.AutoTransition import androidx.transition.TransitionManager import com.google.android.material.animation.ArgbEvaluatorCompat import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import org.signal.core.models.media.Media import org.signal.core.util.BreakIteratorCompat import org.signal.core.util.OVERRIDE_TRANSITION_CLOSE_COMPAT import org.signal.core.util.concurrent.LifecycleDisposable @@ -39,7 +40,6 @@ import org.thoughtcrime.securesms.keyboard.emoji.EmojiKeyboardPageFragment import org.thoughtcrime.securesms.keyboard.emoji.search.EmojiSearchFragment import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil import org.thoughtcrime.securesms.mediasend.CameraDisplay -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult import org.thoughtcrime.securesms.mediasend.v2.review.MediaReviewFragment import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryPostCreationViewModel diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionRepository.kt index 5e6d82165a..9af968527a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionRepository.kt @@ -7,13 +7,14 @@ import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.models.media.Media +import org.signal.core.models.media.TransformProperties import org.signal.core.util.BreakIteratorCompat import org.signal.core.util.ThreadUtil import org.signal.core.util.logging.Log import org.signal.imageeditor.core.model.EditorModel import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.conversation.MessageSendType -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.Mention import org.thoughtcrime.securesms.database.model.StoryType @@ -23,7 +24,6 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.keyvalue.StorySend import org.thoughtcrime.securesms.mediasend.CompositeMediaTransform import org.thoughtcrime.securesms.mediasend.ImageEditorModelRenderMediaTransform -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaRepository import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult import org.thoughtcrime.securesms.mediasend.MediaTransform diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt index 6537014819..4eada60453 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt @@ -1,9 +1,9 @@ package org.thoughtcrime.securesms.mediasend.v2 import android.net.Uri +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.conversation.MessageSendType import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.v2.videos.VideoTrimData import org.thoughtcrime.securesms.mms.MediaConstraints import org.thoughtcrime.securesms.mms.SentMediaQuality diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt index 817bb641ff..1be2170d51 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt @@ -22,6 +22,7 @@ import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.BehaviorSubject import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.Subject +import org.signal.core.models.media.Media import org.signal.core.util.BreakIteratorCompat import org.signal.core.util.getParcelableArrayListCompat import org.signal.core.util.getParcelableCompat @@ -30,7 +31,6 @@ import org.thoughtcrime.securesms.components.mention.MentionAnnotation import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.conversation.MessageSendType import org.thoughtcrime.securesms.conversation.MessageStyler -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult import org.thoughtcrime.securesms.mediasend.v2.review.AddMessageCharacterCount import org.thoughtcrime.securesms.mediasend.v2.videos.VideoTrimData diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaValidator.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaValidator.kt index 50f5762f57..8b5f510729 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaValidator.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaValidator.kt @@ -2,7 +2,7 @@ package org.thoughtcrime.securesms.mediasend.v2 import android.content.Context import androidx.annotation.WorkerThread -import org.thoughtcrime.securesms.mediasend.Media +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.mms.MediaConstraints import org.thoughtcrime.securesms.stories.Stories import org.thoughtcrime.securesms.util.MediaUtil diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureEvent.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureEvent.kt index 3fd272b8b1..9a27b033a4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureEvent.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureEvent.kt @@ -1,6 +1,6 @@ package org.thoughtcrime.securesms.mediasend.v2.capture -import org.thoughtcrime.securesms.mediasend.Media +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.recipients.Recipient sealed interface MediaCaptureEvent { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt index 98552860e8..ccad2c288e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt @@ -9,12 +9,12 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.reactivex.rxjava3.core.Flowable +import org.signal.core.models.media.Media import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity import org.thoughtcrime.securesms.mediasend.CameraFragment -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.v2.HudCommand import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureRepository.kt index 7cce13564b..d26cddfe7d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureRepository.kt @@ -7,10 +7,10 @@ import android.net.Uri import android.os.Build import android.provider.MediaStore import androidx.annotation.WorkerThread +import org.signal.core.models.media.Media import org.signal.core.util.CursorUtil import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.logging.Log -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaRepository import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.util.MediaUtil diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureState.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureState.kt index 9f161d12e8..2d1a5bb1a0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureState.kt @@ -1,6 +1,6 @@ package org.thoughtcrime.securesms.mediasend.v2.capture -import org.thoughtcrime.securesms.mediasend.Media +import org.signal.core.models.media.Media data class MediaCaptureState( val mostRecentMedia: Media? = null diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt index 69b1df3bf6..e336d6cd72 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt @@ -10,9 +10,9 @@ import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.Subject +import org.signal.core.models.media.Media import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.profiles.manage.UsernameRepository import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.registration.data.QuickRegistrationRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/documents/MediaReviewDocumentPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/documents/MediaReviewDocumentPageFragment.kt index 042d001050..f3827a04c3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/documents/MediaReviewDocumentPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/documents/MediaReviewDocumentPageFragment.kt @@ -4,9 +4,9 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import org.signal.core.models.media.Media import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaSendDocumentFragment import org.thoughtcrime.securesms.mediasend.v2.HudCommand import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt index d4d5e9f09e..adde8fa295 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt @@ -15,12 +15,12 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.map import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper +import org.signal.core.models.media.Media import org.signal.core.util.Stopwatch import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.recyclerview.GridDividerDecoration import org.thoughtcrime.securesms.conversation.ManageContextMenu import org.thoughtcrime.securesms.databinding.V2MediaGalleryFragmentBinding -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaRepository import org.thoughtcrime.securesms.mediasend.camerax.CameraXUtil import org.thoughtcrime.securesms.mediasend.v2.review.MediaGalleryGridItemTouchListener diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryRepository.kt index fac03b9a81..f1acea9e7a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryRepository.kt @@ -1,7 +1,7 @@ package org.thoughtcrime.securesms.mediasend.v2.gallery import android.content.Context -import org.thoughtcrime.securesms.mediasend.Media +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.mediasend.MediaFolder import org.thoughtcrime.securesms.mediasend.MediaRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt index 24df5ba282..b13cb37e46 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt @@ -14,10 +14,10 @@ import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import com.google.android.material.imageview.ShapeableImageView +import org.signal.core.models.media.Media import org.signal.core.util.DimensionUnit import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaFolder import org.thoughtcrime.securesms.mediasend.v2.review.MediaGalleryGridItemTouchListener import org.thoughtcrime.securesms.mms.DecryptableUri diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectedItem.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectedItem.kt index 591c5cd477..d46d01098c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectedItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectedItem.kt @@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.mediasend.v2.gallery import android.view.View import android.widget.ImageView import com.bumptech.glide.Glide +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mms.DecryptableUri import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt index 2335275e38..c913885283 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt @@ -8,9 +8,9 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.ItemTouchHelper import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import org.signal.core.models.media.Media import org.signal.core.util.concurrent.LifecycleDisposable import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionNavigator.Companion.requestPermissionsForCamera import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionViewModel diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt index f278256657..13b73693ff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt @@ -31,6 +31,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.imageview.ShapeableImageView +import org.signal.core.models.media.Media import org.signal.core.util.bytes import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.concurrent.SimpleTask @@ -44,7 +45,6 @@ import org.thoughtcrime.securesms.conversation.ScheduleMessageTimePickerBottomSh import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardActivity import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult import org.thoughtcrime.securesms.mediasend.v2.HudCommand import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragmentPagerAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragmentPagerAdapter.kt index f755e4fece..8e7898ac40 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragmentPagerAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragmentPagerAdapter.kt @@ -4,7 +4,7 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter -import org.thoughtcrime.securesms.mediasend.Media +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.mediasend.v2.documents.MediaReviewDocumentPageFragment import org.thoughtcrime.securesms.mediasend.v2.gif.MediaReviewGifPageFragment import org.thoughtcrime.securesms.mediasend.v2.images.MediaReviewImagePageFragment diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewSelectedItem.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewSelectedItem.kt index c80c84d6e2..3c953bd458 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewSelectedItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewSelectedItem.kt @@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.mediasend.v2.review import android.view.View import android.widget.ImageView import com.bumptech.glide.Glide +import org.signal.core.models.media.Media import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mms.DecryptableUri import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/ImageSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/ImageSlide.java index 0d690d4cad..15acfbf92e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/ImageSlide.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/ImageSlide.java @@ -28,7 +28,7 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.blurhash.BlurHash; -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.util.MediaUtil; public class ImageSlide extends Slide { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java index 0ed9fa53a1..823bb4f916 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java @@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.AttachmentId; import org.thoughtcrime.securesms.avatar.AvatarPickerStorage; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.emoji.EmojiFiles; @@ -160,7 +161,7 @@ public class PartAuthority { } } - public static @Nullable AttachmentTable.TransformProperties getAttachmentTransformProperties(@NonNull Uri uri) { + public static @Nullable TransformProperties getAttachmentTransformProperties(@NonNull Uri uri) { int match = uriMatcher.match(uri); switch (match) { case PART_ROW: diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/Slide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/Slide.java index 472970e578..6ed502d7ea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/Slide.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/Slide.java @@ -29,6 +29,7 @@ import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.UriAttachment; import org.thoughtcrime.securesms.audio.AudioHash; import org.thoughtcrime.securesms.blurhash.BlurHash; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.stickers.StickerLocator; import org.thoughtcrime.securesms.util.MediaUtil; @@ -211,7 +212,7 @@ public abstract class Slide { boolean borderless, boolean gif, boolean quote, - @Nullable AttachmentTable.TransformProperties transformProperties) + @Nullable TransformProperties transformProperties) { String resolvedType = Optional.ofNullable(MediaUtil.getMimeType(context, uri)).orElse(defaultMime); String fastPreflightId = String.valueOf(new SecureRandom().nextLong()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/SlideFactory.java b/app/src/main/java/org/thoughtcrime/securesms/mms/SlideFactory.java index bc19fa7852..95a2bd0a8d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/SlideFactory.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/SlideFactory.java @@ -12,6 +12,7 @@ import androidx.annotation.Nullable; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.blurhash.BlurHash; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.util.MediaUtil; @@ -41,7 +42,7 @@ public final class SlideFactory { * * @return A Slide with all the information we can gather about it. */ - public static @Nullable Slide getSlide(@NonNull Context context, @Nullable String contentType, @NonNull Uri uri, int width, int height, @Nullable AttachmentTable.TransformProperties transformProperties) { + public static @Nullable Slide getSlide(@NonNull Context context, @Nullable String contentType, @NonNull Uri uri, int width, int height, @Nullable TransformProperties transformProperties) { MediaType mediaType = MediaType.from(contentType); try { @@ -65,7 +66,7 @@ public final class SlideFactory { @NonNull Uri uri, int width, int height, - @Nullable AttachmentTable.TransformProperties transformProperties + @Nullable TransformProperties transformProperties ) { long start = System.currentTimeMillis(); @@ -99,7 +100,7 @@ public final class SlideFactory { @NonNull Uri uri, int width, int height, - @Nullable AttachmentTable.TransformProperties transformProperties + @Nullable TransformProperties transformProperties ) throws IOException { long start = System.currentTimeMillis(); @@ -162,7 +163,7 @@ public final class SlideFactory { int width, int height, boolean gif, - @Nullable AttachmentTable.TransformProperties transformProperties) + @Nullable TransformProperties transformProperties) { if (mimeType == null) { mimeType = "application/octet-stream"; @@ -172,7 +173,7 @@ public final class SlideFactory { case IMAGE: return new ImageSlide(context, uri, mimeType, dataSize, width, height, false, null, blurHash, transformProperties); case GIF: return new GifSlide(context, uri, dataSize, width, height); case AUDIO: return new AudioSlide(context, uri, dataSize, false); - case VIDEO: return new VideoSlide(context, uri, dataSize, gif, null, AttachmentTable.TransformProperties.forSentMediaQuality(transformProperties != null ? transformProperties.sentMediaQuality : SentMediaQuality.STANDARD.getCode())); + case VIDEO: return new VideoSlide(context, uri, dataSize, gif, null, TransformProperties.forSentMediaQuality(transformProperties != null ? transformProperties.sentMediaQuality : SentMediaQuality.STANDARD.getCode())); case VCARD: case DOCUMENT: return new DocumentSlide(context, uri, mimeType, dataSize, fileName); default: throw new AssertionError("unrecognized enum"); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/VideoSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/VideoSlide.java index da86906da5..e02f43f89e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/VideoSlide.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/VideoSlide.java @@ -26,6 +26,7 @@ import androidx.annotation.Nullable; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.attachments.Attachment; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicy; import org.thoughtcrime.securesms.util.MediaUtil; @@ -36,11 +37,11 @@ public class VideoSlide extends Slide { this(context, uri, dataSize, gif, null, null); } - public VideoSlide(Context context, Uri uri, long dataSize, boolean gif, @Nullable String caption, @Nullable AttachmentTable.TransformProperties transformProperties) { + public VideoSlide(Context context, Uri uri, long dataSize, boolean gif, @Nullable String caption, @Nullable TransformProperties transformProperties) { super(constructAttachmentFromUri(context, uri, MediaUtil.VIDEO_UNSPECIFIED, dataSize, 0, 0, MediaUtil.hasVideoThumbnail(context, uri), null, caption, null, null, null, false, false, gif, false, transformProperties)); } - public VideoSlide(Context context, Uri uri, long dataSize, boolean gif, int width, int height, @Nullable String caption, @Nullable AttachmentTable.TransformProperties transformProperties) { + public VideoSlide(Context context, Uri uri, long dataSize, boolean gif, int width, int height, @Nullable String caption, @Nullable TransformProperties transformProperties) { super(constructAttachmentFromUri(context, uri, MediaUtil.VIDEO_UNSPECIFIED, dataSize, width, height, MediaUtil.hasVideoThumbnail(context, uri), null, caption, null, null, null, false, false, gif, false, transformProperties)); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java index 2d6f93725b..1e60e89f82 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java @@ -34,7 +34,7 @@ import org.thoughtcrime.securesms.databinding.CreateProfileFragmentBinding; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.profiles.edit.pnp.WhoCanFindMeByPhoneNumberFragment; import org.thoughtcrime.securesms.profiles.manage.EditProfileNameFragment; import org.thoughtcrime.securesms.providers.BlobProvider; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java index d0017480bd..7ac10931b4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java @@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.conversation.colors.AvatarColor; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.profiles.edit.EditProfileRepository.UploadResult; import org.thoughtcrime.securesms.util.SingleLiveEvent; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt index f57478f91a..a53a5b12d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt @@ -22,6 +22,7 @@ import com.airbnb.lottie.SimpleColorFilter import com.bumptech.glide.Glide import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar +import org.signal.core.models.media.Media import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.AvatarPreviewActivity @@ -36,7 +37,6 @@ import org.thoughtcrime.securesms.components.emoji.EmojiUtil import org.thoughtcrime.securesms.databinding.EditProfileFragmentBinding import org.thoughtcrime.securesms.keyvalue.AccountValues import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.profiles.ProfileName import org.thoughtcrime.securesms.profiles.manage.EditProfileViewModel.AvatarState import org.thoughtcrime.securesms.profiles.manage.UsernameRepository.UsernameDeleteResult diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileViewModel.java index 3f5fee4a77..3e92c81ff1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileViewModel.java @@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.badges.models.Badge; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.jobs.RefreshOwnProfileJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.profiles.AvatarHelper; import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.providers.BlobProvider; diff --git a/app/src/main/java/org/thoughtcrime/securesms/serialization/UriSerializer.kt b/app/src/main/java/org/thoughtcrime/securesms/serialization/UriSerializer.kt index 2e819796b6..94f9070087 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/serialization/UriSerializer.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/serialization/UriSerializer.kt @@ -5,25 +5,7 @@ package org.thoughtcrime.securesms.serialization -import android.net.Uri -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder - /** - * Kotlinx Serialization serializer for Android [Uri] objects. + * Typealias to the core UriSerializer class for backward compatibility. */ -class UriSerializer : KSerializer { - override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Uri", PrimitiveKind.STRING) - - override fun serialize(encoder: Encoder, value: Uri) { - encoder.encodeString(value.toString()) - } - - override fun deserialize(decoder: Decoder): Uri { - return Uri.parse(decoder.decodeString()) - } -} +typealias UriSerializer = org.signal.core.models.UriSerializer diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareArgs.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareArgs.java index f73b55c4eb..9197c81f2d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareArgs.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareArgs.java @@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.database.model.Mention; import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; import org.thoughtcrime.securesms.linkpreview.LinkPreview; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.stickers.StickerLocator; import org.thoughtcrime.securesms.stories.Stories; import org.thoughtcrime.securesms.util.MediaUtil; 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 31fe8a60bc..4803a114f2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java @@ -22,6 +22,7 @@ import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey; import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.conversation.MessageSendType; import org.thoughtcrime.securesms.conversation.colors.ChatColors; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.model.Mention; @@ -31,7 +32,7 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.keyvalue.StorySend; import org.thoughtcrime.securesms.linkpreview.LinkPreview; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryBackgroundColors; import org.thoughtcrime.securesms.mms.ImageSlide; import org.thoughtcrime.securesms.mms.OutgoingMessage; @@ -352,7 +353,7 @@ public final class MultiShareSender { private static Slide ensureDefaultQuality(@NonNull Context context, @NonNull ImageSlide imageSlide) { Attachment attachment = imageSlide.asAttachment(); - final AttachmentTable.TransformProperties transformProperties = attachment.transformProperties; + final TransformProperties transformProperties = attachment.transformProperties; if (transformProperties != null && transformProperties.sentMediaQuality == SentMediaQuality.HIGH.getCode()) { return new ImageSlide( context, @@ -364,7 +365,7 @@ public final class MultiShareSender { attachment.borderless, attachment.caption, attachment.blurHash, - AttachmentTable.TransformProperties.empty() + TransformProperties.empty() ); } else { return imageSlide; diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ResolvedShareData.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ResolvedShareData.kt index f42295c3fb..b716ba8ecd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ResolvedShareData.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ResolvedShareData.kt @@ -25,7 +25,7 @@ sealed class ResolvedShareData { } data class Media( - val media: List, + val media: List, val text: CharSequence? ) : ResolvedShareData() { override fun toMultiShareArgs(): MultiShareArgs { diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt index 5d3ada2c3a..6cec3e640b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt @@ -16,6 +16,7 @@ import androidx.core.text.buildSpannedString import com.google.android.material.appbar.MaterialToolbar import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.kotlin.subscribeBy +import org.signal.core.models.media.Media import org.signal.core.util.Result import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.concurrent.addTo @@ -33,7 +34,6 @@ import org.thoughtcrime.securesms.conversation.MessageSendType import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFullScreenDialogFragment -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionActivity.Companion.share import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.sharing.MultiShareDialogs diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt index e10784980f..6a382062a5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt @@ -7,8 +7,8 @@ import androidx.annotation.NonNull import androidx.annotation.WorkerThread import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.models.media.Media import org.signal.core.util.logging.Log -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.providers.BlobProvider import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.RemoteConfig diff --git a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java index 0f600a0f24..0850b17348 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java @@ -59,7 +59,7 @@ import org.thoughtcrime.securesms.jobs.PushGroupSendJob; import org.thoughtcrime.securesms.jobs.ReactionSendJob; import org.thoughtcrime.securesms.jobs.RemoteDeleteSendJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.mms.OutgoingMessage; import org.thoughtcrime.securesms.recipients.Recipient; diff --git a/app/src/main/java/org/thoughtcrime/securesms/sms/UploadDependencyGraph.kt b/app/src/main/java/org/thoughtcrime/securesms/sms/UploadDependencyGraph.kt index 1786a86f5e..4e31f99f7c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sms/UploadDependencyGraph.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sms/UploadDependencyGraph.kt @@ -1,12 +1,11 @@ package org.thoughtcrime.securesms.sms import androidx.annotation.WorkerThread +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.attachments.Attachment import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.attachments.UriAttachment -import org.thoughtcrime.securesms.database.AttachmentTable -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.JobManager import org.thoughtcrime.securesms.jobs.AttachmentCompressionJob @@ -44,7 +43,7 @@ class UploadDependencyGraph private constructor( */ private data class AttachmentKey( val attachment: A, - private val transformProperties: AttachmentTable.TransformProperties = attachment.transformProperties ?: AttachmentTable.TransformProperties.empty() + private val transformProperties: TransformProperties = attachment.transformProperties ?: TransformProperties.empty() ) private var hasConsumedJobQueue = false diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt index 110c5e3f1d..c6651e26a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt @@ -10,20 +10,19 @@ import androidx.media3.common.Player import androidx.media3.exoplayer.ExoPlayer import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.models.media.Media +import org.signal.core.models.media.TransformProperties import org.signal.core.util.ThreadUtil import org.signal.core.util.logging.Log import org.signal.core.util.orNull import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.contacts.HeaderAction -import org.thoughtcrime.securesms.database.AttachmentTable -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.DistributionListId import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.v2.stories.ChooseStoryTypeBottomSheet import org.thoughtcrime.securesms.mms.MediaConstraints import org.thoughtcrime.securesms.mms.OutgoingMessage @@ -243,11 +242,12 @@ object Stories { } private fun getContentDuration(media: Media): DurationResult { + val transforms = media.transformProperties return if (MediaUtil.isVideo(media.contentType)) { - val mediaDuration = if (media.duration == 0L && media.transformProperties?.shouldSkipTransform() ?: true) { + val mediaDuration = if (media.duration == 0L && transforms?.shouldSkipTransform() ?: true) { getVideoDuration(media.uri) - } else if (media.transformProperties?.videoTrim ?: false) { - TimeUnit.MICROSECONDS.toMillis(media.transformProperties.videoTrimEndTimeUs - media.transformProperties.videoTrimStartTimeUs) + } else if (transforms?.videoTrim ?: false) { + TimeUnit.MICROSECONDS.toMillis(transforms.videoTrimEndTimeUs - transforms.videoTrimStartTimeUs) } else { media.duration } @@ -341,11 +341,11 @@ object Stories { error("Illegal clip: $startTimeUs > $endTimeUs for clip $clipIndex") } - AttachmentTable.TransformProperties(false, true, startTimeUs, endTimeUs, SentMediaQuality.STANDARD.code, false) + TransformProperties(false, true, startTimeUs, endTimeUs, SentMediaQuality.STANDARD.code, false) }.map { transformMedia(media, it) } } - private fun transformMedia(media: Media, transformProperties: AttachmentTable.TransformProperties): Media { + private fun transformMedia(media: Media, transformProperties: TransformProperties): Media { Log.d(TAG, "Transforming media clip: ${transformProperties.videoTrimStartTimeUs.microseconds.inWholeSeconds}s to ${transformProperties.videoTrimEndTimeUs.microseconds.inWholeSeconds}s") return Media( uri = media.uri, 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 db897ed3ae..8c4ffd46ca 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java @@ -30,7 +30,7 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.AttachmentId; import org.thoughtcrime.securesms.database.SignalDatabase; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.mms.AudioSlide; import org.thoughtcrime.securesms.mms.DecryptableUri; import org.thoughtcrime.securesms.mms.DocumentSlide; diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/crop/WallpaperImageSelectionActivity.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/crop/WallpaperImageSelectionActivity.java index e56da74048..5ca8d88d1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/crop/WallpaperImageSelectionActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/crop/WallpaperImageSelectionActivity.java @@ -11,7 +11,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.mediasend.Media; +import org.signal.core.models.media.Media; import org.thoughtcrime.securesms.mediasend.v2.gallery.MediaGalleryFragment; import org.thoughtcrime.securesms.recipients.RecipientId; diff --git a/app/src/main/res/navigation/avatar_picker.xml b/app/src/main/res/navigation/avatar_picker.xml index dfb74e534c..1401197ce6 100644 --- a/app/src/main/res/navigation/avatar_picker.xml +++ b/app/src/main/res/navigation/avatar_picker.xml @@ -51,7 +51,7 @@ diff --git a/app/src/main/res/navigation/create_group.xml b/app/src/main/res/navigation/create_group.xml index 826530b517..a95090d4cb 100644 --- a/app/src/main/res/navigation/create_group.xml +++ b/app/src/main/res/navigation/create_group.xml @@ -36,7 +36,7 @@ diff --git a/app/src/main/res/navigation/create_profile.xml b/app/src/main/res/navigation/create_profile.xml index 3c6c929c38..880294eb47 100644 --- a/app/src/main/res/navigation/create_profile.xml +++ b/app/src/main/res/navigation/create_profile.xml @@ -25,7 +25,7 @@ diff --git a/app/src/main/res/navigation/edit_profile.xml b/app/src/main/res/navigation/edit_profile.xml index dfbbeee254..8cb942a11a 100644 --- a/app/src/main/res/navigation/edit_profile.xml +++ b/app/src/main/res/navigation/edit_profile.xml @@ -50,7 +50,7 @@ diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/AttachmentDatabaseTransformPropertiesTest.java b/app/src/test/java/org/thoughtcrime/securesms/database/AttachmentDatabaseTransformPropertiesTest.java index dc52b93568..f9a34846f5 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/AttachmentDatabaseTransformPropertiesTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/database/AttachmentDatabaseTransformPropertiesTest.java @@ -1,28 +1,31 @@ package org.thoughtcrime.securesms.database; import org.junit.Test; +import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.mms.SentMediaQuality; import static org.junit.Assert.assertEquals; +import static org.thoughtcrime.securesms.database.TransformPropertiesUtilKt.parseTransformProperties; +import static org.thoughtcrime.securesms.database.TransformPropertiesUtilKt.serialize; public class AttachmentDatabaseTransformPropertiesTest { @Test public void transformProperties_verifyStructure() { - AttachmentTable.TransformProperties properties = AttachmentTable.TransformProperties.empty(); + TransformProperties properties = TransformProperties.empty(); assertEquals("Added transform property, need to confirm default behavior for pre-existing payloads in database", "{\"skipTransform\":false,\"videoTrim\":false,\"videoTrimStartTimeUs\":0,\"videoTrimEndTimeUs\":0,\"sentMediaQuality\":0,\"mp4Faststart\":false,\"videoEdited\":false}", - properties.serialize()); + serialize(properties)); } @Test public void transformProperties_verifyMissingSentMediaQualityDefaultBehavior() { String json = "{\"skipTransform\":false,\"videoTrim\":false,\"videoTrimStartTimeUs\":0,\"videoTrimEndTimeUs\":0,\"videoEdited\":false,\"mp4Faststart\":false}"; - AttachmentTable.TransformProperties properties = AttachmentTable.TransformProperties.parse(json); + TransformProperties properties = parseTransformProperties(json); assertEquals(0, properties.sentMediaQuality); assertEquals(SentMediaQuality.STANDARD, SentMediaQuality.fromCode(properties.sentMediaQuality)); } -} \ No newline at end of file +} diff --git a/app/src/test/java/org/thoughtcrime/securesms/mediasend/MediaRepositoryTest.kt b/app/src/test/java/org/thoughtcrime/securesms/mediasend/MediaRepositoryTest.kt index 4497d0210a..0540145185 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/mediasend/MediaRepositoryTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/mediasend/MediaRepositoryTest.kt @@ -12,8 +12,9 @@ import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config +import org.signal.core.models.media.Media +import org.signal.core.models.media.TransformProperties import org.signal.core.util.logging.Log -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties import org.thoughtcrime.securesms.testutil.EmptyLogger import org.thoughtcrime.securesms.util.MediaUtil diff --git a/app/src/test/java/org/thoughtcrime/securesms/sms/UploadDependencyGraphTest.kt b/app/src/test/java/org/thoughtcrime/securesms/sms/UploadDependencyGraphTest.kt index 7286ef2f72..ec005f72bc 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/sms/UploadDependencyGraphTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/sms/UploadDependencyGraphTest.kt @@ -9,6 +9,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.attachments.Attachment import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.attachments.DatabaseAttachment @@ -80,7 +81,7 @@ class UploadDependencyGraphTest { UriAttachmentBuilder.build( id = 10, contentType = MediaUtil.IMAGE_JPEG, - transformProperties = AttachmentTable.TransformProperties(false, true, increment, increment + 1, SentMediaQuality.STANDARD.code, false) + transformProperties = TransformProperties(false, true, increment, increment + 1, SentMediaQuality.STANDARD.code, false) ) } @@ -122,7 +123,7 @@ class UploadDependencyGraphTest { UriAttachmentBuilder.build( id = 10, contentType = MediaUtil.IMAGE_JPEG, - transformProperties = if (it != 1) AttachmentTable.TransformProperties(false, true, 1, 2, SentMediaQuality.STANDARD.code, false) else null + transformProperties = if (it != 1) TransformProperties(false, true, 1, 2, SentMediaQuality.STANDARD.code, false) else null ) } @@ -182,7 +183,7 @@ class UploadDependencyGraphTest { UriAttachmentBuilder.build( 1L, contentType = MediaUtil.IMAGE_JPEG, - transformProperties = AttachmentTable.TransformProperties.forVideoTrim(it.toLong(), it.toLong() + 1) + transformProperties = TransformProperties.forVideoTrim(it.toLong(), it.toLong() + 1) ) } diff --git a/app/src/test/java/org/thoughtcrime/securesms/testutil/UriAttachmentBuilder.kt b/app/src/test/java/org/thoughtcrime/securesms/testutil/UriAttachmentBuilder.kt index ba2fef8081..e5d93dbed9 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/testutil/UriAttachmentBuilder.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/testutil/UriAttachmentBuilder.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.testutil import android.net.Uri +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.attachments.UriAttachment import org.thoughtcrime.securesms.audio.AudioHash import org.thoughtcrime.securesms.blurhash.BlurHash @@ -24,7 +25,7 @@ object UriAttachmentBuilder { stickerLocator: StickerLocator? = null, blurHash: BlurHash? = null, audioHash: AudioHash? = null, - transformProperties: AttachmentTable.TransformProperties? = null + transformProperties: TransformProperties? = null ): UriAttachment { return UriAttachment( uri, diff --git a/app/src/testShared/org/thoughtcrime/securesms/database/FakeMessageRecords.kt b/app/src/testShared/org/thoughtcrime/securesms/database/FakeMessageRecords.kt index 5b066493f5..799892cb48 100644 --- a/app/src/testShared/org/thoughtcrime/securesms/database/FakeMessageRecords.kt +++ b/app/src/testShared/org/thoughtcrime/securesms/database/FakeMessageRecords.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.database +import org.signal.core.models.media.TransformProperties import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.attachments.Cdn import org.thoughtcrime.securesms.attachments.DatabaseAttachment @@ -56,7 +57,7 @@ object FakeMessageRecords { stickerLocator: StickerLocator? = null, blurHash: BlurHash? = null, audioHash: AudioHash? = null, - transformProperties: AttachmentTable.TransformProperties? = null, + transformProperties: TransformProperties? = null, displayOrder: Int = 0, uploadTimestamp: Long = 200, dataHash: String? = null, diff --git a/core/models-jvm/build.gradle.kts b/core/models-jvm/build.gradle.kts new file mode 100644 index 0000000000..6fb45baa8f --- /dev/null +++ b/core/models-jvm/build.gradle.kts @@ -0,0 +1,27 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +plugins { + id("java-library") + id("org.jetbrains.kotlin.jvm") + id("ktlint") +} + +java { + sourceCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get()) + targetCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get()) +} + +kotlin { + jvmToolchain { + languageVersion = JavaLanguageVersion.of(libs.versions.kotlinJvmTarget.get()) + } +} + +dependencies { + implementation(libs.libsignal.client) + implementation(libs.square.okio) + implementation(project(":core:util-jvm")) +} diff --git a/core/models/src/main/java/org/signal/core/models/AccountEntropyPool.kt b/core/models-jvm/src/main/java/org/signal/core/models/AccountEntropyPool.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/AccountEntropyPool.kt rename to core/models-jvm/src/main/java/org/signal/core/models/AccountEntropyPool.kt diff --git a/core/models/src/main/java/org/signal/core/models/MasterKey.kt b/core/models-jvm/src/main/java/org/signal/core/models/MasterKey.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/MasterKey.kt rename to core/models-jvm/src/main/java/org/signal/core/models/MasterKey.kt diff --git a/core/models/src/main/java/org/signal/core/models/ServiceId.kt b/core/models-jvm/src/main/java/org/signal/core/models/ServiceId.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/ServiceId.kt rename to core/models-jvm/src/main/java/org/signal/core/models/ServiceId.kt diff --git a/core/models/src/main/java/org/signal/core/models/backup/BackupId.kt b/core/models-jvm/src/main/java/org/signal/core/models/backup/BackupId.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/backup/BackupId.kt rename to core/models-jvm/src/main/java/org/signal/core/models/backup/BackupId.kt diff --git a/core/models/src/main/java/org/signal/core/models/backup/BackupKey.kt b/core/models-jvm/src/main/java/org/signal/core/models/backup/BackupKey.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/backup/BackupKey.kt rename to core/models-jvm/src/main/java/org/signal/core/models/backup/BackupKey.kt diff --git a/core/models/src/main/java/org/signal/core/models/backup/MediaId.kt b/core/models-jvm/src/main/java/org/signal/core/models/backup/MediaId.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/backup/MediaId.kt rename to core/models-jvm/src/main/java/org/signal/core/models/backup/MediaId.kt diff --git a/core/models/src/main/java/org/signal/core/models/backup/MediaName.kt b/core/models-jvm/src/main/java/org/signal/core/models/backup/MediaName.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/backup/MediaName.kt rename to core/models-jvm/src/main/java/org/signal/core/models/backup/MediaName.kt diff --git a/core/models/src/main/java/org/signal/core/models/backup/MediaRootBackupKey.kt b/core/models-jvm/src/main/java/org/signal/core/models/backup/MediaRootBackupKey.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/backup/MediaRootBackupKey.kt rename to core/models-jvm/src/main/java/org/signal/core/models/backup/MediaRootBackupKey.kt diff --git a/core/models/src/main/java/org/signal/core/models/backup/MessageBackupKey.kt b/core/models-jvm/src/main/java/org/signal/core/models/backup/MessageBackupKey.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/backup/MessageBackupKey.kt rename to core/models-jvm/src/main/java/org/signal/core/models/backup/MessageBackupKey.kt diff --git a/core/models/src/main/java/org/signal/core/models/storageservice/StorageCipherKey.kt b/core/models-jvm/src/main/java/org/signal/core/models/storageservice/StorageCipherKey.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/storageservice/StorageCipherKey.kt rename to core/models-jvm/src/main/java/org/signal/core/models/storageservice/StorageCipherKey.kt diff --git a/core/models/src/main/java/org/signal/core/models/storageservice/StorageItemKey.kt b/core/models-jvm/src/main/java/org/signal/core/models/storageservice/StorageItemKey.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/storageservice/StorageItemKey.kt rename to core/models-jvm/src/main/java/org/signal/core/models/storageservice/StorageItemKey.kt diff --git a/core/models/src/main/java/org/signal/core/models/storageservice/StorageKey.kt b/core/models-jvm/src/main/java/org/signal/core/models/storageservice/StorageKey.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/storageservice/StorageKey.kt rename to core/models-jvm/src/main/java/org/signal/core/models/storageservice/StorageKey.kt diff --git a/core/models/src/main/java/org/signal/core/models/storageservice/StorageManifestKey.kt b/core/models-jvm/src/main/java/org/signal/core/models/storageservice/StorageManifestKey.kt similarity index 100% rename from core/models/src/main/java/org/signal/core/models/storageservice/StorageManifestKey.kt rename to core/models-jvm/src/main/java/org/signal/core/models/storageservice/StorageManifestKey.kt diff --git a/core/models/build.gradle.kts b/core/models/build.gradle.kts index 6fb45baa8f..8f44920779 100644 --- a/core/models/build.gradle.kts +++ b/core/models/build.gradle.kts @@ -4,24 +4,16 @@ */ plugins { - id("java-library") - id("org.jetbrains.kotlin.jvm") - id("ktlint") + id("signal-library") + id("kotlin-parcelize") + alias(libs.plugins.kotlinx.serialization) } -java { - sourceCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get()) - targetCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get()) -} - -kotlin { - jvmToolchain { - languageVersion = JavaLanguageVersion.of(libs.versions.kotlinJvmTarget.get()) - } +android { + namespace = "org.signal.core.models" } dependencies { - implementation(libs.libsignal.client) - implementation(libs.square.okio) - implementation(project(":core:util-jvm")) + implementation(libs.kotlinx.serialization.json) + implementation(libs.jackson.core) } diff --git a/core/models/src/main/AndroidManifest.xml b/core/models/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..3752c114f7 --- /dev/null +++ b/core/models/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + diff --git a/core/models/src/main/java/org/signal/core/models/UriSerializer.kt b/core/models/src/main/java/org/signal/core/models/UriSerializer.kt new file mode 100644 index 0000000000..e68b41a3a7 --- /dev/null +++ b/core/models/src/main/java/org/signal/core/models/UriSerializer.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.core.models + +import android.net.Uri +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +/** + * Kotlinx Serialization serializer for Android [Uri] objects. + */ +class UriSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Uri", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: Uri) { + encoder.encodeString(value.toString()) + } + + override fun deserialize(decoder: Decoder): Uri { + return Uri.parse(decoder.decodeString()) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/Media.kt b/core/models/src/main/java/org/signal/core/models/media/Media.kt similarity index 82% rename from app/src/main/java/org/thoughtcrime/securesms/mediasend/Media.kt rename to core/models/src/main/java/org/signal/core/models/media/Media.kt index 6989353f0c..2c37254362 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/Media.kt +++ b/core/models/src/main/java/org/signal/core/models/media/Media.kt @@ -1,11 +1,15 @@ -package org.thoughtcrime.securesms.mediasend +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.core.models.media import android.net.Uri import android.os.Parcelable import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable -import org.thoughtcrime.securesms.database.AttachmentTable.TransformProperties -import org.thoughtcrime.securesms.serialization.UriSerializer +import org.signal.core.models.UriSerializer /** * Represents a piece of media that the user has on their device. diff --git a/core/models/src/main/java/org/signal/core/models/media/TransformProperties.kt b/core/models/src/main/java/org/signal/core/models/media/TransformProperties.kt new file mode 100644 index 0000000000..f14830dd2b --- /dev/null +++ b/core/models/src/main/java/org/signal/core/models/media/TransformProperties.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.core.models.media + +import android.os.Parcelable +import com.fasterxml.jackson.annotation.JsonProperty +import kotlinx.parcelize.IgnoredOnParcel +import kotlinx.parcelize.Parcelize +import kotlinx.serialization.Serializable + +/** + * Properties that describe transformations to be applied to media before sending. + */ +@Serializable +@Parcelize +data class TransformProperties( + @JsonProperty("skipTransform") + @JvmField + val skipTransform: Boolean = false, + + @JsonProperty("videoTrim") + @JvmField + val videoTrim: Boolean = false, + + @JsonProperty("videoTrimStartTimeUs") + @JvmField + val videoTrimStartTimeUs: Long = 0, + + @JsonProperty("videoTrimEndTimeUs") + @JvmField + val videoTrimEndTimeUs: Long = 0, + + @JsonProperty("sentMediaQuality") + @JvmField + val sentMediaQuality: Int = DEFAULT_MEDIA_QUALITY, + + @JsonProperty("mp4Faststart") + @JvmField + val mp4FastStart: Boolean = false +) : Parcelable { + fun shouldSkipTransform(): Boolean { + return skipTransform + } + + @IgnoredOnParcel + @JsonProperty("videoEdited") + val videoEdited: Boolean = videoTrim + + fun withSkipTransform(): TransformProperties { + return this.copy( + skipTransform = true + ) + } + + fun withMp4FastStart(): TransformProperties { + return this.copy(mp4FastStart = true) + } + + companion object { + /** Corresponds to SentMediaQuality.STANDARD.code */ + const val DEFAULT_MEDIA_QUALITY = 0 + + @JvmStatic + fun empty(): TransformProperties { + return TransformProperties( + skipTransform = false, + videoTrim = false, + videoTrimStartTimeUs = 0, + videoTrimEndTimeUs = 0, + sentMediaQuality = DEFAULT_MEDIA_QUALITY, + mp4FastStart = false + ) + } + + fun forSkipTransform(): TransformProperties { + return TransformProperties( + skipTransform = true, + videoTrim = false, + videoTrimStartTimeUs = 0, + videoTrimEndTimeUs = 0, + sentMediaQuality = DEFAULT_MEDIA_QUALITY, + mp4FastStart = false + ) + } + + fun forVideoTrim(videoTrimStartTimeUs: Long, videoTrimEndTimeUs: Long): TransformProperties { + return TransformProperties( + skipTransform = false, + videoTrim = true, + videoTrimStartTimeUs = videoTrimStartTimeUs, + videoTrimEndTimeUs = videoTrimEndTimeUs, + sentMediaQuality = DEFAULT_MEDIA_QUALITY, + mp4FastStart = false + ) + } + + @JvmStatic + fun forSentMediaQuality(sentMediaQuality: Int): TransformProperties { + return TransformProperties(sentMediaQuality = sentMediaQuality) + } + } +} diff --git a/core/util/build.gradle.kts b/core/util/build.gradle.kts index 7795fd0e6e..2c1022d2b0 100644 --- a/core/util/build.gradle.kts +++ b/core/util/build.gradle.kts @@ -1,6 +1,8 @@ plugins { id("signal-library") id("com.squareup.wire") + id("kotlin-parcelize") + alias(libs.plugins.kotlinx.serialization) } android { @@ -12,6 +14,8 @@ dependencies { implementation(libs.androidx.sqlite) implementation(libs.androidx.documentfile) + implementation(libs.kotlinx.serialization.json) + implementation(libs.jackson.core) testImplementation(libs.androidx.sqlite.framework) testImplementation(testLibs.junit.junit) diff --git a/demo/registration/build.gradle.kts b/demo/registration/build.gradle.kts index 0f0099f2ba..7bc8cabf47 100644 --- a/demo/registration/build.gradle.kts +++ b/demo/registration/build.gradle.kts @@ -57,7 +57,7 @@ dependencies { // Core dependencies implementation(project(":core:ui")) implementation(project(":core:util")) - implementation(project(":core:models")) + implementation(project(":core:models-jvm")) implementation(project(":lib:libsignal-service")) // libsignal-protocol for PreKeyCollection types diff --git a/feature/registration/build.gradle.kts b/feature/registration/build.gradle.kts index c45904da54..4887a8999e 100644 --- a/feature/registration/build.gradle.kts +++ b/feature/registration/build.gradle.kts @@ -26,7 +26,7 @@ dependencies { // Project dependencies implementation(project(":core:ui")) implementation(project(":core:util")) - implementation(project(":core:models")) + implementation(project(":core:models-jvm")) implementation(libs.libsignal.android) // Compose BOM diff --git a/lib/libsignal-service/build.gradle.kts b/lib/libsignal-service/build.gradle.kts index 47a4d104a7..82ca3ac7a1 100644 --- a/lib/libsignal-service/build.gradle.kts +++ b/lib/libsignal-service/build.gradle.kts @@ -112,7 +112,7 @@ dependencies { implementation(libs.kotlinx.coroutines.core.jvm) implementation(project(":core:util-jvm")) - implementation(project(":core:models")) + implementation(project(":core:models-jvm")) testImplementation(testLibs.junit.junit) testImplementation(testLibs.assertk) diff --git a/microbenchmark/build.gradle.kts b/microbenchmark/build.gradle.kts index f67c567b10..f236556f6e 100644 --- a/microbenchmark/build.gradle.kts +++ b/microbenchmark/build.gradle.kts @@ -45,7 +45,7 @@ dependencies { lintChecks(project(":lintchecks")) implementation(project(":core:util")) - implementation(project(":core:models")) + implementation(project(":core:models-jvm")) // Base dependencies androidTestImplementation(testLibs.junit.junit) diff --git a/settings.gradle.kts b/settings.gradle.kts index f0bcefeab7..a69d640b99 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -68,6 +68,7 @@ include(":app") include(":core:util") include(":core:util-jvm") include(":core:models") +include(":core:models-jvm") include(":core:ui") // Lib modules