Skip to content

Commit 34697d8

Browse files
author
PSPDFKit
committed
Release 2.10.0
1 parent dc6971a commit 34697d8

File tree

55 files changed

+5092
-4720
lines changed

Some content is hidden

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

55 files changed

+5092
-4720
lines changed

CHANGELOG.md

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,35 @@
11
## Newest Release
22

3+
### 2.10.0 - 06 May 2024
4+
5+
- Adds the ability to define annotation behavior using flags. (J#HYB-283)
6+
- Adds the ability to add custom menu items to the annotation selection menu. (J#HYB-280)
7+
- Adds the `imageSaveMode` property to the `PSPDFKitView` component to specify how annotations should be treated when saving image documents. (J#HYB-334)
8+
- Updates for PSPDFKit 13.5.0 for iOS.
9+
- Fixes an issue where selecting a measurement annotation without the Measurement Tools license causes a crash. (J#HYB-318)
10+
- Fixes an issue where the `removeAnnotation` API sometimes failed to remove an annotation on iOS. (J#HYB-43)
11+
12+
## Previous Releases
13+
314
### 2.9.1 - 12 Apr 2024
415

516
- Adds the ability to import and export annotations from XFDF files. (J#HYB-293)
617
- Updates for PSPDFKit 2024.2.1 for Android.
718
- Fixes issue where password input UI for password-protected documents wasn't shown on Android. (J#HYB-285)
819

9-
## Previous Releases
10-
1120
### 2.9.0 - 22 Mar 2024
1221

13-
- Adds new getConfiguration method to retrieve current PSPDFKitView configuration options. (J#HYB-192)
14-
- Adds the option to open a password protected document through configuration. (J#HYB-213)
22+
- Adds new `getConfiguration` method to retrieve current PSPDFKitView configuration options. (J#HYB-192)
23+
- Adds the option to open a password-protected document through configuration. (J#HYB-213)
1524
- Adds the ability to add custom toolbar buttons to the PSPDFKit toolbar. (J#HYB-198)
16-
- Adds support for new `MeasurementValueConfiguration` configuration option, replacing deprecated `setMeasurementScale` and `setMeasurementPrecision` methods. (J#HYB-205)
17-
- Updates `showPageLabels` property to also control page number overlay on Android. (J#HYB-223)
25+
- Adds support for the new `MeasurementValueConfiguration` configuration option, replacing the deprecated `setMeasurementScale` and `setMeasurementPrecision` methods. (J#HYB-205)
26+
- Updates the `showPageLabels` property to also control page number overlay on Android. (J#HYB-223)
1827
- Updates for PSPDFKit 2024.1.2 for Android.
1928
- Updates for PSPDFKit 13.3.3 for iOS.
2029
- Fixes issue of document URIs with file:/// scheme on iOS. (#43160)
21-
- Fixes issue where `onDocumentLoaded` callback was not called on Android. (#43187)
22-
- Fixes signatureSavingStrategy configuration option to save signature if enabled. (J#HYB-210)
23-
- Fixes `spreadFitting` configuration option behaviour on iOS. (J#HYB-222)
30+
- Fixes issue where the `onDocumentLoaded` callback was not called on Android. (#43187)
31+
- Fixes the `signatureSavingStrategy` configuration option to save signatures if enabled. (J#HYB-210)
32+
- Fixes `spreadFitting` configuration option behavior on iOS. (J#HYB-222)
2433

2534
### 2.8.1 - 27 Feb 2024
2635

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,13 @@
1-
connection.project.dir=../../../android
1+
arguments=--init-script /var/folders/3v/qy3ssjxs2m7d97yc60nrl2l00000gn/T/d146c9752a26f79b52047fb6dc6ed385d064e120494f96f08ca63a317c41f94c.gradle --init-script /var/folders/3v/qy3ssjxs2m7d97yc60nrl2l00000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle
2+
auto.sync=false
3+
build.scans.enabled=false
4+
connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(8.1.1))
5+
connection.project.dir=
26
eclipse.preferences.version=1
7+
gradle.user.home=
8+
java.home=/Library/Java/JavaVirtualMachines/microsoft-17.jdk/Contents/Home
9+
jvm.arguments=
10+
offline.mode=false
11+
override.workspace.settings=true
12+
show.console.view=true
13+
show.executions.view=true

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ public class ReactPdfViewManager extends ViewGroupManager<PdfView> {
7373
public static final int COMMAND_GET_MEASUREMENT_VALUE_CONFIGURATIONS = 22;
7474
public static final int COMMAND_IMPORT_XFDF = 23;
7575
public static final int COMMAND_EXPORT_XFDF = 24;
76+
public static final int COMMAND_SET_ANNOTATION_FLAGS = 25;
77+
public static final int COMMAND_GET_ANNOTATION_FLAGS = 26;
7678

7779
private final CompositeDisposable annotationDisposables = new CompositeDisposable();
7880

@@ -127,6 +129,8 @@ public Map<String, Integer> getCommandsMap() {
127129
commandMap.put("setToolbar", COMMAND_SET_TOOLBAR);
128130
commandMap.put("importXFDF", COMMAND_IMPORT_XFDF);
129131
commandMap.put("exportXFDF", COMMAND_EXPORT_XFDF);
132+
commandMap.put("setAnnotationFlags", COMMAND_SET_ANNOTATION_FLAGS);
133+
commandMap.put("getAnnotationFlags", COMMAND_GET_ANNOTATION_FLAGS);
130134
return commandMap;
131135
}
132136

@@ -217,6 +221,11 @@ public void setAnnotationAuthorName(PdfView view, String annotationAuthorName) {
217221
PSPDFKitPreferences.get(view.getContext()).setAnnotationCreator(annotationAuthorName);
218222
}
219223

224+
@ReactProp(name = "imageSaveMode")
225+
public void setImageSaveMode(PdfView view, String imageSaveMode) {
226+
view.setImageSaveMode(imageSaveMode);
227+
}
228+
220229
@ReactProp(name = "menuItemGrouping")
221230
public void setMenuItemGrouping(PdfView view, @NonNull ReadableArray menuItemGrouping) {
222231
ReactGroupingRule groupingRule = new ReactGroupingRule(view.getContext(), menuItemGrouping);
@@ -257,6 +266,13 @@ public void setToolbarMenuItems(@NonNull final PdfView view, @Nullable final Rea
257266
}
258267
}
259268

269+
@ReactProp(name = "annotationContextualMenu")
270+
public void setAnnotationContextualMenu(@NonNull final PdfView view, @NonNull ReadableMap annotationContextualMenuItems) {
271+
if (annotationContextualMenuItems != null) {
272+
view.setAnnotationToolbarMenuButtonItems(annotationContextualMenuItems);
273+
}
274+
}
275+
260276
@ReactProp(name = "measurementValueConfigurations")
261277
public void setMeasurementValueConfigurations(@NonNull final PdfView view, @Nullable final ReadableArray measurementValueConfigs) {
262278
if (measurementValueConfigs != null) {
@@ -358,6 +374,18 @@ public void accept(List<Annotation> annotations) {
358374
annotationDisposables.add(root.addAnnotations(requestId, args.getMap(1)));
359375
}
360376
break;
377+
case COMMAND_SET_ANNOTATION_FLAGS:
378+
if (args != null && args.size() == 3) {
379+
final int requestId = args.getInt(0);
380+
annotationDisposables.add(root.setAnnotationFlags(requestId, args.getString(1), args.getArray(2)));
381+
}
382+
break;
383+
case COMMAND_GET_ANNOTATION_FLAGS:
384+
if (args != null && args.size() == 2) {
385+
final int requestId = args.getInt(0);
386+
annotationDisposables.add(root.getAnnotationFlags(requestId, args.getString(1)));
387+
}
388+
break;
361389
case COMMAND_GET_FORM_FIELD_VALUE:
362390
if (args != null && args.size() == 2) {
363391
final int requestId = args.getInt(0);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.pspdfkit.react.events
2+
3+
import androidx.annotation.IdRes
4+
import com.facebook.react.bridge.Arguments
5+
import com.facebook.react.uimanager.events.Event
6+
import com.facebook.react.uimanager.events.RCTEventEmitter
7+
8+
class CustomAnnotationContextualMenuItemTappedEvent: Event<CustomAnnotationContextualMenuItemTappedEvent> {
9+
private var buttonId: String? = null
10+
11+
constructor(@IdRes viewId: Int, buttonId: String) : super(viewId) {
12+
13+
this.buttonId = buttonId
14+
}
15+
16+
override fun getEventName(): String? {
17+
return EVENT_NAME
18+
}
19+
20+
override fun dispatch(rctEventEmitter: RCTEventEmitter) {
21+
val eventData = Arguments.createMap()
22+
eventData.putString("id", buttonId)
23+
rctEventEmitter.receiveEvent(viewTag, eventName, eventData)
24+
}
25+
26+
companion object {
27+
@kotlin.jvm.JvmField
28+
var EVENT_NAME = "customAnnotationContextualMenuItemTapped"
29+
}
30+
}

android/src/main/java/com/pspdfkit/react/events/PdfViewAnnotationChangedEvent.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public void dispatch(RCTEventEmitter rctEventEmitter) {
7474
} else {
7575
JSONObject instantJson = new JSONObject(annotation.toInstantJson());
7676
annotationMap = JsonUtilities.jsonObjectToMap(instantJson);
77+
annotationMap.put("uuid", annotation.getUuid());
7778
}
7879

7980
List<Map<String, Object>> annotations = new ArrayList<>();

android/src/main/java/com/pspdfkit/react/events/PdfViewAnnotationTappedEvent.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,13 @@ public String getEventName() {
5151
@Override
5252
public void dispatch(RCTEventEmitter rctEventEmitter) {
5353
try {
54-
JSONObject instantJson = new JSONObject(annotation.toInstantJson());
55-
Map<String, Object> map = JsonUtilities.jsonObjectToMap(instantJson);
56-
WritableMap eventData = Arguments.makeNativeMap(map);
57-
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), eventData);
54+
String rawInstantJson = annotation.toInstantJson();
55+
if (rawInstantJson != null && !rawInstantJson.equals("null")) {
56+
JSONObject instantJson = new JSONObject(rawInstantJson);
57+
Map<String, Object> map = JsonUtilities.jsonObjectToMap(instantJson);
58+
WritableMap eventData = Arguments.makeNativeMap(map);
59+
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), eventData);
60+
}
5861
} catch (JSONException e) {
5962
e.printStackTrace();
6063
}

android/src/main/java/com/pspdfkit/react/events/PdfViewDataReturnedEvent.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,16 @@ public PdfViewDataReturnedEvent(@IdRes int viewId, int requestId, boolean result
7474
payload = Arguments.makeNativeMap(map);
7575
}
7676

77+
public PdfViewDataReturnedEvent(@IdRes int viewId, int requestId, ArrayList result) {
78+
super(viewId);
79+
this.requestId = requestId;
80+
Map<String, Object> map = new HashMap<>();
81+
map.put("requestId", requestId);
82+
map.put("result", result);
83+
84+
payload = Arguments.makeNativeMap(map);
85+
}
86+
7787
public PdfViewDataReturnedEvent(@IdRes int viewId, int requestId, @NonNull JSONObject jsonObject) {
7888
super(viewId);
7989
this.requestId = requestId;

android/src/main/java/com/pspdfkit/react/helper/ConversionHelpers.java

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@
1515

1616
import androidx.annotation.Nullable;
1717

18+
import com.facebook.react.bridge.ReadableArray;
19+
import com.pspdfkit.annotations.AnnotationFlags;
1820
import com.pspdfkit.annotations.AnnotationType;
21+
import com.pspdfkit.ui.toolbar.ContextualToolbarMenuItem;
1922

23+
import java.util.ArrayList;
2024
import java.util.EnumSet;
25+
import java.util.List;
2126

2227
public class ConversionHelpers {
2328

@@ -82,4 +87,86 @@ public static EnumSet<AnnotationType> getAnnotationTypeFromString(@Nullable fina
8287
return EnumSet.allOf(AnnotationType.class);
8388
}
8489
}
90+
91+
public static EnumSet<AnnotationFlags> getAnnotationFlags(final ReadableArray flags) {
92+
93+
EnumSet<AnnotationFlags> convertedFlags = EnumSet.noneOf(AnnotationFlags.class);
94+
95+
for (int i = 0; i < flags.size(); i++) {
96+
String flag = flags.getString(i);
97+
switch (flag) {
98+
case "hidden":
99+
convertedFlags.add(AnnotationFlags.HIDDEN);
100+
break;
101+
case "invisible":
102+
convertedFlags.add(AnnotationFlags.INVISIBLE);
103+
break;
104+
case "locked":
105+
convertedFlags.add(AnnotationFlags.LOCKED);
106+
break;
107+
case "lockedContents":
108+
convertedFlags.add(AnnotationFlags.LOCKEDCONTENTS);
109+
break;
110+
case "print":
111+
convertedFlags.add(AnnotationFlags.PRINT);
112+
break;
113+
case "readOnly":
114+
convertedFlags.add(AnnotationFlags.READONLY);
115+
break;
116+
case "noView":
117+
convertedFlags.add(AnnotationFlags.NOVIEW);
118+
break;
119+
case "noZoom":
120+
convertedFlags.add(AnnotationFlags.NOZOOM);
121+
break;
122+
default:
123+
break;
124+
}
125+
126+
}
127+
return convertedFlags;
128+
}
129+
130+
public static ArrayList<String> convertAnnotationFlags(final EnumSet<AnnotationFlags> flags) {
131+
132+
ArrayList<String> stringFlags = new ArrayList<String>();
133+
134+
if (flags.contains(AnnotationFlags.HIDDEN)) {
135+
stringFlags.add("hidden");
136+
}
137+
if (flags.contains(AnnotationFlags.INVISIBLE)) {
138+
stringFlags.add("invisible");
139+
}
140+
if (flags.contains(AnnotationFlags.LOCKED)) {
141+
stringFlags.add("locked");
142+
}
143+
if (flags.contains(AnnotationFlags.LOCKEDCONTENTS)) {
144+
stringFlags.add("lockedContents");
145+
}
146+
if (flags.contains(AnnotationFlags.PRINT)) {
147+
stringFlags.add("print");
148+
}
149+
if (flags.contains(AnnotationFlags.READONLY)) {
150+
stringFlags.add("readOnly");
151+
}
152+
if (flags.contains(AnnotationFlags.NOVIEW)) {
153+
stringFlags.add("noView");
154+
}
155+
if (flags.contains(AnnotationFlags.NOZOOM)) {
156+
stringFlags.add("noZoom");
157+
}
158+
159+
return stringFlags;
160+
}
161+
162+
public static ContextualToolbarMenuItem.Position getContextualToolbarMenuItemPosition(final String position) {
163+
switch (position.toLowerCase()) {
164+
case "start":
165+
return ContextualToolbarMenuItem.Position.START;
166+
case "end":
167+
return ContextualToolbarMenuItem.Position.END;
168+
default:
169+
return ContextualToolbarMenuItem.Position.END;
170+
}
171+
}
85172
}

android/src/main/java/com/pspdfkit/react/helper/PSPDFKitUtils.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.pspdfkit.react.helper
22

3+
import android.content.Context
34
import java.io.File
45
import java.util.Locale
56

@@ -28,6 +29,11 @@ class PSPDFKitUtils {
2829
@JvmStatic
2930
public fun isValidPdf(file: File): Boolean {
3031
return file.name.lowercase(Locale.getDefault()).endsWith(".pdf")
32+
}
33+
34+
@JvmStatic
35+
public fun getCustomResourceId(resName: String, type: String, context: Context): Int {
36+
return context.resources.getIdentifier(resName, type, context.packageName)
3137
}
3238
}
3339
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.pspdfkit.react.menu;
2+
3+
import android.content.Context;
4+
import androidx.annotation.NonNull;
5+
6+
import com.pspdfkit.ui.toolbar.ContextualToolbarMenuItem;
7+
import com.pspdfkit.ui.toolbar.grouping.presets.AnnotationEditingToolbarGroupingRule;
8+
import com.pspdfkit.ui.toolbar.grouping.presets.MenuItem;
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
public class AnnotationContextualToolbarGroupingRule extends AnnotationEditingToolbarGroupingRule {
12+
13+
List<ContextualToolbarMenuItem> menuItems;
14+
15+
public AnnotationContextualToolbarGroupingRule(@NonNull Context context, @NonNull List menuItems) {
16+
super(context);
17+
this.menuItems = menuItems;
18+
}
19+
20+
@NonNull
21+
@Override
22+
public List<MenuItem> getGroupPreset(int capacity, int itemsCount) {
23+
List<com.pspdfkit.ui.toolbar.grouping.presets.MenuItem> groupPreset =
24+
new ArrayList<>(super.getGroupPreset(capacity - 1, itemsCount - 1));
25+
for (ContextualToolbarMenuItem menuItem : menuItems) {
26+
groupPreset.add(new MenuItem(menuItem.getId()));
27+
}
28+
return groupPreset;
29+
}
30+
}

0 commit comments

Comments
 (0)