Improved PDF viewer

This commit is contained in:
Sylvain Berfini 2023-12-06 14:10:23 +01:00
parent ff521eb559
commit 80b887c874
3 changed files with 49 additions and 12 deletions

View file

@ -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)
}
}
}

View file

@ -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"
)
}
}

View file

@ -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) {}
}
}
}