Skip to content

Commit 049ac9d

Browse files
author
PSPDFKit
committed
Release 2.6.0
1 parent f823d8b commit 049ac9d

File tree

62 files changed

+3403
-2714
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+3403
-2714
lines changed

ACKNOWLEDGEMENTS.md

Lines changed: 386 additions & 408 deletions
Large diffs are not rendered by default.

CHANGELOG.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
## Newest Release
22

3-
### 2.5.2 - 13 Apr 2023
4-
- Fixes missing RXJava dependencies for Android. (#39813)
3+
### 2.6.0 - 05 Jun 2023
4+
- Adds measurement tools configurations (#40296)
5+
- Updates for PSPDFKit 8.7.2 for Android. (#40697)
6+
- Updates for PSPDFKit 12.2 for iOS. (#40697)
7+
- Fixes annotation tools subgroups selection with menuItem grouping customization (#40593)
58

69
## Previous Releases
710

11+
### 2.5.2 - 13 Apr 2023
12+
- Fixes missing RXJava dependencies for Android. (#39813)
13+
814
### 2.5.1 - 03 Apr 2023
915
- Updated NativeCatalog configuration and replaced deprecated AppDelegate.m
1016
- Bumps PSPDFKit for Android version to 8.6.0

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Contains gradle configuration constants
1616
*/
1717
ext {
18-
PSPDFKIT_VERSION = '8.6.0'
18+
PSPDFKIT_VERSION = '8.7.2'
1919
}
2020

2121
buildscript {

android/src/main/java/com/pspdfkit/react/ConfigurationAdapter.java

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.pspdfkit.configuration.page.PageScrollMode;
3333
import com.pspdfkit.configuration.sharing.ShareFeatures;
3434
import com.pspdfkit.configuration.signatures.SignatureSavingStrategy;
35+
import com.pspdfkit.preferences.PSPDFKitPreferences;
3536

3637
import java.util.ArrayList;
3738
import java.util.Collections;
@@ -108,6 +109,11 @@ public class ConfigurationAdapter {
108109
private static final String SHOW_ANNOTATION_LIST_ACTION = "showAnnotationListAction";
109110
private static final String ANNOTATION_EDITING_ENABLED = "enableAnnotationEditing";
110111

112+
// Measurement tools options
113+
private static final String ENABLED_MEASUREMENT_TOOLS = "enableMeasurementTools";
114+
private static final String ENABLE_MAGNIFIER = "enableMagnifier";
115+
private static final String ENABLED_MEASUREMENT_TOOL_SNAPPING = "enableMeasurementToolSnapping";
116+
111117
// Deprecated Options
112118
/**
113119
* @deprecated This key word was deprecated with PSPDFKit for React Native 2.1.
@@ -152,6 +158,7 @@ public ConfigurationAdapter(@NonNull final Context context, ReadableMap configur
152158
ReadableMapKeySetIterator iterator = configuration.keySetIterator();
153159
boolean hasConfiguration = iterator.hasNextKey();
154160
this.configuration = new PdfActivityConfiguration.Builder(context);
161+
this.configuration.disableContentEditing();
155162
if (hasConfiguration) {
156163
String key;
157164

@@ -303,6 +310,18 @@ public ConfigurationAdapter(@NonNull final Context context, ReadableMap configur
303310
if (key != null) {
304311
configureToolbarTitle(configuration.getString(key));
305312
}
313+
key = getKeyOrNull(configuration, ENABLE_MAGNIFIER);
314+
if (key != null) {
315+
configureMagnifierEnabled(configuration.getBoolean(key));
316+
}
317+
key = getKeyOrNull(configuration, ENABLED_MEASUREMENT_TOOLS);
318+
if (key != null) {
319+
configureMeasurementToolsEnabled(configuration.getBoolean(key));
320+
}
321+
key = getKeyOrNull(configuration, ENABLED_MEASUREMENT_TOOL_SNAPPING);
322+
if (key != null) {
323+
configureMeasurementToolSnappingEnabled(context, configuration.getBoolean(key));
324+
}
306325
}
307326
}
308327

@@ -427,18 +446,21 @@ private void configureShowThumbnailBar(@Nullable final String showThumbnailBar)
427446
return;
428447
}
429448

430-
if (showThumbnailBar.equals(SHOW_THUMBNAIL_BAR_NONE)) {
431-
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_NONE);
432-
} else if (showThumbnailBar.equals(SHOW_THUMBNAIL_BAR_DEFAULT)) {
433-
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_FLOATING);
434-
} else if (showThumbnailBar.equals(SHOW_THUMBNAIL_BAR_FLOATING)) {
435-
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_FLOATING);
436-
} else if (showThumbnailBar.equals(SHOW_THUMBNAIL_BAR_SCRUBBERBAR)) {
437-
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_PINNED);
438-
} else if (showThumbnailBar.equals(SHOW_THUMBNAIL_BAR_PINNED)) {
439-
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_PINNED);
440-
} else if (showThumbnailBar.equals(SHOW_THUMBNAIL_BAR_SCROLLABLE)) {
441-
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_SCROLLABLE);
449+
switch (showThumbnailBar) {
450+
case SHOW_THUMBNAIL_BAR_NONE:
451+
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_NONE);
452+
break;
453+
case SHOW_THUMBNAIL_BAR_DEFAULT:
454+
case SHOW_THUMBNAIL_BAR_FLOATING:
455+
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_FLOATING);
456+
break;
457+
case SHOW_THUMBNAIL_BAR_SCRUBBERBAR:
458+
case SHOW_THUMBNAIL_BAR_PINNED:
459+
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_PINNED);
460+
break;
461+
case SHOW_THUMBNAIL_BAR_SCROLLABLE:
462+
configuration.setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_SCROLLABLE);
463+
break;
442464
}
443465
}
444466

@@ -613,6 +635,18 @@ private void configureToolbarTitle(@Nullable final String customTitle) {
613635
configuration.title(customTitle);
614636
}
615637

638+
private void configureMeasurementToolsEnabled(final Boolean measurementToolsEnabled) {
639+
configuration.setMeasurementToolsEnabled(measurementToolsEnabled);
640+
}
641+
642+
private void configureMagnifierEnabled(final Boolean magnifierEnabled) {
643+
configuration.enableMagnifier(magnifierEnabled);
644+
}
645+
646+
private void configureMeasurementToolSnappingEnabled(Context context, final Boolean snappingEnabled) {
647+
PSPDFKitPreferences.get(context).setMeasurementSnappingEnabled(snappingEnabled);
648+
}
649+
616650
public PdfActivityConfiguration build() {
617651
return configuration.build();
618652
}

android/src/main/java/com/pspdfkit/react/PSPDFKitModule.java

Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,15 @@
3535
import com.pspdfkit.PSPDFKit;
3636
import com.pspdfkit.annotations.Annotation;
3737
import com.pspdfkit.annotations.AnnotationType;
38+
import com.pspdfkit.annotations.measurements.FloatPrecision;
39+
import com.pspdfkit.annotations.measurements.Scale;
3840
import com.pspdfkit.document.PdfDocument;
3941
import com.pspdfkit.document.PdfDocumentLoader;
4042
import com.pspdfkit.document.image.CameraImagePickerFragment;
4143
import com.pspdfkit.document.image.GalleryImagePickerFragment;
4244
import com.pspdfkit.document.processor.PdfProcessor;
4345
import com.pspdfkit.document.processor.PdfProcessorTask;
46+
import com.pspdfkit.exceptions.InvalidPSPDFKitLicenseException;
4447
import com.pspdfkit.react.RNInstantPdfActivity;
4548
import com.pspdfkit.listeners.SimpleDocumentListener;
4649
import com.pspdfkit.react.helper.ConversionHelpers;
@@ -52,7 +55,6 @@
5255
import java.util.EnumSet;
5356
import java.util.HashMap;
5457
import java.util.Map;
55-
import com.pspdfkit.exceptions.InvalidPSPDFKitLicenseException;
5658

5759
public class PSPDFKitModule extends ReactContextBaseJavaModule implements Application.ActivityLifecycleCallbacks, ActivityEventListener {
5860

@@ -144,7 +146,7 @@ public void presentPdf(@NonNull String document, @NonNull ReadableMap configurat
144146
PdfActivity.showDocument(getCurrentActivity(), Uri.parse(document), configurationAdapter.build());
145147
}
146148
}
147-
149+
148150
@ReactMethod
149151
public void presentImage(@NonNull String imageDocument, @NonNull ReadableMap configuration, @Nullable Promise promise) {
150152
if (getCurrentActivity() != null) {
@@ -238,7 +240,7 @@ public void processAnnotations(@NonNull final String processingMode,
238240
@NonNull final String sourceDocumentPath,
239241
@NonNull final String targetDocumentPath,
240242
@NonNull final Promise promise) {
241-
243+
242244
// This is an edge case where file scheme is missing.
243245
String documentPath = Uri.parse(sourceDocumentPath).getScheme() == null
244246
? FILE_SCHEME + sourceDocumentPath : sourceDocumentPath;
@@ -261,6 +263,66 @@ public void processAnnotations(@NonNull final String processingMode,
261263
});
262264
}
263265

266+
@ReactMethod
267+
public void setMeasurementScale(@Nullable final Scale scale) {
268+
if (resumedActivity instanceof PdfActivity) {
269+
final PdfActivity activity = (PdfActivity) resumedActivity;
270+
activity.runOnUiThread(new Runnable() {
271+
@Override
272+
public void run() {
273+
PdfDocument document = activity.getDocument();
274+
if (document != null && scale != null) {
275+
document.setMeasurementScale(scale);
276+
} else {
277+
activity.getPdfFragment().addDocumentListener(new SimpleDocumentListener() {
278+
@Override
279+
public void onDocumentLoaded(@NonNull PdfDocument document) {
280+
activity.getPdfFragment().removeDocumentListener(this);
281+
}
282+
});
283+
}
284+
}
285+
});
286+
} else {
287+
onPdfActivityOpenedTask = new Runnable() {
288+
@Override
289+
public void run() {
290+
setMeasurementScale(scale);
291+
}
292+
};
293+
}
294+
}
295+
@ReactMethod
296+
public void setMeasurementPrecision(@Nullable final FloatPrecision floatPrecision) {
297+
if (resumedActivity instanceof PdfActivity) {
298+
final PdfActivity activity = (PdfActivity) resumedActivity;
299+
activity.runOnUiThread(new Runnable() {
300+
@Override
301+
public void run() {
302+
PdfDocument document = activity.getDocument();
303+
FloatPrecision precision = floatPrecision;
304+
if (document != null && precision != null) {
305+
document.setMeasurementPrecision(precision);
306+
} else {
307+
activity.getPdfFragment().addDocumentListener(new SimpleDocumentListener() {
308+
@Override
309+
public void onDocumentLoaded(@NonNull PdfDocument document) {
310+
activity.getPdfFragment().removeDocumentListener(this);
311+
}
312+
});
313+
}
314+
}
315+
});
316+
} else {
317+
onPdfActivityOpenedTask = new Runnable() {
318+
@Override
319+
public void run() {
320+
setMeasurementPrecision(floatPrecision);
321+
}
322+
};
323+
}
324+
}
325+
264326
private static PdfProcessorTask.AnnotationProcessingMode getProcessingModeFromString(@NonNull final String mode) {
265327
if ("print".equalsIgnoreCase(mode)) {
266328
return PdfProcessorTask.AnnotationProcessingMode.PRINT;
@@ -300,7 +362,7 @@ public synchronized void onActivityResumed(Activity activity) {
300362
// Run our queued up task when a PdfActivity is displayed.
301363
onPdfActivityOpenedTask.run();
302364
onPdfActivityOpenedTask = null;
303-
365+
304366
// We notify the called as soon as the document is loaded or loading failed.
305367
if (lastPresentPromise != null) {
306368
PdfActivity pdfActivity = (PdfActivity) resumedActivity;
@@ -389,7 +451,7 @@ public void onNewIntent(Intent intent) {
389451
private boolean isPdf(File file) {
390452
return file.getName().toLowerCase().endsWith(".pdf");
391453
}
392-
454+
393455
private boolean isImage(File file) {
394456
for (String extension: SUPPORTED_IMAGE_TYPES) {
395457
if (file.getName().toLowerCase().endsWith(extension)) {

android/src/main/java/com/pspdfkit/react/ReactPdfViewManager.java

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,10 @@
3131
import com.pspdfkit.react.menu.ReactGroupingRule;
3232
import com.pspdfkit.views.PdfView;
3333
import com.pspdfkit.configuration.activity.PdfActivityConfiguration;
34-
35-
3634
import org.json.JSONObject;
37-
3835
import java.util.List;
3936
import java.util.Map;
40-
4137
import javax.annotation.Nullable;
42-
4338
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
4439
import io.reactivex.rxjava3.disposables.CompositeDisposable;
4540
import io.reactivex.rxjava3.disposables.Disposable;
@@ -65,14 +60,18 @@ public class ReactPdfViewManager extends ViewGroupManager<PdfView> {
6560
public static final int COMMAND_REMOVE_FRAGMENT = 12;
6661
public static final int COMMAND_SET_TOOLBAR_MENU_ITEMS = 13;
6762
public static final int COMMAND_REMOVE_ANNOTATIONS = 14;
63+
public static final int COMMAND_SET_MEASUREMENT_SCALE = 17;
64+
public static final int COMMAND_SET_MEASUREMENT_PRECISION = 16;
6865

69-
private CompositeDisposable annotationDisposables = new CompositeDisposable();
66+
private final CompositeDisposable annotationDisposables = new CompositeDisposable();
7067

68+
@NonNull
7169
@Override
7270
public String getName() {
7371
return "RCTPSPDFKitView";
7472
}
7573

74+
@NonNull
7675
@Override
7776
protected PdfView createViewInstance(ThemedReactContext reactContext) {
7877
Activity currentActivity = reactContext.getCurrentActivity();
@@ -111,6 +110,8 @@ public Map<String, Integer> getCommandsMap() {
111110
commandMap.put("getAllAnnotations", COMMAND_GET_ALL_ANNOTATIONS);
112111
commandMap.put("removeFragment", COMMAND_REMOVE_FRAGMENT);
113112
commandMap.put("setToolbarMenuItems", COMMAND_SET_TOOLBAR_MENU_ITEMS);
113+
commandMap.put("setMeasurementScale", COMMAND_SET_MEASUREMENT_SCALE);
114+
commandMap.put("setMeasurementPrecision", COMMAND_SET_MEASUREMENT_PRECISION);
114115
return commandMap;
115116
}
116117

@@ -192,7 +193,7 @@ public Map getExportedCustomDirectEventTypeConstants() {
192193
}
193194

194195
@Override
195-
public void receiveCommand(final PdfView root, int commandId, @Nullable ReadableArray args) {
196+
public void receiveCommand(@NonNull final PdfView root, int commandId, @Nullable ReadableArray args) {
196197
switch (commandId) {
197198
case COMMAND_ENTER_ANNOTATION_CREATION_MODE:
198199
root.enterAnnotationCreationMode();
@@ -268,12 +269,8 @@ public void accept(List<Annotation> annotations) {
268269
Disposable annotationDisposable = root.getAllUnsavedAnnotations()
269270
.subscribeOn(Schedulers.io())
270271
.observeOn(AndroidSchedulers.mainThread())
271-
.subscribe(new Consumer<JSONObject>() {
272-
@Override
273-
public void accept(JSONObject jsonObject) {
274-
root.getEventDispatcher().dispatchEvent(new PdfViewDataReturnedEvent(root.getId(), requestId, jsonObject));
275-
}
276-
});
272+
.subscribe(jsonObject -> root.getEventDispatcher()
273+
.dispatchEvent(new PdfViewDataReturnedEvent(root.getId(), requestId, jsonObject)));
277274
annotationDisposables.add(annotationDisposable);
278275
}
279276
break;
@@ -316,6 +313,28 @@ public void accept(JSONObject jsonObject) {
316313
setToolbarMenuItems(root,args.getArray(0));
317314
}
318315
break;
316+
case COMMAND_SET_MEASUREMENT_SCALE:
317+
if (args != null) {
318+
final int requestId = args.getInt(0);
319+
try {
320+
boolean result = root.setMeasurementScale(args.getMap(1));
321+
root.getEventDispatcher().dispatchEvent(new PdfViewDataReturnedEvent(root.getId(), requestId, result));
322+
} catch (Exception e) {
323+
root.getEventDispatcher().dispatchEvent(new PdfViewDataReturnedEvent(root.getId(), requestId, e));
324+
}
325+
}
326+
break;
327+
case COMMAND_SET_MEASUREMENT_PRECISION:
328+
if (args != null) {
329+
final int requestId = args.getInt(0);
330+
try {
331+
boolean result = root.setMeasurementPrecision(args.getString(1));
332+
root.getEventDispatcher().dispatchEvent(new PdfViewDataReturnedEvent(root.getId(), requestId, result));
333+
} catch (Exception e) {
334+
root.getEventDispatcher().dispatchEvent(new PdfViewDataReturnedEvent(root.getId(), requestId, e));
335+
}
336+
}
337+
break;
319338
}
320339
}
321340

android/src/main/java/com/pspdfkit/react/ToolbarMenuItemsAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
1111
* This notice may not be removed from this file.
1212
*/
13-
13+
1414
package com.pspdfkit.react;
1515

1616
import com.facebook.react.bridge.ReadableArray;

0 commit comments

Comments
 (0)