pull/696/head
Mattia Iavarone 6 years ago
parent 55cd077389
commit c088ed4252
  1. 2
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java
  2. 4
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java
  3. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java
  4. 7
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java
  5. 24
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java
  6. 4
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraOrchestrator.java
  7. 12
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/orchestrator/CameraStateOrchestrator.java

@ -848,7 +848,7 @@ public abstract class CameraIntegrationTest<E extends CameraEngine> extends Base
//region Frame Processing //region Frame Processing
private void assert30Frames(FrameProcessor mock) throws Exception { private void assert30Frames(@NonNull FrameProcessor mock) throws Exception {
// Expect 30 frames // Expect 30 frames
CountDownLatch latch = new CountDownLatch(30); CountDownLatch latch = new CountDownLatch(30);
doCountDown(latch).when(mock).process(any(Frame.class)); doCountDown(latch).when(mock).process(any(Frame.class));

@ -40,8 +40,8 @@ public class MockCameraEngine extends CameraEngine {
@NonNull @NonNull
@Override @Override
protected Task<Void> onStartEngine() { protected Task<CameraOptions> onStartEngine() {
return Tasks.forResult(null); return Tasks.forResult(mCameraOptions);
} }
@NonNull @NonNull

@ -19,6 +19,7 @@ import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.Tasks; import com.google.android.gms.tasks.Tasks;
import com.otaliastudios.cameraview.CameraException; import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.controls.PictureFormat; import com.otaliastudios.cameraview.controls.PictureFormat;
import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper;
import com.otaliastudios.cameraview.engine.offset.Axis; import com.otaliastudios.cameraview.engine.offset.Axis;
@ -142,7 +143,7 @@ public class Camera1Engine extends CameraEngine implements
@NonNull @NonNull
@EngineThread @EngineThread
@Override @Override
protected Task<Void> onStartEngine() { protected Task<CameraOptions> onStartEngine() {
try { try {
mCamera = Camera.open(mCameraId); mCamera = Camera.open(mCameraId);
} catch (Exception e) { } catch (Exception e) {
@ -161,7 +162,7 @@ public class Camera1Engine extends CameraEngine implements
mCamera.setDisplayOrientation(getAngles().offset(Reference.SENSOR, Reference.VIEW, mCamera.setDisplayOrientation(getAngles().offset(Reference.SENSOR, Reference.VIEW,
Axis.ABSOLUTE)); // <- not allowed during preview Axis.ABSOLUTE)); // <- not allowed during preview
LOG.i("onStartEngine:", "Ended"); LOG.i("onStartEngine:", "Ended");
return Tasks.forResult(null); return Tasks.forResult(mCameraOptions);
} }
@EngineThread @EngineThread

@ -35,6 +35,7 @@ import com.google.android.gms.tasks.TaskCompletionSource;
import com.google.android.gms.tasks.Tasks; import com.google.android.gms.tasks.Tasks;
import com.otaliastudios.cameraview.CameraException; import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.PictureResult; import com.otaliastudios.cameraview.PictureResult;
import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.VideoResult;
import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Facing;
@ -371,8 +372,8 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
@NonNull @NonNull
@Override @Override
protected Task<Void> onStartEngine() { protected Task<CameraOptions> onStartEngine() {
final TaskCompletionSource<Void> task = new TaskCompletionSource<>(); final TaskCompletionSource<CameraOptions> task = new TaskCompletionSource<>();
try { try {
// We have a valid camera for this Facing. Go on. // We have a valid camera for this Facing. Go on.
mManager.openCamera(mCameraId, new CameraDevice.StateCallback() { mManager.openCamera(mCameraId, new CameraDevice.StateCallback() {
@ -398,7 +399,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
task.trySetException(createCameraException(e)); task.trySetException(createCameraException(e));
return; return;
} }
task.trySetResult(null); task.trySetResult(mCameraOptions);
} }
@Override @Override

@ -8,8 +8,10 @@ import android.location.Location;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import com.google.android.gms.tasks.Continuation;
import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener; 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.Task;
import com.google.android.gms.tasks.Tasks; import com.google.android.gms.tasks.Tasks;
import com.otaliastudios.cameraview.CameraException; import com.otaliastudios.cameraview.CameraException;
@ -413,12 +415,16 @@ public abstract class CameraEngine implements
LOG.e("onStartEngine:", "No camera available for facing", mFacing); LOG.e("onStartEngine:", "No camera available for facing", mFacing);
throw new CameraException(CameraException.REASON_NO_CAMERA); throw new CameraException(CameraException.REASON_NO_CAMERA);
} }
return onStartEngine(); return onStartEngine().onSuccessTask(
} new SuccessContinuation<CameraOptions, Void>() {
}).addOnSuccessListener(new OnSuccessListener<Void>() { @NonNull
@Override @Override
public void onSuccess(Void aVoid) { public Task<Void> then(@Nullable CameraOptions cameraOptions) {
mCallback.dispatchOnCameraOpened(mCameraOptions); if (cameraOptions == null) throw new RuntimeException("Null options!");
mCallback.dispatchOnCameraOpened(cameraOptions);
return Tasks.forResult(null);
}
});
} }
}); });
} }
@ -431,15 +437,15 @@ public abstract class CameraEngine implements
new Callable<Task<Void>>() { new Callable<Task<Void>>() {
@Override @Override
public Task<Void> call() { public Task<Void> call() {
return onStopEngine(); return onStopEngine().addOnSuccessListener(new OnSuccessListener<Void>() {
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override @Override
public void onSuccess(Void aVoid) { public void onSuccess(Void aVoid) {
mCallback.dispatchOnCameraClosed(); mCallback.dispatchOnCameraClosed();
} }
}); });
} }
});
}
/** /**
* Starts the engine. * Starts the engine.
@ -447,7 +453,7 @@ public abstract class CameraEngine implements
*/ */
@NonNull @NonNull
@EngineThread @EngineThread
protected abstract Task<Void> onStartEngine(); protected abstract Task<CameraOptions> onStartEngine();
/** /**
* Stops the engine. * Stops the engine.

@ -99,15 +99,17 @@ public class CameraOrchestrator {
@Override @Override
public void onComplete(@NonNull Task<Void> task) { public void onComplete(@NonNull Task<Void> task) {
Exception e = task.getException(); Exception e = task.getException();
LOG.i(name.toUpperCase(), "- Finished.", e);
if (e != null) { if (e != null) {
LOG.w(name.toUpperCase(), "- Finished with ERROR.", e);
if (dispatchExceptions) { if (dispatchExceptions) {
mCallback.handleJobException(name, e); mCallback.handleJobException(name, e);
} }
source.trySetException(e); source.trySetException(e);
} else if (task.isCanceled()) { } else if (task.isCanceled()) {
LOG.i(name.toUpperCase(), "- Finished because ABORTED.");
source.trySetException(new CancellationException()); source.trySetException(new CancellationException());
} else { } else {
LOG.i(name.toUpperCase(), "- Finished.");
source.trySetResult(null); source.trySetResult(null);
} }
} }

@ -37,7 +37,8 @@ public class CameraStateOrchestrator extends CameraOrchestrator {
public boolean hasPendingStateChange() { public boolean hasPendingStateChange() {
synchronized (mLock) { synchronized (mLock) {
for (Token token : mJobs) { for (Token token : mJobs) {
if (token.name.contains(" > ") && !token.task.isComplete()) { if ((token.name.contains(" >> ") || token.name.contains(" << "))
&& !token.task.isComplete()) {
return true; return true;
} }
} }
@ -54,16 +55,17 @@ public class CameraStateOrchestrator extends CameraOrchestrator {
mTargetState = toState; mTargetState = toState;
final boolean isTearDown = !toState.isAtLeast(fromState); final boolean isTearDown = !toState.isAtLeast(fromState);
final String changeName = fromState.name() + " > " + toState.name(); final String name = isTearDown ? toState.name() + " << " + fromState.name()
return schedule(changeName, dispatchExceptions, new Callable<Task<Void>>() { : fromState.name() + " >> " + toState.name();
return schedule(name, dispatchExceptions, new Callable<Task<Void>>() {
@Override @Override
public Task<Void> call() throws Exception { public Task<Void> call() throws Exception {
if (getCurrentState() != fromState) { if (getCurrentState() != fromState) {
LOG.w(changeName.toUpperCase(), "- State mismatch, aborting. current:", LOG.w(name.toUpperCase(), "- State mismatch, aborting. current:",
getCurrentState(), "from:", fromState, "to:", toState); getCurrentState(), "from:", fromState, "to:", toState);
return Tasks.forCanceled(); return Tasks.forCanceled();
} else { } else {
Executor executor = mCallback.getJobWorker(changeName).getExecutor(); Executor executor = mCallback.getJobWorker(name).getExecutor();
return stateChange.call().continueWithTask(executor, return stateChange.call().continueWithTask(executor,
new Continuation<Void, Task<Void>>() { new Continuation<Void, Task<Void>>() {
@Override @Override

Loading…
Cancel
Save