From 7a3b7da6d2a01e00d793d38ce039473e68042ea9 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Sat, 14 Dec 2019 13:44:12 +0100 Subject: [PATCH] Test --- .../cameraview/internal/utils/WorkerHandlerTest.java | 6 +++--- .../otaliastudios/cameraview/engine/Camera1Engine.java | 2 ++ .../otaliastudios/cameraview/engine/Camera2Engine.java | 2 +- .../com/otaliastudios/cameraview/engine/CameraEngine.java | 7 +++++-- .../cameraview/internal/utils/WorkerHandler.java | 8 +++++++- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/WorkerHandlerTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/WorkerHandlerTest.java index 5a733217..57d531c4 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/WorkerHandlerTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/WorkerHandlerTest.java @@ -220,12 +220,12 @@ public class WorkerHandlerTest extends BaseTest { final WorkerHandler handler = WorkerHandler.get("handler"); assertTrue(handler.getThread().isAlive()); handler.destroy(); - // Wait for the thread to die. - try { handler.getThread().join(500); } catch (InterruptedException ignore) {} - assertFalse(handler.getThread().isAlive()); WorkerHandler newHandler = WorkerHandler.get("handler"); assertNotSame(handler, newHandler); assertTrue(newHandler.getThread().isAlive()); + // Ensure old thread dies at some point. + try { handler.getThread().join(500); } catch (InterruptedException ignore) {} + assertFalse(handler.getThread().isAlive()); } @Test diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java index 2ef41ca1..25e2b8dc 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java @@ -329,6 +329,7 @@ public class Camera1Engine extends CameraEngine implements stub.size = getPictureSize(Reference.OUTPUT); mPictureRecorder = new Full1PictureRecorder(stub, Camera1Engine.this, mCamera); mPictureRecorder.take(); + LOG.i("onTakePicture:", "executed."); } @EngineThread @@ -347,6 +348,7 @@ public class Camera1Engine extends CameraEngine implements mPictureRecorder = new Snapshot1PictureRecorder(stub, this, mCamera, outputRatio); } mPictureRecorder.take(); + LOG.i("onTakePictureSnapshot:", "executed."); } //endregion diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java index dae3de0a..487fab81 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -386,7 +386,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv // Set parameters that might have been set before the camera was opened. try { - LOG.i("createCamera:", "Applying default parameters."); + LOG.i("onStartEngine:", "Opened camera device."); mCameraCharacteristics = mManager.getCameraCharacteristics(mCameraId); boolean flip = getAngles().flip(Reference.SENSOR, Reference.VIEW); int format; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java index 0be5fe95..d035512c 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java @@ -369,8 +369,11 @@ public abstract class CameraEngine implements // onStopEngine() implementation and comments. LOG.e("DESTROY: Could not destroy synchronously after 6 seconds.", "Current thread:", Thread.currentThread(), - "Handler thread: ", mHandler.getThread()); - // TODO Should we find a solution or is this emulator only? + "Handler thread:", mHandler.getThread()); + recreateHandler(); + LOG.e("DESTROY: Could not destroy synchronously after 6 seconds.", + "Trying again on thread:", mHandler.getThread()); + destroy(unrecoverably); } } catch (InterruptedException ignore) {} } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/utils/WorkerHandler.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/utils/WorkerHandler.java index 17584809..180923ed 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/utils/WorkerHandler.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/utils/WorkerHandler.java @@ -89,18 +89,20 @@ public class WorkerHandler { get().post(action); } + private String mName; private HandlerThread mThread; private Handler mHandler; private Executor mExecutor; private WorkerHandler(@NonNull String name) { + mName = name; mThread = new HandlerThread(name); mThread.setDaemon(true); mThread.start(); mHandler = new Handler(mThread.getLooper()); mExecutor = new Executor() { @Override - public void execute(Runnable command) { + public void execute(@NonNull Runnable command) { WorkerHandler.this.run(command); } }; @@ -245,6 +247,10 @@ public class WorkerHandler { // after quit(), the thread will die at some point in the future. Might take some ms. // try { handler.getThread().join(); } catch (InterruptedException ignore) {} } + // This should not be needed, but just to be sure, let's remove it from cache. + // For example, interrupt() won't interrupt the thread if it's blocked - it will throw + // an exception instead. + sCache.remove(mName); } /**