mirror of
https://gitlab.linphone.org/BC/public/linphone-android.git
synced 2026-05-06 21:33:09 +00:00
Improved PDF viewer
This commit is contained in:
parent
ff521eb559
commit
80b887c874
3 changed files with 49 additions and 12 deletions
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue