From 91ec675cbe0f43bef0572d88cdc28937184034b9 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 7 Feb 2024 10:54:28 +0100 Subject: [PATCH] Refactored Media & File viewers --- .../java/org/linphone/ui/main/MainActivity.kt | 1 + .../chat/fragment/ConversationFragment.kt | 84 ++++----- .../fragment/ConversationMediaListFragment.kt | 84 ++++----- .../fragment/ConversationsListFragment.kt | 26 +++ .../adapter/MediaListAdapter.kt | 4 +- .../adapter/PdfPagesListAdapter.kt | 4 +- .../fragment/FileViewerFragment.kt | 52 +----- .../fragment/MediaListViewerFragment.kt | 23 ++- .../fragment/MediaViewerFragment.kt | 16 +- .../viewmodel/FileViewModel.kt | 33 +--- .../viewmodel/MediaViewModel.kt | 2 +- .../ui/main/viewmodel/SharedMainViewModel.kt | 5 + .../res/layout-land/file_viewer_fragment.xml | 165 ------------------ ...l => file_media_viewer_child_fragment.xml} | 2 +- ...ent.xml => file_media_viewer_fragment.xml} | 0 .../main/res/layout/file_viewer_fragment.xml | 38 +--- .../main/res/navigation/chat_nav_graph.xml | 49 ------ .../main/res/navigation/main_nav_graph.xml | 43 ++++- 18 files changed, 174 insertions(+), 457 deletions(-) rename app/src/main/java/org/linphone/ui/main/{chat => file_media_viewer}/adapter/MediaListAdapter.kt (93%) rename app/src/main/java/org/linphone/ui/main/{viewer => file_media_viewer}/adapter/PdfPagesListAdapter.kt (94%) rename app/src/main/java/org/linphone/ui/main/{viewer => file_media_viewer}/fragment/FileViewerFragment.kt (80%) rename app/src/main/java/org/linphone/ui/main/{chat => file_media_viewer}/fragment/MediaListViewerFragment.kt (92%) rename app/src/main/java/org/linphone/ui/main/{chat => file_media_viewer}/fragment/MediaViewerFragment.kt (88%) rename app/src/main/java/org/linphone/ui/main/{viewer => file_media_viewer}/viewmodel/FileViewModel.kt (89%) rename app/src/main/java/org/linphone/ui/main/{chat => file_media_viewer}/viewmodel/MediaViewModel.kt (97%) delete mode 100644 app/src/main/res/layout-land/file_viewer_fragment.xml rename app/src/main/res/layout/{chat_media_viewer_child_fragment.xml => file_media_viewer_child_fragment.xml} (96%) rename app/src/main/res/layout/{chat_media_viewer_fragment.xml => file_media_viewer_fragment.xml} (100%) diff --git a/app/src/main/java/org/linphone/ui/main/MainActivity.kt b/app/src/main/java/org/linphone/ui/main/MainActivity.kt index 53701b5c7..4d756bb52 100644 --- a/app/src/main/java/org/linphone/ui/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/main/MainActivity.kt @@ -402,6 +402,7 @@ class MainActivity : GenericActivity() { val pair = Pair(localSipUri, remoteSipUri) sharedViewModel.showConversationEvent.value = Event(pair) } + args?.clear() val action = ConversationsListFragmentDirections.actionGlobalConversationsListFragment() findNavController().navigate(action) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index e1554be10..af059b6ad 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -39,8 +39,6 @@ import android.view.View import android.view.ViewGroup import android.view.Window import android.view.WindowManager -import android.view.animation.Animation -import android.view.animation.AnimationUtils import android.widget.PopupWindow import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts @@ -244,17 +242,6 @@ class ConversationFragment : SlidingPaneChildFragment() { private var bottomSheetReactionsModel: MessageReactionsModel? = null - override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { - if ( - findNavController().currentDestination?.id == R.id.fileViewerFragment || - findNavController().currentDestination?.id == R.id.mediaListViewerFragment - ) { - // Holds fragment in place while new fragment slides over it - return AnimationUtils.loadAnimation(activity, R.anim.hold) - } - return super.onCreateAnimation(transit, enter, nextAnim) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -750,43 +737,40 @@ class ConversationFragment : SlidingPaneChildFragment() { } private fun goToFileViewer(path: String) { - if (findNavController().currentDestination?.id == R.id.conversationFragment) { - Log.i("$TAG Navigating to file viewer fragment with path [$path]") - val extension = FileUtils.getExtensionFromFileName(path) - val mime = FileUtils.getMimeTypeFromExtension(extension) - when (FileUtils.getMimeType(mime)) { - FileUtils.MimeType.Image, FileUtils.MimeType.Video -> { - val action = - ConversationFragmentDirections.actionConversationFragmentToMediaListViewerFragment( - localSipUri = viewModel.localSipUri, - remoteSipUri = viewModel.remoteSipUri, - path = path - ) - findNavController().navigate(action) - } - FileUtils.MimeType.Pdf, FileUtils.MimeType.PlainText -> { - val action = - ConversationFragmentDirections.actionConversationFragmentToFileViewerFragment( - path - ) - findNavController().navigate(action) - } - else -> { - val intent = Intent(Intent.ACTION_VIEW) - val contentUri: Uri = - FileUtils.getPublicFilePath(requireContext(), path) - intent.setDataAndType(contentUri, "file/$mime") - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - try { - requireContext().startActivity(intent) - } catch (anfe: ActivityNotFoundException) { - Log.e("$TAG Can't open file [$path] in third party app: $anfe") - val message = getString( - R.string.toast_no_app_registered_to_handle_content_type_error - ) - val icon = R.drawable.file - (requireActivity() as MainActivity).showRedToast(message, icon) - } + Log.i("$TAG Navigating to file viewer fragment with path [$path]") + val extension = FileUtils.getExtensionFromFileName(path) + val mime = FileUtils.getMimeTypeFromExtension(extension) + + val bundle = Bundle() + bundle.apply { + putString("localSipUri", viewModel.localSipUri) + putString("remoteSipUri", viewModel.remoteSipUri) + putString("path", path) + } + when (FileUtils.getMimeType(mime)) { + FileUtils.MimeType.Image, FileUtils.MimeType.Video -> { + bundle.putBoolean("isMedia", true) + sharedViewModel.displayFileEvent.value = Event(bundle) + } + FileUtils.MimeType.Pdf, FileUtils.MimeType.PlainText -> { + bundle.putBoolean("isMedia", false) + sharedViewModel.displayFileEvent.value = Event(bundle) + } + else -> { + val intent = Intent(Intent.ACTION_VIEW) + val contentUri: Uri = + FileUtils.getPublicFilePath(requireContext(), path) + intent.setDataAndType(contentUri, "file/$mime") + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + try { + requireContext().startActivity(intent) + } catch (anfe: ActivityNotFoundException) { + Log.e("$TAG Can't open file [$path] in third party app: $anfe") + val message = getString( + R.string.toast_no_app_registered_to_handle_content_type_error + ) + val icon = R.drawable.file + (requireActivity() as MainActivity).showRedToast(message, icon) } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt index d52cc09a3..05705bdc8 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt @@ -26,8 +26,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.animation.Animation -import android.view.animation.AnimationUtils import androidx.annotation.UiThread import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider @@ -39,6 +37,7 @@ import org.linphone.databinding.ChatMediaFragmentBinding import org.linphone.ui.main.MainActivity import org.linphone.ui.main.chat.viewmodel.ConversationMediaListViewModel import org.linphone.ui.main.fragment.SlidingPaneChildFragment +import org.linphone.utils.Event import org.linphone.utils.FileUtils @UiThread @@ -53,16 +52,6 @@ class ConversationMediaListFragment : SlidingPaneChildFragment() { private val args: ConversationMediaListFragmentArgs by navArgs() - override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { - if ( - findNavController().currentDestination?.id == R.id.mediaListViewerFragment - ) { - // Holds fragment in place while new fragment slides over it - return AnimationUtils.loadAnimation(activity, R.anim.hold) - } - return super.onCreateAnimation(transit, enter, nextAnim) - } - override fun goBack(): Boolean { return findNavController().popBackStack() } @@ -116,43 +105,40 @@ class ConversationMediaListFragment : SlidingPaneChildFragment() { } private fun goToFileViewer(path: String) { - if (findNavController().currentDestination?.id == R.id.conversationMediaListFragment) { - Log.i("$TAG Navigating to file viewer fragment with path [$path]") - val extension = FileUtils.getExtensionFromFileName(path) - val mime = FileUtils.getMimeTypeFromExtension(extension) - when (FileUtils.getMimeType(mime)) { - FileUtils.MimeType.Image, FileUtils.MimeType.Video -> { - val action = - ConversationMediaListFragmentDirections.actionConversationMediaListFragmentToMediaListViewerFragment( - localSipUri = viewModel.localSipUri, - remoteSipUri = viewModel.remoteSipUri, - path = path - ) - findNavController().navigate(action) - } - FileUtils.MimeType.Pdf, FileUtils.MimeType.PlainText -> { - val action = - ConversationMediaListFragmentDirections.actionConversationMediaListFragmentToFileViewerFragment( - path - ) - findNavController().navigate(action) - } - else -> { - val intent = Intent(Intent.ACTION_VIEW) - val contentUri: Uri = - FileUtils.getPublicFilePath(requireContext(), path) - intent.setDataAndType(contentUri, "file/$mime") - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - try { - requireContext().startActivity(intent) - } catch (anfe: ActivityNotFoundException) { - Log.e("$TAG Can't open file [$path] in third party app: $anfe") - val message = getString( - R.string.toast_no_app_registered_to_handle_content_type_error - ) - val icon = R.drawable.file - (requireActivity() as MainActivity).showRedToast(message, icon) - } + Log.i("$TAG Navigating to file viewer fragment with path [$path]") + val extension = FileUtils.getExtensionFromFileName(path) + val mime = FileUtils.getMimeTypeFromExtension(extension) + + val bundle = Bundle() + bundle.apply { + putString("localSipUri", viewModel.localSipUri) + putString("remoteSipUri", viewModel.remoteSipUri) + putString("path", path) + } + when (FileUtils.getMimeType(mime)) { + FileUtils.MimeType.Image, FileUtils.MimeType.Video -> { + bundle.putBoolean("isMedia", true) + sharedViewModel.displayFileEvent.value = Event(bundle) + } + FileUtils.MimeType.Pdf, FileUtils.MimeType.PlainText -> { + bundle.putBoolean("isMedia", false) + sharedViewModel.displayFileEvent.value = Event(bundle) + } + else -> { + val intent = Intent(Intent.ACTION_VIEW) + val contentUri: Uri = + FileUtils.getPublicFilePath(requireContext(), path) + intent.setDataAndType(contentUri, "file/$mime") + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + try { + requireContext().startActivity(intent) + } catch (anfe: ActivityNotFoundException) { + Log.e("$TAG Can't open file [$path] in third party app: $anfe") + val message = getString( + R.string.toast_no_app_registered_to_handle_content_type_error + ) + val icon = R.drawable.file + (requireActivity() as MainActivity).showRedToast(message, icon) } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt index 1c88b2fda..add88f337 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt @@ -218,6 +218,32 @@ class ConversationsListFragment : AbstractTopBarFragment() { } } + sharedViewModel.displayFileEvent.observe(viewLifecycleOwner) { + it.consume { bundle -> + if (findNavController().currentDestination?.id == R.id.conversationsListFragment) { + val path = bundle.getString("path", "") + val isMedia = bundle.getBoolean("isMedia", false) + Log.i( + "$TAG Navigating to ${if (isMedia) "media" else "file"} viewer fragment with path [$path]" + ) + val action = if (isMedia) { + val localSipUri = bundle.getString("localSipUri", "") + val remoteSipUri = bundle.getString("remoteSipUri", "") + ConversationsListFragmentDirections.actionConversationsListFragmentToMediaListViewerFragment( + localSipUri = localSipUri, + remoteSipUri = remoteSipUri, + path = path + ) + } else { + ConversationsListFragmentDirections.actionConversationsListFragmentToFileViewerFragment( + path + ) + } + findNavController().navigate(action) + } + } + } + sharedViewModel.messageToForwardEvent.observe(viewLifecycleOwner) { event -> if (!event.consumed()) { // Do not consume it yet diff --git a/app/src/main/java/org/linphone/ui/main/chat/adapter/MediaListAdapter.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/adapter/MediaListAdapter.kt similarity index 93% rename from app/src/main/java/org/linphone/ui/main/chat/adapter/MediaListAdapter.kt rename to app/src/main/java/org/linphone/ui/main/file_media_viewer/adapter/MediaListAdapter.kt index 3c8ae7ff2..1872f9fc1 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/adapter/MediaListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/adapter/MediaListAdapter.kt @@ -17,14 +17,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.main.chat.adapter +package org.linphone.ui.main.file_media_viewer.adapter import android.os.Bundle import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter import org.linphone.core.tools.Log -import org.linphone.ui.main.chat.fragment.MediaViewerFragment import org.linphone.ui.main.chat.viewmodel.ConversationMediaListViewModel +import org.linphone.ui.main.file_media_viewer.fragment.MediaViewerFragment class MediaListAdapter(fragment: Fragment, private val viewModel: ConversationMediaListViewModel) : FragmentStateAdapter( fragment diff --git a/app/src/main/java/org/linphone/ui/main/viewer/adapter/PdfPagesListAdapter.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/adapter/PdfPagesListAdapter.kt similarity index 94% rename from app/src/main/java/org/linphone/ui/main/viewer/adapter/PdfPagesListAdapter.kt rename to app/src/main/java/org/linphone/ui/main/file_media_viewer/adapter/PdfPagesListAdapter.kt index 6d15676c9..b960e8ba0 100644 --- a/app/src/main/java/org/linphone/ui/main/viewer/adapter/PdfPagesListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/adapter/PdfPagesListAdapter.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.main.viewer.adapter +package org.linphone.ui.main.file_media_viewer.adapter import android.view.LayoutInflater import android.view.View @@ -25,7 +25,7 @@ import android.view.ViewGroup import android.widget.ImageView import androidx.recyclerview.widget.RecyclerView import org.linphone.R -import org.linphone.ui.main.viewer.viewmodel.FileViewModel +import org.linphone.ui.main.file_media_viewer.viewmodel.FileViewModel class PdfPagesListAdapter(private val viewModel: FileViewModel) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PdfPageViewHolder { diff --git a/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt similarity index 80% rename from app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt rename to app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt index ecd80629a..2bae4b2ff 100644 --- a/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt @@ -1,4 +1,4 @@ -package org.linphone.ui.main.viewer.fragment +package org.linphone.ui.main.file_media_viewer.fragment import android.app.Activity import android.content.Intent @@ -20,14 +20,14 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.FileViewerFragmentBinding import org.linphone.ui.main.MainActivity -import org.linphone.ui.main.fragment.SlidingPaneChildFragment -import org.linphone.ui.main.viewer.adapter.PdfPagesListAdapter -import org.linphone.ui.main.viewer.viewmodel.FileViewModel +import org.linphone.ui.main.file_media_viewer.adapter.PdfPagesListAdapter +import org.linphone.ui.main.file_media_viewer.viewmodel.FileViewModel +import org.linphone.ui.main.fragment.GenericFragment import org.linphone.utils.Event import org.linphone.utils.FileUtils @UiThread -class FileViewerFragment : SlidingPaneChildFragment() { +class FileViewerFragment : GenericFragment() { companion object { private const val TAG = "[File Viewer Fragment]" @@ -74,11 +74,7 @@ class FileViewerFragment : SlidingPaneChildFragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel - val path = if (arguments?.containsKey("path") == true) { - requireArguments().getString("path", args.path) - } else { - args.path - } + val path = args.path Log.i("$TAG Path argument is [$path]") viewModel.loadFile(path) @@ -138,30 +134,6 @@ class FileViewerFragment : SlidingPaneChildFragment() { } } - viewModel.isVideo.observe(viewLifecycleOwner) { isVideo -> - if (isVideo) { - binding.videoPlayer.setVideoPath(path) - binding.videoPlayer.setOnCompletionListener { - Log.i("$TAG End of file reached") - viewModel.isVideoPlaying.value = false - } - (view.parent as? ViewGroup)?.doOnPreDraw { - binding.videoPlayer.start() - viewModel.isVideoPlaying.value = true - } - } - } - - viewModel.toggleVideoPlayPauseEvent.observe(viewLifecycleOwner) { - it.consume { play -> - if (play) { - binding.videoPlayer.start() - } else { - binding.videoPlayer.pause() - } - } - } - viewModel.showGreenToastEvent.observe(viewLifecycleOwner) { it.consume { pair -> val message = pair.first @@ -191,21 +163,9 @@ class FileViewerFragment : SlidingPaneChildFragment() { override fun onPause() { binding.pdfViewPager.unregisterOnPageChangeCallback(pageChangedListener) - - if (binding.videoPlayer.isPlaying) { - binding.videoPlayer.pause() - viewModel.isVideoPlaying.value = false - } - super.onPause() } - override fun onDestroyView() { - binding.videoPlayer.stopPlayback() - - super.onDestroyView() - } - override fun onDestroy() { // Reset default navigation bar color requireActivity().window.navigationBarColor = navBarDefaultColor diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/MediaListViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt similarity index 92% rename from app/src/main/java/org/linphone/ui/main/chat/fragment/MediaListViewerFragment.kt rename to app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt index 79b9db3fa..373d995cf 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/MediaListViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.main.chat.fragment +package org.linphone.ui.main.file_media_viewer.fragment import android.net.Uri import android.os.Bundle @@ -27,7 +27,6 @@ import android.view.ViewGroup import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.viewpager2.widget.ViewPager2 import kotlinx.coroutines.Dispatchers @@ -35,21 +34,21 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.linphone.R import org.linphone.core.tools.Log -import org.linphone.databinding.ChatMediaViewerFragmentBinding +import org.linphone.databinding.FileMediaViewerFragmentBinding import org.linphone.ui.main.MainActivity -import org.linphone.ui.main.chat.adapter.MediaListAdapter import org.linphone.ui.main.chat.viewmodel.ConversationMediaListViewModel -import org.linphone.ui.main.fragment.SlidingPaneChildFragment +import org.linphone.ui.main.file_media_viewer.adapter.MediaListAdapter +import org.linphone.ui.main.fragment.GenericFragment import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.FileUtils -class MediaListViewerFragment : SlidingPaneChildFragment() { +class MediaListViewerFragment : GenericFragment() { companion object { private const val TAG = "[Media List Viewer]" } - private lateinit var binding: ChatMediaViewerFragmentBinding + private lateinit var binding: FileMediaViewerFragmentBinding private lateinit var adapter: MediaListAdapter @@ -76,14 +75,10 @@ class MediaListViewerFragment : SlidingPaneChildFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = ChatMediaViewerFragmentBinding.inflate(layoutInflater) + binding = FileMediaViewerFragmentBinding.inflate(layoutInflater) return binding.root } - override fun goBack(): Boolean { - return findNavController().popBackStack() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { postponeEnterTransition() super.onViewCreated(view, savedInstanceState) @@ -218,7 +213,9 @@ class MediaListViewerFragment : SlidingPaneChildFragment() { // Reset default navigation bar color requireActivity().window.navigationBarColor = navBarDefaultColor - viewPager.unregisterOnPageChangeCallback(pageListener) + if (::viewPager.isInitialized) { + viewPager.unregisterOnPageChangeCallback(pageListener) + } super.onDestroy() } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/MediaViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaViewerFragment.kt similarity index 88% rename from app/src/main/java/org/linphone/ui/main/chat/fragment/MediaViewerFragment.kt rename to app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaViewerFragment.kt index cb11c406a..042840cde 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/MediaViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaViewerFragment.kt @@ -1,26 +1,24 @@ -package org.linphone.ui.main.chat.fragment +package org.linphone.ui.main.file_media_viewer.fragment import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import org.linphone.core.tools.Log -import org.linphone.databinding.ChatMediaViewerChildFragmentBinding -import org.linphone.ui.main.chat.viewmodel.MediaViewModel +import org.linphone.databinding.FileMediaViewerChildFragmentBinding +import org.linphone.ui.main.file_media_viewer.viewmodel.MediaViewModel +import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.viewmodel.SharedMainViewModel @UiThread -class MediaViewerFragment : Fragment() { +class MediaViewerFragment : GenericFragment() { companion object { private const val TAG = "[Media Viewer Fragment]" } - private lateinit var binding: ChatMediaViewerChildFragmentBinding - - private lateinit var sharedViewModel: SharedMainViewModel + private lateinit var binding: FileMediaViewerChildFragmentBinding private lateinit var viewModel: MediaViewModel @@ -29,7 +27,7 @@ class MediaViewerFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = ChatMediaViewerChildFragmentBinding.inflate(layoutInflater) + binding = FileMediaViewerChildFragmentBinding.inflate(layoutInflater) return binding.root } diff --git a/app/src/main/java/org/linphone/ui/main/viewer/viewmodel/FileViewModel.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/FileViewModel.kt similarity index 89% rename from app/src/main/java/org/linphone/ui/main/viewer/viewmodel/FileViewModel.kt rename to app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/FileViewModel.kt index 55e6dd299..1cc17b7f5 100644 --- a/app/src/main/java/org/linphone/ui/main/viewer/viewmodel/FileViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/FileViewModel.kt @@ -1,4 +1,4 @@ -package org.linphone.ui.main.viewer.viewmodel +package org.linphone.ui.main.file_media_viewer.viewmodel import android.graphics.Bitmap import android.graphics.pdf.PdfRenderer @@ -28,8 +28,6 @@ class FileViewModel @UiThread constructor() : ViewModel() { private const val TAG = "[File ViewModel]" } - val path = MutableLiveData() - val fileName = MutableLiveData() val fullScreenMode = MutableLiveData() @@ -40,14 +38,8 @@ class FileViewModel @UiThread constructor() : ViewModel() { val pdfPages = MutableLiveData() - val isImage = MutableLiveData() - val isAudio = MutableLiveData() - val isVideo = MutableLiveData() - - val isVideoPlaying = MutableLiveData() - val isText = MutableLiveData() val text = MutableLiveData() @@ -62,10 +54,6 @@ class FileViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } - val toggleVideoPlayPauseEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - val showGreenToastEvent: MutableLiveData>> by lazy { MutableLiveData>>() } @@ -110,18 +98,6 @@ class FileViewModel @UiThread constructor() : ViewModel() { Log.i("$TAG File [$file] seems to be a PDF") loadPdf() } - FileUtils.MimeType.Image -> { - Log.i("$TAG File [$file] seems to be an image") - isImage.value = true - path.value = file - fileReadyEvent.value = Event(true) - } - FileUtils.MimeType.Video -> { - Log.i("$TAG File [$file] seems to be a video") - isVideo.value = true - isVideoPlaying.value = false - fileReadyEvent.value = Event(true) - } FileUtils.MimeType.Audio -> { Log.i("$TAG File [$file] seems to be an audio") // TODO: handle audio files @@ -189,13 +165,6 @@ class FileViewModel @UiThread constructor() : ViewModel() { } } - @UiThread - fun playPauseVideo() { - val playVideo = isVideoPlaying.value == false - isVideoPlaying.value = playVideo - toggleVideoPlayPauseEvent.value = Event(playVideo) - } - @UiThread fun exportToMediaStore() { if (::filePath.isInitialized) { diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/MediaViewModel.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt similarity index 97% rename from app/src/main/java/org/linphone/ui/main/chat/viewmodel/MediaViewModel.kt rename to app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt index 61e9512ee..6eeeacf41 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/MediaViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt @@ -1,4 +1,4 @@ -package org.linphone.ui.main.chat.viewmodel +package org.linphone.ui.main.file_media_viewer.viewmodel import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt index 5c4fd7138..99dd7e4c2 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt @@ -20,6 +20,7 @@ package org.linphone.ui.main.viewmodel import android.net.Uri +import android.os.Bundle import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -108,6 +109,10 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { val mediaViewerFullScreenMode = MutableLiveData() + val displayFileEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val forceRefreshConversationInfo: MutableLiveData> by lazy { MutableLiveData>() } diff --git a/app/src/main/res/layout-land/file_viewer_fragment.xml b/app/src/main/res/layout-land/file_viewer_fragment.xml deleted file mode 100644 index c526a6e22..000000000 --- a/app/src/main/res/layout-land/file_viewer_fragment.xml +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/chat_media_viewer_child_fragment.xml b/app/src/main/res/layout/file_media_viewer_child_fragment.xml similarity index 96% rename from app/src/main/res/layout/chat_media_viewer_child_fragment.xml rename to app/src/main/res/layout/file_media_viewer_child_fragment.xml index 3289c2358..199f13de2 100644 --- a/app/src/main/res/layout/chat_media_viewer_child_fragment.xml +++ b/app/src/main/res/layout/file_media_viewer_child_fragment.xml @@ -7,7 +7,7 @@ + type="org.linphone.ui.main.file_media_viewer.viewmodel.MediaViewModel" /> + type="org.linphone.ui.main.file_media_viewer.viewmodel.FileViewModel" /> - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml index 612f1d015..d0ec3516c 100644 --- a/app/src/main/res/navigation/main_nav_graph.xml +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -238,6 +238,18 @@ app:enterAnim="@anim/slide_in" app:popExitAnim="@anim/slide_out" app:launchSingleTop="true" /> + + + app:launchSingleTop="true" + app:popUpTo="@id/contactsListFragment" + app:popUpToInclusive="true"/> + + + + + + + + + + + \ No newline at end of file