diff --git a/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt index 4c42330c8..fef1e05fa 100644 --- a/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread +import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -72,5 +73,44 @@ class FileViewerFragment : GenericFragment() { binding.dotsIndicator.attachTo(binding.pdfViewPager) } } + + 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() + } + } + } + } + + override fun onPause() { + if (binding.videoPlayer.isPlaying) { + binding.videoPlayer.pause() + viewModel.isVideoPlaying.value = false + } + + super.onPause() + } + + override fun onDestroyView() { + binding.videoPlayer.stopPlayback() + + super.onDestroyView() } } diff --git a/app/src/main/java/org/linphone/ui/main/viewer/viewmodel/FileViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewer/viewmodel/FileViewModel.kt index 0520771c2..e5b12259b 100644 --- a/app/src/main/java/org/linphone/ui/main/viewer/viewmodel/FileViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewer/viewmodel/FileViewModel.kt @@ -3,6 +3,7 @@ package org.linphone.ui.main.viewer.viewmodel import android.graphics.Bitmap import android.graphics.pdf.PdfRenderer import android.os.ParcelFileDescriptor +import android.webkit.MimeTypeMap import android.widget.ImageView import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData @@ -29,10 +30,18 @@ class FileViewModel @UiThread constructor() : ViewModel() { val isPdf = MutableLiveData() + val isVideo = MutableLiveData() + + val isVideoPlaying = MutableLiveData() + val pdfRendererReadyEvent: MutableLiveData> by lazy { MutableLiveData>() } + val toggleVideoPlayPauseEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + // Below are required for PDF viewer private lateinit var pdfRenderer: PdfRenderer @@ -40,8 +49,11 @@ class FileViewModel @UiThread constructor() : ViewModel() { var screenHeight: Int = 0 // End of PDF viewer required variables - init { - fullScreenMode.value = true + override fun onCleared() { + if (::pdfRenderer.isInitialized) { + pdfRenderer.close() + } + super.onCleared() } @UiThread @@ -50,34 +62,38 @@ class FileViewModel @UiThread constructor() : ViewModel() { fileName.value = name val extension = FileUtils.getExtensionFromFileName(name) - if (extension == "pdf") { - Log.i("$TAG File [$file] seems to be a PDF") - isPdf.value = true - fullScreenMode.value = false + val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) + when (FileUtils.getMimeType(mime)) { + FileUtils.MimeType.Pdf -> { + Log.i("$TAG File [$file] seems to be a PDF") + isPdf.value = true + fullScreenMode.value = false - viewModelScope.launch { - withContext(Dispatchers.IO) { - val input = ParcelFileDescriptor.open( - File(file), - ParcelFileDescriptor.MODE_READ_ONLY - ) - pdfRenderer = PdfRenderer(input) - Log.i("$TAG ${pdfRenderer.pageCount} pages in file $file") - pdfRendererReadyEvent.postValue(Event(true)) + viewModelScope.launch { + withContext(Dispatchers.IO) { + val input = ParcelFileDescriptor.open( + File(file), + ParcelFileDescriptor.MODE_READ_ONLY + ) + pdfRenderer = PdfRenderer(input) + Log.i("$TAG ${pdfRenderer.pageCount} pages in file $file") + pdfRendererReadyEvent.postValue(Event(true)) + } } } - } else { - path.value = file + FileUtils.MimeType.Video -> { + Log.i("$TAG File [$file] seems to be a video") + isVideo.value = true + isVideoPlaying.value = false + fullScreenMode.value = true + } + else -> { + path.value = file + fullScreenMode.value = true + } } } - override fun onCleared() { - if (::pdfRenderer.isInitialized) { - pdfRenderer.close() - } - super.onCleared() - } - @UiThread fun toggleFullScreen() { fullScreenMode.value = fullScreenMode.value != true @@ -115,4 +131,11 @@ class FileViewModel @UiThread constructor() : ViewModel() { } } } + + @UiThread + fun playPauseVideo() { + val playVideo = isVideoPlaying.value == false + isVideoPlaying.value = playVideo + toggleVideoPlayPauseEvent.value = Event(playVideo) + } } diff --git a/app/src/main/res/layout/file_image_viewer_fragment.xml b/app/src/main/res/layout/file_image_viewer_fragment.xml index cdad4a11f..624796bc7 100644 --- a/app/src/main/res/layout/file_image_viewer_fragment.xml +++ b/app/src/main/res/layout/file_image_viewer_fragment.xml @@ -24,37 +24,43 @@ android:layout_height="match_parent" android:background="@color/black"> - + app:layout_constraintEnd_toEndOf="parent"/> + + + android:visibility="@{viewModel.isPdf ? View.VISIBLE : View.GONE, default=gone}" /> + +