From 80b410860fd02d655aa7343db2e0285469068fcb Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 2 Jun 2023 09:44:07 +0200 Subject: [PATCH] Media: improve creation of LocalMedia --- .../media/local/AndroidLocalMediaFactory.kt | 16 ++++--------- .../impl/media/local/LocalMediaFactory.kt | 23 ++++++++++++++----- .../impl/media/viewer/MediaViewerPresenter.kt | 9 ++++++-- .../MessageComposerPresenter.kt | 2 +- .../messages/media/FakeLocalMediaFactory.kt | 6 +---- .../libraries/androidutils/file/Context.kt | 13 ++++++++--- 6 files changed, 41 insertions(+), 28 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/AndroidLocalMediaFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/AndroidLocalMediaFactory.kt index 68c1b935d8..4908d79f68 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/AndroidLocalMediaFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/AndroidLocalMediaFactory.kt @@ -18,15 +18,13 @@ package io.element.android.features.messages.impl.media.local import android.content.Context import android.net.Uri -import androidx.core.net.toUri import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.androidutils.file.getFileName import io.element.android.libraries.androidutils.file.getFileSize +import io.element.android.libraries.androidutils.file.getMimeType import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext -import io.element.android.libraries.matrix.api.media.MediaFile -import io.element.android.libraries.matrix.api.media.toFile import javax.inject.Inject @ContributesBinding(AppScope::class) @@ -34,14 +32,9 @@ class AndroidLocalMediaFactory @Inject constructor( @ApplicationContext private val context: Context ) : LocalMediaFactory { - override fun createFromMediaFile(mediaFile: MediaFile, mimeType: String?): LocalMedia { - val uri = mediaFile.toFile().toUri() - return createFromUri(uri, mimeType) - } - - override fun createFromUri(uri: Uri, mimeType: String?): LocalMedia { - val resolvedMimeType = mimeType ?: context.contentResolver.getType(uri) ?: MimeTypes.OctetStream - val fileName = context.getFileName(uri) + override fun createFromUri(uri: Uri, mimeType: String?, name: String?): LocalMedia { + val resolvedMimeType = mimeType ?: context.getMimeType(uri) ?: MimeTypes.OctetStream + val fileName = name ?: context.getFileName(uri) val fileSize = context.getFileSize(uri) return LocalMedia( uri = uri, @@ -51,3 +44,4 @@ class AndroidLocalMediaFactory @Inject constructor( ) } } + diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/LocalMediaFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/LocalMediaFactory.kt index 09c44f4fba..917369292a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/LocalMediaFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/local/LocalMediaFactory.kt @@ -17,18 +17,29 @@ package io.element.android.features.messages.impl.media.local import android.net.Uri +import androidx.core.net.toUri import io.element.android.libraries.matrix.api.media.MediaFile +import io.element.android.libraries.matrix.api.media.toFile interface LocalMediaFactory { - /** - * This method will create a [LocalMedia] with the given [MediaFile] and [mimeType]. - */ - fun createFromMediaFile(mediaFile: MediaFile, mimeType: String?): LocalMedia - /** * This method will create a [LocalMedia] with the given [uri] and [mimeType] * If the [mimeType] is null, it'll try to read it from the content. + * If the [name] is null, it'll try to read it from the content. */ - fun createFromUri(uri: Uri, mimeType: String?): LocalMedia + fun createFromUri( + uri: Uri, + mimeType: String?, + name: String?, + ): LocalMedia +} + +fun LocalMediaFactory.createFromMediaFile( + mediaFile: MediaFile, + mimeType: String?, + name: String? +): LocalMedia { + val uri = mediaFile.toFile().toUri() + return createFromUri(uri = uri, mimeType = mimeType, name = name) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt index 145e9607de..54e2175257 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt @@ -30,6 +30,7 @@ import dagger.assisted.AssistedInject import io.element.android.features.messages.impl.media.local.LocalMedia import io.element.android.features.messages.impl.media.local.LocalMediaActionsHandler import io.element.android.features.messages.impl.media.local.LocalMediaFactory +import io.element.android.features.messages.impl.media.local.createFromMediaFile import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.media.MatrixMediaLoader @@ -88,8 +89,12 @@ class MediaViewerPresenter @AssistedInject constructor( mediaLoader.downloadMediaFile(inputs.mediaSource, inputs.mimeType) .onSuccess { mediaFile.value = it - }.mapCatching { - localMediaFactory.createFromMediaFile(it, inputs.mimeType) + }.mapCatching { mediaFile -> + localMediaFactory.createFromMediaFile( + mediaFile = mediaFile, + mimeType = inputs.mimeType, + name = inputs.name + ) }.onSuccess { localMedia.value = Async.Success(it) }.onFailure { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index ae975f4ddb..cb966189a0 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -210,7 +210,7 @@ class MessageComposerPresenter @Inject constructor( attachmentsState.value = AttachmentsState.None return } - val localMedia = localMediaFactory.createFromUri(uri, mimeType) + val localMedia = localMediaFactory.createFromUri(uri, mimeType, null) val mediaAttachment = Attachment.Media(localMedia, compressIfPossible) val isPreviewable = when { MimeTypes.isImage(localMedia.mimeType) -> true diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/media/FakeLocalMediaFactory.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/media/FakeLocalMediaFactory.kt index 89f4e96173..1f7dda5f34 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/media/FakeLocalMediaFactory.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/media/FakeLocalMediaFactory.kt @@ -27,11 +27,7 @@ class FakeLocalMediaFactory(private val localMediaUri: Uri) : LocalMediaFactory var fallbackMimeType: String = MimeTypes.OctetStream - override fun createFromMediaFile(mediaFile: MediaFile, mimeType: String?): LocalMedia { - return aLocalMedia(uri = localMediaUri, mimeType = mimeType ?: fallbackMimeType) - } - - override fun createFromUri(uri: Uri, mimeType: String?): LocalMedia { + override fun createFromUri(uri: Uri, mimeType: String?, name: String?): LocalMedia { return aLocalMedia(uri, mimeType ?: fallbackMimeType) } } diff --git a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/file/Context.kt b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/file/Context.kt index 6bf784b100..b730eec3d5 100644 --- a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/file/Context.kt +++ b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/file/Context.kt @@ -20,17 +20,24 @@ import android.content.ContentResolver import android.content.Context import android.net.Uri import android.provider.OpenableColumns -import java.io.File +import androidx.core.net.toFile + +fun Context.getMimeType(uri: Uri): String? = when (uri.scheme) { + ContentResolver.SCHEME_CONTENT -> contentResolver.getType(uri) + else -> null +} fun Context.getFileName(uri: Uri): String? = when (uri.scheme) { ContentResolver.SCHEME_CONTENT -> getContentFileName(uri) - else -> uri.path?.let(::File)?.name + ContentResolver.SCHEME_FILE -> uri.toFile().name + else -> null } fun Context.getFileSize(uri: Uri): Long { return when (uri.scheme) { ContentResolver.SCHEME_CONTENT -> getContentFileSize(uri) - else -> uri.path?.let(::File)?.length() + ContentResolver.SCHEME_FILE -> uri.toFile().length() + else -> 0 } ?: 0 }