Delete temporary created files.
This commit is contained in:
parent
0c841442d9
commit
585b6a94f3
10 changed files with 328 additions and 89 deletions
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Copyright 2024 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
* Please see LICENSE in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.libraries.androidutils.file
|
||||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import com.squareup.anvil.annotations.ContributesBinding
|
||||
import io.element.android.libraries.di.AppScope
|
||||
import io.element.android.libraries.di.ApplicationContext
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
||||
interface TemporaryUriDeleter {
|
||||
/**
|
||||
* Delete the Uri only if it is a temporary one.
|
||||
*/
|
||||
fun delete(uri: Uri?)
|
||||
}
|
||||
|
||||
@ContributesBinding(AppScope::class)
|
||||
class DefaultTemporaryUriDeleter @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
) : TemporaryUriDeleter {
|
||||
private val baseCacheUri = "content://${context.packageName}.fileprovider/cache"
|
||||
|
||||
override fun delete(uri: Uri?) {
|
||||
uri ?: return
|
||||
if (uri.toString().startsWith(baseCacheUri)) {
|
||||
context.contentResolver.delete(uri, null, null)
|
||||
} else {
|
||||
Timber.d("Do not delete the uri")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -13,6 +13,7 @@ import android.media.MediaMetadataRetriever
|
|||
import android.net.Uri
|
||||
import androidx.exifinterface.media.ExifInterface
|
||||
import com.squareup.anvil.annotations.ContributesBinding
|
||||
import io.element.android.libraries.androidutils.file.TemporaryUriDeleter
|
||||
import io.element.android.libraries.androidutils.file.createTmpFile
|
||||
import io.element.android.libraries.androidutils.file.getFileName
|
||||
import io.element.android.libraries.androidutils.file.safeRenameTo
|
||||
|
|
@ -50,6 +51,7 @@ class AndroidMediaPreProcessor @Inject constructor(
|
|||
private val imageCompressor: ImageCompressor,
|
||||
private val videoCompressor: VideoCompressor,
|
||||
private val coroutineDispatchers: CoroutineDispatchers,
|
||||
private val temporaryUriDeleter: TemporaryUriDeleter,
|
||||
) : MediaPreProcessor {
|
||||
companion object {
|
||||
/**
|
||||
|
|
@ -86,6 +88,8 @@ class AndroidMediaPreProcessor @Inject constructor(
|
|||
Timber.w("Deleting original uri $uri")
|
||||
contentResolver.delete(uri, null, null)
|
||||
}
|
||||
} else {
|
||||
temporaryUriDeleter.delete(uri)
|
||||
}
|
||||
result.postProcess(uri)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,10 +8,12 @@
|
|||
package io.element.android.libraries.mediaupload.impl
|
||||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import androidx.core.net.toUri
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import io.element.android.libraries.androidutils.file.TemporaryUriDeleter
|
||||
import io.element.android.libraries.core.mimetype.MimeTypes
|
||||
import io.element.android.libraries.matrix.api.media.AudioInfo
|
||||
import io.element.android.libraries.matrix.api.media.FileInfo
|
||||
|
|
@ -21,6 +23,8 @@ import io.element.android.libraries.matrix.api.media.VideoInfo
|
|||
import io.element.android.libraries.mediaupload.api.MediaPreProcessor
|
||||
import io.element.android.libraries.mediaupload.api.MediaUploadInfo
|
||||
import io.element.android.services.toolbox.test.sdk.FakeBuildVersionSdkIntProvider
|
||||
import io.element.android.tests.testutils.fake.FakeTemporaryUriDeleter
|
||||
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||
import io.element.android.tests.testutils.testCoroutineDispatchers
|
||||
import kotlinx.coroutines.test.TestScope
|
||||
import kotlinx.coroutines.test.runTest
|
||||
|
|
@ -42,7 +46,12 @@ class AndroidMediaPreProcessorTest {
|
|||
deleteOriginal: Boolean = false,
|
||||
): MediaUploadInfo {
|
||||
val context = InstrumentationRegistry.getInstrumentation().context
|
||||
val sut = createAndroidMediaPreProcessor(context, sdkIntVersion)
|
||||
val deleteCallback = lambdaRecorder<Uri?, Unit> {}
|
||||
val sut = createAndroidMediaPreProcessor(
|
||||
context = context,
|
||||
sdkIntVersion = sdkIntVersion,
|
||||
temporaryUriDeleter = FakeTemporaryUriDeleter(deleteCallback),
|
||||
)
|
||||
val file = getFileFromAssets(context, asset.filename)
|
||||
val result = sut.process(
|
||||
uri = file.toUri(),
|
||||
|
|
@ -52,6 +61,7 @@ class AndroidMediaPreProcessorTest {
|
|||
)
|
||||
val data = result.getOrThrow()
|
||||
assertThat(data.file.path).endsWith(asset.filename)
|
||||
deleteCallback.assertions().isCalledExactly(if (deleteOriginal) 0 else 1)
|
||||
return data
|
||||
}
|
||||
|
||||
|
|
@ -356,13 +366,15 @@ class AndroidMediaPreProcessorTest {
|
|||
|
||||
private fun TestScope.createAndroidMediaPreProcessor(
|
||||
context: Context,
|
||||
sdkIntVersion: Int = Build.VERSION_CODES.P
|
||||
sdkIntVersion: Int = Build.VERSION_CODES.P,
|
||||
temporaryUriDeleter: TemporaryUriDeleter = FakeTemporaryUriDeleter(),
|
||||
) = AndroidMediaPreProcessor(
|
||||
context = context,
|
||||
thumbnailFactory = ThumbnailFactory(context, FakeBuildVersionSdkIntProvider(sdkIntVersion)),
|
||||
imageCompressor = ImageCompressor(context, testCoroutineDispatchers()),
|
||||
videoCompressor = VideoCompressor(context),
|
||||
coroutineDispatchers = testCoroutineDispatchers(),
|
||||
temporaryUriDeleter = temporaryUriDeleter,
|
||||
)
|
||||
|
||||
@Throws(IOException::class)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue