diff --git a/android/src/main/java/com/pspdfkit/react/ReactPdfViewManager.java b/android/src/main/java/com/pspdfkit/react/ReactPdfViewManager.java index 24a8c5e8..f7f0be2f 100644 --- a/android/src/main/java/com/pspdfkit/react/ReactPdfViewManager.java +++ b/android/src/main/java/com/pspdfkit/react/ReactPdfViewManager.java @@ -1,6 +1,7 @@ package com.pspdfkit.react; import android.app.Activity; + import androidx.annotation.NonNull; import androidx.fragment.app.FragmentActivity; @@ -51,6 +52,7 @@ public class ReactPdfViewManager extends ViewGroupManager { public static final int COMMAND_GET_FORM_FIELD_VALUE = 8; public static final int COMMAND_SET_FORM_FIELD_VALUE = 9; public static final int COMMAND_REMOVE_ANNOTATION = 10; + public static final int COMMAND_GET_ALL_ANNOTATIONS = 11; private CompositeDisposable annotationDisposables = new CompositeDisposable(); @@ -100,6 +102,7 @@ public Map getCommandsMap() { commandMap.put("getFormFieldValue", COMMAND_GET_FORM_FIELD_VALUE); commandMap.put("setFormFieldValue", COMMAND_SET_FORM_FIELD_VALUE); commandMap.put("removeAnnotation", COMMAND_REMOVE_ANNOTATION); + commandMap.put("getAllAnnotations", COMMAND_GET_ALL_ANNOTATIONS); return commandMap; } @@ -185,6 +188,19 @@ public void accept(List annotations) { annotationDisposables.add(annotationDisposable); } break; + case COMMAND_GET_ALL_ANNOTATIONS: + if (args != null && args.size() == 2) { + final int requestId = args.getInt(0); + annotationDisposables.add(root.getAllAnnotations(args.getString(1)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(annotations -> { + root.getEventDispatcher().dispatchEvent(new PdfViewDataReturnedEvent(root.getId(), requestId, annotations)); + }, throwable -> { + root.getEventDispatcher().dispatchEvent(new PdfViewDataReturnedEvent(root.getId(), requestId, throwable)); + })); + } + break; case COMMAND_ADD_ANNOTATION: if (args != null && args.size() == 2) { final int requestId = args.getInt(0); diff --git a/android/src/main/java/com/pspdfkit/views/PdfView.java b/android/src/main/java/com/pspdfkit/views/PdfView.java index 7394609e..52346f2d 100644 --- a/android/src/main/java/com/pspdfkit/views/PdfView.java +++ b/android/src/main/java/com/pspdfkit/views/PdfView.java @@ -2,10 +2,6 @@ import android.content.Context; import android.net.Uri; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentManager; - import android.util.AttributeSet; import android.util.Pair; import android.view.Choreographer; @@ -13,6 +9,10 @@ import android.view.View; import android.widget.FrameLayout; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; + import com.facebook.react.bridge.ReadableMap; import com.facebook.react.uimanager.events.EventDispatcher; import com.pspdfkit.annotations.Annotation; @@ -30,7 +30,6 @@ import com.pspdfkit.forms.TextFormElement; import com.pspdfkit.listeners.OnPreparePopupToolbarListener; import com.pspdfkit.listeners.SimpleDocumentListener; -import com.pspdfkit.react.R; import com.pspdfkit.react.events.PdfViewDataReturnedEvent; import com.pspdfkit.react.events.PdfViewDocumentLoadFailedEvent; import com.pspdfkit.react.events.PdfViewDocumentSaveFailedEvent; @@ -449,11 +448,17 @@ public PdfDocument apply(PdfFragment pdfFragment) { }).flatMap(new Function>() { @Override public ObservableSource apply(PdfDocument pdfDocument) { - return pdfDocument.getAnnotationProvider().getAllAnnotationsOfType(getTypeFromString(type), pageIndex, 1); + return pdfDocument.getAnnotationProvider().getAllAnnotationsOfTypeAsync(getTypeFromString(type), pageIndex, 1); } }).toList(); } + public Single> getAllAnnotations(@Nullable final String type) { + return fragmentGetter.take(1).map(PdfFragment::getDocument) + .flatMap(pdfDocument -> pdfDocument.getAnnotationProvider().getAllAnnotationsOfTypeAsync(getTypeFromString(type))) + .toList(); + } + private EnumSet getTypeFromString(@Nullable String type) { if (type == null) { return EnumSet.allOf(AnnotationType.class); diff --git a/index.js b/index.js index 7af9cff8..d6245d1d 100644 --- a/index.js +++ b/index.js @@ -276,6 +276,40 @@ class PSPDFKitView extends React.Component { } }; + /** + * Gets all annotations of the given type. + * + * @param type The type of annotations to get (See here for types https://pspdfkit.com/guides/server/current/api/json-format/) or null to get all annotations. + * + * Returns a promise resolving an array with the following structure: + * {'annotations' : [instantJson]} + */ + getAllAnnotations = function(type) { + if (Platform.OS === "android") { + let requestId = this._nextRequestId++; + let requestMap = this._requestMap; + + // We create a promise here that will be resolved once onDataReturned is called. + let promise = new Promise(function(resolve, reject) { + requestMap[requestId] = { resolve: resolve, reject: reject }; + }); + + UIManager.dispatchViewManagerCommand( + findNodeHandle(this.refs.pdfView), + this._getViewManagerConfig("RCTPSPDFKitView").Commands + .getAllAnnotations, + [requestId, type] + ); + + return promise; + } else if (Platform.OS === "ios") { + return NativeModules.PSPDFKitViewManager.getAllAnnotations( + type, + findNodeHandle(this.refs.pdfView) + ); + } + }; + /** * Applies the passed in document instant json. * diff --git a/ios/RCTPSPDFKit/RCTPSPDFKitView.h b/ios/RCTPSPDFKit/RCTPSPDFKitView.h index 85fe2b87..5a5f40ae 100644 --- a/ios/RCTPSPDFKit/RCTPSPDFKitView.h +++ b/ios/RCTPSPDFKit/RCTPSPDFKitView.h @@ -43,6 +43,7 @@ NS_ASSUME_NONNULL_BEGIN - (BOOL)addAnnotation:(id)jsonAnnotation error:(NSError *_Nullable *)error; - (BOOL)removeAnnotationWithUUID:(NSString *)annotationUUID; - (NSDictionary *> *)getAllUnsavedAnnotationsWithError:(NSError *_Nullable *)error; +- (NSDictionary *> *)getAllAnnotations:(PSPDFAnnotationType)type error:(NSError *_Nullable *)error; - (BOOL)addAnnotations:(NSString *)jsonAnnotations error:(NSError *_Nullable *)error; /// Forms diff --git a/ios/RCTPSPDFKit/RCTPSPDFKitView.m b/ios/RCTPSPDFKit/RCTPSPDFKitView.m index 03f4d243..ef8161c7 100644 --- a/ios/RCTPSPDFKit/RCTPSPDFKitView.m +++ b/ios/RCTPSPDFKit/RCTPSPDFKitView.m @@ -247,6 +247,15 @@ - (BOOL)removeAnnotationWithUUID:(NSString *)annotationUUID { return annotationsJSON; } +- (NSDictionary *> *)getAllAnnotations:(PSPDFAnnotationType)type error:(NSError *_Nullable *)error { + PSPDFDocument *document = self.pdfController.document; + VALIDATE_DOCUMENT(document, nil) + + NSArray *annotations = [[document allAnnotationsOfType:type].allValues valueForKeyPath:@"@unionOfArrays.self"]; + NSArray *annotationsJSON = [RCTConvert instantJSONFromAnnotations:annotations error:error]; + return @{@"annotations" : annotationsJSON}; +} + - (BOOL)addAnnotations:(id)jsonAnnotations error:(NSError *_Nullable *)error { NSData *data; if ([jsonAnnotations isKindOfClass:NSString.class]) { diff --git a/ios/RCTPSPDFKit/RCTPSPDFKitViewManager.m b/ios/RCTPSPDFKit/RCTPSPDFKitViewManager.m index 2638d841..6ec6dd70 100644 --- a/ios/RCTPSPDFKit/RCTPSPDFKitViewManager.m +++ b/ios/RCTPSPDFKit/RCTPSPDFKitViewManager.m @@ -195,6 +195,19 @@ @implementation RCTPSPDFKitViewManager }); } +RCT_EXPORT_METHOD(getAllAnnotations:(NSString *)type reactTag:(nonnull NSNumber *)reactTag resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { + dispatch_async(dispatch_get_main_queue(), ^{ + RCTPSPDFKitView *component = (RCTPSPDFKitView *)[self.bridge.uiManager viewForReactTag:reactTag]; + NSError *error; + NSDictionary *annotations = [component getAllAnnotations:[RCTConvert annotationTypeFromInstantJSONType:type] error:&error]; + if (annotations) { + resolve(annotations); + } else { + reject(@"error", @"Failed to get all annotations.", error); + } + }); +} + RCT_EXPORT_METHOD(addAnnotations:(id)jsonAnnotations reactTag:(nonnull NSNumber *)reactTag resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { dispatch_async(dispatch_get_main_queue(), ^{ RCTPSPDFKitView *component = (RCTPSPDFKitView *)[self.bridge.uiManager viewForReactTag:reactTag]; diff --git a/package-lock.json b/package-lock.json index a6fcb520..195a0af6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "react-native-pspdfkit", - "version": "1.25.0", + "version": "1.25.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4bffe94c..a3992c37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-pspdfkit", - "version": "1.25.0", + "version": "1.25.1", "description": "A React Native module for the PSPDFKit library.", "keywords": [ "react native", diff --git a/samples/Catalog/Catalog.android.js b/samples/Catalog/Catalog.android.js index 74efe66c..06a7aaf3 100644 --- a/samples/Catalog/Catalog.android.js +++ b/samples/Catalog/Catalog.android.js @@ -588,8 +588,8 @@ class PdfViewInstantJsonScreen extends Component<{}> {