From e28556dd1b8557bdd2269e4f29c421f3319a3adf Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 5 May 2021 11:26:36 +0200 Subject: [PATCH] Create TemporaryFileCreator to avoid code duplication --- .../internal/session/content/FileUploader.kt | 5 +-- .../session/content/ImageCompressor.kt | 27 +++++++-------- .../session/content/UploadContentWorker.kt | 7 ++-- .../session/content/VideoCompressor.kt | 15 +++----- .../sdk/internal/util/TemporaryFileCreator.kt | 34 +++++++++++++++++++ 5 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt index 2626f96708..6bb43d599c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt @@ -41,10 +41,10 @@ import org.matrix.android.sdk.internal.network.ProgressRequestBody import org.matrix.android.sdk.internal.network.awaitResponse import org.matrix.android.sdk.internal.network.toFailure import org.matrix.android.sdk.internal.session.homeserver.DefaultHomeServerCapabilitiesService +import org.matrix.android.sdk.internal.util.TemporaryFileCreator import java.io.File import java.io.FileNotFoundException import java.io.IOException -import java.util.UUID import javax.inject.Inject internal class FileUploader @Inject constructor(@Authenticated @@ -52,6 +52,7 @@ internal class FileUploader @Inject constructor(@Authenticated private val globalErrorReceiver: GlobalErrorReceiver, private val homeServerCapabilitiesService: DefaultHomeServerCapabilitiesService, private val context: Context, + private val temporaryFileCreator: TemporaryFileCreator, contentUrlResolver: ContentUrlResolver, moshi: Moshi) { @@ -110,7 +111,7 @@ internal class FileUploader @Inject constructor(@Authenticated val inputStream = withContext(Dispatchers.IO) { context.contentResolver.openInputStream(uri) } ?: throw FileNotFoundException() - val workingFile = File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir) + val workingFile = temporaryFileCreator.create() workingFile.outputStream().use { inputStream.copyTo(it) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageCompressor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageCompressor.kt index 1d6cd61060..9b01d0a00e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageCompressor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageCompressor.kt @@ -16,19 +16,20 @@ package org.matrix.android.sdk.internal.session.content -import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Matrix import androidx.exifinterface.media.ExifInterface import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import org.matrix.android.sdk.internal.util.TemporaryFileCreator import timber.log.Timber import java.io.File -import java.util.UUID import javax.inject.Inject -internal class ImageCompressor @Inject constructor(private val context: Context) { +internal class ImageCompressor @Inject constructor( + private val temporaryFileCreator: TemporaryFileCreator +) { suspend fun compress( imageFile: File, desiredWidth: Int, @@ -45,7 +46,7 @@ internal class ImageCompressor @Inject constructor(private val context: Context) } } ?: return@withContext imageFile - val destinationFile = createDestinationFile() + val destinationFile = temporaryFileCreator.create() runCatching { destinationFile.outputStream().use { @@ -53,7 +54,7 @@ internal class ImageCompressor @Inject constructor(private val context: Context) } } - return@withContext destinationFile + destinationFile } } @@ -64,16 +65,16 @@ internal class ImageCompressor @Inject constructor(private val context: Context) val orientation = exifInfo.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL) val matrix = Matrix() when (orientation) { - ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270f) - ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180f) - ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90f) + ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270f) + ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180f) + ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90f) ExifInterface.ORIENTATION_FLIP_HORIZONTAL -> matrix.preScale(-1f, 1f) - ExifInterface.ORIENTATION_FLIP_VERTICAL -> matrix.preScale(1f, -1f) - ExifInterface.ORIENTATION_TRANSPOSE -> { + ExifInterface.ORIENTATION_FLIP_VERTICAL -> matrix.preScale(1f, -1f) + ExifInterface.ORIENTATION_TRANSPOSE -> { matrix.preRotate(-90f) matrix.preScale(-1f, 1f) } - ExifInterface.ORIENTATION_TRANSVERSE -> { + ExifInterface.ORIENTATION_TRANSVERSE -> { matrix.preRotate(90f) matrix.preScale(-1f, 1f) } @@ -116,8 +117,4 @@ internal class ImageCompressor @Inject constructor(private val context: Context) null } } - - private fun createDestinationFile(): File { - return File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir) - } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt index 822c53cc9b..751eb0c04b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt @@ -44,13 +44,13 @@ import org.matrix.android.sdk.internal.session.room.send.CancelSendTracker import org.matrix.android.sdk.internal.session.room.send.LocalEchoIdentifiers import org.matrix.android.sdk.internal.session.room.send.LocalEchoRepository import org.matrix.android.sdk.internal.session.room.send.MultipleEventSendingDispatcherWorker +import org.matrix.android.sdk.internal.util.TemporaryFileCreator import org.matrix.android.sdk.internal.util.toMatrixErrorStr import org.matrix.android.sdk.internal.worker.SessionSafeCoroutineWorker import org.matrix.android.sdk.internal.worker.SessionWorkerParams import org.matrix.android.sdk.internal.worker.WorkerParamsFactory import timber.log.Timber import java.io.File -import java.util.UUID import javax.inject.Inject private data class NewAttachmentAttributes( @@ -83,6 +83,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter @Inject lateinit var imageCompressor: ImageCompressor @Inject lateinit var videoCompressor: VideoCompressor @Inject lateinit var localEchoRepository: LocalEchoRepository + @Inject lateinit var temporaryFileCreator: TemporaryFileCreator override fun injectWith(injector: SessionComponent) { injector.inject(this) @@ -125,7 +126,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter ) // always use a temporary file, it guaranties that we could report progress on upload and simplifies the flows - val workingFile = File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir) + val workingFile = temporaryFileCreator.create() .also { filesToDelete.add(it) } workingFile.outputStream().use { outputStream -> inputStream.use { inputStream -> @@ -228,7 +229,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter val contentUploadResponse = if (params.isEncrypted) { Timber.v("## Encrypt file") - encryptedFile = File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir) + encryptedFile = temporaryFileCreator.create() .also { filesToDelete.add(it) } uploadedFileEncryptedFileInfo = diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/VideoCompressor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/VideoCompressor.kt index 8749d1f84a..05aaf4e9f1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/VideoCompressor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/VideoCompressor.kt @@ -16,25 +16,24 @@ package org.matrix.android.sdk.internal.session.content -import android.content.Context import com.otaliastudios.transcoder.Transcoder import com.otaliastudios.transcoder.TranscoderListener import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.withContext import org.matrix.android.sdk.api.listeners.ProgressListener +import org.matrix.android.sdk.internal.util.TemporaryFileCreator import timber.log.Timber import java.io.File -import java.util.UUID import javax.inject.Inject -internal class VideoCompressor @Inject constructor(private val context: Context) { +internal class VideoCompressor @Inject constructor( + private val temporaryFileCreator: TemporaryFileCreator +) { suspend fun compress(videoFile: File, progressListener: ProgressListener?): VideoCompressionResult { - val destinationFile = withContext(Dispatchers.IO) { - createDestinationFile() - } + val destinationFile = temporaryFileCreator.create() val job = Job() @@ -117,8 +116,4 @@ internal class VideoCompressor @Inject constructor(private val context: Context) file.delete() } } - - private fun createDestinationFile(): File { - return File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir) - } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt new file mode 100644 index 0000000000..2790ffba36 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.internal.util + +import android.content.Context +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.io.File +import java.util.UUID +import javax.inject.Inject + +internal class TemporaryFileCreator @Inject constructor( + private val context: Context +) { + suspend fun create(): File { + return withContext(Dispatchers.IO) { + File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir) + } + } +}