Added export button in each file viewer
This commit is contained in:
parent
b818bf0155
commit
d4229711e3
8 changed files with 123 additions and 2 deletions
|
@ -55,6 +55,9 @@ class ImageViewerFragment : SecureFragment<ImageViewerFragmentBinding>() {
|
||||||
val filePath = sharedViewModel.fileToOpen.value
|
val filePath = sharedViewModel.fileToOpen.value
|
||||||
filePath ?: return
|
filePath ?: return
|
||||||
|
|
||||||
|
(childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment)
|
||||||
|
?.setFilePath(filePath)
|
||||||
|
|
||||||
viewModel = ViewModelProvider(
|
viewModel = ViewModelProvider(
|
||||||
this,
|
this,
|
||||||
ImageFileViewModelFactory(filePath)
|
ImageFileViewModelFactory(filePath)
|
||||||
|
|
|
@ -46,6 +46,9 @@ class PdfViewerFragment : SecureFragment<PdfViewerFragmentBinding>() {
|
||||||
val filePath = sharedViewModel.fileToOpen.value
|
val filePath = sharedViewModel.fileToOpen.value
|
||||||
filePath ?: return
|
filePath ?: return
|
||||||
|
|
||||||
|
(childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment)
|
||||||
|
?.setFilePath(filePath)
|
||||||
|
|
||||||
viewModel = ViewModelProvider(
|
viewModel = ViewModelProvider(
|
||||||
this,
|
this,
|
||||||
PdfFileViewModelFactory(filePath)
|
PdfFileViewModelFactory(filePath)
|
||||||
|
|
|
@ -46,6 +46,9 @@ class TextViewerFragment : SecureFragment<TextViewerFragmentBinding>() {
|
||||||
val filePath = sharedViewModel.fileToOpen.value
|
val filePath = sharedViewModel.fileToOpen.value
|
||||||
filePath ?: return
|
filePath ?: return
|
||||||
|
|
||||||
|
(childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment)
|
||||||
|
?.setFilePath(filePath)
|
||||||
|
|
||||||
viewModel = ViewModelProvider(
|
viewModel = ViewModelProvider(
|
||||||
this,
|
this,
|
||||||
TextFileViewModelFactory(filePath)
|
TextFileViewModelFactory(filePath)
|
||||||
|
|
|
@ -19,13 +19,24 @@
|
||||||
*/
|
*/
|
||||||
package org.linphone.activities.main.files.fragments
|
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.os.Bundle
|
||||||
|
import android.webkit.MimeTypeMap
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import org.linphone.LinphoneApplication
|
||||||
import org.linphone.R
|
import org.linphone.R
|
||||||
import org.linphone.activities.GenericFragment
|
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.databinding.FileViewerTopBarFragmentBinding
|
||||||
|
import org.linphone.utils.DialogUtils
|
||||||
|
import org.linphone.utils.FileUtils
|
||||||
|
|
||||||
class TopBarFragment : GenericFragment<FileViewerTopBarFragmentBinding>() {
|
class TopBarFragment : GenericFragment<FileViewerTopBarFragmentBinding>() {
|
||||||
|
private var filePath: String = ""
|
||||||
|
|
||||||
override fun getLayoutId(): Int = R.layout.file_viewer_top_bar_fragment
|
override fun getLayoutId(): Int = R.layout.file_viewer_top_bar_fragment
|
||||||
|
|
||||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||||
|
@ -36,5 +47,77 @@ class TopBarFragment : GenericFragment<FileViewerTopBarFragmentBinding>() {
|
||||||
binding.setBackClickListener {
|
binding.setBackClickListener {
|
||||||
findNavController().popBackStack()
|
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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,9 @@ class VideoViewerFragment : SecureFragment<VideoViewerFragmentBinding>() {
|
||||||
val filePath = sharedViewModel.fileToOpen.value
|
val filePath = sharedViewModel.fileToOpen.value
|
||||||
filePath ?: return
|
filePath ?: return
|
||||||
|
|
||||||
|
(childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment)
|
||||||
|
?.setFilePath(filePath)
|
||||||
|
|
||||||
viewModel = ViewModelProvider(
|
viewModel = ViewModelProvider(
|
||||||
this,
|
this,
|
||||||
VideoFileViewModelFactory(filePath)
|
VideoFileViewModelFactory(filePath)
|
||||||
|
@ -58,6 +61,18 @@ class VideoViewerFragment : SecureFragment<VideoViewerFragmentBinding>() {
|
||||||
isSecure = arguments?.getBoolean("Secure") ?: false
|
isSecure = arguments?.getBoolean("Secure") ?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
|
||||||
|
binding.videoView.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
binding.videoView.pause()
|
||||||
|
|
||||||
|
super.onPause()
|
||||||
|
}
|
||||||
|
|
||||||
private fun initVideoControls() {
|
private fun initVideoControls() {
|
||||||
val mediaController = MediaController(requireContext())
|
val mediaController = MediaController(requireContext())
|
||||||
viewModel.initMediaController(mediaController, binding.videoView)
|
viewModel.initMediaController(mediaController, binding.videoView)
|
||||||
|
|
|
@ -55,6 +55,5 @@ class VideoFileViewModel(val filePath: String) : ViewModel() {
|
||||||
}
|
}
|
||||||
|
|
||||||
videoView.setVideoPath(filePath)
|
videoView.setVideoPath(filePath)
|
||||||
videoView.start()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
<variable
|
<variable
|
||||||
name="backClickListener"
|
name="backClickListener"
|
||||||
type="android.view.View.OnClickListener"/>
|
type="android.view.View.OnClickListener"/>
|
||||||
|
<variable
|
||||||
|
name="exportClickListener"
|
||||||
|
type="android.view.View.OnClickListener"/>
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
@ -30,9 +33,20 @@
|
||||||
<View
|
<View
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_weight="0.8"
|
android:layout_weight="0.6"
|
||||||
android:visibility="invisible" />
|
android:visibility="invisible" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/export"
|
||||||
|
android:onClick="@{exportClickListener}"
|
||||||
|
android:contentDescription="@string/content_description_export"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="0.2"
|
||||||
|
android:background="?attr/button_background_drawable"
|
||||||
|
android:padding="18dp"
|
||||||
|
android:src="@drawable/settings_network" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</layout>
|
</layout>
|
||||||
|
|
|
@ -718,4 +718,5 @@
|
||||||
<string name="content_description_take_screenshot">Take a screenshot of received video</string>
|
<string name="content_description_take_screenshot">Take a screenshot of received video</string>
|
||||||
<string name="content_description_close_bubble">Close notification bubble</string>
|
<string name="content_description_close_bubble">Close notification bubble</string>
|
||||||
<string name="content_description_open_app">Open conversation in app instead of bubble</string>
|
<string name="content_description_open_app">Open conversation in app instead of bubble</string>
|
||||||
|
<string name="content_description_export">Export file in another app</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in a new issue