From c90f7308acdad7e8954ae49eb15abd485ec81504 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Wed, 4 Sep 2019 23:49:16 +0200 Subject: [PATCH] Abort actions on exit --- .../cameraview/engine/Camera2Engine.java | 22 +++++++------- .../cameraview/engine/LogAction.java | 29 +++++-------------- .../cameraview/engine/action/BaseAction.java | 2 +- 3 files changed, 18 insertions(+), 35 deletions(-) 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 82788f5d..c511db2d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -209,17 +209,6 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv } } - private void applyRepeatingRequestBuilderAsSingle() { - if (getPreviewState() == STATE_STARTED) { - try { - mSession.capture(mRepeatingRequestBuilder.build(), - mRepeatingRequestCallback, null); - } catch (CameraAccessException e) { - throw createCameraException(e); - } - } - } - /** * Applies the repeating request builder to the preview, assuming we actually have a preview * running. Can be called after changing parameters to the builder. @@ -611,7 +600,6 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv @NonNull @Override protected Task onStopEngine() { - LOG.i("onStopEngine:", "About to clean up."); try { LOG.i("onStopEngine:", "Clean up.", "Releasing camera."); mCamera.close(); @@ -620,6 +608,16 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv LOG.w("onStopEngine:", "Clean up.", "Exception while releasing camera.", e); } mCamera = null; + + // After engine is stopping, the repeating request builder will be null, + // so the ActionHolder.getBuilder() contract would be broken. Same for characteristics. + // This can cause crashes if some ongoing Action queries the holder. So we abort them. + LOG.i("onStopEngine:", "Aborting actions."); + for (Action action : mActions) { + action.abort(this); + } + + mCameraCharacteristics = null; mCameraOptions = null; mVideoRecorder = null; mRepeatingRequestBuilder = null; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/LogAction.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/LogAction.java index 72de4d6e..7520b05e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/LogAction.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/LogAction.java @@ -34,29 +34,14 @@ class LogAction extends BaseAction { " afState: " + afState + " afTriggerState: " + afTriggerState; if (!log.equals(lastLog)) { lastLog = log; - LOG.w(log); + LOG.i(log); } + } - // START - // aeMode: 3 aeLock: false aeState: 4 aeTriggerState: 0 afState: 2 afTriggerState: 0 - // - // DURING metering (focus skips) - // aeMode: 3 aeLock: false aeState: 4 aeTriggerState: 0 afState: 0 afTriggerState: 0 - // aeMode: 3 aeLock: false aeState: 5 aeTriggerState: 1 afState: 0 afTriggerState: 0 - // - // DURING locking (focus skips) - // aeMode: 3 aeLock: false aeState: 4 aeTriggerState: 1 afState: 0 afTriggerState: 0 - // aeMode: 3 aeLock: true aeState: 5 aeTriggerState: 1 afState: 0 afTriggerState: 0 - // - // AFTER locked - // aeMode: 3 aeLock: true aeState: 3 aeTriggerState: 1 afState: 0 afTriggerState: 0 - // - // AFTER super.take() called - // aeMode: 1 aeLock: true aeState: 5 aeTriggerState: 1 afState: 0 afTriggerState: 0 - // aeMode: 1 aeLock: true aeState: 3 aeTriggerState: 1 afState: 0 afTriggerState: 0 - // - // Reverting flash changes + reset lock + reset metering - // aeMode: 3 aeLock: false aeState: 4 aeTriggerState: 2(1 now) afState: 2 afTriggerState: 0 - // aeMode: 3 aeLock: false aeState: 1 aeTriggerState: 2(1 now) afState: 2 afTriggerState: 0 + @Override + protected void onCompleted(@NonNull ActionHolder holder) { + super.onCompleted(holder); + setState(0); // set another state. + start(holder); // restart. } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.java index 0c3d29e2..c4fc6051 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.java @@ -92,7 +92,7 @@ public abstract class BaseAction implements Action { * this removes this action from the holder. * @param newState new state */ - protected void setState(int newState) { + protected final void setState(int newState) { if (newState != state) { state = newState; for (ActionCallback callback : callbacks) {