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
* 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<Void> 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;

@ -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.
}
}

@ -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) {

Loading…
Cancel
Save