Skip to content

Commit f4e48ca

Browse files
committed
Add onError prop and implement on Android
1 parent 40f00f2 commit f4e48ca

8 files changed

Lines changed: 133 additions & 66 deletions

File tree

Sample/App.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, {useCallback, useEffect, useState} from 'react';
2-
import {Button, SafeAreaView, StatusBar, Text, View} from 'react-native';
2+
import {Alert, Button, SafeAreaView, StatusBar, Text, View} from 'react-native';
33
import PdfRendererView from 'react-native-pdf-renderer';
44
import * as FileSystem from 'expo-file-system';
55
// import ReactNativeBlobUtil from 'react-native-blob-util';
@@ -90,6 +90,10 @@ function App() {
9090
setCurrentPage(current);
9191
setTotalPages(total);
9292
}}
93+
onError={() => {
94+
console.warn('Error loading PDF');
95+
Alert.alert('Error', 'Error loading PDF');
96+
}}
9397
/>
9498
<View
9599
style={{
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
4+
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
5+
<!-- Customize your theme here. -->
6+
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
7+
8+
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
9+
</style>
10+
</resources>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class PdfRendererPackage extends BaseReactPackage {
4343
@Nullable
4444
@Override
4545
public NativeModule getModule(@NonNull String s, @NonNull ReactApplicationContext reactApplicationContext) {
46-
if (PdfRendererViewManagerImpl.REACT_CLASS.equals(s)) {
46+
if (PdfRendererViewManagerImpl.REACT_MODULE_NAME.equals(s)) {
4747
return new PdfRendererViewManager(reactApplicationContext);
4848
}
4949
return null;
@@ -59,9 +59,9 @@ public List<ViewManager> createViewManagers(ReactApplicationContext reactContext
5959
public ReactModuleInfoProvider getReactModuleInfoProvider() {
6060
return () -> {
6161
Map<String, ReactModuleInfo> map = new HashMap<>();
62-
map.put(PdfRendererViewManagerImpl.REACT_CLASS, new ReactModuleInfo(
63-
PdfRendererViewManagerImpl.REACT_CLASS, // name
64-
PdfRendererViewManagerImpl.REACT_CLASS, // className
62+
map.put(PdfRendererViewManagerImpl.REACT_MODULE_NAME, new ReactModuleInfo(
63+
PdfRendererViewManagerImpl.REACT_MODULE_NAME, // name
64+
PdfRendererViewManagerImpl.REACT_MODULE_NAME, // className
6565
false, // canOverrideExistingModule
6666
false, // needsEagerInit
6767
false, // isCxxModule

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

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222

2323
package com.github.douglasjunior.reactNativePdfRenderer;
2424

25+
import android.graphics.pdf.PdfRenderer;
26+
import android.os.ParcelFileDescriptor;
27+
import android.text.TextUtils;
2528
import android.view.View;
2629

2730
import androidx.annotation.NonNull;
@@ -32,54 +35,68 @@
3235
import com.facebook.react.uimanager.events.Event;
3336
import com.github.douglasjunior.reactNativePdfRenderer.modules.PdfRendererRecyclerView;
3437

38+
import java.io.File;
3539
import java.io.IOException;
3640
import java.util.HashMap;
3741
import java.util.Map;
3842

3943
public class PdfRendererViewManagerImpl {
40-
public static final String REACT_CLASS = "RNPdfRendererView";
41-
public static final String ON_PAGE_CHANGE_EVENT = "onPageChange";
44+
public static final String REACT_MODULE_NAME = "RNPdfRendererView";
45+
private static final String ON_PAGE_CHANGE_EVENT = "onPageChange";
46+
private static final String ON_ERROR_EVENT = "onError";
4247

4348
public static Map<String, Object> getExportedCustomBubblingEventTypeConstants() {
44-
Map<String, Object> map = new HashMap<>();
45-
Map<String, Object> bubblingMap = new HashMap<>();
46-
bubblingMap.put("phasedRegistrationNames", new HashMap<String, String>() {{
47-
put("bubbled", ON_PAGE_CHANGE_EVENT);
48-
}});
49-
map.put("pageChange", bubblingMap);
50-
return map;
49+
return new HashMap<>() {{
50+
put(ON_PAGE_CHANGE_EVENT, new HashMap<>() {{
51+
put("phasedRegistrationNames", new HashMap<String, String>() {{
52+
put("bubbled", ON_PAGE_CHANGE_EVENT);
53+
}});
54+
}});
55+
put(ON_ERROR_EVENT, new HashMap<>() {{
56+
put("phasedRegistrationNames", new HashMap<String, String>() {{
57+
put("bubbled", ON_ERROR_EVENT);
58+
}});
59+
}});
60+
}};
5161
}
5262

53-
public static void setParams(PdfRendererRecyclerView view, ReadableMap params) {
63+
public static void setParams(PdfRendererRecyclerView view, ReadableMap params, Runnable errorCallback) {
5464
if (params == null) return;
5565

5666
var source = params.getString("source");
5767
var singlePage = params.hasKey("singlePage") && params.getBoolean("singlePage");
5868
var maxZoom = params.hasKey("maxZoom") ? Double.valueOf(params.getDouble("maxZoom")).floatValue() : 5;
5969

60-
try {
61-
if (source != null) {
62-
view.updateSource(source);
63-
} else {
64-
view.closeAdapter();
65-
}
66-
} catch (IOException e) {
67-
throw new RuntimeException("Error setting PDF source: " + e.getMessage(), e);
68-
}
70+
if (TextUtils.isEmpty(source)) return;
71+
var file = new File(source.replace("file://", ""));
72+
73+
try (var fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)) {
74+
final PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor);
6975

70-
view.setSinglePage(singlePage);
71-
view.setMaxZoom(maxZoom);
72-
view.setOverScrollMode(singlePage ? View.OVER_SCROLL_NEVER : View.OVER_SCROLL_IF_CONTENT_SCROLLS);
76+
view.post(() -> {
77+
view.updateSource(pdfRenderer);
7378

74-
view.forceRequestLayout();
79+
view.setSinglePage(singlePage);
80+
view.setMaxZoom(maxZoom);
81+
view.setOverScrollMode(singlePage ? View.OVER_SCROLL_NEVER : View.OVER_SCROLL_IF_CONTENT_SCROLLS);
82+
83+
view.forceRequestLayout();
84+
});
85+
} catch (IOException e) {
86+
if (BuildConfig.DEBUG) {
87+
// noinspection CallToPrintStackTrace
88+
e.printStackTrace();
89+
}
90+
errorCallback.run();
91+
}
7592
}
7693

7794
public static Event<?> createOnPageChangeEvent(int surfaceId, int targetId, int position, int total) {
7895
return new Event<>(surfaceId, targetId) {
7996
@NonNull
8097
@Override
8198
public String getEventName() {
82-
return "pageChange";
99+
return ON_PAGE_CHANGE_EVENT;
83100
}
84101

85102
@Override
@@ -91,4 +108,14 @@ protected WritableMap getEventData() {
91108
}
92109
};
93110
}
111+
112+
public static Event<?> createOnErrorEvent(int surfaceId, int targetId) {
113+
return new Event<>(surfaceId, targetId) {
114+
@NonNull
115+
@Override
116+
public String getEventName() {
117+
return ON_ERROR_EVENT;
118+
}
119+
};
120+
}
94121
}

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

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
import android.graphics.Color;
3131
import android.graphics.Matrix;
3232
import android.graphics.pdf.PdfRenderer;
33-
import android.os.ParcelFileDescriptor;
34-
import android.text.TextUtils;
3533
import android.util.Log;
3634
import android.util.TypedValue;
3735
import android.view.GestureDetector;
@@ -44,9 +42,6 @@
4442
import androidx.recyclerview.widget.LinearLayoutManager;
4543
import androidx.recyclerview.widget.RecyclerView;
4644

47-
import java.io.File;
48-
import java.io.IOException;
49-
5045
@SuppressLint({"ViewConstructor", "NotifyDataSetChanged"})
5146
public class PdfRendererRecyclerView extends RecyclerView {
5247
private final GestureDetector mGestureDetector;
@@ -110,14 +105,10 @@ public void setMaxZoom(float maxZoom) {
110105
}
111106

112107
public void closeAdapter() {
113-
try {
114-
var adapter = (PdfRendererAdapter) getAdapter();
115-
assert adapter != null;
116-
adapter.close();
117-
adapter.notifyDataSetChanged();
118-
} catch (Exception ex) {
119-
Log.e("PdfRendererRecyclerView", "Error closing adapter", ex);
120-
}
108+
var adapter = (PdfRendererAdapter) getAdapter();
109+
assert adapter != null;
110+
adapter.close();
111+
adapter.notifyDataSetChanged();
121112
}
122113

123114
private void dispatchPageChangeEvent() {
@@ -134,12 +125,12 @@ private void dispatchPageChangeEvent() {
134125
}
135126
}
136127

137-
public void updateSource(String source) throws IOException {
128+
public void updateSource(PdfRenderer pdfRenderer) {
138129
mCurrentItemPosition = -1;
139130
var adapter = (PdfRendererAdapter) getAdapter();
140131
if (adapter == null) return;
141132
adapter.close();
142-
adapter.updateSource(source);
133+
adapter.updateSource(pdfRenderer);
143134
adapter.notifyDataSetChanged();
144135
post(this::dispatchPageChangeEvent);
145136
}
@@ -340,22 +331,15 @@ public boolean onDoubleTap(@NonNull MotionEvent e) {
340331
}
341332

342333
class PdfRendererAdapter extends Adapter<PdfRendererAdapter.ViewHolder> {
343-
344-
private ParcelFileDescriptor mFileDescriptor;
345334
private PdfRenderer mPdfRenderer;
346335

347-
public void updateSource(String source) throws IOException {
348-
if (TextUtils.isEmpty(source)) return;
349-
var file = new File(source.replace("file://", ""));
350-
mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
351-
mPdfRenderer = new PdfRenderer(mFileDescriptor);
336+
public void updateSource(PdfRenderer pdfRenderer) {
337+
mPdfRenderer = pdfRenderer;
352338
}
353339

354-
public void close() throws IOException {
340+
public void close() {
355341
if (mPdfRenderer != null) mPdfRenderer.close();
356-
if (mFileDescriptor != null) mFileDescriptor.close();
357342
mPdfRenderer = null;
358-
mFileDescriptor = null;
359343
}
360344

361345
@NonNull

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

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
package com.github.douglasjunior.reactNativePdfRenderer.modules;
2424

25-
import static com.github.douglasjunior.reactNativePdfRenderer.PdfRendererViewManagerImpl.REACT_CLASS;
25+
import static com.github.douglasjunior.reactNativePdfRenderer.PdfRendererViewManagerImpl.REACT_MODULE_NAME;
2626

2727
import androidx.annotation.NonNull;
2828
import androidx.annotation.Nullable;
@@ -34,13 +34,14 @@
3434
import com.facebook.react.uimanager.ThemedReactContext;
3535
import com.facebook.react.uimanager.UIManagerHelper;
3636
import com.facebook.react.uimanager.annotations.ReactProp;
37+
import com.facebook.react.uimanager.events.Event;
3738
import com.facebook.react.uimanager.events.EventDispatcher;
3839
import com.facebook.react.viewmanagers.RNPdfRendererViewManagerInterface;
3940
import com.github.douglasjunior.reactNativePdfRenderer.PdfRendererViewManagerImpl;
4041

4142
import java.util.Map;
4243

43-
@ReactModule(name = REACT_CLASS)
44+
@ReactModule(name = REACT_MODULE_NAME)
4445
public class PdfRendererViewManager extends SimpleViewManager<PdfRendererRecyclerView> implements RNPdfRendererViewManagerInterface<PdfRendererRecyclerView>, PdfRendererRecyclerView.PdfRendererRecyclerViewListener {
4546

4647
private final ReactApplicationContext mReactApplicationContext;
@@ -52,7 +53,7 @@ public PdfRendererViewManager(ReactApplicationContext reactApplicationContext) {
5253
@NonNull
5354
@Override
5455
public String getName() {
55-
return REACT_CLASS;
56+
return REACT_MODULE_NAME;
5657
}
5758

5859
@NonNull
@@ -67,6 +68,19 @@ public Map<String, Object> getExportedCustomBubblingEventTypeConstants() {
6768
return PdfRendererViewManagerImpl.getExportedCustomBubblingEventTypeConstants();
6869
}
6970

71+
private void sendEvent(PdfRendererRecyclerView target, Event<?> event) {
72+
EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(
73+
mReactApplicationContext,
74+
target.getId()
75+
);
76+
77+
if (eventDispatcher != null) {
78+
eventDispatcher.dispatchEvent(
79+
event
80+
);
81+
}
82+
}
83+
7084
@Override
7185
public void onPageChange(PdfRendererRecyclerView target, int position, int total) {
7286
EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(
@@ -82,6 +96,20 @@ public void onPageChange(PdfRendererRecyclerView target, int position, int total
8296
}
8397
}
8498

99+
private void onError(PdfRendererRecyclerView target) {
100+
EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(
101+
mReactApplicationContext,
102+
target.getId()
103+
);
104+
105+
if (eventDispatcher != null) {
106+
int surfaceId = UIManagerHelper.getSurfaceId(mReactApplicationContext);
107+
eventDispatcher.dispatchEvent(
108+
PdfRendererViewManagerImpl.createOnErrorEvent(surfaceId, target.getId())
109+
);
110+
}
111+
}
112+
85113
@ReactProp(name = "maxPageResolution")
86114
@Override
87115
public void setMaxPageResolution(PdfRendererRecyclerView view, float value) {
@@ -97,6 +125,6 @@ public void setDistanceBetweenPages(PdfRendererRecyclerView view, float value) {
97125
@ReactProp(name = "params")
98126
@Override
99127
public void setParams(PdfRendererRecyclerView view, @Nullable ReadableMap params) {
100-
PdfRendererViewManagerImpl.setParams(view, params);
128+
PdfRendererViewManagerImpl.setParams(view, params, () -> onError(view));
101129
}
102130
}

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
package com.github.douglasjunior.reactNativePdfRenderer.modules;
2424

25-
import static com.github.douglasjunior.reactNativePdfRenderer.PdfRendererViewManagerImpl.REACT_CLASS;
25+
import static com.github.douglasjunior.reactNativePdfRenderer.PdfRendererViewManagerImpl.REACT_MODULE_NAME;
2626

2727
import androidx.annotation.NonNull;
2828
import androidx.annotation.Nullable;
@@ -34,6 +34,7 @@
3434
import com.facebook.react.uimanager.UIManagerHelper;
3535
import com.facebook.react.uimanager.UIManagerModule;
3636
import com.facebook.react.uimanager.annotations.ReactProp;
37+
import com.facebook.react.uimanager.events.Event;
3738
import com.github.douglasjunior.reactNativePdfRenderer.PdfRendererViewManagerImpl;
3839

3940
import java.io.IOException;
@@ -49,7 +50,7 @@ public PdfRendererViewManager(ReactApplicationContext reactApplicationContext) {
4950
@NonNull
5051
@Override
5152
public String getName() {
52-
return REACT_CLASS;
53+
return REACT_MODULE_NAME;
5354
}
5455

5556
@NonNull
@@ -66,7 +67,7 @@ public Map<String, Object> getExportedCustomBubblingEventTypeConstants() {
6667

6768
@ReactProp(name = "params")
6869
public void setParams(PdfRendererRecyclerView view, @Nullable ReadableMap params) throws IOException {
69-
PdfRendererViewManagerImpl.setParams(view, params);
70+
PdfRendererViewManagerImpl.setParams(view, params, () -> onError(view));
7071
}
7172

7273
@ReactProp(name = "distanceBetweenPages")
@@ -79,14 +80,27 @@ public void setMaxPageResolution(PdfRendererRecyclerView view, float maxPageReso
7980
view.setMaxPageResolution(maxPageResolution);
8081
}
8182

82-
@Override
83-
public void onPageChange(PdfRendererRecyclerView target, int position, int total) {
83+
private void sendEvent(Event<?> event) {
8484
UIManagerModule uiManager = mReactApplicationContext.getNativeModule(UIManagerModule.class);
8585
if (uiManager != null) {
86-
int surfaceId = UIManagerHelper.getSurfaceId(mReactApplicationContext);
8786
uiManager.getEventDispatcher().dispatchEvent(
88-
PdfRendererViewManagerImpl.createOnPageChangeEvent(surfaceId, target.getId(), position, total)
87+
event
8988
);
9089
}
9190
}
91+
92+
private void onError(PdfRendererRecyclerView target) {
93+
int surfaceId = UIManagerHelper.getSurfaceId(target);
94+
sendEvent(
95+
PdfRendererViewManagerImpl.createOnErrorEvent(surfaceId, target.getId())
96+
);
97+
}
98+
99+
@Override
100+
public void onPageChange(PdfRendererRecyclerView target, int position, int total) {
101+
int surfaceId = UIManagerHelper.getSurfaceId(target);
102+
sendEvent(
103+
PdfRendererViewManagerImpl.createOnPageChangeEvent(surfaceId, target.getId(), position, total)
104+
);
105+
}
92106
}

0 commit comments

Comments
 (0)