Skip to content

Commit eca12a9

Browse files
committed
Keep ParcelFileDescriptor open to work with old Android versions
1 parent a07640a commit eca12a9

3 files changed

Lines changed: 55 additions & 46 deletions

File tree

android/src/main/java/com/github/douglasjunior/reactNativePdfRenderer/PdfRendererViewManagerImpl.java

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222

2323
package com.github.douglasjunior.reactNativePdfRenderer;
2424

25-
import android.graphics.pdf.PdfRenderer;
26-
import android.os.ParcelFileDescriptor;
2725
import android.text.TextUtils;
2826
import android.view.View;
2927

@@ -70,25 +68,23 @@ public static void setParams(PdfRendererRecyclerView view, ReadableMap params, R
7068
if (TextUtils.isEmpty(source)) return;
7169
var file = new File(source.replace("file://", ""));
7270

73-
try (var fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)) {
74-
final PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor);
75-
76-
view.post(() -> {
77-
view.updateSource(pdfRenderer);
78-
71+
view.post(() -> {
72+
try {
7973
view.setSinglePage(singlePage);
8074
view.setMaxZoom(maxZoom);
8175
view.setOverScrollMode(singlePage ? View.OVER_SCROLL_NEVER : View.OVER_SCROLL_IF_CONTENT_SCROLLS);
8276

77+
view.updateSource(file);
78+
8379
view.forceRequestLayout();
84-
});
85-
} catch (IOException e) {
86-
if (BuildConfig.DEBUG) {
87-
// noinspection CallToPrintStackTrace
88-
e.printStackTrace();
80+
} catch (IOException e) {
81+
if (BuildConfig.DEBUG) {
82+
// noinspection CallToPrintStackTrace
83+
e.printStackTrace();
84+
}
85+
errorCallback.run();
8986
}
90-
errorCallback.run();
91-
}
87+
});
9288
}
9389

9490
public static Event<?> createOnPageChangeEvent(int surfaceId, int targetId, int position, int total) {

android/src/main/java/com/github/douglasjunior/reactNativePdfRenderer/modules/PdfRendererRecyclerView.java

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import android.graphics.Color;
3131
import android.graphics.Matrix;
3232
import android.graphics.pdf.PdfRenderer;
33+
import android.os.ParcelFileDescriptor;
3334
import android.util.Log;
3435
import android.util.TypedValue;
3536
import android.view.GestureDetector;
@@ -44,6 +45,9 @@
4445

4546
import com.github.douglasjunior.reactNativePdfRenderer.BuildConfig;
4647

48+
import java.io.File;
49+
import java.io.IOException;
50+
4751
@SuppressLint({"ViewConstructor", "NotifyDataSetChanged"})
4852
public class PdfRendererRecyclerView extends RecyclerView {
4953
private final GestureDetector mGestureDetector;
@@ -120,12 +124,12 @@ private void dispatchPageChangeEvent() {
120124
}
121125
}
122126

123-
public void updateSource(PdfRenderer pdfRenderer) {
127+
public void updateSource(File file) throws IOException {
124128
mCurrentItemPosition = -1;
125129
var adapter = (PdfRendererAdapter) getAdapter();
126130
if (adapter == null) return;
127131
adapter.close();
128-
adapter.updateSource(pdfRenderer);
132+
adapter.updateSource(file);
129133
adapter.notifyDataSetChanged();
130134
post(this::dispatchPageChangeEvent);
131135
}
@@ -252,6 +256,16 @@ public void requestLayout() {
252256

253257
public void setSinglePage(boolean singlePage) {
254258
this.mSinglePage = singlePage;
259+
if (mSinglePage) {
260+
resetZoom();
261+
}
262+
}
263+
264+
private void resetZoom() {
265+
mMatrix.setScale(1, 1, 0, 0);
266+
validateMatrixLimits();
267+
postInvalidateOnAnimation();
268+
mZoomObserver.setZoom(1);
255269
}
256270

257271
public interface PdfRendererRecyclerViewListener {
@@ -327,14 +341,30 @@ public boolean onDoubleTap(@NonNull MotionEvent e) {
327341

328342
class PdfRendererAdapter extends Adapter<PdfRendererAdapter.ViewHolder> {
329343
private PdfRenderer mPdfRenderer;
344+
private ParcelFileDescriptor mFileDescriptor;
330345

331-
public void updateSource(PdfRenderer pdfRenderer) {
332-
mPdfRenderer = pdfRenderer;
346+
public void updateSource(File file) throws IOException {
347+
mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
348+
mPdfRenderer = new PdfRenderer(mFileDescriptor);
333349
}
334350

335351
public void close() {
336-
if (mPdfRenderer != null) mPdfRenderer.close();
337-
mPdfRenderer = null;
352+
if (mPdfRenderer != null) {
353+
mPdfRenderer.close();
354+
mPdfRenderer = null;
355+
}
356+
if (mFileDescriptor != null) {
357+
try {
358+
mFileDescriptor.close();
359+
} catch (IOException e) {
360+
if (BuildConfig.DEBUG) {
361+
// noinspection CallToPrintStackTrace
362+
e.printStackTrace();
363+
}
364+
}
365+
mFileDescriptor = null;
366+
}
367+
338368
}
339369

340370
@NonNull
@@ -375,11 +405,6 @@ public int getItemCount() {
375405
return mPdfRenderer.getPageCount();
376406
}
377407

378-
public int getPageCount() {
379-
if (mPdfRenderer == null) return 0;
380-
return mPdfRenderer.getPageCount();
381-
}
382-
383408
public class ViewHolder extends RecyclerView.ViewHolder {
384409
private ObservableZoom.ZoomChangeListener zoomListener;
385410

android/src/newarch/com/github/douglasjunior/reactNativePdfRenderer/modules/PdfRendererViewManager.java

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -83,31 +83,19 @@ private void sendEvent(PdfRendererRecyclerView target, Event<?> event) {
8383

8484
@Override
8585
public void onPageChange(PdfRendererRecyclerView target, int position, int total) {
86-
EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(
87-
mReactApplicationContext,
88-
target.getId()
86+
int surfaceId = UIManagerHelper.getSurfaceId(mReactApplicationContext);
87+
sendEvent(
88+
target,
89+
PdfRendererViewManagerImpl.createOnPageChangeEvent(surfaceId, target.getId(), position, total)
8990
);
90-
91-
if (eventDispatcher != null) {
92-
int surfaceId = UIManagerHelper.getSurfaceId(mReactApplicationContext);
93-
eventDispatcher.dispatchEvent(
94-
PdfRendererViewManagerImpl.createOnPageChangeEvent(surfaceId, target.getId(), position, total)
95-
);
96-
}
9791
}
9892

9993
private void onError(PdfRendererRecyclerView target) {
100-
EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(
101-
mReactApplicationContext,
102-
target.getId()
94+
int surfaceId = UIManagerHelper.getSurfaceId(mReactApplicationContext);
95+
sendEvent(
96+
target,
97+
PdfRendererViewManagerImpl.createOnErrorEvent(surfaceId, target.getId())
10398
);
104-
105-
if (eventDispatcher != null) {
106-
int surfaceId = UIManagerHelper.getSurfaceId(mReactApplicationContext);
107-
eventDispatcher.dispatchEvent(
108-
PdfRendererViewManagerImpl.createOnErrorEvent(surfaceId, target.getId())
109-
);
110-
}
11199
}
112100

113101
@ReactProp(name = "maxPageResolution")

0 commit comments

Comments
 (0)