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. 32
      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
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));

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

@ -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<Void> onStartEngine() {
protected Task<CameraOptions> 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

@ -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<Void> onStartEngine() {
final TaskCompletionSource<Void> task = new TaskCompletionSource<>();
protected Task<CameraOptions> onStartEngine() {
final TaskCompletionSource<CameraOptions> 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

@ -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<Void>() {
@Override
public void onSuccess(Void aVoid) {
mCallback.dispatchOnCameraOpened(mCameraOptions);
return onStartEngine().onSuccessTask(
new SuccessContinuation<CameraOptions, Void>() {
@NonNull
@Override
public Task<Void> 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<Task<Void>>() {
@Override
public Task<Void> call() {
return onStopEngine();
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mCallback.dispatchOnCameraClosed();
return onStopEngine().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mCallback.dispatchOnCameraClosed();
}
});
}
});
}
@ -447,7 +453,7 @@ public abstract class CameraEngine implements
*/
@NonNull
@EngineThread
protected abstract Task<Void> onStartEngine();
protected abstract Task<CameraOptions> onStartEngine();
/**
* Stops the engine.

@ -99,15 +99,17 @@ public class CameraOrchestrator {
@Override
public void onComplete(@NonNull Task<Void> 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);
}
}

@ -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<Task<Void>>() {
final String name = isTearDown ? toState.name() + " << " + fromState.name()
: fromState.name() + " >> " + toState.name();
return schedule(name, dispatchExceptions, new Callable<Task<Void>>() {
@Override
public Task<Void> 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<Void, Task<Void>>() {
@Override

Loading…
Cancel
Save