From 80b887c874415b03b878c087b1917663640afe66 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 6 Dec 2023 14:10:23 +0100 Subject: [PATCH] Improved PDF viewer --- .../viewer/adapter/PdfPagesListAdapter.kt | 7 +++- .../viewer/fragment/FileViewerFragment.kt | 22 ++++++++++--- .../ui/main/viewer/viewmodel/FileViewModel.kt | 32 +++++++++++++++---- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/viewer/adapter/PdfPagesListAdapter.kt b/app/src/main/java/org/linphone/ui/main/viewer/adapter/PdfPagesListAdapter.kt index ee4d9dd71..6d15676c9 100644 --- a/app/src/main/java/org/linphone/ui/main/viewer/adapter/PdfPagesListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/viewer/adapter/PdfPagesListAdapter.kt @@ -22,6 +22,7 @@ package org.linphone.ui.main.viewer.adapter import android.view.LayoutInflater import android.view.View 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 @@ -46,7 +47,11 @@ class PdfPagesListAdapter(private val viewModel: FileViewModel) : RecyclerView.A inner class PdfPageViewHolder(private val view: View) : RecyclerView.ViewHolder(view) { fun bind(index: Int) { - viewModel.loadPdfPageInto(index, view.findViewById(R.id.pdf_image)) + val pdfImage: ImageView = view.findViewById(R.id.pdf_image) + pdfImage.setOnClickListener { + viewModel.toggleFullScreen() + } + viewModel.loadPdfPageInto(index, pdfImage) } } } 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 243fd6a6c..305803c0a 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 @@ -63,10 +63,9 @@ class FileViewerFragment : GenericFragment() { viewModel.pdfRendererReadyEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG PDF renderer is ready, attaching adapter to ViewPager") - val displayMetrics = DisplayMetrics() - requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics) - viewModel.screenHeight = displayMetrics.heightPixels - viewModel.screenWidth = displayMetrics.widthPixels + if (viewModel.screenWidth == 0 || viewModel.screenHeight == 0) { + updateScreenSize() + } adapter = PdfPagesListAdapter(viewModel) binding.pdfViewPager.adapter = adapter @@ -115,6 +114,11 @@ class FileViewerFragment : GenericFragment() { } } + override fun onResume() { + super.onResume() + updateScreenSize() + } + override fun onPause() { if (binding.videoPlayer.isPlaying) { binding.videoPlayer.pause() @@ -129,4 +133,14 @@ class FileViewerFragment : GenericFragment() { super.onDestroyView() } + + private fun updateScreenSize() { + val displayMetrics = DisplayMetrics() + requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics) + viewModel.screenHeight = displayMetrics.heightPixels + viewModel.screenWidth = displayMetrics.widthPixels + Log.i( + "$TAG Setting screen size ${viewModel.screenWidth}/${viewModel.screenHeight} for PDF renderer" + ) + } } 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 28822ad67..74e51b898 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 @@ -15,6 +15,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import java.io.File +import java.lang.IllegalStateException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -66,17 +67,24 @@ class FileViewModel @UiThread constructor() : ViewModel() { var screenWidth: Int = 0 var screenHeight: Int = 0 + var currentPdfPage: PdfRenderer.Page? = null // End of PDF viewer required variables override fun onCleared() { if (::pdfRenderer.isInitialized) { - pdfRenderer.close() + try { + pdfRenderer.close() + } catch (ise: IllegalStateException) { + Log.e("$TAG Failed to close PDF renderer: $ise") + } } super.onCleared() } @UiThread fun loadFile(file: String) { + fullScreenMode.value = true + filePath = file val name = FileUtils.getNameFromFilePath(file) fileName.value = name @@ -87,7 +95,6 @@ class FileViewModel @UiThread constructor() : ViewModel() { FileUtils.MimeType.Pdf -> { Log.i("$TAG File [$file] seems to be a PDF") isPdf.value = true - fullScreenMode.value = false viewModelScope.launch { withContext(Dispatchers.IO) { @@ -105,11 +112,9 @@ class FileViewModel @UiThread constructor() : ViewModel() { 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 } } } @@ -132,11 +137,20 @@ class FileViewModel @UiThread constructor() : ViewModel() { viewModelScope.launch { withContext(Dispatchers.IO) { try { + try { + currentPdfPage?.close() + currentPdfPage = null + } catch (_: IllegalStateException) {} + val page: PdfRenderer.Page = pdfRenderer.openPage(index) - val width = if (screenWidth <= screenHeight) screenWidth else screenHeight + currentPdfPage = page + + Log.i( + "$TAG Page size is ${page.width}/${page.height}, screen size is $screenWidth/$screenHeight" + ) val bm = Bitmap.createBitmap( - width, - (width / page.width * page.height), + page.width, + page.height, Bitmap.Config.ARGB_8888 ) page.render(bm, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY) @@ -147,6 +161,10 @@ class FileViewModel @UiThread constructor() : ViewModel() { } } catch (e: Exception) { Log.e("$TAG Exception: $e") + try { + currentPdfPage?.close() + currentPdfPage = null + } catch (_: IllegalStateException) {} } } }