diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 31beda79c..075b65d8a 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -35,6 +35,7 @@ import android.webkit.MimeTypeMap import androidx.activity.addCallback import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuPopupHelper +import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager @@ -343,9 +344,7 @@ class DetailChatRoomFragment : MasterFragment(), S // Allows to capture directly from the camera val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) val tempFileName = System.currentTimeMillis().toString() + ".jpeg" - temporaryPicturePath = FileUtils.getFileStoragePath(tempFileName) - val uri = Uri.fromFile(temporaryPicturePath) - captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri) + val file = FileUtils.getFileStoragePath(tempFileName) + temporaryPicturePath = file + val publicUri = FileProvider.getUriForFile( + requireContext(), + requireContext().getString(R.string.file_provider), + file + ) + captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, publicUri) + captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) cameraIntents.add(captureIntent) } diff --git a/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt b/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt index 39e14b925..ebc4ce0a0 100644 --- a/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt @@ -21,10 +21,10 @@ package org.linphone.activities.main.sidemenu.fragments import android.app.Activity import android.content.Intent -import android.net.Uri import android.os.Bundle import android.os.Parcelable import android.provider.MediaStore +import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import java.io.File @@ -139,9 +139,16 @@ class SideMenuFragment : GenericFragment() { // Allows to capture directly from the camera val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) val tempFileName = System.currentTimeMillis().toString() + ".jpeg" - temporaryPicturePath = FileUtils.getFileStoragePath(tempFileName) - val uri = Uri.fromFile(temporaryPicturePath) - captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri) + val file = FileUtils.getFileStoragePath(tempFileName) + temporaryPicturePath = file + val publicUri = FileProvider.getUriForFile( + requireContext(), + requireContext().getString(R.string.file_provider), + file + ) + captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, publicUri) + captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) cameraIntents.add(captureIntent) } diff --git a/app/src/main/java/org/linphone/utils/ImageUtils.kt b/app/src/main/java/org/linphone/utils/ImageUtils.kt index 607da2843..dc0fe6bbe 100644 --- a/app/src/main/java/org/linphone/utils/ImageUtils.kt +++ b/app/src/main/java/org/linphone/utils/ImageUtils.kt @@ -73,69 +73,62 @@ class ImageUtils { suspend fun getFilesPathFromPickerIntent(data: Intent?, temporaryImageFilePath: File?): List { var imageFilePath: String? = null - if (temporaryImageFilePath != null) { - if (data != null) { - val clipData = data.clipData - if (clipData != null) { // Multiple selection - Log.i("[Image Utils] Found ${clipData.itemCount} elements") - val list = arrayListOf() - for (i in 0 until clipData.itemCount) { - val dataUri = clipData.getItemAt(i).uri - if (dataUri != null) { - imageFilePath = dataUri.toString() - Log.i("[Image Utils] Using data URI $imageFilePath") - } - imageFilePath = cleanFilePath(imageFilePath) - if (imageFilePath != null) list.add(imageFilePath) - } - return list - } else { // Single selection - val dataUri = data.data + if (data != null) { + val clipData = data.clipData + if (clipData != null) { // Multiple selection + Log.i("[Image Utils] Found ${clipData.itemCount} elements") + val list = arrayListOf() + for (i in 0 until clipData.itemCount) { + val dataUri = clipData.getItemAt(i).uri if (dataUri != null) { imageFilePath = dataUri.toString() Log.i("[Image Utils] Using data URI $imageFilePath") - } else if (temporaryImageFilePath.exists()) { - imageFilePath = temporaryImageFilePath.absolutePath - Log.i("[Image Utils] Data URI is null, using $imageFilePath") } imageFilePath = cleanFilePath(imageFilePath) - if (imageFilePath != null) return arrayListOf(imageFilePath) + if (imageFilePath != null) list.add(imageFilePath) + } + return list + } else { // Single selection + val dataUri = data.data + if (dataUri != null) { + imageFilePath = dataUri.toString() + Log.i("[Image Utils] Using data URI $imageFilePath") + } else if (temporaryImageFilePath?.exists() == true) { + imageFilePath = temporaryImageFilePath.absolutePath + Log.i("[Image Utils] Data URI is null, using $imageFilePath") } - } else if (temporaryImageFilePath.exists()) { - imageFilePath = temporaryImageFilePath.absolutePath - Log.i("[Image Utils] Data is null, using $imageFilePath") imageFilePath = cleanFilePath(imageFilePath) if (imageFilePath != null) return arrayListOf(imageFilePath) } + } else if (temporaryImageFilePath?.exists() == true) { + imageFilePath = temporaryImageFilePath.absolutePath + Log.i("[Image Utils] Data is null, using $imageFilePath") + imageFilePath = cleanFilePath(imageFilePath) + if (imageFilePath != null) return arrayListOf(imageFilePath) } return arrayListOf() } suspend fun getFilePathFromPickerIntent(data: Intent?, temporaryImageFilePath: File?): String? { var imageFilePath: String? = null - if (temporaryImageFilePath != null) { - if (data != null) { - val clipData = data.clipData - if (clipData != null) { // Multiple selection - for (i in 0 until clipData.itemCount) { - val uri = clipData.getItemAt(i).uri - } - } else { // Single selection - val dataUri = data.data - if (dataUri != null) { - imageFilePath = dataUri.toString() - Log.i("[Image Utils] Using data URI $imageFilePath") - } else if (temporaryImageFilePath.exists()) { - imageFilePath = temporaryImageFilePath.absolutePath - Log.i("[Image Utils] Data URI is null, using $imageFilePath") - } + if (data != null) { + val clipData = data.clipData + if (clipData != null) { // Multiple selection + Log.e("[Image Utils] Expecting only one file, got ${clipData.itemCount}") + } else { // Single selection + val dataUri = data.data + if (dataUri != null) { + imageFilePath = dataUri.toString() + Log.i("[Image Utils] Using data URI $imageFilePath") + } else if (temporaryImageFilePath?.exists() == true) { + imageFilePath = temporaryImageFilePath.absolutePath + Log.i("[Image Utils] Data URI is null, using $imageFilePath") } - } else if (temporaryImageFilePath.exists()) { - imageFilePath = temporaryImageFilePath.absolutePath - Log.i("[Image Utils] Data is null, using $imageFilePath") } + } else if (temporaryImageFilePath?.exists() == true) { + imageFilePath = temporaryImageFilePath.absolutePath + Log.i("[Image Utils] Data is null, using $imageFilePath") } - return cleanFilePath(imageFilePath) }