Abort actions on exit

pull/588/head
Mattia Iavarone 6 years ago
parent 4ddd2af731
commit c90f7308ac
  1. 22
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java
  2. 29
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/LogAction.java
  3. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.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 * Applies the repeating request builder to the preview, assuming we actually have a preview
* running. Can be called after changing parameters to the builder. * running. Can be called after changing parameters to the builder.
@ -611,7 +600,6 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
@NonNull @NonNull
@Override @Override
protected Task<Void> onStopEngine() { protected Task<Void> onStopEngine() {
LOG.i("onStopEngine:", "About to clean up.");
try { try {
LOG.i("onStopEngine:", "Clean up.", "Releasing camera."); LOG.i("onStopEngine:", "Clean up.", "Releasing camera.");
mCamera.close(); mCamera.close();
@ -620,6 +608,16 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
LOG.w("onStopEngine:", "Clean up.", "Exception while releasing camera.", e); LOG.w("onStopEngine:", "Clean up.", "Exception while releasing camera.", e);
} }
mCamera = null; 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; mCameraOptions = null;
mVideoRecorder = null; mVideoRecorder = null;
mRepeatingRequestBuilder = null; mRepeatingRequestBuilder = null;

@ -34,29 +34,14 @@ class LogAction extends BaseAction {
" afState: " + afState + " afTriggerState: " + afTriggerState; " afState: " + afState + " afTriggerState: " + afTriggerState;
if (!log.equals(lastLog)) { if (!log.equals(lastLog)) {
lastLog = log; lastLog = log;
LOG.w(log); LOG.i(log);
}
} }
// START @Override
// aeMode: 3 aeLock: false aeState: 4 aeTriggerState: 0 afState: 2 afTriggerState: 0 protected void onCompleted(@NonNull ActionHolder holder) {
// super.onCompleted(holder);
// DURING metering (focus skips) setState(0); // set another state.
// aeMode: 3 aeLock: false aeState: 4 aeTriggerState: 0 afState: 0 afTriggerState: 0 start(holder); // restart.
// 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
} }
} }

@ -92,7 +92,7 @@ public abstract class BaseAction implements Action {
* this removes this action from the holder. * this removes this action from the holder.
* @param newState new state * @param newState new state
*/ */
protected void setState(int newState) { protected final void setState(int newState) {
if (newState != state) { if (newState != state) {
state = newState; state = newState;
for (ActionCallback callback : callbacks) { for (ActionCallback callback : callbacks) {

Loading…
Cancel
Save