Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions android/src/main/java/com/pspdfkit/react/ReactPdfViewManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
import com.facebook.react.uimanager.UIManagerModule;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.pspdfkit.react.events.PdfViewAnnotationChangedEvent;
import com.pspdfkit.react.events.PdfViewAnnotationTappedEvent;
import com.pspdfkit.react.events.PdfViewDocumentSavedEvent;
import com.pspdfkit.react.events.PdfViewStateChangedEvent;
import com.pspdfkit.views.PdfView;

Expand All @@ -25,6 +28,7 @@ public class ReactPdfViewManager extends ViewGroupManager<PdfView> {

public static final int COMMAND_ENTER_ANNOTATION_CREATION_MODE = 1;
public static final int COMMAND_EXIT_CURRENTLY_ACTIVE_MODE = 2;
public static final int COMMAND_SAVE_CURRENT_DOCUMENT = 3;

@Override
public String getName() {
Expand Down Expand Up @@ -58,7 +62,9 @@ public Map<String, Integer> getCommandsMap() {
"enterAnnotationCreationMode",
COMMAND_ENTER_ANNOTATION_CREATION_MODE,
"exitCurrentlyActiveMode",
COMMAND_EXIT_CURRENTLY_ACTIVE_MODE);
COMMAND_EXIT_CURRENTLY_ACTIVE_MODE,
"saveCurrentDocument",
COMMAND_SAVE_CURRENT_DOCUMENT);
}

@ReactProp(name = "fragmentTag")
Expand All @@ -82,10 +88,18 @@ public void setPageIndex(PdfView view, int pageIndex) {
view.setPageIndex(pageIndex);
}

@ReactProp(name = "disableDefaultActionForTappedAnnotations")
public void setDisableDefaultActionForTappedAnnotations(PdfView view, boolean disableDefaultActionForTappedAnnotations) {
view.setDisableDefaultActionForTappedAnnotations(disableDefaultActionForTappedAnnotations);
}

