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 02b36ddf2..0bed56ddb 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 @@ -21,17 +21,14 @@ package org.linphone.activities.main.chat.fragments import android.app.Activity import android.app.Dialog -import android.content.ActivityNotFoundException import android.content.Intent import android.content.pm.PackageManager -import android.net.Uri import android.os.Bundle import android.os.Parcelable import android.provider.MediaStore import android.view.MenuInflater import android.view.MenuItem import android.view.View -import android.webkit.MimeTypeMap import androidx.activity.addCallback import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuPopupHelper @@ -231,13 +228,18 @@ class DetailChatRoomFragment : MasterFragment navigateToImageFileViewer(viewModel.chatRoom.currentParams.encryptionEnabled()) - FileUtils.isExtensionVideo(path) -> navigateToVideoFileViewer(viewModel.chatRoom.currentParams.encryptionEnabled()) - FileUtils.isExtensionAudio(path) -> navigateToAudioFileViewer(viewModel.chatRoom.currentParams.encryptionEnabled()) - FileUtils.isExtensionPdf(path) -> navigateToPdfFileViewer(viewModel.chatRoom.currentParams.encryptionEnabled()) - FileUtils.isPlainTextFile(path) -> navigateToTextFileViewer(viewModel.chatRoom.currentParams.encryptionEnabled()) - else -> openFile(path) + FileUtils.isExtensionImage(path) -> navigateToImageFileViewer(preventScreenshots) + FileUtils.isExtensionVideo(path) -> navigateToVideoFileViewer(preventScreenshots) + FileUtils.isExtensionAudio(path) -> navigateToAudioFileViewer(preventScreenshots) + FileUtils.isExtensionPdf(path) -> navigateToPdfFileViewer(preventScreenshots) + FileUtils.isPlainTextFile(path) -> navigateToTextFileViewer(preventScreenshots) + else -> { + if (!FileUtils.openFileInThirdPartyApp(requireActivity(), path)) { + showDialogToSuggestOpeningFileAsText() + } + } } } } @@ -548,57 +550,22 @@ class DetailChatRoomFragment : MasterFragment() { @@ -49,7 +43,9 @@ class TopBarFragment : GenericFragment() { } binding.setExportClickListener { - openFile(filePath) + if (!FileUtils.openFileInThirdPartyApp(requireActivity(), filePath)) { + (requireActivity() as SnackBarActivity).showSnackBar(R.string.chat_message_no_app_found_to_handle_file_mime_type) + } } } @@ -67,57 +63,4 @@ class TopBarFragment : GenericFragment() { super.onViewStateRestored(savedInstanceState) filePath = savedInstanceState?.getString("FilePath") ?: filePath } - - private fun openFile(contentFilePath: String) { - val intent = Intent(Intent.ACTION_VIEW) - val contentUri: Uri = FileUtils.getPublicFilePath(requireContext(), contentFilePath) - val filePath: String = contentUri.toString() - Log.i("[File Viewer] Trying to open file: $filePath") - var type: String? = null - val extension = FileUtils.getExtensionFromFileName(filePath) - - if (extension.isNotEmpty()) { - Log.i("[File Viewer] Found extension $extension") - type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) - } else { - Log.e("[File Viewer] Couldn't find extension") - } - - if (type != null) { - Log.i("[File Viewer] Found matching MIME type $type") - } else { - type = "file/$extension" - Log.e("[File Viewer] Can't get MIME type from extension: $extension, will use $type") - } - - intent.setDataAndType(contentUri, type) - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - - try { - startActivity(intent) - - if (LinphoneApplication.corePreferences.enableAnimations) { - requireActivity().overridePendingTransition(R.anim.enter_right, R.anim.exit_left) - } - } catch (anfe: ActivityNotFoundException) { - Log.e("[File Viewer] Couldn't find an activity to handle MIME type: $type") - - val dialogViewModel = DialogViewModel( - getString(R.string.dialog_try_open_file_as_text_body), getString( - R.string.dialog_try_open_file_as_text_title - ) - ) - val dialog = DialogUtils.getDialog(requireContext(), dialogViewModel) - - dialogViewModel.showCancelButton { - dialog.dismiss() - } - - dialogViewModel.showOkButton({ - dialog.dismiss() - }) - - dialog.show() - } - } } diff --git a/app/src/main/java/org/linphone/utils/FileUtils.kt b/app/src/main/java/org/linphone/utils/FileUtils.kt index 268fec0d7..7d47afba1 100644 --- a/app/src/main/java/org/linphone/utils/FileUtils.kt +++ b/app/src/main/java/org/linphone/utils/FileUtils.kt @@ -19,7 +19,10 @@ */ package org.linphone.utils +import android.app.Activity +import android.content.ActivityNotFoundException import android.content.Context +import android.content.Intent import android.database.CursorIndexOutOfBoundsException import android.net.Uri import android.os.Environment @@ -33,6 +36,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.withContext +import org.linphone.LinphoneApplication import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log @@ -292,5 +296,42 @@ class FileUtils { } return contentUri } + + fun openFileInThirdPartyApp(activity: Activity, contentFilePath: String): Boolean { + val intent = Intent(Intent.ACTION_VIEW) + val contentUri: Uri = getPublicFilePath(activity, contentFilePath) + val filePath: String = contentUri.toString() + Log.i("[File Viewer] Trying to open file: $filePath") + var type: String? = null + val extension = getExtensionFromFileName(filePath) + + if (extension.isNotEmpty()) { + Log.i("[File Viewer] Found extension $extension") + type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) + } else { + Log.e("[File Viewer] Couldn't find extension") + } + + if (type != null) { + Log.i("[File Viewer] Found matching MIME type $type") + } else { + type = "file/$extension" + Log.e("[File Viewer] Can't get MIME type from extension: $extension, will use $type") + } + + intent.setDataAndType(contentUri, type) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + + try { + activity.startActivity(intent) + if (LinphoneApplication.corePreferences.enableAnimations) { + activity.overridePendingTransition(R.anim.enter_right, R.anim.exit_left) + } + return true + } catch (anfe: ActivityNotFoundException) { + Log.e("[File Viewer] Can't open file in third party app: $anfe") + } + return false + } } } diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 72d6da939..8232bbf82 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -566,4 +566,6 @@ la politique de confidentialité J\'accepte %1$s et %2$s de Belledonne Communications Ouvrir les conversations dans l\'application au lieu de la bulle + Ouvrir le fichier dans une application tierce + Aucune application n\'est disponible pour ouvrir ce type de fichier \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 84f6d534a..72c5dd7be 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -200,6 +200,7 @@ @string/chat_room_delete_many_dialog <Redacted> + No app available for this kind of file No recordings @@ -718,5 +719,5 @@ Take a screenshot of received video Close notification bubble Open conversation in app instead of bubble - Export file in another app + Open file in third-party app