Merge pull request #5652 from vector-im/bugfix/eric/sending-images-crashes
Potentially fixes intermittent crashing from sending gallery images
This commit is contained in:
commit
aebdee1070
|
@ -0,0 +1 @@
|
|||
Tentative fix of images crashing when being sent or shared from gallery
|
|
@ -23,11 +23,9 @@ import android.provider.MediaStore
|
|||
import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.core.content.FileProvider
|
||||
import im.vector.lib.multipicker.entity.MultiPickerImageType
|
||||
import im.vector.lib.multipicker.utils.MediaType
|
||||
import im.vector.lib.multipicker.utils.createTemporaryMediaFile
|
||||
import im.vector.lib.multipicker.utils.toMultiPickerImageType
|
||||
import java.io.File
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
/**
|
||||
* Implementation of taking a photo with Camera
|
||||
|
@ -38,7 +36,7 @@ class CameraPicker {
|
|||
* Start camera by using a ActivityResultLauncher
|
||||
* @return Uri of taken photo or null if the operation is cancelled.
|
||||
*/
|
||||
fun startWithExpectingFile(context: Context, activityResultLauncher: ActivityResultLauncher<Intent>): Uri? {
|
||||
fun startWithExpectingFile(context: Context, activityResultLauncher: ActivityResultLauncher<Intent>): Uri {
|
||||
val photoUri = createPhotoUri(context)
|
||||
val intent = createIntent().apply {
|
||||
putExtra(MediaStore.EXTRA_OUTPUT, photoUri)
|
||||
|
@ -63,19 +61,9 @@ class CameraPicker {
|
|||
|
||||
companion object {
|
||||
fun createPhotoUri(context: Context): Uri {
|
||||
val file = createImageFile(context)
|
||||
val file = createTemporaryMediaFile(context, MediaType.IMAGE)
|
||||
val authority = context.packageName + ".multipicker.fileprovider"
|
||||
return FileProvider.getUriForFile(context, authority, file)
|
||||
}
|
||||
|
||||
private fun createImageFile(context: Context): File {
|
||||
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
|
||||
val storageDir: File = context.filesDir
|
||||
return File.createTempFile(
|
||||
"${timeStamp}_", /* prefix */
|
||||
".jpg", /* suffix */
|
||||
storageDir /* directory */
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,11 +23,9 @@ import android.provider.MediaStore
|
|||
import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.core.content.FileProvider
|
||||
import im.vector.lib.multipicker.entity.MultiPickerVideoType
|
||||
import im.vector.lib.multipicker.utils.MediaType
|
||||
import im.vector.lib.multipicker.utils.createTemporaryMediaFile
|
||||
import im.vector.lib.multipicker.utils.toMultiPickerVideoType
|
||||
import java.io.File
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
/**
|
||||
* Implementation of taking a video with Camera
|
||||
|
@ -38,7 +36,7 @@ class CameraVideoPicker {
|
|||
* Start camera by using a ActivityResultLauncher
|
||||
* @return Uri of taken photo or null if the operation is cancelled.
|
||||
*/
|
||||
fun startWithExpectingFile(context: Context, activityResultLauncher: ActivityResultLauncher<Intent>): Uri? {
|
||||
fun startWithExpectingFile(context: Context, activityResultLauncher: ActivityResultLauncher<Intent>): Uri {
|
||||
val videoUri = createVideoUri(context)
|
||||
val intent = createIntent().apply {
|
||||
putExtra(MediaStore.EXTRA_OUTPUT, videoUri)
|
||||
|
@ -63,19 +61,9 @@ class CameraVideoPicker {
|
|||
|
||||
companion object {
|
||||
fun createVideoUri(context: Context): Uri {
|
||||
val file = createVideoFile(context)
|
||||
val file = createTemporaryMediaFile(context, MediaType.VIDEO)
|
||||
val authority = context.packageName + ".multipicker.fileprovider"
|
||||
return FileProvider.getUriForFile(context, authority, file)
|
||||
}
|
||||
|
||||
private fun createVideoFile(context: Context): File {
|
||||
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
|
||||
val storageDir: File = context.filesDir
|
||||
return File.createTempFile(
|
||||
"${timeStamp}_", /* prefix */
|
||||
".mp4", /* suffix */
|
||||
storageDir /* directory */
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright (c) 2022 New Vector Ltd
|
||||
*
|
||||
* 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 im.vector.lib.multipicker.utils
|
||||
|
||||
import android.content.Context
|
||||
import java.io.File
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
internal fun createTemporaryMediaFile(context: Context, mediaType: MediaType): File {
|
||||
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
|
||||
val storageDir: File = context.filesDir.also { it.mkdirs() }
|
||||
val fileSuffix = when (mediaType) {
|
||||
MediaType.IMAGE -> ".jpg"
|
||||
MediaType.VIDEO -> ".mp4"
|
||||
}
|
||||
|
||||
return File.createTempFile(
|
||||
"${timeStamp}_",
|
||||
fileSuffix,
|
||||
storageDir
|
||||
)
|
||||
}
|
||||
|
||||
internal enum class MediaType {
|
||||
IMAGE, VIDEO
|
||||
}
|
|
@ -29,6 +29,7 @@ internal class TemporaryFileCreator @Inject constructor(
|
|||
suspend fun create(): File {
|
||||
return withContext(Dispatchers.IO) {
|
||||
File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir)
|
||||
.apply { mkdirs() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue