From d4229711e3d1adc0c4b42f5a9da929a9392d7e2c Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 31 Mar 2021 17:29:45 +0200 Subject: [PATCH] Added export button in each file viewer --- .../files/fragments/ImageViewerFragment.kt | 3 + .../main/files/fragments/PdfViewerFragment.kt | 3 + .../files/fragments/TextViewerFragment.kt | 3 + .../main/files/fragments/TopBarFragment.kt | 83 +++++++++++++++++++ .../files/fragments/VideoViewerFragment.kt | 15 ++++ .../files/viewmodels/VideoFileViewModel.kt | 1 - .../layout/file_viewer_top_bar_fragment.xml | 16 +++- app/src/main/res/values/strings.xml | 1 + 8 files changed, 123 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/ImageViewerFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/ImageViewerFragment.kt index 887b6db32..be57ba345 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/ImageViewerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/ImageViewerFragment.kt @@ -55,6 +55,9 @@ class ImageViewerFragment : SecureFragment() { val filePath = sharedViewModel.fileToOpen.value filePath ?: return + (childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment) + ?.setFilePath(filePath) + viewModel = ViewModelProvider( this, ImageFileViewModelFactory(filePath) diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/PdfViewerFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/PdfViewerFragment.kt index 825719fe7..a264196de 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/PdfViewerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/PdfViewerFragment.kt @@ -46,6 +46,9 @@ class PdfViewerFragment : SecureFragment() { val filePath = sharedViewModel.fileToOpen.value filePath ?: return + (childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment) + ?.setFilePath(filePath) + viewModel = ViewModelProvider( this, PdfFileViewModelFactory(filePath) diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/TextViewerFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/TextViewerFragment.kt index aa3dd7553..5ced40461 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/TextViewerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/TextViewerFragment.kt @@ -46,6 +46,9 @@ class TextViewerFragment : SecureFragment() { val filePath = sharedViewModel.fileToOpen.value filePath ?: return + (childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment) + ?.setFilePath(filePath) + viewModel = ViewModelProvider( this, TextFileViewModelFactory(filePath) diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt index 572af0027..50c315f30 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt @@ -19,13 +19,24 @@ */ package org.linphone.activities.main.files.fragments +import android.content.ActivityNotFoundException +import android.content.Intent +import android.net.Uri import android.os.Bundle +import android.webkit.MimeTypeMap import androidx.navigation.fragment.findNavController +import org.linphone.LinphoneApplication import org.linphone.R import org.linphone.activities.GenericFragment +import org.linphone.activities.main.viewmodels.DialogViewModel +import org.linphone.core.tools.Log import org.linphone.databinding.FileViewerTopBarFragmentBinding +import org.linphone.utils.DialogUtils +import org.linphone.utils.FileUtils class TopBarFragment : GenericFragment() { + private var filePath: String = "" + override fun getLayoutId(): Int = R.layout.file_viewer_top_bar_fragment override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -36,5 +47,77 @@ class TopBarFragment : GenericFragment() { binding.setBackClickListener { findNavController().popBackStack() } + + binding.setExportClickListener { + openFile(filePath) + } + } + + fun setFilePath(newFilePath: String) { + Log.i("[File Viewer] File path is: $newFilePath") + filePath = newFilePath + } + + override fun onSaveInstanceState(outState: Bundle) { + outState.putString("FilePath", filePath) + super.onSaveInstanceState(outState) + } + + override fun onViewStateRestored(savedInstanceState: Bundle?) { + 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/activities/main/files/fragments/VideoViewerFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/VideoViewerFragment.kt index 806dbf034..6a880474d 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/VideoViewerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/VideoViewerFragment.kt @@ -47,6 +47,9 @@ class VideoViewerFragment : SecureFragment() { val filePath = sharedViewModel.fileToOpen.value filePath ?: return + (childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment) + ?.setFilePath(filePath) + viewModel = ViewModelProvider( this, VideoFileViewModelFactory(filePath) @@ -58,6 +61,18 @@ class VideoViewerFragment : SecureFragment() { isSecure = arguments?.getBoolean("Secure") ?: false } + override fun onResume() { + super.onResume() + + binding.videoView.start() + } + + override fun onPause() { + binding.videoView.pause() + + super.onPause() + } + private fun initVideoControls() { val mediaController = MediaController(requireContext()) viewModel.initMediaController(mediaController, binding.videoView) diff --git a/app/src/main/java/org/linphone/activities/main/files/viewmodels/VideoFileViewModel.kt b/app/src/main/java/org/linphone/activities/main/files/viewmodels/VideoFileViewModel.kt index 82d4fdf0f..f568720bb 100644 --- a/app/src/main/java/org/linphone/activities/main/files/viewmodels/VideoFileViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/files/viewmodels/VideoFileViewModel.kt @@ -55,6 +55,5 @@ class VideoFileViewModel(val filePath: String) : ViewModel() { } videoView.setVideoPath(filePath) - videoView.start() } } diff --git a/app/src/main/res/layout/file_viewer_top_bar_fragment.xml b/app/src/main/res/layout/file_viewer_top_bar_fragment.xml index 667c1b55d..8943beb5d 100644 --- a/app/src/main/res/layout/file_viewer_top_bar_fragment.xml +++ b/app/src/main/res/layout/file_viewer_top_bar_fragment.xml @@ -6,6 +6,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3c57e7b16..84f6d534a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -718,4 +718,5 @@ Take a screenshot of received video Close notification bubble Open conversation in app instead of bubble + Export file in another app