package org.reactnative.camera; import android.content.Context; import org.reactnative.facedetector.RNFaceDetector; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableArray; import com.google.android.cameraview.AspectRatio; import com.google.zxing.BarcodeFormat; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.annotation.Nullable; public class CameraModule extends ReactContextBaseJavaModule { private static final String TAG = "CameraModule"; private static ReactApplicationContext mReactContext; // private static ScopedContext mScopedContext; static final int VIDEO_2160P = 0; static final int VIDEO_1080P = 1; static final int VIDEO_720P = 2; static final int VIDEO_480P = 3; static final int VIDEO_4x3 = 4; public static final Map VALID_BARCODE_TYPES = Collections.unmodifiableMap(new HashMap() { { put("aztec", BarcodeFormat.AZTEC.toString()); put("ean13", BarcodeFormat.EAN_13.toString()); put("ean8", BarcodeFormat.EAN_8.toString()); put("qr", BarcodeFormat.QR_CODE.toString()); put("pdf417", BarcodeFormat.PDF_417.toString()); put("upc_e", BarcodeFormat.UPC_E.toString()); put("datamatrix", BarcodeFormat.DATA_MATRIX.toString()); put("code39", BarcodeFormat.CODE_39.toString()); put("code93", BarcodeFormat.CODE_93.toString()); put("interleaved2of5", BarcodeFormat.ITF.toString()); put("codabar", BarcodeFormat.CODABAR.toString()); put("code128", BarcodeFormat.CODE_128.toString()); put("maxicode", BarcodeFormat.MAXICODE.toString()); put("rss14", BarcodeFormat.RSS_14.toString()); put("rssexpanded", BarcodeFormat.RSS_EXPANDED.toString()); put("upc_a", BarcodeFormat.UPC_A.toString()); put("upc_ean", BarcodeFormat.UPC_EAN_EXTENSION.toString()); } }); public CameraModule(ReactApplicationContext reactContext) { super(reactContext); mReactContext = reactContext; } public static ReactApplicationContext getReactContextSingleton() { return mReactContext; } public static Context getScopedContextSingleton() { return mReactContext; } @Override public String getName() { return "RNCameraModule"; } @Nullable @Override public Map getConstants() { return Collections.unmodifiableMap(new HashMap() { { put("Type", getTypeConstants()); put("FlashMode", getFlashModeConstants()); put("AutoFocus", getAutoFocusConstants()); put("WhiteBalance", getWhiteBalanceConstants()); put("VideoQuality", getVideoQualityConstants()); put("BarCodeType", getBarCodeConstants()); put("FaceDetection", Collections.unmodifiableMap(new HashMap() { { put("Mode", getFaceDetectionModeConstants()); put("Landmarks", getFaceDetectionLandmarksConstants()); put("Classifications", getFaceDetectionClassificationsConstants()); } private Map getFaceDetectionModeConstants() { return Collections.unmodifiableMap(new HashMap() { { put("fast", RNFaceDetector.FAST_MODE); put("accurate", RNFaceDetector.ACCURATE_MODE); } }); } private Map getFaceDetectionClassificationsConstants() { return Collections.unmodifiableMap(new HashMap() { { put("all", RNFaceDetector.ALL_CLASSIFICATIONS); put("none", RNFaceDetector.NO_CLASSIFICATIONS); } }); } private Map getFaceDetectionLandmarksConstants() { return Collections.unmodifiableMap(new HashMap() { { put("all", RNFaceDetector.ALL_LANDMARKS); put("none", RNFaceDetector.NO_LANDMARKS); } }); } })); } private Map getTypeConstants() { return Collections.unmodifiableMap(new HashMap() { { put("front", Constants.FACING_FRONT); put("back", Constants.FACING_BACK); } }); } private Map getFlashModeConstants() { return Collections.unmodifiableMap(new HashMap() { { put("off", Constants.FLASH_OFF); put("on", Constants.FLASH_ON); put("auto", Constants.FLASH_AUTO); put("torch", Constants.FLASH_TORCH); } }); } private Map getAutoFocusConstants() { return Collections.unmodifiableMap(new HashMap() { { put("on", true); put("off", false); } }); } private Map getWhiteBalanceConstants() { return Collections.unmodifiableMap(new HashMap() { { put("auto", Constants.WB_AUTO); put("cloudy", Constants.WB_CLOUDY); put("sunny", Constants.WB_SUNNY); put("shadow", Constants.WB_SHADOW); put("fluorescent", Constants.WB_FLUORESCENT); put("incandescent", Constants.WB_INCANDESCENT); } }); } private Map getVideoQualityConstants() { return Collections.unmodifiableMap(new HashMap() { { put("2160p", VIDEO_2160P); put("1080p", VIDEO_1080P); put("720p", VIDEO_720P); put("480p", VIDEO_480P); put("4:3", VIDEO_4x3); } }); } private Map getBarCodeConstants() { return VALID_BARCODE_TYPES; } }); } @ReactMethod public void takePicture(ReadableMap options, final Promise promise) { CameraViewManager.getInstance().takePicture(options, promise); } @ReactMethod public void record(ReadableMap options, final Promise promise) { CameraViewManager.getInstance().record(options, promise); } @ReactMethod public void stopRecording() { CameraViewManager.getInstance().stopRecording(); } @ReactMethod public void getSupportedRatios(final Promise promise) { WritableArray result = Arguments.createArray(); Set ratios = CameraViewManager.getInstance().getSupportedRatios(); if (ratios != null) { for (AspectRatio ratio : ratios) { result.pushString(ratio.toString()); } promise.resolve(result); } else { promise.reject("E_CAMERA_UNAVAILABLE", "Camera is not running"); } } }