@Nullable
@Override
public Map getExportedCustomDirectEventTypeConstants() {
return MapBuilder.of(PdfViewStateChangedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onStateChanged"));
return MapBuilder.of(PdfViewStateChangedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onStateChanged"),
PdfViewDocumentSavedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onDocumentSaved"),
PdfViewAnnotationTappedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onAnnotationTapped"),
PdfViewAnnotationChangedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onAnnotationsChanged"));
}

@Override
Expand All @@ -97,6 +111,9 @@ public void receiveCommand(PdfView root, int commandId, @Nullable ReadableArray
case COMMAND_EXIT_CURRENTLY_ACTIVE_MODE:
root.exitCurrentlyActiveMode();
break;
case COMMAND_SAVE_CURRENT_DOCUMENT:
root.saveCurrentDocument();
break;
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.pspdfkit.react.events;

import android.support.annotation.IdRes;
import android.support.annotation.NonNull;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.pspdfkit.annotations.Annotation;
import com.pspdfkit.react.helper.JsonUtilities;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Event sent by the {@link com.pspdfkit.views.PdfView} when an annotation was selected.
*/
public class PdfViewAnnotationChangedEvent extends Event<PdfViewAnnotationChangedEvent> {

public static final String EVENT_NAME = "pdfViewAnnotationChanged";
public static final String EVENT_TYPE_CHANGED = "changed";
public static final String EVENT_TYPE_ADDED = "added";
public static final String EVENT_TYPE_REMOVED = "removed";

@NonNull
private final String eventType;

@NonNull
private final Annotation annotation;

public PdfViewAnnotationChangedEvent(@IdRes int viewId, @NonNull String eventType, @NonNull Annotation annotation) {
super(viewId);
this.eventType = eventType;
this.annotation = annotation;
}

@Override
public String getEventName() {
return EVENT_NAME;
}

@Override
public void dispatch(RCTEventEmitter rctEventEmitter) {
try {
Map<String, Object> map = new HashMap<>();
map.put("change", eventType);

Map<String, Object> annotationMap;
if (EVENT_TYPE_REMOVED.equalsIgnoreCase(eventType)) {
// For removed annotation we can't get the instant json so manually create something.
annotationMap = new HashMap<>();
annotationMap.put("name", annotation.getName());
annotationMap.put("creatorName", annotation.getCreator());
} else {
JSONObject instantJson = new JSONObject(annotation.toInstantJson());
annotationMap = JsonUtilities.jsonObjectToMap(instantJson);
}

List<Map<String, Object>> annotations = new ArrayList<>();
annotations.add(annotationMap);
map.put("annotations", annotations);

WritableMap eventData = Arguments.makeNativeMap(map);
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), eventData);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.pspdfkit.react.events;

import android.support.annotation.IdRes;
import android.support.annotation.NonNull;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.pspdfkit.annotations.Annotation;
import com.pspdfkit.react.helper.JsonUtilities;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Map;

/**
* Event sent by the {@link com.pspdfkit.views.PdfView} when an annotation was selected.
*/
public class PdfViewAnnotationTappedEvent extends Event<PdfViewAnnotationTappedEvent> {

public static final String EVENT_NAME = "pdfViewAnnotationTapped";

@NonNull
private final Annotation annotation;

public PdfViewAnnotationTappedEvent(@IdRes int viewId, @NonNull Annotation annotation) {
super(viewId);
this.annotation = annotation;
}

@Override
public String getEventName() {
return EVENT_NAME;
}

@Override
public void dispatch(RCTEventEmitter rctEventEmitter) {
try {
JSONObject instantJson = new JSONObject(annotation.toInstantJson());
Map<String, Object> map = JsonUtilities.jsonObjectToMap(instantJson);
WritableMap eventData = Arguments.makeNativeMap(map);
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), eventData);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.pspdfkit.react.events;

import android.support.annotation.IdRes;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;

/**
* Event sent by the {@link com.pspdfkit.views.PdfView} when the document was saved.
*/
public class PdfViewDocumentSavedEvent extends Event<PdfViewDocumentSavedEvent> {

public static final String EVENT_NAME = "pdfViewDocumentSaved";

public PdfViewDocumentSavedEvent(@IdRes int viewId) {
super(viewId);
}

@Override
public String getEventName() {
return EVENT_NAME;
}

@Override
public void dispatch(RCTEventEmitter rctEventEmitter) {
WritableMap eventData = Arguments.createMap();
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), eventData);
}
}
49 changes: 49 additions & 0 deletions android/src/main/java/com/pspdfkit/react/helper/JsonUtilities.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.pspdfkit.react.helper;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class JsonUtilities {

/**
* Converts the given {@link JSONObject} to a {@link Map}.
*/
public static Map<String, Object> jsonObjectToMap(JSONObject object) throws JSONException {
Map<String, Object> map = new HashMap<>(object.length());

Iterator<String> keysItr = object.keys();
while (keysItr.hasNext()) {
String key = keysItr.next();
Object value = object.get(key);

if (value instanceof JSONArray) {
value = toList((JSONArray) value);
} else if (value instanceof JSONObject) {
value = jsonObjectToMap((JSONObject) value);
}
map.put(key, value);
}
return map;
}

private static List<Object> toList(JSONArray array) throws JSONException {
List<Object> list = new ArrayList<>(array.length());
for (int i = 0; i < array.length(); i++) {
Object value = array.get(i);
if (value instanceof JSONArray) {
value = toList((JSONArray) value);
} else if (value instanceof JSONObject) {
value = jsonObjectToMap((JSONObject) value);
}
list.add(value);
}
return list;
}
}
24 changes: 19 additions & 5 deletions android/src/main/java/com/pspdfkit/views/PdfView.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@
import android.util.AttributeSet;
import android.view.Choreographer;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.facebook.react.uimanager.events.EventDispatcher;
Expand Down Expand Up @@ -51,6 +49,7 @@ public class PdfView extends FrameLayout {

private FrameLayout container;
private PdfViewModeController pdfViewModeController;
private PdfViewDocumentListener pdfViewDocumentListener;

private PdfThumbnailBar pdfThumbnailBar;

Expand Down Expand Up @@ -114,6 +113,8 @@ public void doFrame(long frameTimeNanos) {
public void inject(FragmentManager fragmentManager, EventDispatcher eventDispatcher) {
this.fragmentManager = fragmentManager;
this.eventDispatcher = eventDispatcher;
pdfViewDocumentListener = new PdfViewDocumentListener(this,
eventDispatcher);
}

public void setFragmentTag(String fragmentTag) {
Expand Down Expand Up @@ -152,14 +153,18 @@ public void setPageIndex(int pageIndex) {
setupFragment();
}

public void setDisableDefaultActionForTappedAnnotations(boolean disableDefaultActionForTappedAnnotations) {
pdfViewDocumentListener.setDisableDefaultActionForTappedAnnotations(disableDefaultActionForTappedAnnotations);
}

private void setupFragment() {
if (fragmentTag != null && configuration != null && document != null) {
PdfFragment pdfFragment = (PdfFragment) fragmentManager.findFragmentByTag(fragmentTag);
if (pdfFragment == null) {
pdfFragment = PdfFragment.newInstance(document, this.configuration.getConfiguration());
prepareFragment(pdfFragment);
} else {
ViewGroup parent = (ViewGroup) pdfFragment.getView().getParent();
View fragmentView = pdfFragment.getView();
if (pdfFragment.getDocument() != null && !pdfFragment.getDocument().getUid().equals(document.getUid())) {
fragmentManager.beginTransaction()
.remove(pdfFragment)
Expand All @@ -168,7 +173,7 @@ private void setupFragment() {
// The document changed create a new PdfFragment.
pdfFragment = PdfFragment.newInstance(document, this.configuration.getConfiguration());
prepareFragment(pdfFragment);
} else if (parent != this) {
} else if (fragmentView != null && fragmentView.getParent() != this) {
// We only need to detach the fragment if the parent view changed.
pdfViewModeController.resetToolbars();
fragmentManager.beginTransaction()
Expand Down Expand Up @@ -206,13 +211,16 @@ public void onPageChanged(@NonNull PdfDocument document, int pageIndex) {
pdfFragment.addOnAnnotationEditingModeChangeListener(pdfViewModeController);
pdfFragment.addOnFormElementEditingModeChangeListener(pdfViewModeController);
pdfFragment.addOnTextSelectionModeChangeListener(pdfViewModeController);
pdfFragment.addDocumentListener(pdfViewDocumentListener);
pdfFragment.addOnAnnotationSelectedListener(pdfViewDocumentListener);
pdfFragment.addOnAnnotationUpdatedListener(pdfViewDocumentListener);

setupThumbnailBar(pdfFragment);

fragmentManager.beginTransaction()
.add(pdfFragment, fragmentTag)
.commitNow();
View fragmentView = pdfFragment.onCreateView(LayoutInflater.from(getContext()), this, null);
View fragmentView = pdfFragment.getView();
addView(fragmentView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}

Expand Down Expand Up @@ -298,4 +306,10 @@ public void exitCurrentlyActiveMode() {
fragment.exitCurrentlyActiveMode();
}
}

public void saveCurrentDocument() {
if (fragment != null) {
fragment.save();
}
}
}
Loading