Skip to content

Commit

Permalink
fix(android): reduce unnecessary rerenders
Browse files Browse the repository at this point in the history
  • Loading branch information
alpha0010 committed Feb 24, 2021
1 parent ed9803c commit d960f5d
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 22 deletions.
1 change: 0 additions & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ buildscript {

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

def getExtOrDefault(name) {
return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['PdfViewer_' + name]
Expand Down
2 changes: 1 addition & 1 deletion android/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PdfViewer_kotlinVersion=1.3.50
PdfViewer_kotlinVersion=1.4.30
PdfViewer_compileSdkVersion=28
PdfViewer_buildToolsVersion=28.0.3
PdfViewer_targetSdkVersion=28
13 changes: 8 additions & 5 deletions android/src/main/java/com/alpha0010/pdf/PdfView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ enum class ResizeMode(val jsName: String) {
@SuppressLint("ViewConstructor")
class PdfView(context: Context, private val pdfMutex: Lock) : View(context) {
private var mBitmap: Bitmap
private var mDirty = false
private var mPage = 0
private var mResizeMode = ResizeMode.CONTAIN
private var mSource = ""
Expand All @@ -38,7 +39,7 @@ class PdfView(context: Context, private val pdfMutex: Lock) : View(context) {

fun setPage(page: Int) {
mPage = page
renderPdf()
mDirty = true
}

fun setResizeMode(mode: String) {
Expand All @@ -52,12 +53,12 @@ class PdfView(context: Context, private val pdfMutex: Lock) : View(context) {
}

mResizeMode = resizeMode
renderPdf()
mDirty = true
}

fun setSource(source: String) {
mSource = source
renderPdf()
mDirty = true
}

private fun computeDestRect(srcWidth: Int, srcHeight: Int): RectF {
Expand All @@ -70,11 +71,12 @@ class PdfView(context: Context, private val pdfMutex: Lock) : View(context) {
}
}

private fun renderPdf() {
if (height < 1 || width < 1 || mSource.isEmpty()) {
fun renderPdf() {
if (height < 1 || width < 1 || mSource.isEmpty() || !mDirty) {
// View layout not yet complete, or nothing to render.
return
}
mDirty = false

CoroutineScope(Dispatchers.Main).launch(Dispatchers.IO) {
val file = File(mSource)
Expand Down Expand Up @@ -187,6 +189,7 @@ class PdfView(context: Context, private val pdfMutex: Lock) : View(context) {

override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
mViewRect.set(0, 0, w, h)
mDirty = true
renderPdf()
}
}
25 changes: 10 additions & 15 deletions android/src/main/java/com/alpha0010/pdf/PdfViewManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,15 @@ import java.util.concurrent.locks.Lock
class PdfViewManager(private val pdfMutex: Lock) : BaseViewManager<PdfView, PdfViewShadowNode>() {
private val mMeasureCache = LruCache<String, Size>(128)

override fun getName(): String {
return "RNPdfView"
}
override fun getName() = "RNPdfView"

override fun createViewInstance(reactContext: ThemedReactContext): PdfView {
return PdfView(reactContext, pdfMutex)
}

override fun createShadowNodeInstance(): PdfViewShadowNode {
return PdfViewShadowNode(mMeasureCache, pdfMutex)
}
override fun createShadowNodeInstance() = PdfViewShadowNode(mMeasureCache, pdfMutex)

override fun getShadowNodeClass(): Class<out PdfViewShadowNode> {
return PdfViewShadowNode::class.java
}
override fun getShadowNodeClass() = PdfViewShadowNode::class.java

override fun getExportedCustomBubblingEventTypeConstants(): MutableMap<String, Any> {
return mutableMapOf(
Expand All @@ -39,13 +33,16 @@ class PdfViewManager(private val pdfMutex: Lock) : BaseViewManager<PdfView, PdfV

override fun updateExtraData(root: PdfView, extraData: Any?) {}

override fun onAfterUpdateTransaction(view: PdfView) {
super.onAfterUpdateTransaction(view)
view.renderPdf()
}

/**
* Page (0-indexed) of document to display.
*/
@ReactProp(name = "page", defaultInt = 0)
fun setPage(view: PdfView, page: Int) {
view.setPage(page)
}
fun setPage(view: PdfView, page: Int) = view.setPage(page)

/**
* How pdf page should be scaled to fit in view dimensions.
Expand All @@ -66,7 +63,5 @@ class PdfViewManager(private val pdfMutex: Lock) : BaseViewManager<PdfView, PdfV
* Document to display.
*/
@ReactProp(name = "source")
fun setSource(view: PdfView, source: String?) {
view.setSource(source ?: "")
}
fun setSource(view: PdfView, source: String?) = view.setSource(source ?: "")
}

0 comments on commit d960f5d

Please sign in to comment.