mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-15 07:28:30 +00:00
Add media send feature module.
This commit is contained in:
@@ -16,4 +16,5 @@ android {
|
||||
dependencies {
|
||||
implementation(libs.kotlinx.serialization.json)
|
||||
implementation(libs.jackson.core)
|
||||
implementation(libs.jackson.module.kotlin)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user