Add support for addressing attachments within a message.

This commit is contained in:
Cody Henthorne
2024-06-14 11:35:52 -04:00
committed by Greyson Parrelli
parent 10922594b3
commit a2fc710261
35 changed files with 181 additions and 66 deletions

View File

@@ -11,6 +11,7 @@ import org.signal.core.util.Base64
import org.thoughtcrime.securesms.blurhash.BlurHash
import org.thoughtcrime.securesms.database.AttachmentTable
import org.thoughtcrime.securesms.stickers.StickerLocator
import java.util.UUID
class ArchivedAttachment : Attachment {
@@ -47,7 +48,8 @@ class ArchivedAttachment : Attachment {
borderless: Boolean,
stickerLocator: StickerLocator?,
gif: Boolean,
quote: Boolean
quote: Boolean,
uuid: UUID?
) : super(
contentType = contentType ?: "",
quote = quote,
@@ -71,7 +73,8 @@ class ArchivedAttachment : Attachment {
stickerLocator = stickerLocator,
blurHash = BlurHash.parseOrNull(blurHash),
audioHash = null,
transformProperties = null
transformProperties = null,
uuid = uuid
) {
this.archiveCdn = archiveCdn ?: Cdn.CDN_3.cdnNumber
this.archiveMediaName = archiveMediaName

View File

@@ -14,6 +14,8 @@ 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 org.whispersystems.signalservice.api.util.UuidUtil
import java.util.UUID
/**
* Note: We have to use our own Parcelable implementation because we need to do custom stuff to preserve
@@ -65,7 +67,9 @@ abstract class Attachment(
@JvmField
val audioHash: AudioHash?,
@JvmField
val transformProperties: TransformProperties?
val transformProperties: TransformProperties?,
@JvmField
val uuid: UUID?
) : Parcelable {
abstract val uri: Uri?
@@ -97,7 +101,8 @@ abstract class Attachment(
stickerLocator = ParcelCompat.readParcelable(parcel, StickerLocator::class.java.classLoader, StickerLocator::class.java),
blurHash = ParcelCompat.readParcelable(parcel, BlurHash::class.java.classLoader, BlurHash::class.java),
audioHash = ParcelCompat.readParcelable(parcel, AudioHash::class.java.classLoader, AudioHash::class.java),
transformProperties = ParcelCompat.readParcelable(parcel, TransformProperties::class.java.classLoader, TransformProperties::class.java)
transformProperties = ParcelCompat.readParcelable(parcel, TransformProperties::class.java.classLoader, TransformProperties::class.java),
uuid = UuidUtil.parseOrNull(parcel.readString())
)
override fun writeToParcel(dest: Parcel, flags: Int) {
@@ -125,6 +130,7 @@ abstract class Attachment(
dest.writeParcelable(blurHash, 0)
dest.writeParcelable(audioHash, 0)
dest.writeParcelable(transformProperties, 0)
dest.writeString(uuid?.toString())
}
override fun describeContents(): Int {

View File

@@ -55,6 +55,7 @@ object AttachmentUploadUtil {
.withResumableUploadSpec(ResumableUploadSpec.from(uploadSpec))
.withCancelationSignal(cancellationSignal)
.withListener(progressListener)
.withUuid(attachment.uuid)
if (MediaUtil.isImageType(attachment.contentType)) {
builder.withBlurHash(getImageBlurHash(context, attachment))

View File

@@ -10,6 +10,7 @@ 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
import java.util.UUID
class DatabaseAttachment : Attachment {
@@ -79,7 +80,8 @@ class DatabaseAttachment : Attachment {
archiveThumbnailCdn: Int,
archiveMediaName: String?,
archiveMediaId: String?,
thumbnailRestoreState: AttachmentTable.ThumbnailRestoreState
thumbnailRestoreState: AttachmentTable.ThumbnailRestoreState,
uuid: UUID?
) : super(
contentType = contentType!!,
transferState = transferProgress,
@@ -102,7 +104,8 @@ class DatabaseAttachment : Attachment {
stickerLocator = stickerLocator,
blurHash = blurHash,
audioHash = audioHash,
transformProperties = transformProperties
transformProperties = transformProperties,
uuid = uuid
) {
this.attachmentId = attachmentId
this.mmsId = mmsId

View File

@@ -12,6 +12,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceAttachment
import org.whispersystems.signalservice.api.util.AttachmentPointerUtil
import org.whispersystems.signalservice.internal.push.DataMessage
import java.util.Optional
import java.util.UUID
class PointerAttachment : Attachment {
@VisibleForTesting
@@ -35,7 +36,8 @@ class PointerAttachment : Attachment {
uploadTimestamp: Long,
caption: String?,
stickerLocator: StickerLocator?,
blurHash: BlurHash?
blurHash: BlurHash?,
uuid: UUID?
) : super(
contentType = contentType,
transferState = transferState,
@@ -59,7 +61,8 @@ class PointerAttachment : Attachment {
stickerLocator = stickerLocator,
blurHash = blurHash,
audioHash = null,
transformProperties = null
transformProperties = null,
uuid = uuid
)
constructor(parcel: Parcel) : super(parcel)
@@ -115,7 +118,8 @@ class PointerAttachment : Attachment {
uploadTimestamp = pointer.get().asPointer().uploadTimestamp,
caption = pointer.get().asPointer().caption.orElse(null),
stickerLocator = stickerLocator,
blurHash = BlurHash.parseOrNull(pointer.get().asPointer().blurHash.orElse(null))
blurHash = BlurHash.parseOrNull(pointer.get().asPointer().blurHash.orElse(null)),
uuid = pointer.get().asPointer().uuid
)
)
}
@@ -152,7 +156,8 @@ class PointerAttachment : Attachment {
uploadTimestamp = thumbnail?.asPointer()?.uploadTimestamp ?: 0,
caption = thumbnail?.asPointer()?.caption?.orElse(null),
stickerLocator = null,
blurHash = null
blurHash = null,
uuid = thumbnail?.asPointer()?.uuid
)
)
}

View File

@@ -4,6 +4,7 @@ import android.net.Uri
import android.os.Parcel
import org.thoughtcrime.securesms.blurhash.BlurHash
import org.thoughtcrime.securesms.database.AttachmentTable
import java.util.UUID
/**
* An attachment that represents where an attachment used to be. Useful when you need to know that
@@ -35,7 +36,8 @@ class TombstoneAttachment : Attachment {
stickerLocator = null,
blurHash = null,
audioHash = null,
transformProperties = null
transformProperties = null,
uuid = null
)
constructor(
@@ -49,7 +51,8 @@ class TombstoneAttachment : Attachment {
voiceNote: Boolean = false,
borderless: Boolean = false,
gif: Boolean = false,
quote: Boolean
quote: Boolean,
uuid: UUID?
) : super(
contentType = contentType ?: "",
quote = quote,
@@ -73,7 +76,8 @@ class TombstoneAttachment : Attachment {
stickerLocator = null,
blurHash = BlurHash.parseOrNull(blurHash),
audioHash = null,
transformProperties = null
transformProperties = null,
uuid = uuid
)
constructor(parcel: Parcel) : super(parcel)

View File

@@ -8,6 +8,7 @@ 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
class UriAttachment : Attachment {
@@ -87,7 +88,8 @@ class UriAttachment : Attachment {
stickerLocator = stickerLocator,
blurHash = blurHash,
audioHash = audioHash,
transformProperties = transformProperties
transformProperties = transformProperties,
uuid = UUID.randomUUID()
) {
uri = Objects.requireNonNull(dataUri)
}

View File

@@ -537,7 +537,8 @@ class ChatItemExportIterator(private val cursor: Cursor, private val batchSize:
MessageAttachment.Flag.BORDERLESS
} else {
MessageAttachment.Flag.NONE
}
},
uuid = uuid?.let { UuidUtil.toByteString(uuid) }
)
}

View File

@@ -7,6 +7,7 @@ package org.thoughtcrime.securesms.backup.v2.database
import android.content.ContentValues
import androidx.core.content.contentValuesOf
import okio.ByteString
import org.signal.core.util.Base64
import org.signal.core.util.Hex
import org.signal.core.util.SqlUtil
@@ -817,7 +818,7 @@ class ChatItemImportInserter(
}
}
private fun FilePointer?.toLocalAttachment(voiceNote: Boolean, borderless: Boolean, gif: Boolean, wasDownloaded: Boolean, stickerLocator: StickerLocator? = null, contentType: String? = this?.contentType, fileName: String? = this?.fileName): Attachment? {
private fun FilePointer?.toLocalAttachment(voiceNote: Boolean, borderless: Boolean, gif: Boolean, wasDownloaded: Boolean, stickerLocator: StickerLocator? = null, contentType: String? = this?.contentType, fileName: String? = this?.fileName, uuid: ByteString? = null): Attachment? {
if (this == null) return null
if (attachmentLocator != null) {
@@ -839,7 +840,8 @@ class ChatItemImportInserter(
gif,
Optional.ofNullable(caption),
Optional.ofNullable(blurHash),
attachmentLocator.uploadTimestamp
attachmentLocator.uploadTimestamp,
UuidUtil.fromByteStringOrNull(uuid)
)
return PointerAttachment.forPointer(
pointer = Optional.of(signalAttachmentPointer),
@@ -858,7 +860,8 @@ class ChatItemImportInserter(
voiceNote = voiceNote,
borderless = borderless,
gif = gif,
quote = false
quote = false,
uuid = UuidUtil.fromByteStringOrNull(uuid)
)
} else if (backupLocator != null) {
return ArchivedAttachment(
@@ -882,7 +885,8 @@ class ChatItemImportInserter(
borderless = borderless,
gif = gif,
quote = false,
stickerLocator = stickerLocator
stickerLocator = stickerLocator,
uuid = UuidUtil.fromByteStringOrNull(uuid)
)
}
return null
@@ -910,7 +914,8 @@ class ChatItemImportInserter(
voiceNote = flag == MessageAttachment.Flag.VOICE_MESSAGE,
gif = flag == MessageAttachment.Flag.GIF,
borderless = flag == MessageAttachment.Flag.BORDERLESS,
wasDownloaded = wasDownloaded
wasDownloaded = wasDownloaded,
uuid = uuid
)
}
@@ -921,7 +926,8 @@ class ChatItemImportInserter(
borderless = flag == MessageAttachment.Flag.BORDERLESS,
wasDownloaded = wasDownloaded,
contentType = contentType,
fileName = fileName
fileName = fileName,
uuid = uuid
)
}

View File

@@ -87,6 +87,7 @@ import org.thoughtcrime.securesms.util.JsonUtils.SaneJSONObject
import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.StorageUtil
import org.thoughtcrime.securesms.video.EncryptedMediaDataSource
import org.whispersystems.signalservice.api.util.UuidUtil
import org.whispersystems.signalservice.internal.util.JsonUtil
import java.io.File
import java.io.FileNotFoundException
@@ -152,6 +153,7 @@ class AttachmentTable(
const val ARCHIVE_TRANSFER_FILE = "archive_transfer_file"
const val ARCHIVE_TRANSFER_STATE = "archive_transfer_state"
const val THUMBNAIL_RESTORE_STATE = "thumbnail_restore_state"
const val ATTACHMENT_UUID = "attachment_uuid"
const val ATTACHMENT_JSON_ALIAS = "attachment_json"
@@ -207,7 +209,8 @@ class AttachmentTable(
ARCHIVE_MEDIA_ID,
ARCHIVE_TRANSFER_FILE,
THUMBNAIL_FILE,
THUMBNAIL_RESTORE_STATE
THUMBNAIL_RESTORE_STATE,
ATTACHMENT_UUID
)
@JvmField
@@ -255,7 +258,8 @@ class AttachmentTable(
$ARCHIVE_THUMBNAIL_MEDIA_ID TEXT DEFAULT NULL,
$THUMBNAIL_FILE TEXT DEFAULT NULL,
$THUMBNAIL_RANDOM BLOB DEFAULT NULL,
$THUMBNAIL_RESTORE_STATE INTEGER DEFAULT ${ThumbnailRestoreState.NONE.value}
$THUMBNAIL_RESTORE_STATE INTEGER DEFAULT ${ThumbnailRestoreState.NONE.value},
$ATTACHMENT_UUID TEXT DEFAULT NULL
)
"""
@@ -1417,7 +1421,8 @@ class AttachmentTable(
archiveMediaName = jsonObject.getString(ARCHIVE_MEDIA_NAME),
archiveMediaId = jsonObject.getString(ARCHIVE_MEDIA_ID),
hasArchiveThumbnail = !TextUtils.isEmpty(jsonObject.getString(THUMBNAIL_FILE)),
thumbnailRestoreState = ThumbnailRestoreState.deserialize(jsonObject.getInt(THUMBNAIL_RESTORE_STATE))
thumbnailRestoreState = ThumbnailRestoreState.deserialize(jsonObject.getInt(THUMBNAIL_RESTORE_STATE)),
uuid = UuidUtil.parseOrNull(jsonObject.getString(ATTACHMENT_UUID))
)
}
}
@@ -1740,6 +1745,7 @@ class AttachmentTable(
put(CAPTION, attachment.caption)
put(UPLOAD_TIMESTAMP, attachment.uploadTimestamp)
put(BLUR_HASH, attachment.blurHash?.hash)
put(ATTACHMENT_UUID, attachment.uuid?.toString())
attachment.stickerLocator?.let { sticker ->
put(STICKER_PACK_ID, sticker.packId)
@@ -1795,6 +1801,7 @@ class AttachmentTable(
put(ARCHIVE_MEDIA_ID, attachment.archiveMediaId)
put(ARCHIVE_THUMBNAIL_MEDIA_ID, attachment.archiveThumbnailMediaId)
put(THUMBNAIL_RESTORE_STATE, ThumbnailRestoreState.NEEDS_RESTORE.value)
put(ATTACHMENT_UUID, attachment.uuid?.toString())
attachment.stickerLocator?.let { sticker ->
put(STICKER_PACK_ID, sticker.packId)
@@ -1921,6 +1928,7 @@ class AttachmentTable(
contentValues.put(CAPTION, attachment.caption)
contentValues.put(UPLOAD_TIMESTAMP, uploadTemplate?.uploadTimestamp ?: 0)
contentValues.put(TRANSFORM_PROPERTIES, transformProperties.serialize())
contentValues.put(ATTACHMENT_UUID, attachment.uuid?.toString())
if (attachment.transformProperties?.videoEdited == true) {
contentValues.putNull(BLUR_HASH)
@@ -2012,7 +2020,8 @@ class AttachmentTable(
archiveMediaName = cursor.requireString(ARCHIVE_MEDIA_NAME),
archiveMediaId = cursor.requireString(ARCHIVE_MEDIA_ID),
hasArchiveThumbnail = !cursor.isNull(THUMBNAIL_FILE),
thumbnailRestoreState = ThumbnailRestoreState.deserialize(cursor.requireInt(THUMBNAIL_RESTORE_STATE))
thumbnailRestoreState = ThumbnailRestoreState.deserialize(cursor.requireInt(THUMBNAIL_RESTORE_STATE)),
uuid = UuidUtil.parseOrNull(cursor.requireString(ATTACHMENT_UUID))
)
}

View File

@@ -57,6 +57,7 @@ class MediaTable internal constructor(context: Context?, databaseHelper: SignalD
${AttachmentTable.TABLE_NAME}.${AttachmentTable.ARCHIVE_MEDIA_ID},
${AttachmentTable.TABLE_NAME}.${AttachmentTable.ARCHIVE_THUMBNAIL_CDN},
${AttachmentTable.TABLE_NAME}.${AttachmentTable.THUMBNAIL_RESTORE_STATE},
${AttachmentTable.TABLE_NAME}.${AttachmentTable.ATTACHMENT_UUID},
${MessageTable.TABLE_NAME}.${MessageTable.TYPE},
${MessageTable.TABLE_NAME}.${MessageTable.DATE_SENT},
${MessageTable.TABLE_NAME}.${MessageTable.DATE_RECEIVED},

View File

@@ -386,7 +386,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
'${AttachmentTable.ARCHIVE_THUMBNAIL_CDN}', ${AttachmentTable.TABLE_NAME}.${AttachmentTable.ARCHIVE_THUMBNAIL_CDN},
'${AttachmentTable.ARCHIVE_MEDIA_NAME}', ${AttachmentTable.TABLE_NAME}.${AttachmentTable.ARCHIVE_MEDIA_NAME},
'${AttachmentTable.ARCHIVE_MEDIA_ID}', ${AttachmentTable.TABLE_NAME}.${AttachmentTable.ARCHIVE_MEDIA_ID},
'${AttachmentTable.THUMBNAIL_RESTORE_STATE}', ${AttachmentTable.TABLE_NAME}.${AttachmentTable.THUMBNAIL_RESTORE_STATE}
'${AttachmentTable.THUMBNAIL_RESTORE_STATE}', ${AttachmentTable.TABLE_NAME}.${AttachmentTable.THUMBNAIL_RESTORE_STATE},
'${AttachmentTable.ATTACHMENT_UUID}', ${AttachmentTable.TABLE_NAME}.${AttachmentTable.ATTACHMENT_UUID}
)
) AS ${AttachmentTable.ATTACHMENT_JSON_ALIAS}
""".toSingleLine()

View File

@@ -92,6 +92,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V231_ArchiveThumbna
import org.thoughtcrime.securesms.database.helpers.migration.V232_CreateInAppPaymentTable
import org.thoughtcrime.securesms.database.helpers.migration.V233_FixInAppPaymentTableDefaultNotifiedValue
import org.thoughtcrime.securesms.database.helpers.migration.V234_ThumbnailRestoreStateColumn
import org.thoughtcrime.securesms.database.helpers.migration.V235_AttachmentUuidColumn
/**
* Contains all of the database migrations for [SignalDatabase]. Broken into a separate file for cleanliness.
@@ -186,10 +187,11 @@ object SignalDatabaseMigrations {
231 to V231_ArchiveThumbnailColumns,
232 to V232_CreateInAppPaymentTable,
233 to V233_FixInAppPaymentTableDefaultNotifiedValue,
234 to V234_ThumbnailRestoreStateColumn
234 to V234_ThumbnailRestoreStateColumn,
235 to V235_AttachmentUuidColumn
)
const val DATABASE_VERSION = 234
const val DATABASE_VERSION = 235
@JvmStatic
fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {

View File

@@ -0,0 +1,19 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.database.helpers.migration
import android.app.Application
import net.zetetic.database.sqlcipher.SQLiteDatabase
/**
* Add a column for attachment uuids
*/
@Suppress("ClassName")
object V235_AttachmentUuidColumn : SignalDatabaseMigration {
override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("ALTER TABLE attachment ADD COLUMN attachment_uuid TEXT DEFAULT NULL")
}
}

View File

@@ -380,7 +380,8 @@ class AttachmentDownloadJob private constructor(
attachment.videoGif,
Optional.empty(),
Optional.ofNullable(attachment.blurHash).map { it.hash },
attachment.uploadTimestamp
attachment.uploadTimestamp,
attachment.uuid
)
} catch (e: IOException) {
Log.w(TAG, e)

View File

@@ -85,7 +85,7 @@ public final class AvatarGroupsV1DownloadJob extends BaseJob {
attachment.deleteOnExit();
SignalServiceMessageReceiver receiver = AppDependencies.getSignalServiceMessageReceiver();
SignalServiceAttachmentPointer pointer = new SignalServiceAttachmentPointer(0, new SignalServiceAttachmentRemoteId.V2(avatarId), contentType, key, Optional.of(0), Optional.empty(), 0, 0, digest, Optional.empty(), 0, fileName, false, false, false, Optional.empty(), Optional.empty(), System.currentTimeMillis());
SignalServiceAttachmentPointer pointer = new SignalServiceAttachmentPointer(0, new SignalServiceAttachmentRemoteId.V2(avatarId), contentType, key, Optional.of(0), Optional.empty(), 0, 0, digest, Optional.empty(), 0, fileName, false, false, false, Optional.empty(), Optional.empty(), System.currentTimeMillis(), null);
InputStream inputStream = receiver.retrieveAttachment(pointer, attachment, AvatarHelper.AVATAR_DOWNLOAD_FAILSAFE_MAX_SIZE);
AvatarHelper.setAvatar(context, record.get().getRecipientId(), inputStream);

View File

@@ -88,6 +88,7 @@ import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -211,6 +212,7 @@ public abstract class PushSendJob extends SendJob {
.withWidth(attachment.width)
.withHeight(attachment.height)
.withCaption(attachment.caption)
.withUuid(attachment.uuid)
.withListener(new SignalServiceAttachment.ProgressListener() {
@Override
public void onAttachmentProgress(long total, long progress) {
@@ -305,7 +307,8 @@ public abstract class PushSendJob extends SendJob {
attachment.videoGif,
Optional.ofNullable(attachment.caption),
Optional.ofNullable(attachment.blurHash).map(BlurHash::getHash),
attachment.uploadTimestamp);
attachment.uploadTimestamp,
attachment.uuid);
} catch (IOException | ArithmeticException e) {
Log.w(TAG, e);
return null;
@@ -380,7 +383,8 @@ public abstract class PushSendJob extends SendJob {
.withHeight(thumbnailData.getHeight())
.withLength(thumbnailData.getData().length)
.withStream(new ByteArrayInputStream(thumbnailData.getData()))
.withResumableUploadSpec(AppDependencies.getSignalServiceMessageSender().getResumableUploadSpec());
.withResumableUploadSpec(AppDependencies.getSignalServiceMessageSender().getResumableUploadSpec())
.withUuid(UUID.randomUUID());
thumbnail = builder.build();
}

View File

@@ -366,7 +366,8 @@ class RestoreAttachmentJob private constructor(
attachment.videoGif,
Optional.empty(),
Optional.ofNullable(attachment.blurHash).map { it.hash },
attachment.uploadTimestamp
attachment.uploadTimestamp,
attachment.uuid
)
} catch (e: IOException) {
Log.w(TAG, e)
@@ -410,7 +411,8 @@ class RestoreAttachmentJob private constructor(
attachment.videoGif,
Optional.empty(),
Optional.ofNullable(attachment.blurHash).map { it.hash },
attachment.uploadTimestamp
attachment.uploadTimestamp,
attachment.uuid
)
} catch (e: IOException) {
Log.w(TAG, e)

View File

@@ -168,7 +168,8 @@ class RestoreAttachmentThumbnailJob private constructor(
attachment.videoGif,
Optional.empty(),
Optional.ofNullable(attachment.blurHash).map { it.hash },
attachment.uploadTimestamp
attachment.uploadTimestamp,
attachment.uuid
)
} catch (e: IOException) {
Log.w(TAG, e)

View File

@@ -30,6 +30,7 @@ import org.thoughtcrime.securesms.releasechannel.ReleaseChannel
import org.thoughtcrime.securesms.s3.S3
import org.thoughtcrime.securesms.transport.RetryLaterException
import org.thoughtcrime.securesms.util.LocaleRemoteConfig
import org.whispersystems.signalservice.api.util.UuidUtil
import org.whispersystems.signalservice.internal.ServiceResponse
import java.io.IOException
import java.lang.Integer.max
@@ -232,7 +233,8 @@ class RetrieveRemoteAnnouncementsJob private constructor(private val force: Bool
media = note.translation.media,
mediaWidth = note.translation.mediaWidth?.toIntOrNull() ?: 0,
mediaHeight = note.translation.mediaHeight?.toIntOrNull() ?: 0,
mediaType = note.translation.mediaContentType ?: "image/webp"
mediaType = note.translation.mediaContentType ?: "image/webp",
mediaAttachmentUuid = UuidUtil.parseOrNull(note.releaseNote.uuid)
)
if (insertResult != null) {

View File

@@ -29,7 +29,7 @@ object ReleaseChannel {
mediaWidth: Int = 0,
mediaHeight: Int = 0,
mediaType: String = "image/webp",
serverUuid: String? = UUID.randomUUID().toString(),
mediaAttachmentUuid: UUID? = UUID.randomUUID(),
messageRanges: BodyRangeList? = null,
storyType: StoryType = StoryType.NONE
): MessageTable.InsertResult? {
@@ -52,7 +52,8 @@ object ReleaseChannel {
MediaUtil.isVideo(mediaType),
Optional.empty(),
Optional.empty(),
System.currentTimeMillis()
System.currentTimeMillis(),
mediaAttachmentUuid
)
Optional.of(listOf(attachment))
@@ -68,7 +69,7 @@ object ReleaseChannel {
receivedTimeMillis = System.currentTimeMillis(),
body = body,
attachments = PointerAttachment.forPointers(attachments),
serverGuid = serverUuid,
serverGuid = UUID.randomUUID().toString(),
messageRanges = messageRanges,
storyType = storyType
)