Skip to content

Commit 7610b84

Browse files
author
Reinhard Hafenscher
authored
Merge pull request #269 from PSPDFKit/reinhard/fragment-hot-reload
Fix hot reload breaking the PdfView
2 parents 122b895 + c94f9e8 commit 7610b84

File tree

4 files changed

+24
-3
lines changed

4 files changed

+24
-3
lines changed

android/src/main/java/com/pspdfkit/views/PdfView.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ public class PdfView extends FrameLayout {
7777

7878
private static final String FILE_SCHEME = "file:///";
7979

80+
/** Key to use when setting the id argument of PdfFragments created by this PdfView. */
81+
private static final String ARG_ROOT_ID = "root_id";
82+
8083
private FragmentManager fragmentManager;
8184
private EventDispatcher eventDispatcher;
8285
private String fragmentTag;
@@ -102,6 +105,9 @@ public class PdfView extends FrameLayout {
102105
@Nullable
103106
private PdfTextSelectionPopupToolbar textSelectionPopupToolbar;
104107

108+
/** An internal id we generate so we can track if fragments found belong to this specific PdfView instance. */
109+
private int internalId;
110+
105111
public PdfView(@NonNull Context context) {
106112
super(context);
107113
init();
@@ -158,6 +164,9 @@ public void doFrame(long frameTimeNanos) {
158164

159165
// Set a default configuration.
160166
configuration = new PdfActivityConfiguration.Builder(getContext()).build();
167+
168+
// Generate an id to set on all fragments created by the PdfView.
169+
internalId = View.generateViewId();
161170
}
162171

163172
public void inject(FragmentManager fragmentManager, EventDispatcher eventDispatcher) {
@@ -239,8 +248,20 @@ public void setMenuItemGroupingRule(@NonNull MenuItemGroupingRule groupingRule)
239248
private void setupFragment() {
240249
if (fragmentTag != null && configuration != null && document != null) {
241250
PdfFragment pdfFragment = (PdfFragment) fragmentManager.findFragmentByTag(fragmentTag);
251+
if (pdfFragment != null &&
252+
(pdfFragment.getArguments() == null ||
253+
pdfFragment.getArguments().getInt(ARG_ROOT_ID) != internalId)) {
254+
// This is an orphaned fragment probably from a reload, get rid of it.
255+
fragmentManager.beginTransaction()
256+
.remove(pdfFragment)
257+
.commitNow();
258+
pdfFragment = null;
259+
}
260+
242261
if (pdfFragment == null) {
243262
pdfFragment = PdfFragment.newInstance(document, this.configuration.getConfiguration());
263+
// We put our internal id so we can track if this fragment belongs to us, used to handle orphaned fragments after hot reloads.
264+
pdfFragment.getArguments().putInt(ARG_ROOT_ID, internalId);
244265
prepareFragment(pdfFragment);
245266
} else {
246267
View fragmentView = pdfFragment.getView();

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-native-pspdfkit",
3-
"version": "1.25.3",
3+
"version": "1.25.4",
44
"description": "A React Native module for the PSPDFKit library.",
55
"keywords": [
66
"react native",

samples/Catalog/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "Catalog",
3-
"version": "1.25.3",
3+
"version": "1.25.4",
44
"private": true,
55
"scripts": {
66
"start": "react-native start",

0 commit comments

Comments
 (0)