Add media send feature module.

This commit is contained in:
Alex Hart
2026-02-03 11:25:57 -04:00
committed by GitHub
parent bc7ba5f2c6
commit 0cd93986bd
58 changed files with 4364 additions and 68 deletions

View File

@@ -16,4 +16,5 @@ android {
dependencies {
implementation(libs.kotlinx.serialization.json)
implementation(libs.jackson.core)
implementation(libs.jackson.module.kotlin)
}

View File

@@ -6,17 +6,20 @@
package org.signal.core.models.media
import android.net.Uri
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
/**
* Represents a folder that's shown in a media selector, containing [Media] items.
*/
@Parcelize
data class MediaFolder(
val thumbnailUri: Uri,
val title: String,
val itemCount: Int,
val bucketId: String,
val folderType: FolderType
) {
) : Parcelable {
enum class FolderType {
NORMAL, CAMERA
}

View File

@@ -9,35 +9,51 @@ import android.os.Parcelable
import com.fasterxml.jackson.annotation.JsonProperty
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
/**
* Properties that describe transformations to be applied to media before sending.
*/
@OptIn(ExperimentalSerializationApi::class)
@Serializable
@Parcelize
data class TransformProperties(
@EncodeDefault(EncodeDefault.Mode.ALWAYS)
@JsonProperty("skipTransform")
@SerialName("skipTransform")
@JvmField
val skipTransform: Boolean = false,
@EncodeDefault(EncodeDefault.Mode.ALWAYS)
@JsonProperty("videoTrim")
@SerialName("videoTrim")
@JvmField
val videoTrim: Boolean = false,
@EncodeDefault(EncodeDefault.Mode.ALWAYS)
@JsonProperty("videoTrimStartTimeUs")
@SerialName("videoTrimStartTimeUs")
@JvmField
val videoTrimStartTimeUs: Long = 0,
@EncodeDefault(EncodeDefault.Mode.ALWAYS)
@JsonProperty("videoTrimEndTimeUs")
@SerialName("videoTrimEndTimeUs")
@JvmField
val videoTrimEndTimeUs: Long = 0,
@EncodeDefault(EncodeDefault.Mode.ALWAYS)
@JsonProperty("sentMediaQuality")
@SerialName("sentMediaQuality")
@JvmField
val sentMediaQuality: Int = DEFAULT_MEDIA_QUALITY,
@EncodeDefault(EncodeDefault.Mode.ALWAYS)
@JsonProperty("mp4Faststart")
@SerialName("mp4Faststart")
@JvmField
val mp4FastStart: Boolean = false
) : Parcelable {
@@ -46,7 +62,9 @@ data class TransformProperties(
}
@IgnoredOnParcel
@EncodeDefault(EncodeDefault.Mode.ALWAYS)
@JsonProperty("videoEdited")
@SerialName("videoEdited")
val videoEdited: Boolean = videoTrim
fun withSkipTransform(): TransformProperties {

View File

@@ -0,0 +1,61 @@
/*
* Copyright 2026 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.core.models.media
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
import kotlinx.serialization.json.Json
import org.junit.Assert
import org.junit.Test
class TransformPropertiesTest {
@Test
fun `kotlinx serialize matches legacy json keys`() {
val properties = TransformProperties.empty()
Assert.assertEquals(
"{\"skipTransform\":false,\"videoTrim\":false,\"videoTrimStartTimeUs\":0,\"videoTrimEndTimeUs\":0,\"sentMediaQuality\":0,\"mp4Faststart\":false,\"videoEdited\":false}",
Json.encodeToString(properties)
)
}
@Test
fun `kotlinx parse tolerates legacy mp4Faststart key`() {
val json = "{\"skipTransform\":false,\"videoTrim\":false,\"videoTrimStartTimeUs\":0,\"videoTrimEndTimeUs\":0,\"videoEdited\":false,\"mp4Faststart\":true}"
val parsed = Json.decodeFromString<TransformProperties>(json)
Assert.assertEquals(true, parsed.mp4FastStart)
Assert.assertEquals(false, parsed.videoTrim)
Assert.assertEquals(false, parsed.videoEdited)
}
@Test
fun `jackson serialize matches legacy json keys`() {
val properties = TransformProperties.empty()
val objectMapper = ObjectMapper().registerKotlinModule()
val encoded = objectMapper.writeValueAsString(properties)
Assert.assertEquals(
"{\"skipTransform\":false,\"videoTrim\":false,\"videoTrimStartTimeUs\":0,\"videoTrimEndTimeUs\":0,\"sentMediaQuality\":0,\"mp4Faststart\":false,\"videoEdited\":false}",
encoded
)
}
@Test
fun `jackson parse tolerates legacy mp4Faststart key`() {
val json = "{\"skipTransform\":false,\"videoTrim\":false,\"videoTrimStartTimeUs\":0,\"videoTrimEndTimeUs\":0,\"videoEdited\":false,\"mp4Faststart\":true}"
val objectMapper = ObjectMapper().registerKotlinModule()
val parsed = objectMapper.readValue(json, TransformProperties::class.java)
Assert.assertEquals(true, parsed.mp4FastStart)
Assert.assertEquals(false, parsed.videoTrim)
Assert.assertEquals(false, parsed.videoEdited)
}
}