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 2471f420..5dff35de 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -266,10 +266,32 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv Boolean aeLock = result.get(CaptureResult.CONTROL_AE_LOCK); Integer aeTriggerState = result.get(CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER); Integer afTriggerState = result.get(CaptureResult.CONTROL_AF_TRIGGER); - LOG.v("metering:", - "aeMode:", aeMode, "aeLock:", aeLock, - "aeState:", aeState, "aeTriggerState:", aeTriggerState, - "afState:", afState, "afTriggerState:", afTriggerState); + String log = "metering: aeMode: " + aeMode + " aeLock: " + aeLock + + " aeState: " + aeState + " aeTriggerState: " + aeTriggerState + + " afState: " + afState + " afTriggerState: " + afTriggerState; + if (!log.equals(mLastLog)) { + mLastLog = log; + LOG.w(log); + } + + // 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 afState: 2 afTriggerState: 0 + // aeMode: 3 aeLock: false aeState: 1 aeTriggerState: 2 afState: 2 afTriggerState: 0 } }; @@ -279,6 +301,9 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv } } } + + private String mLastLog; + //endregion //region Protected APIs diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoExposure.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoExposure.java index 749f84c3..4254ccf3 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoExposure.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoExposure.java @@ -62,8 +62,7 @@ public class AutoExposure extends Parameter { if (aeState == null) return; switch (aeState) { case CaptureRequest.CONTROL_AE_STATE_LOCKED: { - isLocked = true; - isSuccessful = true; + notifyLocked(true); break; } case CaptureRequest.CONTROL_AE_STATE_PRECAPTURE: @@ -78,7 +77,7 @@ public class AutoExposure extends Parameter { } @Override - protected void onLocked(@NonNull CaptureRequest.Builder builder) { + protected void onLocked(@NonNull CaptureRequest.Builder builder, boolean success) { // Do nothing } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoFocus.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoFocus.java index 5390b0d6..c2311fa3 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoFocus.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoFocus.java @@ -72,8 +72,7 @@ public class AutoFocus extends Parameter { case CaptureRequest.CONTROL_AF_STATE_INACTIVE: case CaptureRequest.CONTROL_AF_STATE_PASSIVE_FOCUSED: case CaptureRequest.CONTROL_AF_STATE_PASSIVE_UNFOCUSED: { - isLocked = true; - isSuccessful = true; + notifyLocked(true); break; } case CaptureRequest.CONTROL_AF_STATE_ACTIVE_SCAN: @@ -85,7 +84,7 @@ public class AutoFocus extends Parameter { } @Override - protected void onLocked(@NonNull CaptureRequest.Builder builder) { + protected void onLocked(@NonNull CaptureRequest.Builder builder, boolean success) { // Do nothing. } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoWhiteBalance.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoWhiteBalance.java index b7bbf175..4946b49c 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoWhiteBalance.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/AutoWhiteBalance.java @@ -54,8 +54,7 @@ public class AutoWhiteBalance extends Parameter { if (awbState == null) return; switch (awbState) { case CaptureRequest.CONTROL_AWB_STATE_LOCKED: { - isLocked = true; - isSuccessful = true; + notifyLocked(true); break; } case CaptureRequest.CONTROL_AWB_STATE_CONVERGED: @@ -68,7 +67,7 @@ public class AutoWhiteBalance extends Parameter { } @Override - protected void onLocked(@NonNull CaptureRequest.Builder builder) { + protected void onLocked(@NonNull CaptureRequest.Builder builder, boolean success) { // Do nothing } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/Parameter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/Parameter.java index 036a348f..a48af4c8 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/Parameter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/locking/Parameter.java @@ -8,8 +8,6 @@ import android.os.Build; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; -import java.util.List; - @RequiresApi(Build.VERSION_CODES.LOLLIPOP) public abstract class Parameter { @@ -17,11 +15,8 @@ public abstract class Parameter { void onLockingChange(); } - protected boolean isSuccessful; - - @SuppressWarnings("WeakerAccess") - protected boolean isLocked; - + private boolean isSuccessful; + private boolean isLocked; private LockingChangeCallback callback; private boolean shouldSkip; private boolean supportsLocking; @@ -44,6 +39,12 @@ public abstract class Parameter { callback.onLockingChange(); } + @SuppressWarnings({"WeakerAccess", "SameParameterValue"}) + protected void notifyLocked(boolean success) { + isLocked = true; + isSuccessful = success; + } + public final boolean isLocked() { // A non supported parameter should always appear as metered return isLocked || !supportsLocking || shouldSkip; @@ -70,7 +71,7 @@ public abstract class Parameter { @NonNull CaptureResult result) { if (isLocked()) return; processCapture(result); - if (isLocked()) onLocked(builder); + if (isLocked()) onLocked(builder, isSuccessful); } protected abstract boolean checkSupportsLocking(@NonNull CameraCharacteristics characteristics, @@ -83,5 +84,5 @@ public abstract class Parameter { protected abstract void processCapture(@NonNull CaptureResult result); - protected abstract void onLocked(@NonNull CaptureRequest.Builder builder); + protected abstract void onLocked(@NonNull CaptureRequest.Builder builder, boolean success); } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoExposure.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoExposure.java index 878fa9e3..a630bbb1 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoExposure.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoExposure.java @@ -108,15 +108,13 @@ public class AutoExposure extends Parameter { // distinguish, check the trigger state. if (aeTriggerState != null && aeTriggerState == CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER_START) { - isMetered = true; - isSuccessful = true; + notifyMetered(true); } break; } case CaptureResult.CONTROL_AE_STATE_LOCKED: { // There's nothing we can do, AE was locked, triggers are ignored. - isMetered = true; - isSuccessful = false; + notifyMetered(false); break; } case CaptureResult.CONTROL_AE_STATE_INACTIVE: @@ -129,14 +127,12 @@ public class AutoExposure extends Parameter { switch (aeState) { case CaptureResult.CONTROL_AE_STATE_CONVERGED: case CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED: { - isMetered = true; - isSuccessful = true; + notifyMetered(true); break; } case CaptureResult.CONTROL_AE_STATE_LOCKED: { // There's nothing we can do, AE was locked, triggers are ignored. - isMetered = true; - isSuccessful = false; + notifyMetered(false); break; } case CaptureResult.CONTROL_AE_STATE_PRECAPTURE: @@ -150,7 +146,7 @@ public class AutoExposure extends Parameter { } @Override - protected void onMetered(@NonNull CaptureRequest.Builder builder) { + protected void onMetered(@NonNull CaptureRequest.Builder builder, boolean success) { // Do nothing } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoFocus.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoFocus.java index e646f720..736950c7 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoFocus.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoFocus.java @@ -84,13 +84,11 @@ public class AutoFocus extends Parameter { if (afState == null) return; switch (afState) { case CaptureRequest.CONTROL_AF_STATE_FOCUSED_LOCKED: { - isMetered = true; - isSuccessful = true; + notifyMetered(true); break; } case CaptureRequest.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: { - isMetered = true; - isSuccessful = false; + notifyMetered(false); break; } case CaptureRequest.CONTROL_AF_STATE_INACTIVE: break; @@ -100,7 +98,7 @@ public class AutoFocus extends Parameter { } @Override - protected void onMetered(@NonNull CaptureRequest.Builder builder) { + protected void onMetered(@NonNull CaptureRequest.Builder builder, boolean success) { // Do nothing. } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoWhiteBalance.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoWhiteBalance.java index 5c253f35..94d47c60 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoWhiteBalance.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/AutoWhiteBalance.java @@ -67,14 +67,12 @@ public class AutoWhiteBalance extends Parameter { switch (awbState) { case CaptureRequest.CONTROL_AWB_STATE_CONVERGED: { - isMetered = true; - isSuccessful = true; + notifyMetered(true); break; } case CaptureRequest.CONTROL_AWB_STATE_LOCKED: { // Nothing we can do if AWB was locked. - isMetered = true; - isSuccessful = false; + notifyMetered(false); break; } case CaptureRequest.CONTROL_AWB_STATE_INACTIVE: @@ -86,7 +84,7 @@ public class AutoWhiteBalance extends Parameter { } @Override - protected void onMetered(@NonNull CaptureRequest.Builder builder) { + protected void onMetered(@NonNull CaptureRequest.Builder builder, boolean success) { // Do nothing } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/Parameter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/Parameter.java index 1b81e1ae..6f407a7d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/Parameter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/metering/Parameter.java @@ -19,17 +19,12 @@ public abstract class Parameter { void onMeteringChange(); } - @SuppressWarnings("WeakerAccess") - protected boolean isSuccessful; - - @SuppressWarnings("WeakerAccess") - protected boolean isMetered; - + private boolean isSuccessful; + private boolean isMetered; private MeteringChangeCallback callback; private boolean shouldSkip; private boolean supportsProcessing; - @SuppressWarnings("WeakerAccess") protected Parameter(@NonNull MeteringChangeCallback callback) { this.callback = callback; } @@ -48,6 +43,12 @@ public abstract class Parameter { callback.onMeteringChange(); } + @SuppressWarnings("WeakerAccess") + protected void notifyMetered(boolean success) { + isMetered = true; + isSuccessful = success; + } + public final boolean isMetered() { // A non supported parameter should always appear as metered return isMetered || !supportsProcessing || shouldSkip; @@ -74,9 +75,10 @@ public abstract class Parameter { public final void onCapture(@NonNull CaptureRequest.Builder builder, @NonNull CaptureResult result) { - if (isMetered()) return; - processCapture(result); - if (isMetered()) onMetered(builder); + if (!isMetered()) { + processCapture(result); + if (isMetered()) onMetered(builder, isSuccessful); + } } public final void resetMetering(@NonNull CameraCharacteristics characteristics, @@ -97,7 +99,7 @@ public abstract class Parameter { protected abstract void processCapture(@NonNull CaptureResult result); - protected abstract void onMetered(@NonNull CaptureRequest.Builder builder); + protected abstract void onMetered(@NonNull CaptureRequest.Builder builder, boolean success); protected abstract void onResetMetering(@NonNull CameraCharacteristics characteristics, @NonNull CaptureRequest.Builder builder,