package com.reactlibrary; import android.support.annotation.NonNull; import android.view.View; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.MapBuilder; import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.events.RCTEventEmitter; import com.sketchView.SketchFile; import com.sketchView.SketchViewContainer; import java.io.IOException; import java.util.Locale; import java.util.Map; import javax.annotation.Nullable; public class RNSketchViewManager extends SimpleViewManager<SketchViewContainer> { private static final String RN_PACKAGE = "RNSketchView"; private static final String PROPS_SELECTED_TOOL = "selectedTool"; private static final String PROPS_LOCAL_SOURCE_IMAGE_PATH = "localSourceImagePath"; private static final int COMMAND_CLEAR_SKETCH = 321; private static final int COMMAND_SAVE_SKETCH = 780; private static final int COMMAND_CHANGE_TOOL = 406; @Override public String getName() { return RN_PACKAGE; } @Override protected SketchViewContainer createViewInstance(ThemedReactContext reactContext) { return new SketchViewContainer(reactContext); } @ReactProp(name = PROPS_SELECTED_TOOL) public void setSelectedTool(SketchViewContainer viewContainer, @NonNull Integer toolId) { viewContainer.sketchView.setToolType(toolId); } @ReactProp(name = PROPS_LOCAL_SOURCE_IMAGE_PATH) public void setLocalSourceImagePath(SketchViewContainer viewContainer, @NonNull String localSourceImagePath) { viewContainer.openSketchFile(localSourceImagePath); } @Nullable @Override public Map<String, Integer> getCommandsMap() { return MapBuilder.of( "clearSketch", COMMAND_CLEAR_SKETCH, "saveSketch", COMMAND_SAVE_SKETCH, "changeTool", COMMAND_CHANGE_TOOL); } @Override public void receiveCommand(SketchViewContainer root, int commandId, @Nullable ReadableArray args) { Assertions.assertNotNull(root); switch (commandId) { case COMMAND_CLEAR_SKETCH: root.sketchView.clear(); return; case COMMAND_CHANGE_TOOL: Assertions.assertNotNull(args); int toolId = args.getInt(0); root.sketchView.setToolType(toolId); return; case COMMAND_SAVE_SKETCH: try { SketchFile sketchFile = root.saveToLocalCache(); onSaveSketch(root, sketchFile); return; } catch (IOException e) { e.printStackTrace(); } default: throw new IllegalArgumentException(String.format(Locale.ENGLISH, "Unsupported command %d.", commandId)); } } private void onSaveSketch(SketchViewContainer root, SketchFile sketchFile) { WritableMap event = Arguments.createMap(); event.putString("localFilePath", sketchFile.localFilePath); event.putInt("imageWidth", sketchFile.width); event.putInt("imageHeight", sketchFile.height); sendEvent(root, "onSaveSketch", event); } private void sendEvent(View view, String eventType, WritableMap event) { WritableMap nativeEvent = Arguments.createMap(); nativeEvent.putString("type", eventType); nativeEvent.putMap("event", event); ReactContext reactContext = (ReactContext) view.getContext(); reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(view.getId(), "topChange", nativeEvent); } }