pull/696/head
Mattia Iavarone 6 years ago
parent b7486efbcd
commit 1a37c4c92c
  1. 2
      .github/workflows/emulator_script.sh
  2. 23
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java
  3. 66
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/RecoverCameraRule.java
  4. 11
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java

@ -1,4 +1,4 @@
#!/usr/bin/env bash
adb logcat -c
adb logcat CameraOrchestrator:I CameraEngine:I CameraView:I CameraCallbacks:I CameraIntegrationTest:I MediaEncoderEngine:I MediaEncoder:I AudioMediaEncoder:I VideoMediaEncoder:I TextureMediaEncoder:I VideoRecorder:I FullVideoRecorder:I SnapshotVideoRecorder:I MessageQueue:W MPEG4Writer:I *:E -v color &
adb logcat CameraOrchestrator:I CameraEngine:I CameraView:I CameraCallbacks:I CameraIntegrationTest:I MediaEncoderEngine:I MediaEncoder:I AudioMediaEncoder:I VideoMediaEncoder:I TextureMediaEncoder:I VideoRecorder:I FullVideoRecorder:I SnapshotVideoRecorder:I MessageQueue:W WorkerHandler:I MPEG4Writer:I *:E -v color &
./gradlew cameraview:connectedCheck

@ -33,11 +33,9 @@ import com.otaliastudios.cameraview.tools.Op;
import com.otaliastudios.cameraview.internal.utils.WorkerHandler;
import com.otaliastudios.cameraview.overlay.Overlay;
import com.otaliastudios.cameraview.size.Size;
import com.otaliastudios.cameraview.tools.RecoverCameraRule;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.test.annotation.UiThreadTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.After;
@ -75,21 +73,6 @@ public abstract class CameraIntegrationTest<E extends CameraEngine> extends Base
@Rule
public ActivityTestRule<TestActivity> activityRule = new ActivityTestRule<>(TestActivity.class);
@Rule
public RecoverCameraRule recoverRule = new RecoverCameraRule(new RecoverCameraRule.Callback() {
@NonNull
@Override
public CameraView getCamera() {
return camera;
}
@NonNull
@Override
public CameraLogger getLogger() {
return LOG;
}
});
protected CameraView camera;
protected E controller;
private CameraListener listener;
@ -218,15 +201,15 @@ public abstract class CameraIntegrationTest<E extends CameraEngine> extends Base
// power saving mode which makes the CPU extremely slow. This is especially problematic
// with video snapshots where we do lots of processing. The videoEnd callback can return
// long after the actual stop() call, so if we're still processing, let's wait more.
if (expectSuccess && camera.isTakingVideo()) {
while (camera.isTakingVideo()) {
if (expectSuccess) {
while (wait1Result == null) {
LOG.w("[WAIT VIDEO]", "Waiting extra", DELAY, "milliseconds...");
wait1.listen();
wait1Result = wait1.await(DELAY);
}
}
// Now wait for onVideoResult().
// Now wait for onVideoResult(). One cycle should be enough.
LOG.i("[WAIT VIDEO]", "Waiting for onVideoTaken()...");
VideoResult wait2Result = wait2.await(DELAY);

@ -1,66 +0,0 @@
package com.otaliastudios.cameraview.tools;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraListener;
import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraView;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
public class RecoverCameraRule implements TestRule {
public interface Callback {
@NonNull
CameraView getCamera();
@NonNull
CameraLogger getLogger();
}
private final Callback mCallback;
public RecoverCameraRule(@NonNull Callback callback) {
mCallback = callback;
}
@Override
public Statement apply(final Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
base.evaluate();
} catch (Throwable throwable) {
mCallback.getLogger().w("**************************************");
mCallback.getLogger().w("!!! TEST FAILED? THROWABLE FOUND:", throwable);
mCallback.getLogger().w("**************************************");
CameraException exception = findCameraException(throwable);
if (exception != null) {
mCallback.getLogger().e("**************************************");
mCallback.getLogger().e("!!! TEST FAILED, TRYING TO RECOVER !!!");
mCallback.getLogger().e("**************************************");
mCallback.getCamera().destroy();
base.evaluate();
} else {
throw throwable;
}
}
}
};
}
@Nullable
private CameraException findCameraException(@NonNull Throwable throwable) {
if (throwable instanceof CameraException
&& ((CameraException) throwable).isUnrecoverable()) {
return (CameraException) throwable;
}
if (throwable.getCause() == null) return null;
if (throwable == throwable.getCause()) return null;
return findCameraException(throwable.getCause());
}
}

@ -214,10 +214,9 @@ public abstract class CameraEngine implements
protected CameraEngine(@NonNull Callback callback) {
mCallback = callback;
mCrashHandler = new Handler(Looper.getMainLooper());
mHandler = WorkerHandler.get("CameraViewEngine");
mHandler.getThread().setUncaughtExceptionHandler(new CrashExceptionHandler());
mFrameManager = instantiateFrameManager();
mAngles = new Angles();
recreateHandler();
}
public void setPreview(@NonNull CameraPreview cameraPreview) {
@ -310,7 +309,7 @@ public abstract class CameraEngine implements
}
private void recreateHandler() {
mHandler.destroy();
if (mHandler != null) mHandler.destroy();
mHandler = WorkerHandler.get("CameraViewEngine");
mHandler.getThread().setUncaughtExceptionHandler(new CrashExceptionHandler());
}
@ -370,10 +369,8 @@ public abstract class CameraEngine implements
// onStopEngine() implementation and comments.
LOG.w("DESTROY: Could not destroy synchronously after 6 seconds.",
"Current thread:", Thread.currentThread(),
"Handler thread: ", mHandler.getThread(),
"Trying again on a new thread...");
recreateHandler();
destroy(unrecoverably);
"Handler thread: ", mHandler.getThread());
// TODO find a solution
}
} catch (InterruptedException ignore) {}
}

Loading…
Cancel
Save