34
34
import com .pspdfkit .react .events .PdfViewDocumentLoadFailedEvent ;
35
35
import com .pspdfkit .react .events .PdfViewDocumentSaveFailedEvent ;
36
36
import com .pspdfkit .react .events .PdfViewDocumentSavedEvent ;
37
+ import com .pspdfkit .react .events .PdfViewNavigationButtonClickedEvent ;
37
38
import com .pspdfkit .react .events .PdfViewStateChangedEvent ;
38
39
import com .pspdfkit .react .helper .DocumentJsonDataProvider ;
39
40
import com .pspdfkit .ui .DocumentDescriptor ;
40
41
import com .pspdfkit .ui .PdfFragment ;
41
- import com .pspdfkit .ui .PdfUi ;
42
42
import com .pspdfkit .ui .PdfUiFragment ;
43
43
import com .pspdfkit .ui .PdfUiFragmentBuilder ;
44
44
import com .pspdfkit .ui .toolbar .grouping .MenuItemGroupingRule ;
50
50
import java .io .ByteArrayOutputStream ;
51
51
import java .io .File ;
52
52
import java .util .ArrayList ;
53
+ import java .util .Collections ;
53
54
import java .util .EnumSet ;
54
55
import java .util .List ;
55
56
import java .util .Map ;
@@ -97,7 +98,10 @@ public class PdfView extends FrameLayout {
97
98
98
99
@ Nullable
99
100
private PdfUiFragment fragment ;
100
- private BehaviorSubject <PdfUiFragment > pdfUiFragmentGetter = BehaviorSubject .create ();
101
+
102
+ /** We wrap the fragment in a list so we can have a state that encapsulates no element being set. */
103
+ @ NonNull
104
+ private final BehaviorSubject <List <PdfUiFragment >> pdfUiFragmentGetter = BehaviorSubject .createDefault (Collections .emptyList ());
101
105
102
106
/** An internal id we generate so we can track if fragments found belong to this specific PdfView instance. */
103
107
private int internalId ;
@@ -219,6 +223,14 @@ public void setMenuItemGroupingRule(@NonNull MenuItemGroupingRule groupingRule)
219
223
pdfViewModeController .setMenuItemGroupingRule (groupingRule );
220
224
}
221
225
226
+ public void setShowNavigationButtonInToolbar (final boolean showNavigationButtonInToolbar ) {
227
+ pendingFragmentActions .add (getCurrentPdfUiFragment ()
228
+ .observeOn (Schedulers .io ())
229
+ .subscribe (pdfUiFragment -> {
230
+ ((ReactPdfUiFragment ) pdfUiFragment ).setShowNavigationButtonInToolbar (showNavigationButtonInToolbar );
231
+ }));
232
+ }
233
+
222
234
private void setupFragment () {
223
235
if (fragmentTag != null && configuration != null && document != null ) {
224
236
PdfUiFragment pdfFragment = (PdfUiFragment ) fragmentManager .findFragmentByTag (fragmentTag );
@@ -235,7 +247,7 @@ private void setupFragment() {
235
247
if (pdfFragment == null ) {
236
248
pdfFragment = PdfUiFragmentBuilder .fromDocumentDescriptor (getContext (), DocumentDescriptor .fromDocument (document ))
237
249
.configuration (configuration )
238
- .fragmentClass (ConfigurationChangeReportingPdfUiFragment .class )
250
+ .fragmentClass (ReactPdfUiFragment .class )
239
251
.build ();
240
252
// We put our internal id so we can track if this fragment belongs to us, used to handle orphaned fragments after hot reloads.
241
253
pdfFragment .getArguments ().putInt (ARG_ROOT_ID , internalId );
@@ -249,7 +261,7 @@ private void setupFragment() {
249
261
// The document changed create a new PdfFragment.
250
262
pdfFragment = PdfUiFragmentBuilder .fromDocumentDescriptor (getContext (), DocumentDescriptor .fromDocument (document ))
251
263
.configuration (configuration )
252
- .fragmentClass (ConfigurationChangeReportingPdfUiFragment .class )
264
+ .fragmentClass (ReactPdfUiFragment .class )
253
265
.build ();
254
266
prepareFragment (pdfFragment );
255
267
} else if (fragmentView != null && fragmentView .getParent () != this ) {
@@ -266,7 +278,7 @@ private void setupFragment() {
266
278
}
267
279
268
280
fragment = pdfFragment ;
269
- pdfUiFragmentGetter .onNext (fragment );
281
+ pdfUiFragmentGetter .onNext (Collections . singletonList ( pdfFragment ) );
270
282
}
271
283
}
272
284
@@ -279,9 +291,17 @@ private void prepareFragment(final PdfUiFragment pdfUiFragment) {
279
291
280
292
pdfUiFragment .setOnContextualToolbarLifecycleListener (pdfViewModeController );
281
293
pdfUiFragment .getPSPDFKitViews ().getFormEditingBarView ().addOnFormEditingBarLifecycleListener (pdfViewModeController );
282
- ((ConfigurationChangeReportingPdfUiFragment ) pdfUiFragment ).setOnConfigurationChangedListener (() -> {
283
- // If the configuration was changed from the UI a new fragment will be created, reattach our listeners.
284
- preparePdfFragment (pdfUiFragment .getPdfFragment ());
294
+ ((ReactPdfUiFragment ) pdfUiFragment ).setReactPdfUiFragmentListener (new ReactPdfUiFragment .ReactPdfUiFragmentListener () {
295
+ @ Override
296
+ public void onConfigurationChanged (@ NonNull PdfUiFragment pdfUiFragment ) {
297
+ // If the configuration was changed from the UI a new fragment will be created, reattach our listeners.
298
+ preparePdfFragment (pdfUiFragment .getPdfFragment ());
299
+ }
300
+
301
+ @ Override
302
+ public void onNavigationButtonClicked (@ NonNull PdfUiFragment pdfUiFragment ) {
303
+ eventDispatcher .dispatchEvent (new PdfViewNavigationButtonClickedEvent (getId ()));
304
+ }
285
305
});
286
306
287
307
// After attaching the PdfUiFragment we can access the PdfFragment.
@@ -315,14 +335,14 @@ public void removeFragment(boolean makeInactive) {
315
335
// Clear everything.
316
336
isActive = false ;
317
337
document = null ;
338
+
339
+ pendingFragmentActions .dispose ();
340
+ pendingFragmentActions = new CompositeDisposable ();
318
341
}
319
342
320
343
fragment = null ;
321
344
322
- pdfUiFragmentGetter .onComplete ();
323
- pdfUiFragmentGetter = BehaviorSubject .create ();
324
- pendingFragmentActions .dispose ();
325
- pendingFragmentActions = new CompositeDisposable ();
345
+ pdfUiFragmentGetter .onNext (Collections .emptyList ());
326
346
}
327
347
328
348
void manuallyLayoutChildren () {
@@ -622,9 +642,15 @@ public Maybe<Boolean> setFormFieldValue(@NonNull String formElementName, @NonNul
622
642
623
643
/** Returns the {@link PdfFragment} hosted in the current {@link PdfUiFragment}. */
624
644
private Observable <PdfFragment > getCurrentPdfFragment () {
645
+ return getPdfFragment ()
646
+ .take (1 );
647
+ }
648
+
649
+ /** Returns the {@link PdfUiFragment}. */
650
+ private Observable <PdfUiFragment > getCurrentPdfUiFragment () {
625
651
return pdfUiFragmentGetter
626
- .filter (pdfUiFragment -> pdfUiFragment . getPdfFragment () != null )
627
- .map (PdfUiFragment :: getPdfFragment )
652
+ .filter (pdfUiFragments -> ! pdfUiFragments . isEmpty () )
653
+ .map (pdfUiFragments -> pdfUiFragments . get ( 0 ) )
628
654
.take (1 );
629
655
}
630
656
@@ -642,24 +668,25 @@ public Maybe<PdfFragment> getActivePdfFragment() {
642
668
*/
643
669
public Observable <PdfFragment > getPdfFragment () {
644
670
return pdfUiFragmentGetter
671
+ .filter (pdfUiFragments -> !pdfUiFragments .isEmpty ())
672
+ .map (pdfUiFragments -> pdfUiFragments .get (0 ))
645
673
.filter (pdfUiFragment -> pdfUiFragment .getPdfFragment () != null )
646
674
.map (PdfUiFragment ::getPdfFragment );
647
675
}
648
676
649
- /** Returns the current fragment if it is set. */
650
- public Maybe <PdfFragment > getFragment () {
651
- return pdfUiFragmentGetter .firstElement ().map (PdfUi ::getPdfFragment );
652
- }
653
-
654
677
/** Returns the event registration map for the default events emitted by the {@link PdfView}. */
655
678
public static Map <String , Map <String , String >> createDefaultEventRegistrationMap () {
656
- return MapBuilder .of (PdfViewStateChangedEvent .EVENT_NAME , MapBuilder .of ("registrationName" , "onStateChanged" ),
679
+ Map < String , Map < String , String >> map = MapBuilder .of (PdfViewStateChangedEvent .EVENT_NAME , MapBuilder .of ("registrationName" , "onStateChanged" ),
657
680
PdfViewDocumentSavedEvent .EVENT_NAME , MapBuilder .of ("registrationName" , "onDocumentSaved" ),
658
681
PdfViewAnnotationTappedEvent .EVENT_NAME , MapBuilder .of ("registrationName" , "onAnnotationTapped" ),
659
682
PdfViewAnnotationChangedEvent .EVENT_NAME , MapBuilder .of ("registrationName" , "onAnnotationsChanged" ),
660
683
PdfViewDataReturnedEvent .EVENT_NAME , MapBuilder .of ("registrationName" , "onDataReturned" ),
661
684
PdfViewDocumentSaveFailedEvent .EVENT_NAME , MapBuilder .of ("registrationName" , "onDocumentSaveFailed" ),
662
685
PdfViewDocumentLoadFailedEvent .EVENT_NAME , MapBuilder .of ("registrationName" , "onDocumentLoadFailed" )
663
686
);
687
+
688
+ map .put (PdfViewNavigationButtonClickedEvent .EVENT_NAME , MapBuilder .of ("registrationName" , "onNavigationButtonClicked" ));
689
+
690
+ return map ;
664
691
}
665
692
}
0 commit comments