From c088ed4252bb176532d6f39c4c8aac6efae9874a Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Mon, 9 Dec 2019 16:08:08 +0100 Subject: [PATCH] Test --- .../engine/CameraIntegrationTest.java | 2 +- .../cameraview/engine/MockCameraEngine.java | 4 +-- .../cameraview/engine/Camera1Engine.java | 5 +-- .../cameraview/engine/Camera2Engine.java | 7 ++-- .../cameraview/engine/CameraEngine.java | 32 +++++++++++-------- .../orchestrator/CameraOrchestrator.java | 4 ++- .../orchestrator/CameraStateOrchestrator.java | 12 ++++--- 7 files changed, 39 insertions(+), 27 deletions(-) diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java index 8573fccb..e3896661 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java @@ -848,7 +848,7 @@ public abstract class CameraIntegrationTest extends Base //region Frame Processing - private void assert30Frames(FrameProcessor mock) throws Exception { + private void assert30Frames(@NonNull FrameProcessor mock) throws Exception { // Expect 30 frames CountDownLatch latch = new CountDownLatch(30); doCountDown(latch).when(mock).process(any(Frame.class)); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java index 0c0b50d6..2e6b3213 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java @@ -40,8 +40,8 @@ public class MockCameraEngine extends CameraEngine { @NonNull @Override - protected Task onStartEngine() { - return Tasks.forResult(null); + protected Task onStartEngine() { + return Tasks.forResult(mCameraOptions); } @NonNull diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java index 99f9d1ee..81685a53 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java @@ -19,6 +19,7 @@ import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.otaliastudios.cameraview.CameraException; import com.otaliastudios.cameraview.CameraLogger; +import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.controls.PictureFormat; import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import com.otaliastudios.cameraview.engine.offset.Axis; @@ -142,7 +143,7 @@ public class Camera1Engine extends CameraEngine implements @NonNull @EngineThread @Override - protected Task onStartEngine() { + protected Task onStartEngine() { try { mCamera = Camera.open(mCameraId); } catch (Exception e) { @@ -161,7 +162,7 @@ public class Camera1Engine extends CameraEngine implements mCamera.setDisplayOrientation(getAngles().offset(Reference.SENSOR, Reference.VIEW, Axis.ABSOLUTE)); // <- not allowed during preview LOG.i("onStartEngine:", "Ended"); - return Tasks.forResult(null); + return Tasks.forResult(mCameraOptions); } @EngineThread 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 a34e9883..8825b325 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -35,6 +35,7 @@ import com.google.android.gms.tasks.TaskCompletionSource; import com.google.android.gms.tasks.Tasks; import com.otaliastudios.cameraview.CameraException; import com.otaliastudios.cameraview.CameraLogger; +import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.PictureResult; import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.controls.Facing; @@ -371,8 +372,8 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv @SuppressLint("MissingPermission") @NonNull @Override - protected Task onStartEngine() { - final TaskCompletionSource task = new TaskCompletionSource<>(); + protected Task onStartEngine() { + final TaskCompletionSource task = new TaskCompletionSource<>(); try { // We have a valid camera for this Facing. Go on. mManager.openCamera(mCameraId, new CameraDevice.StateCallback() { @@ -398,7 +399,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv task.trySetException(createCameraException(e)); return; } - task.trySetResult(null); + task.trySetResult(mCameraOptions); } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java index 13726ef3..77447c91 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java @@ -8,8 +8,10 @@ import android.location.Location; import android.os.Handler; import android.os.Looper; +import com.google.android.gms.tasks.Continuation; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.gms.tasks.SuccessContinuation; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.otaliastudios.cameraview.CameraException; @@ -413,12 +415,16 @@ public abstract class CameraEngine implements LOG.e("onStartEngine:", "No camera available for facing", mFacing); throw new CameraException(CameraException.REASON_NO_CAMERA); } - return onStartEngine(); - } - }).addOnSuccessListener(new OnSuccessListener() { - @Override - public void onSuccess(Void aVoid) { - mCallback.dispatchOnCameraOpened(mCameraOptions); + return onStartEngine().onSuccessTask( + new SuccessContinuation() { + @NonNull + @Override + public Task then(@Nullable CameraOptions cameraOptions) { + if (cameraOptions == null) throw new RuntimeException("Null options!"); + mCallback.dispatchOnCameraOpened(cameraOptions); + return Tasks.forResult(null); + } + }); } }); } @@ -431,12 +437,12 @@ public abstract class CameraEngine implements new Callable>() { @Override public Task call() { - return onStopEngine(); - } - }).addOnSuccessListener(new OnSuccessListener() { - @Override - public void onSuccess(Void aVoid) { - mCallback.dispatchOnCameraClosed(); + return onStopEngine().addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(Void aVoid) { + mCallback.dispatchOnCameraClosed(); + } + }); } }); } @@ -447,7 +453,7 @@ public abstract class CameraEngine implements */ @NonNull @EngineThread - protected abstract Task onStartEngine(); + protected abstract Task onStartEngine(); /** * Stops the engine. diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraOrchestrator.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraOrchestrator.java index 0b7977c3..8388b8df 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraOrchestrator.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraOrchestrator.java @@ -99,15 +99,17 @@ public class CameraOrchestrator { @Override public void onComplete(@NonNull Task task) { Exception e = task.getException(); - LOG.i(name.toUpperCase(), "- Finished.", e); if (e != null) { + LOG.w(name.toUpperCase(), "- Finished with ERROR.", e); if (dispatchExceptions) { mCallback.handleJobException(name, e); } source.trySetException(e); } else if (task.isCanceled()) { + LOG.i(name.toUpperCase(), "- Finished because ABORTED."); source.trySetException(new CancellationException()); } else { + LOG.i(name.toUpperCase(), "- Finished."); source.trySetResult(null); } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraStateOrchestrator.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraStateOrchestrator.java index d5b06fd9..ae76e5c5 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraStateOrchestrator.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraStateOrchestrator.java @@ -37,7 +37,8 @@ public class CameraStateOrchestrator extends CameraOrchestrator { public boolean hasPendingStateChange() { synchronized (mLock) { for (Token token : mJobs) { - if (token.name.contains(" > ") && !token.task.isComplete()) { + if ((token.name.contains(" >> ") || token.name.contains(" << ")) + && !token.task.isComplete()) { return true; } } @@ -54,16 +55,17 @@ public class CameraStateOrchestrator extends CameraOrchestrator { mTargetState = toState; final boolean isTearDown = !toState.isAtLeast(fromState); - final String changeName = fromState.name() + " > " + toState.name(); - return schedule(changeName, dispatchExceptions, new Callable>() { + final String name = isTearDown ? toState.name() + " << " + fromState.name() + : fromState.name() + " >> " + toState.name(); + return schedule(name, dispatchExceptions, new Callable>() { @Override public Task call() throws Exception { if (getCurrentState() != fromState) { - LOG.w(changeName.toUpperCase(), "- State mismatch, aborting. current:", + LOG.w(name.toUpperCase(), "- State mismatch, aborting. current:", getCurrentState(), "from:", fromState, "to:", toState); return Tasks.forCanceled(); } else { - Executor executor = mCallback.getJobWorker(changeName).getExecutor(); + Executor executor = mCallback.getJobWorker(name).getExecutor(); return stateChange.call().continueWithTask(executor, new Continuation>() { @Override