Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add form editing configuration #365

Merged
merged 9 commits into from
Apr 27, 2020
12 changes: 12 additions & 0 deletions android/src/main/java/com/pspdfkit/react/ConfigurationAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ public class ConfigurationAdapter {
private static final String START_PAGE = "startPage";
private static final String ENABLE_ANNOTATION_EDITING = "enableAnnotationEditing";
private static final String ENABLE_TEXT_SELECTION = "enableTextSelection";
private static final String ENABLE_FORM_EDITING = "enableFormEditing";
private static final String SHOW_SHARE_ACTION = "showShareAction";
private static final String SHOW_PRINT_ACTION = "showPrintAction";
private static final String SHOW_DOCUMENT_INFO_VIEW = "showDocumentInfoView";
Expand Down Expand Up @@ -145,6 +146,9 @@ public ConfigurationAdapter(@NonNull Context context, ReadableMap configuration)
if (configuration.hasKey(ENABLE_ANNOTATION_EDITING)) {
configureEnableAnnotationEditing(configuration.getBoolean(ENABLE_ANNOTATION_EDITING));
}
if (configuration.hasKey(ENABLE_FORM_EDITING)) {
configureEnableFormEditing(configuration.getBoolean(ENABLE_FORM_EDITING));
}
if (configuration.hasKey(SHOW_SHARE_ACTION)) {
configureShowShareAction(configuration.getBoolean(SHOW_SHARE_ACTION));
}
Expand Down Expand Up @@ -320,6 +324,14 @@ private void configureEnableAnnotationEditing(boolean enableAnnotationEditing) {
}
}

private void configureEnableFormEditing(boolean enableFormEditing) {
if (enableFormEditing) {
configuration.enableFormEditing();
} else {
configuration.disableFormEditing();
}
}

private void configureShowShareAction(boolean showShareAction) {
if (showShareAction) {
configuration.setEnabledShareFeatures(ShareFeatures.all());
Expand Down
43 changes: 35 additions & 8 deletions android/src/main/java/com/pspdfkit/react/ReactPdfViewManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,9 @@
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.pspdfkit.annotations.Annotation;
import com.pspdfkit.configuration.activity.PdfActivityConfiguration;
import com.pspdfkit.preferences.PSPDFKitPreferences;
import com.pspdfkit.react.events.PdfViewAnnotationChangedEvent;
import com.pspdfkit.react.events.PdfViewAnnotationTappedEvent;
import com.pspdfkit.react.events.PdfViewDataReturnedEvent;
import com.pspdfkit.react.events.PdfViewDocumentLoadFailedEvent;
import com.pspdfkit.react.events.PdfViewDocumentSaveFailedEvent;
import com.pspdfkit.react.events.PdfViewDocumentSavedEvent;
import com.pspdfkit.react.events.PdfViewStateChangedEvent;
import com.pspdfkit.react.menu.ReactGroupingRule;
import com.pspdfkit.views.PdfView;

Expand Down Expand Up @@ -56,6 +51,11 @@ public class ReactPdfViewManager extends ViewGroupManager<PdfView> {

private CompositeDisposable annotationDisposables = new CompositeDisposable();

/**
* Value of the form editing enabled property so we can make sure configuration does not override it.
*/
private boolean isFormEditingEnabled = true;

@Override
public String getName() {
return "RCTPSPDFKitView";
Expand Down Expand Up @@ -112,9 +112,36 @@ public void setFragmentTag(PdfView view, @NonNull String fragmentTag) {
}

@ReactProp(name = "configuration")
public void setConfiguration(PdfView view, @NonNull ReadableMap configuration) {
public void setConfiguration(@NonNull PdfView view, @NonNull ReadableMap configuration) {
ConfigurationAdapter configurationAdapter = new ConfigurationAdapter(view.getContext(), configuration);
view.setConfiguration(configurationAdapter.build());
view.setConfiguration(updateReactPropsInConfiguration(configurationAdapter.build()));
}

@ReactProp(name = "enableFormEditing")
public void setEnableFormEditing(@NonNull PdfView view, boolean enableFormEditing) {
this.isFormEditingEnabled = enableFormEditing;

final PdfActivityConfiguration configuration = view.getConfiguration();
final PdfActivityConfiguration updatedConfiguration = updateReactPropsInConfiguration(configuration);
if (!updatedConfiguration.equals(configuration)) {
view.setConfiguration(updatedConfiguration);
}
}

@NonNull
private PdfActivityConfiguration updateReactPropsInConfiguration(@NonNull PdfActivityConfiguration configuration) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reasoning behind this method is that iOS defines the enableFormEditing property as well as the configuration. Since the order of react props application is not guaranteed, we need to make sure that the property value is not overriden by the configuration.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On iOS, the last used option overrides the previous one. For example, if the user sets a value in the configuration, and they later override it in the prop, we will use the most recent one.

// Check if the configuration needs update according to current react properties.
if (configuration.getConfiguration().isFormEditingEnabled() == isFormEditingEnabled) {
return configuration;
}

PdfActivityConfiguration.Builder updatedConfigurationBuilder = new PdfActivityConfiguration.Builder(configuration);
if (isFormEditingEnabled) {
updatedConfigurationBuilder.enableFormEditing();
} else {
updatedConfigurationBuilder.disableFormEditing();
}
return updatedConfigurationBuilder.build();
}

@ReactProp(name = "document")
Expand Down
5 changes: 5 additions & 0 deletions android/src/main/java/com/pspdfkit/views/PdfView.java
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,11 @@ public void setConfiguration(PdfActivityConfiguration configuration) {
setupFragment();
}

@NonNull
public PdfActivityConfiguration getConfiguration() {
return this.configuration;
}

public void setDocument(@Nullable String documentPath) {
if (documentPath == null) {
this.document = null;
Expand Down
6 changes: 6 additions & 0 deletions ios/RCTPSPDFKit/Converters/RCTConvert+PSPDFConfiguration.m
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,12 @@ - (void)setupFromJSON:(id)json {
self.editableAnnotationTypes = nil;
}

if (dictionary[@"enableFormEditing"] && ![RCTConvert BOOL:dictionary[@"enableFormEditing"]]) {
NSMutableSet *editableTypes = [self.editableAnnotationTypes mutableCopy];
[editableTypes removeObject:PSPDFAnnotationStringWidget];
self.editableAnnotationTypes = [editableTypes copy];
}

if (dictionary[@"sharingConfigurations"]) {
[self setRCTSharingConfigurations:[RCTConvert NSArray:dictionary[@"sharingConfigurations"]]];
}
Expand Down