Ensure actions are only started in a valid holder state - Fixes #669

pull/691/head
Mattia Iavarone 6 years ago
parent 741cd4cc60
commit 78df21d9b7
  1. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java
  2. 14
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.java
  3. 35
      cameraview/src/main/java/com/otaliastudios/cameraview/picture/Snapshot2PictureRecorder.java

@ -613,6 +613,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
throw createCameraException(e); throw createCameraException(e);
} }
removeRepeatingRequestBuilderSurfaces(); removeRepeatingRequestBuilderSurfaces();
mLastRepeatingResult = null;
LOG.i("onStopPreview:", "Returning."); LOG.i("onStopPreview:", "Returning.");
return Tasks.forResult(null); return Tasks.forResult(null);
} }
@ -1524,7 +1525,9 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
@Override @Override
public void applyBuilder(@NonNull Action source, @NonNull CaptureRequest.Builder builder) public void applyBuilder(@NonNull Action source, @NonNull CaptureRequest.Builder builder)
throws CameraAccessException { throws CameraAccessException {
mSession.capture(builder.build(), mRepeatingRequestCallback, null); if (getPreviewState() == STATE_STARTED) {
mSession.capture(builder.build(), mRepeatingRequestCallback, null);
}
} }
//endregion //endregion

@ -30,6 +30,7 @@ public abstract class BaseAction implements Action {
private final List<ActionCallback> callbacks = new ArrayList<>(); private final List<ActionCallback> callbacks = new ArrayList<>();
private int state; private int state;
private ActionHolder holder; private ActionHolder holder;
private boolean needsOnStart;
@Override @Override
public final int getState() { public final int getState() {
@ -39,7 +40,11 @@ public abstract class BaseAction implements Action {
@Override @Override
public final void start(@NonNull ActionHolder holder) { public final void start(@NonNull ActionHolder holder) {
holder.addAction(this); holder.addAction(this);
onStart(holder); if (holder.getLastResult(this) != null) {
onStart(holder);
} else {
needsOnStart = true;
}
} }
@Override @Override
@ -49,6 +54,7 @@ public abstract class BaseAction implements Action {
onAbort(holder); onAbort(holder);
setState(STATE_COMPLETED); setState(STATE_COMPLETED);
} }
needsOnStart = false;
} }
/** /**
@ -72,9 +78,13 @@ public abstract class BaseAction implements Action {
// Overrideable // Overrideable
} }
@CallSuper
@Override @Override
public void onCaptureStarted(@NonNull ActionHolder holder, @NonNull CaptureRequest request) { public void onCaptureStarted(@NonNull ActionHolder holder, @NonNull CaptureRequest request) {
// Overrideable if (needsOnStart) {
onStart(holder);
needsOnStart = false;
}
} }
@Override @Override

@ -48,7 +48,7 @@ public class Snapshot2PictureRecorder extends SnapshotGlPictureRecorder {
private final static CameraLogger LOG = CameraLogger.create(TAG); private final static CameraLogger LOG = CameraLogger.create(TAG);
private final static long LOCK_TIMEOUT = 2500; private final static long LOCK_TIMEOUT = 2500;
private static class FlashAction extends BaseAction { private class FlashAction extends BaseAction {
@Override @Override
protected void onStart(@NonNull ActionHolder holder) { protected void onStart(@NonNull ActionHolder holder) {
@ -82,6 +82,26 @@ public class Snapshot2PictureRecorder extends SnapshotGlPictureRecorder {
} }
} }
private class ResetFlashAction extends BaseAction {
@Override
protected void onStart(@NonNull ActionHolder holder) {
super.onStart(holder);
try {
// See Camera2Engine.setFlash() comments: turning TORCH off has bugs and we must do
// as follows.
LOG.i("ResetFlashAction:", "Reverting the flash changes.");
CaptureRequest.Builder builder = holder.getBuilder(this);
builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
builder.set(CaptureRequest.FLASH_MODE, CaptureResult.FLASH_MODE_OFF);
holder.applyBuilder(this, builder);
builder.set(CaptureRequest.CONTROL_AE_MODE, mOriginalAeMode);
builder.set(CaptureRequest.FLASH_MODE, mOriginalFlashMode);
holder.applyBuilder(this);
} catch (CameraAccessException ignore) {}
}
}
private final Action mAction; private final Action mAction;
private final ActionHolder mHolder; private final ActionHolder mHolder;
private final boolean mActionNeeded; private final boolean mActionNeeded;
@ -135,18 +155,7 @@ public class Snapshot2PictureRecorder extends SnapshotGlPictureRecorder {
@Override @Override
protected void dispatchResult() { protected void dispatchResult() {
// Revert our changes. // Revert our changes.
LOG.i("dispatchResult:", "Reverting the flash changes."); new ResetFlashAction().start(mHolder);
try {
// See Camera2Engine.setFlash() comments: turning TORCH off has bugs and we must do
// as follows.
CaptureRequest.Builder builder = mHolder.getBuilder(mAction);
builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
builder.set(CaptureRequest.FLASH_MODE, CaptureResult.FLASH_MODE_OFF);
mHolder.applyBuilder(mAction, builder);
builder.set(CaptureRequest.CONTROL_AE_MODE, mOriginalAeMode);
builder.set(CaptureRequest.FLASH_MODE, mOriginalFlashMode);
mHolder.applyBuilder(mAction);
} catch (CameraAccessException ignore) {}
super.dispatchResult(); super.dispatchResult();
} }
} }

Loading…
Cancel
Save