Rename withDefaultSubtype to ensureDefaultSubtype

The old name read as though the default subtype always replaced whatever the
receiver carried, when a mime type that already has a concrete subtype is
returned untouched.
This commit is contained in:
hayaksi1
2026-08-17 15:52:46 +03:00
parent 4c5baf8d60
commit 98ef737b1d
4 changed files with 18 additions and 18 deletions
@@ -68,7 +68,7 @@ object MimeTypes {
* A mime type with a wildcard subtype is a filter, not a media type, so replace it with a * A mime type with a wildcard subtype is a filter, not a media type, so replace it with a
* concrete default for its top level type. * concrete default for its top level type.
*/ */
fun String?.withDefaultSubtype(): String = when { fun String?.ensureDefaultSubtype(): String = when {
this == null -> OctetStream this == null -> OctetStream
hasSubtype(this) -> this hasSubtype(this) -> this
this == Images -> Jpeg this == Images -> Jpeg
@@ -8,28 +8,28 @@
package io.element.android.libraries.core.mimetype package io.element.android.libraries.core.mimetype
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.core.mimetype.MimeTypes.withDefaultSubtype import io.element.android.libraries.core.mimetype.MimeTypes.ensureDefaultSubtype
import org.junit.Test import org.junit.Test
class MimeTypesTest { class MimeTypesTest {
@Test @Test
fun `withDefaultSubtype keeps a mime type that already has a subtype`() { fun `ensureDefaultSubtype keeps a mime type that already has a subtype`() {
assertThat(MimeTypes.Png.withDefaultSubtype()).isEqualTo(MimeTypes.Png) assertThat(MimeTypes.Png.ensureDefaultSubtype()).isEqualTo(MimeTypes.Png)
assertThat(MimeTypes.Mp4.withDefaultSubtype()).isEqualTo(MimeTypes.Mp4) assertThat(MimeTypes.Mp4.ensureDefaultSubtype()).isEqualTo(MimeTypes.Mp4)
assertThat(MimeTypes.Pdf.withDefaultSubtype()).isEqualTo(MimeTypes.Pdf) assertThat(MimeTypes.Pdf.ensureDefaultSubtype()).isEqualTo(MimeTypes.Pdf)
} }
@Test @Test
fun `withDefaultSubtype replaces a wildcard subtype with a concrete one`() { fun `ensureDefaultSubtype replaces a wildcard subtype with a concrete one`() {
assertThat(MimeTypes.Images.withDefaultSubtype()).isEqualTo(MimeTypes.Jpeg) assertThat(MimeTypes.Images.ensureDefaultSubtype()).isEqualTo(MimeTypes.Jpeg)
assertThat(MimeTypes.Videos.withDefaultSubtype()).isEqualTo(MimeTypes.Mp4) assertThat(MimeTypes.Videos.ensureDefaultSubtype()).isEqualTo(MimeTypes.Mp4)
assertThat(MimeTypes.Audio.withDefaultSubtype()).isEqualTo(MimeTypes.Mp3) assertThat(MimeTypes.Audio.ensureDefaultSubtype()).isEqualTo(MimeTypes.Mp3)
} }
@Test @Test
fun `withDefaultSubtype falls back to octet stream`() { fun `ensureDefaultSubtype falls back to octet stream`() {
assertThat(MimeTypes.Any.withDefaultSubtype()).isEqualTo(MimeTypes.OctetStream) assertThat(MimeTypes.Any.ensureDefaultSubtype()).isEqualTo(MimeTypes.OctetStream)
assertThat("text/*".withDefaultSubtype()).isEqualTo(MimeTypes.OctetStream) assertThat("text/*".ensureDefaultSubtype()).isEqualTo(MimeTypes.OctetStream)
assertThat(null.withDefaultSubtype()).isEqualTo(MimeTypes.OctetStream) assertThat(null.ensureDefaultSubtype()).isEqualTo(MimeTypes.OctetStream)
} }
} }
@@ -11,7 +11,7 @@ package io.element.android.libraries.matrix.impl.media
import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.core.extensions.mapFailure import io.element.android.libraries.core.extensions.mapFailure
import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.core.mimetype.MimeTypes.withDefaultSubtype import io.element.android.libraries.core.mimetype.MimeTypes.ensureDefaultSubtype
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
import io.element.android.libraries.matrix.api.media.MediaFile import io.element.android.libraries.matrix.api.media.MediaFile
import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.media.MediaSource
@@ -72,7 +72,7 @@ class RustMediaLoader(
mediaSource = mediaSource, mediaSource = mediaSource,
filename = filename, filename = filename,
// Fallback to a default mime type based on the main type, so that the SDK can create a file with the correct extension. // Fallback to a default mime type based on the main type, so that the SDK can create a file with the correct extension.
mimeType = mimeType.withDefaultSubtype(), mimeType = mimeType.ensureDefaultSubtype(),
useCache = useCache, useCache = useCache,
tempDir = cacheDirectory.path, tempDir = cacheDirectory.path,
) )
@@ -26,10 +26,10 @@ import io.element.android.libraries.core.data.tryOrNull
import io.element.android.libraries.core.extensions.mapFailure import io.element.android.libraries.core.extensions.mapFailure
import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.core.mimetype.MimeTypes
import io.element.android.libraries.core.mimetype.MimeTypes.ensureDefaultSubtype
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeAudio import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeAudio
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeImage import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeImage
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo
import io.element.android.libraries.core.mimetype.MimeTypes.withDefaultSubtype
import io.element.android.libraries.di.annotations.ApplicationContext import io.element.android.libraries.di.annotations.ApplicationContext
import io.element.android.libraries.matrix.api.media.AudioInfo import io.element.android.libraries.matrix.api.media.AudioInfo
import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.api.media.FileInfo
@@ -83,7 +83,7 @@ class AndroidMediaPreProcessor(
mediaOptimizationConfig: MediaOptimizationConfig, mediaOptimizationConfig: MediaOptimizationConfig,
): Result<MediaUploadInfo> = withContext(coroutineDispatchers.computation) { ): Result<MediaUploadInfo> = withContext(coroutineDispatchers.computation) {
runCatchingExceptions { runCatchingExceptions {
val resolvedMimeType = mimeType.withDefaultSubtype() val resolvedMimeType = mimeType.ensureDefaultSubtype()
val result = when { val result = when {
resolvedMimeType == MimeTypes.Svg -> processSvgImage(uri, resolvedMimeType) resolvedMimeType == MimeTypes.Svg -> processSvgImage(uri, resolvedMimeType)
resolvedMimeType.isMimeTypeImage() -> { resolvedMimeType.isMimeTypeImage() -> {