diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/TimeoutAction.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/TimeoutAction.java new file mode 100644 index 00000000..0fd91493 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/TimeoutAction.java @@ -0,0 +1,45 @@ +package com.otaliastudios.cameraview.engine.action; + +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.TotalCaptureResult; +import android.os.Build; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + +@RequiresApi(Build.VERSION_CODES.LOLLIPOP) +public class TimeoutAction extends ActionWrapper { + + private long startMillis; + private long timeoutMillis; + private BaseAction action; + + public TimeoutAction(long timeoutMillis, @NonNull BaseAction action) { + this.timeoutMillis = timeoutMillis; + this.action = action; + } + + @NonNull + @Override + public BaseAction getAction() { + return action; + } + + @Override + protected void onStart(@NonNull ActionHolder holder) { + startMillis = System.currentTimeMillis(); + super.onStart(holder); + } + + @Override + public void onCaptureCompleted(@NonNull ActionHolder holder, + @NonNull CaptureRequest request, + @NonNull TotalCaptureResult result) { + super.onCaptureCompleted(holder, request, result); + if (!isCompleted()) { + if (System.currentTimeMillis() > startMillis + timeoutMillis) { + setState(STATE_COMPLETED); + } + } + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Snapshot2PictureRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Snapshot2PictureRecorder.java index 5c4017fd..1ae0229a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Snapshot2PictureRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Snapshot2PictureRecorder.java @@ -18,6 +18,7 @@ import com.otaliastudios.cameraview.engine.action.ActionHolder; import com.otaliastudios.cameraview.engine.action.Actions; import com.otaliastudios.cameraview.engine.action.BaseAction; import com.otaliastudios.cameraview.engine.action.CompletionCallback; +import com.otaliastudios.cameraview.engine.action.TimeoutAction; import com.otaliastudios.cameraview.engine.lock.LockAction; import com.otaliastudios.cameraview.preview.GlCameraPreview; import com.otaliastudios.cameraview.size.AspectRatio; @@ -44,6 +45,7 @@ public class Snapshot2PictureRecorder extends SnapshotGlPictureRecorder { private final static String TAG = Snapshot2PictureRecorder.class.getSimpleName(); private final static CameraLogger LOG = CameraLogger.create(TAG); + private final static long LOCK_TIMEOUT = 2500; private static class FlashAction extends BaseAction { @@ -88,7 +90,9 @@ public class Snapshot2PictureRecorder extends SnapshotGlPictureRecorder { super(stub, engine, preview, outputRatio); mHolder = engine; - mAction = Actions.sequence(new LockAction(), new FlashAction()); + mAction = Actions.sequence( + new TimeoutAction(LOCK_TIMEOUT, new LockAction()), + new FlashAction()); mAction.addCallback(new CompletionCallback() { @Override protected void onActionCompleted(@NonNull Action action) {