From f8c5da4d808c0e3c58d2a266964231fdc34d3445 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Tue, 13 Mar 2018 12:00:53 +0200 Subject: [PATCH 01/17] orientation fix --- .../camera/barcode/BarcodeScanner.java | 35 +++++++------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java index 7f57fef..b1ada94 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java @@ -103,15 +103,10 @@ public class BarcodeScanner { int width = size.width; int height = size.height; - if (DisplayUtils.getScreenOrientation(context) == Configuration.ORIENTATION_PORTRAIT) { - int rotationCount = CameraViewManager.getRotationCount(); - if (rotationCount == 1 || rotationCount == 3) { - int tmp = width; - width = height; - height = tmp; - } - data = getRotatedData(data, camera); - } + int tmp = width; + width = height; + height = tmp; + data = getRotatedData(data, camera); Result rawResult = null; PlanarYUVLuminanceSource source = buildLuminanceSource(data, width, height); @@ -196,21 +191,15 @@ public class BarcodeScanner { int width = size.width; int height = size.height; - int rotationCount = CameraViewManager.getRotationCount(); - - if (rotationCount == 1 || rotationCount == 3) { - for (int i = 0; i < rotationCount; i++) { - byte[] rotatedData = new byte[data.length]; - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - rotatedData[x * height + height - y - 1] = data[x + y * width]; - } - data = rotatedData; - int tmp = width; - width = height; - height = tmp; - } + byte[] rotatedData = new byte[data.length]; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + rotatedData[x * height + height - y - 1] = data[x + y * width]; } + data = rotatedData; + int tmp = width; + width = height; + height = tmp; return data; } From e6c94c454ad270517a9b94818e857fbd43c985ab Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Tue, 13 Mar 2018 12:07:44 +0200 Subject: [PATCH 02/17] stop preview --- .../com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java index b1ada94..c500d3e 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java @@ -151,8 +151,7 @@ public class BarcodeScanner { ResultHandler tmpResultHandler = mResultHandler; mResultHandler = null; - //TODO:decide if I need to do this - //stopCameraPreview(); + camera.stopPreview(); if (tmpResultHandler != null) { tmpResultHandler.handleResult(finalRawResult); } From 450e190f9b07abf01296bc269709ea57dde07613 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Tue, 13 Mar 2018 15:24:03 +0200 Subject: [PATCH 03/17] handle rotate data --- .../camera/barcode/BarcodeScanner.java | 70 ++++++++++--------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java index c500d3e..58c6723 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java @@ -108,37 +108,9 @@ public class BarcodeScanner { height = tmp; data = getRotatedData(data, camera); - Result rawResult = null; - PlanarYUVLuminanceSource source = buildLuminanceSource(data, width, height); + LuminanceSource source = buildLuminanceSource(data, width, height); - if (source != null) { - BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); - try { - rawResult = mMultiFormatReader.decodeWithState(bitmap); - } catch (ReaderException re) { - // continue - } catch (NullPointerException npe) { - // This is terrible - } catch (ArrayIndexOutOfBoundsException ignored) { - - } finally { - mMultiFormatReader.reset(); - } - - if (rawResult == null) { - LuminanceSource invertedSource = source.invert(); - bitmap = new BinaryBitmap(new HybridBinarizer(invertedSource)); - try { - rawResult = mMultiFormatReader.decodeWithState(bitmap); - } catch (NotFoundException e) { - // continue - } finally { - mMultiFormatReader.reset(); - } - } - } - - final Result finalRawResult = rawResult; + final Result finalRawResult = getFinalResult(source); if (finalRawResult != null) { Handler handler = new Handler(Looper.getMainLooper()); @@ -166,16 +138,48 @@ public class BarcodeScanner { } } - private PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) { + @Nullable + private Result getFinalResult(LuminanceSource source) { + Result rawResult = null; + if (source != null) { + BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); + try { + rawResult = mMultiFormatReader.decodeWithState(bitmap); + } catch (ReaderException re) { + // continue + } catch (NullPointerException npe) { + // This is terrible + } catch (ArrayIndexOutOfBoundsException ignored) { + + } finally { + mMultiFormatReader.reset(); + } + + if (rawResult == null && source.isRotateSupported()) { + LuminanceSource rotatedSource = source.rotateCounterClockwise(); + bitmap = new BinaryBitmap(new HybridBinarizer(rotatedSource)); + try { + rawResult = mMultiFormatReader.decodeWithState(bitmap); + } catch (NotFoundException e) { + // continue + } finally { + mMultiFormatReader.reset(); + } + } + } + return rawResult; + } + + private LuminanceSource buildLuminanceSource(byte[] data, int width, int height) { Rect rect = CameraViewManager.getFramingRectInPreview(width, height); if (rect == null) { return null; } // Go ahead and assume it's YUV rather than die. - PlanarYUVLuminanceSource source = null; + LuminanceSource source = null; try { - source = new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top, + source = new RotateLuminanceSource(data, width, height, rect.left, rect.top, rect.width(), rect.height(), false); } catch(Exception e) { e.printStackTrace(); From d90e219f60075f4892f067487989b43fb64c48c7 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Tue, 13 Mar 2018 15:24:08 +0200 Subject: [PATCH 04/17] handle rotate data --- .../camera/barcode/RotateLuminanceSource.java | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java new file mode 100644 index 0000000..065c853 --- /dev/null +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java @@ -0,0 +1,162 @@ +package com.wix.RNCameraKit.camera.barcode; + +import android.util.Log; + +import com.google.zxing.LuminanceSource; + +import java.util.Arrays; + +public class RotateLuminanceSource extends LuminanceSource { + + private static final int THUMBNAIL_SCALE_FACTOR = 2; + + private final byte[] yuvData; + private final int dataWidth; + private final int dataHeight; + private final int left; + private final int top; + + public RotateLuminanceSource(byte[] yuvData, + int dataWidth, + int dataHeight, + int left, + int top, + int width, + int height, + boolean reverseHorizontal) { + super(width, height); + + if (left + width > dataWidth || top + height > dataHeight) { + throw new IllegalArgumentException("Crop rectangle does not fit within image data."); + } + + this.yuvData = yuvData; + this.dataWidth = dataWidth; + this.dataHeight = dataHeight; + this.left = left; + this.top = top; + if (reverseHorizontal) { + reverseHorizontal(width, height); + } + } + + @Override + public byte[] getRow(int y, byte[] row) { + if (y < 0 || y >= getHeight()) { + throw new IllegalArgumentException("Requested row is outside the image: " + y); + } + int width = getWidth(); + if (row == null || row.length < width) { + row = new byte[width]; + } + int offset = (y + top) * dataWidth + left; + System.arraycopy(yuvData, offset, row, 0, width); + return row; + } + + @Override + public byte[] getMatrix() { + int width = getWidth(); + int height = getHeight(); + + // If the caller asks for the entire underlying image, save the copy and give them the + // original data. The docs specifically warn that result.length must be ignored. + if (width == dataWidth && height == dataHeight) { + return yuvData; + } + + int area = width * height; + byte[] matrix = new byte[area]; + int inputOffset = top * dataWidth + left; + + // If the width matches the full width of the underlying data, perform a single copy. + if (width == dataWidth) { + System.arraycopy(yuvData, inputOffset, matrix, 0, area); + return matrix; + } + + // Otherwise copy one cropped row at a time. + for (int y = 0; y < height; y++) { + int outputOffset = y * width; + System.arraycopy(yuvData, inputOffset, matrix, outputOffset, width); + inputOffset += dataWidth; + } + return matrix; + } + + @Override + public boolean isCropSupported() { + return true; + } + + @Override + public LuminanceSource crop(int left, int top, int width, int height) { + return new RotateLuminanceSource(yuvData, + dataWidth, + dataHeight, + this.left + left, + this.top + top, + width, + height, + false); + } + + public int[] renderThumbnail() { + int width = getWidth() / THUMBNAIL_SCALE_FACTOR; + int height = getHeight() / THUMBNAIL_SCALE_FACTOR; + int[] pixels = new int[width * height]; + byte[] yuv = yuvData; + int inputOffset = top * dataWidth + left; + + for (int y = 0; y < height; y++) { + int outputOffset = y * width; + for (int x = 0; x < width; x++) { + int grey = yuv[inputOffset + x * THUMBNAIL_SCALE_FACTOR] & 0xff; + pixels[outputOffset + x] = 0xFF000000 | (grey * 0x00010101); + } + inputOffset += dataWidth * THUMBNAIL_SCALE_FACTOR; + } + return pixels; + } + + /** + * @return width of image from {@link #renderThumbnail()} + */ + public int getThumbnailWidth() { + return getWidth() / THUMBNAIL_SCALE_FACTOR; + } + + /** + * @return height of image from {@link #renderThumbnail()} + */ + public int getThumbnailHeight() { + return getHeight() / THUMBNAIL_SCALE_FACTOR; + } + + private void reverseHorizontal(int width, int height) { + byte[] yuvData = this.yuvData; + for (int y = 0, rowStart = top * dataWidth + left; y < height; y++, rowStart += dataWidth) { + int middle = rowStart + width / 2; + for (int x1 = rowStart, x2 = rowStart + width - 1; x1 < middle; x1++, x2--) { + byte temp = yuvData[x1]; + yuvData[x1] = yuvData[x2]; + yuvData[x2] = temp; + } + } + } + + @Override + public boolean isRotateSupported() { + return true; + } + + @Override + public LuminanceSource rotateCounterClockwise() { + byte[] rotatedData = new byte[yuvData.length]; + for (int y = 0; y < dataHeight; y++) { + for (int x = 0; x < dataWidth; x++) + rotatedData[x * dataHeight + dataHeight - y - 1] = yuvData[x + y * dataWidth]; + } + return new RotateLuminanceSource(rotatedData, dataHeight, dataWidth, top, (dataWidth - left - getWidth()), getHeight(), getWidth(), false); + } +} From f641546fc0656b9e8e44127382dda8bc56e0990b Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Tue, 13 Mar 2018 17:24:38 +0200 Subject: [PATCH 05/17] fix --- .../com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java index 58c6723..b95e233 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java @@ -3,6 +3,7 @@ package com.wix.RNCameraKit.camera.barcode; import android.content.Context; import android.content.res.Configuration; +import android.support.annotation.Nullable; import android.graphics.Rect; import android.hardware.Camera; import android.os.Handler; @@ -93,7 +94,7 @@ public class BarcodeScanner { mMultiFormatReader.setHints(hints); } - public void onPreviewFrame(byte[] data, Camera camera) { + public void onPreviewFrame(byte[] data, final Camera camera) { if(mResultHandler == null) { return; } From 21a38b19ae0d38f875cff1dbfb34ce9324c94882 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Wed, 14 Mar 2018 11:54:06 +0200 Subject: [PATCH 06/17] non stop barcode flow --- .../RNCameraKit/camera/CameraViewManager.java | 11 ++- .../camera/barcode/BarcodeScanner.java | 99 ++++++++----------- example/src/BarcodeScreen.js | 24 ++--- 3 files changed, 55 insertions(+), 79 deletions(-) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java index 05be099..1443a98 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java @@ -137,6 +137,7 @@ public class CameraViewManager extends SimpleViewManager { } private static void releaseCamera() { + camera.setPreviewCallback(null); cameraReleased.set(true); camera.release(); } @@ -161,10 +162,10 @@ public class CameraViewManager extends SimpleViewManager { try { camera.stopPreview(); camera.setPreviewDisplay(cameraViews.peek().getHolder()); - if (shouldScan) { - camera.setOneShotPreviewCallback(previewCallback); - } camera.startPreview(); + if (shouldScan) { + camera.setPreviewCallback(previewCallback); + } } catch (IOException | RuntimeException e) { e.printStackTrace(); } @@ -274,7 +275,7 @@ public class CameraViewManager extends SimpleViewManager { } public static void setBarcodeScanner() { - scanner = new BarcodeScanner(reactContext, previewCallback); + scanner = new BarcodeScanner(); scanner.setResultHandler(new BarcodeScanner.ResultHandler() { @Override public void handleResult(Result rawResult) { @@ -298,7 +299,7 @@ public class CameraViewManager extends SimpleViewManager { public void setShouldScan(CameraView view, boolean scanBarcode) { shouldScan = scanBarcode; if (shouldScan && camera != null) { - camera.setOneShotPreviewCallback(previewCallback); + camera.setPreviewCallback(previewCallback); } } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java index b95e233..2f73d4e 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java @@ -2,13 +2,11 @@ package com.wix.RNCameraKit.camera.barcode; import android.content.Context; -import android.content.res.Configuration; -import android.support.annotation.Nullable; import android.graphics.Rect; import android.hardware.Camera; import android.os.Handler; import android.os.Looper; -import android.util.AttributeSet; +import android.support.annotation.Nullable; import android.util.Log; import com.google.zxing.BarcodeFormat; @@ -17,7 +15,6 @@ import com.google.zxing.DecodeHintType; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; -import com.google.zxing.PlanarYUVLuminanceSource; import com.google.zxing.ReaderException; import com.google.zxing.Result; import com.google.zxing.common.HybridBinarizer; @@ -29,8 +26,6 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; -import me.dm7.barcodescanner.core.DisplayUtils; - public class BarcodeScanner { public interface ResultHandler { @@ -40,10 +35,7 @@ public class BarcodeScanner { private MultiFormatReader mMultiFormatReader; public static final List ALL_FORMATS = new ArrayList<>(); private List mFormats; - private ResultHandler mResultHandler; - - private Context context; - private Camera.PreviewCallback previewCallback; + private ResultHandler resultHandler; static { ALL_FORMATS.add(BarcodeFormat.AZTEC); @@ -65,9 +57,7 @@ public class BarcodeScanner { ALL_FORMATS.add(BarcodeFormat.UPC_EAN_EXTENSION); } - public BarcodeScanner(Context context, Camera.PreviewCallback previewCallback) { - this.context = context; - this.previewCallback = previewCallback; + public BarcodeScanner() { initMultiFormatReader(); } @@ -77,25 +67,25 @@ public class BarcodeScanner { } public void setResultHandler(ResultHandler resultHandler) { - mResultHandler = resultHandler; + this.resultHandler = resultHandler; } public Collection getFormats() { - if(mFormats == null) { + if (mFormats == null) { return ALL_FORMATS; } return mFormats; } private void initMultiFormatReader() { - Map hints = new EnumMap<>(DecodeHintType.class); + Map hints = new EnumMap<>(DecodeHintType.class); hints.put(DecodeHintType.POSSIBLE_FORMATS, getFormats()); mMultiFormatReader = new MultiFormatReader(); mMultiFormatReader.setHints(hints); } public void onPreviewFrame(byte[] data, final Camera camera) { - if(mResultHandler == null) { + if (resultHandler == null) { return; } try { @@ -118,22 +108,13 @@ public class BarcodeScanner { handler.post(new Runnable() { @Override public void run() { - // Stopping the preview can take a little long. - // So we want to set result handler to null to discard subsequent calls to - // onPreviewFrame. - ResultHandler tmpResultHandler = mResultHandler; - mResultHandler = null; - - camera.stopPreview(); - if (tmpResultHandler != null) { - tmpResultHandler.handleResult(finalRawResult); + if (resultHandler != null) { + resultHandler.handleResult(finalRawResult); } } }); - } else { - camera.setOneShotPreviewCallback(previewCallback); } - } catch(RuntimeException e) { + } catch (RuntimeException e) { // TODO: Terrible hack. It is possible that this method is invoked after camera is released. Log.w("CameraKit", e.toString()); } @@ -167,44 +148,44 @@ public class BarcodeScanner { mMultiFormatReader.reset(); } } - } + } return rawResult; } private LuminanceSource buildLuminanceSource(byte[] data, int width, int height) { - Rect rect = CameraViewManager.getFramingRectInPreview(width, height); - if (rect == null) { - return null; - } - // Go ahead and assume it's YUV rather than die. - LuminanceSource source = null; + Rect rect = CameraViewManager.getFramingRectInPreview(width, height); + if (rect == null) { + return null; + } + // Go ahead and assume it's YUV rather than die. + LuminanceSource source = null; - try { - source = new RotateLuminanceSource(data, width, height, rect.left, rect.top, - rect.width(), rect.height(), false); - } catch(Exception e) { - e.printStackTrace(); - } + try { + source = new RotateLuminanceSource(data, width, height, rect.left, rect.top, + rect.width(), rect.height(), false); + } catch (Exception e) { + e.printStackTrace(); + } - return source; - } + return source; + } private static byte[] getRotatedData(byte[] data, Camera camera) { - Camera.Parameters parameters = camera.getParameters(); - Camera.Size size = parameters.getPreviewSize(); - int width = size.width; - int height = size.height; + Camera.Parameters parameters = camera.getParameters(); + Camera.Size size = parameters.getPreviewSize(); + int width = size.width; + int height = size.height; - byte[] rotatedData = new byte[data.length]; - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) - rotatedData[x * height + height - y - 1] = data[x + y * width]; - } - data = rotatedData; - int tmp = width; - width = height; - height = tmp; + byte[] rotatedData = new byte[data.length]; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) + rotatedData[x * height + height - y - 1] = data[x + y * width]; + } + data = rotatedData; + int tmp = width; + width = height; + height = tmp; - return data; - } + return data; + } } diff --git a/example/src/BarcodeScreen.js b/example/src/BarcodeScreen.js index 92bf19d..2288ce5 100644 --- a/example/src/BarcodeScreen.js +++ b/example/src/BarcodeScreen.js @@ -7,17 +7,11 @@ import { CameraKitCameraScreen } from 'react-native-camera-kit'; export default class CameraScreen extends Component { - - onBottomButtonPressed(event) { - const captureImages = JSON.stringify(event.captureImages); - Alert.alert( - `${event.type} button pressed`, - `${captureImages}`, - [ - { text: 'OK', onPress: () => console.log('OK Pressed') }, - ], - { cancelable: false } - ) + showCodeAlert = ({ nativeEvent: { codeStringValue } }) => { + if (this.codeStringValue !== codeStringValue) { + this.codeStringValue = codeStringValue; + Alert.alert(`Qr code found ${this.codeStringValue} `) + } } render() { @@ -34,12 +28,12 @@ export default class CameraScreen extends Component { scanBarcode={true} laserColor={"blue"} frameColor={"yellow"} - - onReadCode={((event) => Alert.alert(`Qr code found ${event.nativeEvent.codeStringValue} `))} - hideControls={true} + + onReadCode={this.showCodeAlert} + hideControls={true} // offsetForScannerFrame = {10} // heightForScannerFrame = {300} - colorForScannerFrame = {'blue'} + colorForScannerFrame={'blue'} /> ); } From 18f54e919e2ee22b75a297291f0ac264cb946618 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Tue, 20 Mar 2018 12:57:21 +0200 Subject: [PATCH 07/17] WIP --- android/build.gradle | 3 +- .../wix/RNCameraKit/camera/CameraView.java | 49 +++++--------- .../camera/barcode/BarcodeFrame.java | 64 +++++++++++++++++++ .../camera/barcode/RotateLuminanceSource.java | 4 -- android/src/main/res/values/colors.xml | 4 ++ example-android/app/build.gradle | 4 +- .../java/com/camerakit/MainApplication.java | 8 +++ example-android/build.gradle | 2 + 8 files changed, 98 insertions(+), 40 deletions(-) create mode 100644 android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java create mode 100644 android/src/main/res/values/colors.xml diff --git a/android/build.gradle b/android/build.gradle index 802fc7b..375ddfc 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 25 - buildToolsVersion "25.0.1" + buildToolsVersion "26.0.2" defaultConfig { minSdkVersion 16 @@ -22,6 +22,5 @@ dependencies { compile 'com.facebook.react:react-native:+' compile 'com.android.support:recyclerview-v7:25.0.1' compile 'com.google.zxing:core:3.3.0' - compile 'me.dm7.barcodescanner:core:1.9.8' compile group: 'com.drewnoakes', name: 'metadata-extractor', version: '2.9.1' } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java index b78af34..8f5510f 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java @@ -1,6 +1,5 @@ package com.wix.RNCameraKit.camera; -import android.content.Context; import android.graphics.Color; import android.graphics.Rect; import android.hardware.Camera; @@ -12,9 +11,7 @@ import android.widget.FrameLayout; import com.facebook.react.uimanager.ThemedReactContext; import com.wix.RNCameraKit.Utils; - -import me.dm7.barcodescanner.core.IViewFinder; -import me.dm7.barcodescanner.core.ViewFinderView; +import com.wix.RNCameraKit.camera.barcode.BarcodeFrame; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; @@ -23,7 +20,7 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { private SurfaceView surface; private Rect viewFrameRect; - private IViewFinder viewFinder; + private BarcodeFrame barcodeFrame; @ColorInt private int frameColor = Color.GREEN; @ColorInt private int laserColor = Color.RED; @@ -60,8 +57,8 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { int actualPreviewHeight = getResources().getDisplayMetrics().heightPixels; int height = Utils.convertDeviceHeightToSupportedAspectRatio(actualPreviewWidth, actualPreviewHeight); surface.layout(0, 0, actualPreviewWidth, height); - if (viewFinder != null) { - ((View) viewFinder).layout(0, 0, actualPreviewWidth, height); + if (barcodeFrame != null) { + ((View) barcodeFrame).layout(0, 0, actualPreviewWidth, height); } } @@ -102,31 +99,17 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { } public void showFrame() { - viewFinder = createViewFinderView(getContext()); - addView((View) viewFinder); + barcodeFrame = new BarcodeFrame(getContext()); + addView(barcodeFrame); requestLayout(); } - private IViewFinder createViewFinderView(Context context) { - ViewFinderView viewFinderView = new ViewFinderView(context); - viewFinderView.setBorderColor(frameColor); - viewFinderView.setLaserColor(laserColor); - viewFinderView.setLaserEnabled(true); - viewFinderView.setBorderStrokeWidth(5); - viewFinderView.setBorderLineLength(60); - viewFinderView.setMaskColor(Color.argb(60, 0, 0, 0)); - - viewFinderView.setSquareViewFinder(true); - viewFinderView.setViewFinderOffset(11); - return viewFinderView; - } - public Rect getFramingRectInPreview(int previewWidth, int previewHeight) { if (viewFrameRect == null) { - if (viewFinder != null) { - Rect framingRect = viewFinder.getFramingRect(); - int viewFinderViewWidth = viewFinder.getWidth(); - int viewFinderViewHeight = viewFinder.getHeight(); + if (barcodeFrame != null) { + Rect framingRect = barcodeFrame.getFrameRect(); + int viewFinderViewWidth = barcodeFrame.getWidth(); + int viewFinderViewHeight = barcodeFrame.getHeight(); if (framingRect == null || viewFinderViewWidth == 0 || viewFinderViewHeight == 0) { return null; } @@ -153,15 +136,15 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { public void setFrameColor(@ColorInt int color) { this.frameColor = color; - if (viewFinder != null) { - viewFinder.setBorderColor(frameColor); - } +// if (barcodeFrame != null) { +// barcodeFrame.setBorderColor(frameColor); +// } } public void setLaserColor(@ColorInt int color) { this.laserColor = color; - if (viewFinder != null) { - viewFinder.setLaserColor(laserColor); - } +// if (barcodeFrame != null) { +// barcodeFrame.setLaserColor(laserColor); +// } } } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java new file mode 100644 index 0000000..c6e8e4a --- /dev/null +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java @@ -0,0 +1,64 @@ +package com.wix.RNCameraKit.camera.barcode; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.util.Log; +import android.view.View; + +import com.wix.RNCameraKit.R; + +public class BarcodeFrame extends View { + + private Paint dimPaint; + private Paint framePaint; + private Rect frameRect; + private int width; + private int height; + + public BarcodeFrame(Context context) { + super(context); + init(context); + } + + private void init(Context context) { + framePaint = new Paint(); + framePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + dimPaint = new Paint(); + dimPaint.setStyle(Paint.Style.FILL); + dimPaint.setColor(context.getResources().getColor(R.color.bg_dark)); + + frameRect = new Rect(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + width = getMeasuredWidth(); + height = getMeasuredHeight(); + int marginWidth = width / 3; + int marginHeight = height / 3; + + frameRect.left = marginWidth; + frameRect.right = width - marginWidth; + frameRect.top = marginHeight; + frameRect.bottom = height - marginHeight; + Log.i("NIGA", String.format("w=%d, h=%d ", width, height) + frameRect.toShortString()); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + canvas.drawRect(0, 0, width, height, dimPaint); + canvas.drawRect(frameRect, framePaint); + } + + public Rect getFrameRect() { + return frameRect; + } +} diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java index 065c853..b261d00 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java @@ -1,11 +1,7 @@ package com.wix.RNCameraKit.camera.barcode; -import android.util.Log; - import com.google.zxing.LuminanceSource; -import java.util.Arrays; - public class RotateLuminanceSource extends LuminanceSource { private static final int THUMBNAIL_SCALE_FACTOR = 2; diff --git a/android/src/main/res/values/colors.xml b/android/src/main/res/values/colors.xml new file mode 100644 index 0000000..0efcfa9 --- /dev/null +++ b/android/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #80000000 + \ No newline at end of file diff --git a/example-android/app/build.gradle b/example-android/app/build.gradle index 383e3ff..903b2c7 100644 --- a/example-android/app/build.gradle +++ b/example-android/app/build.gradle @@ -37,6 +37,7 @@ android { ndk { abiFilters "armeabi-v7a", "x86" } + multiDexEnabled true } splits { abi { @@ -70,7 +71,8 @@ android { dependencies { compile fileTree(dir: "libs", include: ["*.jar"]) compile project(":rncamerakit") - compile "com.android.support:appcompat-v7:23.0.1" + compile "com.android.support:appcompat-v7:25.0.1" + compile 'com.android.support:multidex:1.0.3' compile "com.facebook.react:react-native:+" // From node_modules } diff --git a/example-android/app/src/main/java/com/camerakit/MainApplication.java b/example-android/app/src/main/java/com/camerakit/MainApplication.java index 4fce4dc..f142e8e 100644 --- a/example-android/app/src/main/java/com/camerakit/MainApplication.java +++ b/example-android/app/src/main/java/com/camerakit/MainApplication.java @@ -1,6 +1,8 @@ package com.camerakit; import android.app.Application; +import android.content.Context; +import android.support.multidex.MultiDex; import com.facebook.react.ReactApplication; import com.facebook.react.ReactNativeHost; @@ -35,6 +37,12 @@ public class MainApplication extends Application implements ReactApplication { } }; + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } + @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; diff --git a/example-android/build.gradle b/example-android/build.gradle index c5fecab..304b7c7 100644 --- a/example-android/build.gradle +++ b/example-android/build.gradle @@ -3,6 +3,7 @@ buildscript { repositories { jcenter() + google() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' @@ -20,5 +21,6 @@ allprojects { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" } + google() } } From aee8b488213eb344084530d1b13a86f190de26ba Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Tue, 20 Mar 2018 15:51:48 +0200 Subject: [PATCH 08/17] WIP --- .../wix/RNCameraKit/camera/CameraView.java | 43 +++++---------- .../camera/barcode/BarcodeFrame.java | 53 +++++++++++++++++-- android/src/main/res/values/colors.xml | 2 +- index.js | 2 +- 4 files changed, 63 insertions(+), 37 deletions(-) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java index 8f5510f..009cade 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java @@ -19,7 +19,7 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { private ThemedReactContext context; private SurfaceView surface; - private Rect viewFrameRect; + private Rect frameRect; private BarcodeFrame barcodeFrame; @ColorInt private int frameColor = Color.GREEN; @ColorInt private int laserColor = Color.RED; @@ -100,51 +100,34 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { public void showFrame() { barcodeFrame = new BarcodeFrame(getContext()); + barcodeFrame.setFrameColor(frameColor); + barcodeFrame.setLaserColor(laserColor); addView(barcodeFrame); requestLayout(); } public Rect getFramingRectInPreview(int previewWidth, int previewHeight) { - if (viewFrameRect == null) { + if (frameRect == null) { if (barcodeFrame != null) { - Rect framingRect = barcodeFrame.getFrameRect(); - int viewFinderViewWidth = barcodeFrame.getWidth(); - int viewFinderViewHeight = barcodeFrame.getHeight(); - if (framingRect == null || viewFinderViewWidth == 0 || viewFinderViewHeight == 0) { - return null; - } - - Rect rect = new Rect(framingRect); - - if (previewWidth < viewFinderViewWidth) { - rect.left = rect.left * previewWidth / viewFinderViewWidth; - rect.right = rect.right * previewWidth / viewFinderViewWidth; - } - - if (previewHeight < viewFinderViewHeight) { - rect.top = rect.top * previewHeight / viewFinderViewHeight; - rect.bottom = rect.bottom * previewHeight / viewFinderViewHeight; - } - - viewFrameRect = rect; + frameRect = barcodeFrame.getFrameRect(); } else { - viewFrameRect = new Rect(0, 0, previewWidth, previewHeight); + frameRect = new Rect(0, 0, previewWidth, previewHeight); } } - return viewFrameRect; + return frameRect; } public void setFrameColor(@ColorInt int color) { this.frameColor = color; -// if (barcodeFrame != null) { -// barcodeFrame.setBorderColor(frameColor); -// } + if (barcodeFrame != null) { + barcodeFrame.setFrameColor(color); + } } public void setLaserColor(@ColorInt int color) { this.laserColor = color; -// if (barcodeFrame != null) { -// barcodeFrame.setLaserColor(laserColor); -// } + if (barcodeFrame != null) { + barcodeFrame.setLaserColor(laserColor); + } } } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java index c6e8e4a..3bdd91a 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java @@ -6,18 +6,26 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; -import android.util.Log; +import android.support.annotation.ColorInt; import android.view.View; import com.wix.RNCameraKit.R; public class BarcodeFrame extends View { + private static final int STROKE_WITDH = 5; + private Paint dimPaint; private Paint framePaint; + private Paint borderPaint; + private Paint laserPaint; private Rect frameRect; private int width; private int height; + private int borderMargin; + + private long previousFrameTime = System.currentTimeMillis(); + private int laserY; public BarcodeFrame(Context context) { super(context); @@ -30,8 +38,15 @@ public class BarcodeFrame extends View { dimPaint = new Paint(); dimPaint.setStyle(Paint.Style.FILL); dimPaint.setColor(context.getResources().getColor(R.color.bg_dark)); + borderPaint = new Paint(); + borderPaint.setStyle(Paint.Style.STROKE); + borderPaint.setStrokeWidth(STROKE_WITDH); + laserPaint = new Paint(); + laserPaint.setStyle(Paint.Style.STROKE); + laserPaint.setStrokeWidth(STROKE_WITDH); frameRect = new Rect(); + borderMargin = context.getResources().getDimensionPixelSize(R.dimen.border_length); } @Override @@ -40,25 +55,53 @@ public class BarcodeFrame extends View { width = getMeasuredWidth(); height = getMeasuredHeight(); - int marginWidth = width / 3; - int marginHeight = height / 3; + int marginWidth = width / 7; + int marginHeight = (int) (height / 2.75); frameRect.left = marginWidth; frameRect.right = width - marginWidth; frameRect.top = marginHeight; frameRect.bottom = height - marginHeight; - Log.i("NIGA", String.format("w=%d, h=%d ", width, height) + frameRect.toShortString()); } @Override protected void onDraw(Canvas canvas) { + long timeElapsed = (System.currentTimeMillis() - previousFrameTime); super.onDraw(canvas); - canvas.drawRect(0, 0, width, height, dimPaint); canvas.drawRect(frameRect, framePaint); + drawBorder(canvas); + drawLaser(canvas, timeElapsed); + previousFrameTime = System.currentTimeMillis(); + this.invalidate(frameRect); + } + + private void drawBorder(Canvas canvas) { + canvas.drawLine(frameRect.left, frameRect.top, frameRect.left, frameRect.top + borderMargin, borderPaint); + canvas.drawLine(frameRect.left, frameRect.top, frameRect.left + borderMargin, frameRect.top, borderPaint); + canvas.drawLine(frameRect.left, frameRect.bottom, frameRect.left, frameRect.bottom - borderMargin, borderPaint); + canvas.drawLine(frameRect.left, frameRect.bottom, frameRect.left + borderMargin, frameRect.bottom, borderPaint); + canvas.drawLine(frameRect.right, frameRect.top, frameRect.right - borderMargin, frameRect.top, borderPaint); + canvas.drawLine(frameRect.right, frameRect.top, frameRect.right, frameRect.top + borderMargin, borderPaint); + canvas.drawLine(frameRect.right, frameRect.bottom, frameRect.right, frameRect.bottom - borderMargin, borderPaint); + canvas.drawLine(frameRect.right, frameRect.bottom, frameRect.right - borderMargin, frameRect.bottom, borderPaint); + } + + private void drawLaser(Canvas canvas, long timeElapsed) { + if (laserY > frameRect.bottom || laserY < frameRect.top) laserY = frameRect.top; + canvas.drawLine(frameRect.left + STROKE_WITDH, laserY, frameRect.right - STROKE_WITDH, laserY, laserPaint); + laserY += (timeElapsed) / 8; } public Rect getFrameRect() { return frameRect; } + + public void setFrameColor(@ColorInt int borderColor) { + borderPaint.setColor(borderColor); + } + + public void setLaserColor(@ColorInt int laserColor) { + laserPaint.setColor(laserColor); + } } diff --git a/android/src/main/res/values/colors.xml b/android/src/main/res/values/colors.xml index 0efcfa9..fbf35ef 100644 --- a/android/src/main/res/values/colors.xml +++ b/android/src/main/res/values/colors.xml @@ -1,4 +1,4 @@ - #80000000 + #BF000000 \ No newline at end of file diff --git a/index.js b/index.js index 551bd4b..7c5303e 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,4 @@ // This index is the example app index, // if you look for react-naitve-camera-kit index, // please jump src/index 😅 -require('./ExampleCode/app'); +require('./example-js-code/app'); From 5c48b9ca6a70df7ca171bcba45d0255f06c4911e Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Tue, 20 Mar 2018 15:52:00 +0200 Subject: [PATCH 09/17] WIP --- android/src/main/res/values/dimens.xml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 android/src/main/res/values/dimens.xml diff --git a/android/src/main/res/values/dimens.xml b/android/src/main/res/values/dimens.xml new file mode 100644 index 0000000..16e2367 --- /dev/null +++ b/android/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ + + + 30dp + \ No newline at end of file From f788ffbf5471962eb6ec8c123388b56c09396c93 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Tue, 20 Mar 2018 16:06:39 +0200 Subject: [PATCH 10/17] WIP --- .../wix/RNCameraKit/camera/CameraView.java | 22 ++++++++++++++++++- .../RNCameraKit/camera/CameraViewManager.java | 3 ++- .../camera/barcode/BarcodeFrame.java | 1 + .../camera/barcode/BarcodeScanner.java | 4 ++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java index 009cade..5174f16 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java @@ -109,7 +109,27 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { public Rect getFramingRectInPreview(int previewWidth, int previewHeight) { if (frameRect == null) { if (barcodeFrame != null) { - frameRect = barcodeFrame.getFrameRect(); + Rect framingRect = barcodeFrame.getFrameRect(); + int viewFinderViewWidth = barcodeFrame.getWidth(); + int viewFinderViewHeight = barcodeFrame.getHeight(); + if (framingRect == null || viewFinderViewWidth == 0 || viewFinderViewHeight == 0) { + return null; + } + + Rect rect = new Rect(framingRect); + + if (previewWidth < viewFinderViewWidth) { + rect.left = rect.left * previewWidth / viewFinderViewWidth; + rect.right = rect.right * previewWidth / viewFinderViewWidth; + } + + if (previewHeight < viewFinderViewHeight) { + rect.top = rect.top * previewHeight / viewFinderViewHeight; + rect.bottom = rect.bottom * previewHeight / viewFinderViewHeight; + } + + frameRect = rect; + } else { frameRect = new Rect(0, 0, previewWidth, previewHeight); } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java index 1443a98..6944b54 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java @@ -281,7 +281,8 @@ public class CameraViewManager extends SimpleViewManager { public void handleResult(Result rawResult) { WritableMap event = Arguments.createMap(); event.putString("codeStringValue", rawResult.getText()); - reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(cameraViews.peek().getId(), "onReadCode", event); + if (!cameraViews.empty()) + reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(cameraViews.peek().getId(), "onReadCode", event); } }); } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java index 3bdd91a..075ad29 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java @@ -7,6 +7,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.support.annotation.ColorInt; +import android.util.Log; import android.view.View; import com.wix.RNCameraKit.R; diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java index 2f73d4e..9326198 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java @@ -1,7 +1,6 @@ package com.wix.RNCameraKit.camera.barcode; -import android.content.Context; import android.graphics.Rect; import android.hardware.Camera; import android.os.Handler; @@ -33,7 +32,7 @@ public class BarcodeScanner { } private MultiFormatReader mMultiFormatReader; - public static final List ALL_FORMATS = new ArrayList<>(); + private static final List ALL_FORMATS = new ArrayList<>(); private List mFormats; private ResultHandler resultHandler; @@ -108,6 +107,7 @@ public class BarcodeScanner { handler.post(new Runnable() { @Override public void run() { + Log.i("NIGA", "result = " + finalRawResult.getText()); if (resultHandler != null) { resultHandler.handleResult(finalRawResult); } From 02a1ad45b36e51e9c8a5ee5ecddf10647794906d Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Wed, 21 Mar 2018 15:27:52 +0200 Subject: [PATCH 11/17] refacto --- android/build.gradle | 7 +- .../wix/RNCameraKit/camera/CameraView.java | 35 +++----- .../RNCameraKit/camera/CameraViewManager.java | 18 ++-- .../camera/barcode/BarcodeScanner.java | 87 +++++-------------- example-android/app/build.gradle | 11 ++- example-js-code/src/BarcodeScreen.js | 2 +- 6 files changed, 58 insertions(+), 102 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 375ddfc..e6c98d2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 25 - buildToolsVersion "26.0.2" + buildToolsVersion "26.0.3" defaultConfig { minSdkVersion 16 @@ -16,6 +16,11 @@ android { lintOptions { warning 'InvalidPackage' } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java index 5174f16..93f413a 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java @@ -16,7 +16,6 @@ import com.wix.RNCameraKit.camera.barcode.BarcodeFrame; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; public class CameraView extends FrameLayout implements SurfaceHolder.Callback { - private ThemedReactContext context; private SurfaceView surface; private Rect frameRect; @@ -26,9 +25,6 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { public CameraView(ThemedReactContext context) { super(context); - this.context = context; - - surface = new SurfaceView(context); setBackgroundColor(Color.BLACK); addView(surface, MATCH_PARENT, MATCH_PARENT); @@ -109,27 +105,20 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { public Rect getFramingRectInPreview(int previewWidth, int previewHeight) { if (frameRect == null) { if (barcodeFrame != null) { - Rect framingRect = barcodeFrame.getFrameRect(); - int viewFinderViewWidth = barcodeFrame.getWidth(); - int viewFinderViewHeight = barcodeFrame.getHeight(); - if (framingRect == null || viewFinderViewWidth == 0 || viewFinderViewHeight == 0) { - return null; + Rect framingRect = new Rect(barcodeFrame.getFrameRect()); + int frameWidth = barcodeFrame.getWidth(); + int frameHeight = barcodeFrame.getHeight(); + + if (previewWidth < frameWidth) { + framingRect.left = framingRect.left * previewWidth / frameWidth; + framingRect.right = framingRect.right * previewWidth / frameWidth; + } + if (previewHeight < frameHeight) { + framingRect.top = framingRect.top * previewHeight / frameHeight; + framingRect.bottom = framingRect.bottom * previewHeight / frameHeight; } - Rect rect = new Rect(framingRect); - - if (previewWidth < viewFinderViewWidth) { - rect.left = rect.left * previewWidth / viewFinderViewWidth; - rect.right = rect.right * previewWidth / viewFinderViewWidth; - } - - if (previewHeight < viewFinderViewHeight) { - rect.top = rect.top * previewHeight / viewFinderViewHeight; - rect.bottom = rect.bottom * previewHeight / viewFinderViewHeight; - } - - frameRect = rect; - + frameRect = framingRect; } else { frameRect = new Rect(0, 0, previewWidth, previewHeight); } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java index 6944b54..a0b1624 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java @@ -51,10 +51,12 @@ public class CameraViewManager extends SimpleViewManager { private static BarcodeScanner scanner; private static Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() { @Override - public void onPreviewFrame(byte[] data, Camera camera) { - if (scanner != null) { - scanner.onPreviewFrame(data, camera); - } + public void onPreviewFrame(final byte[] data, final Camera camera) { + new Thread(() -> { + if (scanner != null) { + scanner.onPreviewFrame(data, camera); + } + }).start(); } }; @@ -137,7 +139,7 @@ public class CameraViewManager extends SimpleViewManager { } private static void releaseCamera() { - camera.setPreviewCallback(null); + camera.setOneShotPreviewCallback(null); cameraReleased.set(true); camera.release(); } @@ -164,7 +166,7 @@ public class CameraViewManager extends SimpleViewManager { camera.setPreviewDisplay(cameraViews.peek().getHolder()); camera.startPreview(); if (shouldScan) { - camera.setPreviewCallback(previewCallback); + camera.setOneShotPreviewCallback(previewCallback); } } catch (IOException | RuntimeException e) { e.printStackTrace(); @@ -275,7 +277,7 @@ public class CameraViewManager extends SimpleViewManager { } public static void setBarcodeScanner() { - scanner = new BarcodeScanner(); + scanner = new BarcodeScanner(previewCallback); scanner.setResultHandler(new BarcodeScanner.ResultHandler() { @Override public void handleResult(Result rawResult) { @@ -300,7 +302,7 @@ public class CameraViewManager extends SimpleViewManager { public void setShouldScan(CameraView view, boolean scanBarcode) { shouldScan = scanBarcode; if (shouldScan && camera != null) { - camera.setPreviewCallback(previewCallback); + camera.setOneShotPreviewCallback(previewCallback); } } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java index 9326198..ba9e4ee 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java @@ -13,14 +13,12 @@ import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; -import com.google.zxing.NotFoundException; import com.google.zxing.ReaderException; import com.google.zxing.Result; import com.google.zxing.common.HybridBinarizer; import com.wix.RNCameraKit.camera.CameraViewManager; import java.util.ArrayList; -import java.util.Collection; import java.util.EnumMap; import java.util.List; import java.util.Map; @@ -33,9 +31,10 @@ public class BarcodeScanner { private MultiFormatReader mMultiFormatReader; private static final List ALL_FORMATS = new ArrayList<>(); - private List mFormats; private ResultHandler resultHandler; + private Camera.PreviewCallback previewCallback; + static { ALL_FORMATS.add(BarcodeFormat.AZTEC); ALL_FORMATS.add(BarcodeFormat.CODABAR); @@ -56,40 +55,25 @@ public class BarcodeScanner { ALL_FORMATS.add(BarcodeFormat.UPC_EAN_EXTENSION); } - public BarcodeScanner() { - initMultiFormatReader(); - } + public BarcodeScanner(Camera.PreviewCallback previewCallback) { + Map hints = new EnumMap<>(DecodeHintType.class); + hints.put(DecodeHintType.POSSIBLE_FORMATS, ALL_FORMATS); + mMultiFormatReader = new MultiFormatReader(); + mMultiFormatReader.setHints(hints); - public void setFormats(List formats) { - mFormats = formats; - initMultiFormatReader(); + this.previewCallback = previewCallback; } public void setResultHandler(ResultHandler resultHandler) { this.resultHandler = resultHandler; } - public Collection getFormats() { - if (mFormats == null) { - return ALL_FORMATS; - } - return mFormats; - } - - private void initMultiFormatReader() { - Map hints = new EnumMap<>(DecodeHintType.class); - hints.put(DecodeHintType.POSSIBLE_FORMATS, getFormats()); - mMultiFormatReader = new MultiFormatReader(); - mMultiFormatReader.setHints(hints); - } - public void onPreviewFrame(byte[] data, final Camera camera) { if (resultHandler == null) { return; } try { - Camera.Parameters parameters = camera.getParameters(); - Camera.Size size = parameters.getPreviewSize(); + Camera.Size size = camera.getParameters().getPreviewSize(); int width = size.width; int height = size.height; @@ -98,41 +82,25 @@ public class BarcodeScanner { height = tmp; data = getRotatedData(data, camera); - LuminanceSource source = buildLuminanceSource(data, width, height); + final Result result = decodeResult(getLuminanceSource(data, width, height)); - final Result finalRawResult = getFinalResult(source); - - if (finalRawResult != null) { - Handler handler = new Handler(Looper.getMainLooper()); - handler.post(new Runnable() { - @Override - public void run() { - Log.i("NIGA", "result = " + finalRawResult.getText()); - if (resultHandler != null) { - resultHandler.handleResult(finalRawResult); - } - } - }); + if (result != null) { + new Handler(Looper.getMainLooper()).post(() -> resultHandler.handleResult(result)); } + camera.setOneShotPreviewCallback(previewCallback); } catch (RuntimeException e) { - // TODO: Terrible hack. It is possible that this method is invoked after camera is released. Log.w("CameraKit", e.toString()); } } @Nullable - private Result getFinalResult(LuminanceSource source) { + private Result decodeResult(LuminanceSource source) { Result rawResult = null; if (source != null) { BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); try { rawResult = mMultiFormatReader.decodeWithState(bitmap); - } catch (ReaderException re) { - // continue - } catch (NullPointerException npe) { - // This is terrible - } catch (ArrayIndexOutOfBoundsException ignored) { - + } catch (ReaderException ignored) { } finally { mMultiFormatReader.reset(); } @@ -142,8 +110,7 @@ public class BarcodeScanner { bitmap = new BinaryBitmap(new HybridBinarizer(rotatedSource)); try { rawResult = mMultiFormatReader.decodeWithState(bitmap); - } catch (NotFoundException e) { - // continue + } catch (ReaderException ignored) { } finally { mMultiFormatReader.reset(); } @@ -152,25 +119,18 @@ public class BarcodeScanner { return rawResult; } - private LuminanceSource buildLuminanceSource(byte[] data, int width, int height) { + private LuminanceSource getLuminanceSource(byte[] data, int width, int height) { Rect rect = CameraViewManager.getFramingRectInPreview(width, height); - if (rect == null) { - return null; - } - // Go ahead and assume it's YUV rather than die. - LuminanceSource source = null; - try { - source = new RotateLuminanceSource(data, width, height, rect.left, rect.top, + return new RotateLuminanceSource(data, width, height, rect.left, rect.top, rect.width(), rect.height(), false); } catch (Exception e) { e.printStackTrace(); } - - return source; + return null; } - private static byte[] getRotatedData(byte[] data, Camera camera) { + private byte[] getRotatedData(byte[] data, Camera camera) { Camera.Parameters parameters = camera.getParameters(); Camera.Size size = parameters.getPreviewSize(); int width = size.width; @@ -181,11 +141,6 @@ public class BarcodeScanner { for (int x = 0; x < width; x++) rotatedData[x * height + height - y - 1] = data[x + y * width]; } - data = rotatedData; - int tmp = width; - width = height; - height = tmp; - - return data; + return rotatedData; } } diff --git a/example-android/app/build.gradle b/example-android/app/build.gradle index 903b2c7..f4d63aa 100644 --- a/example-android/app/build.gradle +++ b/example-android/app/build.gradle @@ -25,13 +25,13 @@ def enableSeparateBuildPerCPUArchitecture = false def enableProguardInReleaseBuilds = false android { - compileSdkVersion 23 - buildToolsVersion '26.0.2' + compileSdkVersion 25 + buildToolsVersion '26.0.3' defaultConfig { applicationId "com.camerakit" minSdkVersion 16 - targetSdkVersion 22 + targetSdkVersion 25 versionCode 1 versionName "1.0" ndk { @@ -66,6 +66,11 @@ android { } } } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { diff --git a/example-js-code/src/BarcodeScreen.js b/example-js-code/src/BarcodeScreen.js index 4ad756e..975e03b 100644 --- a/example-js-code/src/BarcodeScreen.js +++ b/example-js-code/src/BarcodeScreen.js @@ -46,7 +46,7 @@ export default class CameraScreen extends Component { laserColor={"blue"} frameColor={"yellow"} - //onReadCode={((event) => Alert.alert(`Qr code found ${event.nativeEvent.codeStringValue} `))} + // onReadCode={((event) => console.log(`NIGA, Qr code found ${event.nativeEvent.codeStringValue} `))} onReadCode = {((event) => this.setState({ example: CheckingScreen}))} hideControls={true} // offsetForScannerFrame = {10} From 0105df4bcaa9ecea2c717709b38fc09de3ce1561 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Wed, 21 Mar 2018 16:34:50 +0200 Subject: [PATCH 12/17] refactoring --- .../main/java/com/wix/RNCameraKit/Utils.java | 5 +++++ .../RNCameraKit/camera/CameraViewManager.java | 19 +++++++------------ .../camera/barcode/BarcodeScanner.java | 12 +++--------- .../camera/barcode/RotateLuminanceSource.java | 16 ++++++++-------- 4 files changed, 23 insertions(+), 29 deletions(-) diff --git a/android/src/main/java/com/wix/RNCameraKit/Utils.java b/android/src/main/java/com/wix/RNCameraKit/Utils.java index 2f8d095..f9e0f10 100644 --- a/android/src/main/java/com/wix/RNCameraKit/Utils.java +++ b/android/src/main/java/com/wix/RNCameraKit/Utils.java @@ -216,4 +216,9 @@ public class Utils { public static int convertDeviceHeightToSupportedAspectRatio(float actualWidth, float actualHeight) { return (int) (actualHeight / actualWidth > MAX_SCREEN_RATIO ? actualWidth * MAX_SCREEN_RATIO : actualHeight); } + + + public static void runOnWorkerThread(Runnable runnable) { + new Thread(runnable).start(); + } } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java index a0b1624..869a094 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java @@ -20,7 +20,6 @@ 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.google.zxing.Result; import com.wix.RNCameraKit.Utils; import com.wix.RNCameraKit.camera.barcode.BarcodeScanner; @@ -52,11 +51,11 @@ public class CameraViewManager extends SimpleViewManager { private static Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() { @Override public void onPreviewFrame(final byte[] data, final Camera camera) { - new Thread(() -> { + Utils.runOnWorkerThread(() -> { if (scanner != null) { scanner.onPreviewFrame(data, camera); } - }).start(); + }); } }; @@ -277,15 +276,11 @@ public class CameraViewManager extends SimpleViewManager { } public static void setBarcodeScanner() { - scanner = new BarcodeScanner(previewCallback); - scanner.setResultHandler(new BarcodeScanner.ResultHandler() { - @Override - public void handleResult(Result rawResult) { - WritableMap event = Arguments.createMap(); - event.putString("codeStringValue", rawResult.getText()); - if (!cameraViews.empty()) - reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(cameraViews.peek().getId(), "onReadCode", event); - } + scanner = new BarcodeScanner(previewCallback, result -> { + WritableMap event = Arguments.createMap(); + event.putString("codeStringValue", result.getText()); + if (!cameraViews.empty()) + reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(cameraViews.peek().getId(), "onReadCode", event); }); } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java index ba9e4ee..487453e 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java @@ -5,6 +5,7 @@ import android.graphics.Rect; import android.hardware.Camera; import android.os.Handler; import android.os.Looper; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; @@ -55,23 +56,17 @@ public class BarcodeScanner { ALL_FORMATS.add(BarcodeFormat.UPC_EAN_EXTENSION); } - public BarcodeScanner(Camera.PreviewCallback previewCallback) { + public BarcodeScanner(@NonNull Camera.PreviewCallback previewCallback, @NonNull ResultHandler resultHandler) { Map hints = new EnumMap<>(DecodeHintType.class); hints.put(DecodeHintType.POSSIBLE_FORMATS, ALL_FORMATS); mMultiFormatReader = new MultiFormatReader(); mMultiFormatReader.setHints(hints); this.previewCallback = previewCallback; - } - - public void setResultHandler(ResultHandler resultHandler) { this.resultHandler = resultHandler; } public void onPreviewFrame(byte[] data, final Camera camera) { - if (resultHandler == null) { - return; - } try { Camera.Size size = camera.getParameters().getPreviewSize(); int width = size.width; @@ -131,8 +126,7 @@ public class BarcodeScanner { } private byte[] getRotatedData(byte[] data, Camera camera) { - Camera.Parameters parameters = camera.getParameters(); - Camera.Size size = parameters.getPreviewSize(); + Camera.Size size = camera.getParameters().getPreviewSize(); int width = size.width; int height = size.height; diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java index b261d00..38170c6 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java @@ -12,14 +12,14 @@ public class RotateLuminanceSource extends LuminanceSource { private final int left; private final int top; - public RotateLuminanceSource(byte[] yuvData, - int dataWidth, - int dataHeight, - int left, - int top, - int width, - int height, - boolean reverseHorizontal) { + RotateLuminanceSource(byte[] yuvData, + int dataWidth, + int dataHeight, + int left, + int top, + int width, + int height, + boolean reverseHorizontal) { super(width, height); if (left + width > dataWidth || top + height > dataHeight) { From 8bbcaf19218a46fd3323a0d07ecb48a83fc6cb27 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Wed, 21 Mar 2018 16:42:25 +0200 Subject: [PATCH 13/17] refactoring --- .../wix/RNCameraKit/camera/CameraView.java | 31 +++++++------------ .../camera/barcode/BarcodeFrame.java | 18 ++++++----- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java index 93f413a..ba00b31 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java @@ -29,19 +29,13 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { setBackgroundColor(Color.BLACK); addView(surface, MATCH_PARENT, MATCH_PARENT); surface.getHolder().addCallback(this); - surface.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if (CameraViewManager.getCamera() != null) { - try { - CameraViewManager.getCamera().autoFocus(new Camera.AutoFocusCallback() { - @Override - public void onAutoFocus(boolean success, Camera camera) { - } - }); - } catch (Exception e) { + surface.setOnClickListener(v -> { + if (CameraViewManager.getCamera() != null) { + try { + CameraViewManager.getCamera().autoFocus((success, camera) -> { + }); + } catch (Exception ignored) { - } } } }); @@ -78,14 +72,11 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { return surface.getHolder(); } - private final Runnable measureAndLayout = new Runnable() { - @Override - public void run() { - measure( - MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY)); - layout(getLeft(), getTop(), getRight(), getBottom()); - } + private final Runnable measureAndLayout = () -> { + measure( + MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY)); + layout(getLeft(), getTop(), getRight(), getBottom()); }; @Override diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java index 075ad29..b4646d7 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeFrame.java @@ -7,14 +7,16 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.support.annotation.ColorInt; -import android.util.Log; import android.view.View; import com.wix.RNCameraKit.R; public class BarcodeFrame extends View { - private static final int STROKE_WITDH = 5; + private static final int STROKE_WIDTH = 5; + private static final int ANIMATION_SPEED = 8; + private static final int WIDTH_SCALE = 7; + private static final double HEIGHT_SCALE = 2.75; private Paint dimPaint; private Paint framePaint; @@ -41,10 +43,10 @@ public class BarcodeFrame extends View { dimPaint.setColor(context.getResources().getColor(R.color.bg_dark)); borderPaint = new Paint(); borderPaint.setStyle(Paint.Style.STROKE); - borderPaint.setStrokeWidth(STROKE_WITDH); + borderPaint.setStrokeWidth(STROKE_WIDTH); laserPaint = new Paint(); laserPaint.setStyle(Paint.Style.STROKE); - laserPaint.setStrokeWidth(STROKE_WITDH); + laserPaint.setStrokeWidth(STROKE_WIDTH); frameRect = new Rect(); borderMargin = context.getResources().getDimensionPixelSize(R.dimen.border_length); @@ -56,8 +58,8 @@ public class BarcodeFrame extends View { width = getMeasuredWidth(); height = getMeasuredHeight(); - int marginWidth = width / 7; - int marginHeight = (int) (height / 2.75); + int marginWidth = width / WIDTH_SCALE; + int marginHeight = (int) (height / HEIGHT_SCALE); frameRect.left = marginWidth; frameRect.right = width - marginWidth; @@ -90,8 +92,8 @@ public class BarcodeFrame extends View { private void drawLaser(Canvas canvas, long timeElapsed) { if (laserY > frameRect.bottom || laserY < frameRect.top) laserY = frameRect.top; - canvas.drawLine(frameRect.left + STROKE_WITDH, laserY, frameRect.right - STROKE_WITDH, laserY, laserPaint); - laserY += (timeElapsed) / 8; + canvas.drawLine(frameRect.left + STROKE_WIDTH, laserY, frameRect.right - STROKE_WIDTH, laserY, laserPaint); + laserY += (timeElapsed) / ANIMATION_SPEED; } public Rect getFrameRect() { From fe22571b7425399ceac2b279169248ceb86b7136 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Wed, 21 Mar 2018 16:59:20 +0200 Subject: [PATCH 14/17] attribution --- .../RNCameraKit/camera/barcode/RotateLuminanceSource.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java index 38170c6..f14b0b8 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java @@ -2,6 +2,11 @@ package com.wix.RNCameraKit.camera.barcode; import com.google.zxing.LuminanceSource; +/** + * This class is mostly copy of {@link com.google.zxing.PlanarYUVLuminanceSource} class. + * The only difference is adding {@code rotateCounterClockwise()} method + * It was copied due to PlanarYUVLuminanceSource being final, so it can not be extended + */ public class RotateLuminanceSource extends LuminanceSource { private static final int THUMBNAIL_SCALE_FACTOR = 2; From 94e323ec261144dd1dc4550bc83af434e61690e9 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Wed, 21 Mar 2018 17:01:01 +0200 Subject: [PATCH 15/17] license --- .../wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java index f14b0b8..a76a1f4 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/RotateLuminanceSource.java @@ -6,6 +6,7 @@ import com.google.zxing.LuminanceSource; * This class is mostly copy of {@link com.google.zxing.PlanarYUVLuminanceSource} class. * The only difference is adding {@code rotateCounterClockwise()} method * It was copied due to PlanarYUVLuminanceSource being final, so it can not be extended + * Zxing license - {https://github.com/zxing/zxing/blob/master/LICENSE} */ public class RotateLuminanceSource extends LuminanceSource { From e5d702d8ff8f680d7774ea0ea00956d1db938c20 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Wed, 21 Mar 2018 18:23:40 +0200 Subject: [PATCH 16/17] refactor --- example-js-code/src/BarcodeScreen.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/example-js-code/src/BarcodeScreen.js b/example-js-code/src/BarcodeScreen.js index 975e03b..cde3eab 100644 --- a/example-js-code/src/BarcodeScreen.js +++ b/example-js-code/src/BarcodeScreen.js @@ -45,8 +45,6 @@ export default class CameraScreen extends Component { scanBarcode={true} laserColor={"blue"} frameColor={"yellow"} - - // onReadCode={((event) => console.log(`NIGA, Qr code found ${event.nativeEvent.codeStringValue} `))} onReadCode = {((event) => this.setState({ example: CheckingScreen}))} hideControls={true} // offsetForScannerFrame = {10} From b7bbc6831eb34692838a509dde89f2ab48de3500 Mon Sep 17 00:00:00 2001 From: Roman Kozlov Date: Thu, 22 Mar 2018 10:30:58 +0200 Subject: [PATCH 17/17] no java 8 --- android/build.gradle | 7 +--- .../wix/RNCameraKit/camera/CameraView.java | 32 ++++++++++++------- .../RNCameraKit/camera/CameraViewManager.java | 23 ++++++++----- .../camera/barcode/BarcodeScanner.java | 9 ++++-- example-android/app/build.gradle | 5 --- 5 files changed, 44 insertions(+), 32 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index e6c98d2..bc17418 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -14,12 +14,7 @@ android { } } lintOptions { - warning 'InvalidPackage' - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + warning 'InvalidPackage' } } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java index ba00b31..be30e00 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraView.java @@ -29,13 +29,20 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { setBackgroundColor(Color.BLACK); addView(surface, MATCH_PARENT, MATCH_PARENT); surface.getHolder().addCallback(this); - surface.setOnClickListener(v -> { - if (CameraViewManager.getCamera() != null) { - try { - CameraViewManager.getCamera().autoFocus((success, camera) -> { - }); - } catch (Exception ignored) { + surface.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (CameraViewManager.getCamera() != null) { + try { + CameraViewManager.getCamera().autoFocus(new Camera.AutoFocusCallback() { + @Override + public void onAutoFocus(boolean success, Camera camera) { + } + }); + } catch (Exception ignored) { + + } } } }); @@ -72,11 +79,14 @@ public class CameraView extends FrameLayout implements SurfaceHolder.Callback { return surface.getHolder(); } - private final Runnable measureAndLayout = () -> { - measure( - MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY)); - layout(getLeft(), getTop(), getRight(), getBottom()); + private final Runnable measureAndLayout = new Runnable() { + @Override + public void run() { + measure( + MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY)); + layout(getLeft(), getTop(), getRight(), getBottom()); + } }; @Override diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java index 869a094..267e93a 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/CameraViewManager.java @@ -20,6 +20,7 @@ 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.google.zxing.Result; import com.wix.RNCameraKit.Utils; import com.wix.RNCameraKit.camera.barcode.BarcodeScanner; @@ -51,9 +52,12 @@ public class CameraViewManager extends SimpleViewManager { private static Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() { @Override public void onPreviewFrame(final byte[] data, final Camera camera) { - Utils.runOnWorkerThread(() -> { - if (scanner != null) { - scanner.onPreviewFrame(data, camera); + Utils.runOnWorkerThread(new Runnable() { + @Override + public void run() { + if (scanner != null) { + scanner.onPreviewFrame(data, camera); + } } }); } @@ -276,11 +280,14 @@ public class CameraViewManager extends SimpleViewManager { } public static void setBarcodeScanner() { - scanner = new BarcodeScanner(previewCallback, result -> { - WritableMap event = Arguments.createMap(); - event.putString("codeStringValue", result.getText()); - if (!cameraViews.empty()) - reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(cameraViews.peek().getId(), "onReadCode", event); + scanner = new BarcodeScanner(previewCallback, new BarcodeScanner.ResultHandler() { + @Override + public void handleResult(Result result) { + WritableMap event = Arguments.createMap(); + event.putString("codeStringValue", result.getText()); + if (!cameraViews.empty()) + reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(cameraViews.peek().getId(), "onReadCode", event); + } }); } diff --git a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java index 487453e..08a5911 100644 --- a/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java +++ b/android/src/main/java/com/wix/RNCameraKit/camera/barcode/BarcodeScanner.java @@ -27,7 +27,7 @@ import java.util.Map; public class BarcodeScanner { public interface ResultHandler { - void handleResult(Result rawResult); + void handleResult(Result result); } private MultiFormatReader mMultiFormatReader; @@ -80,7 +80,12 @@ public class BarcodeScanner { final Result result = decodeResult(getLuminanceSource(data, width, height)); if (result != null) { - new Handler(Looper.getMainLooper()).post(() -> resultHandler.handleResult(result)); + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + resultHandler.handleResult(result); + } + }); } camera.setOneShotPreviewCallback(previewCallback); } catch (RuntimeException e) { diff --git a/example-android/app/build.gradle b/example-android/app/build.gradle index f4d63aa..0eb5cb8 100644 --- a/example-android/app/build.gradle +++ b/example-android/app/build.gradle @@ -66,11 +66,6 @@ android { } } } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } } dependencies {