From 92393c19b2d2e4deb8df53d22dde2ad5b519fd45 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Tue, 8 Oct 2019 20:56:15 +0200 Subject: [PATCH] Create EngineThread annotation --- .../cameraview/engine/Camera1Engine.java | 21 +++++--- .../cameraview/engine/Camera2Engine.java | 20 ++++--- .../cameraview/engine/CameraEngine.java | 52 +++++++++---------- .../cameraview/engine/EngineThread.java | 7 +++ 4 files changed, 59 insertions(+), 41 deletions(-) create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/engine/EngineThread.java 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 11db5d38..60d63cb7 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java @@ -97,6 +97,7 @@ public class Camera1Engine extends CameraEngine implements //region Protected APIs + @EngineThread @NonNull @Override protected List getPreviewStreamAvailableSizes() { @@ -110,12 +111,13 @@ public class Camera1Engine extends CameraEngine implements return result; } - @WorkerThread + @EngineThread @Override protected void onPreviewStreamSizeChanged() { restartPreview(); } + @EngineThread @Override protected boolean collectCameraInfo(@NonNull Facing facing) { int internalFacing = mMapper.mapFacing(facing); @@ -140,7 +142,7 @@ public class Camera1Engine extends CameraEngine implements //region Start @NonNull - @WorkerThread + @EngineThread @Override protected Task onStartEngine() { try { @@ -164,6 +166,7 @@ public class Camera1Engine extends CameraEngine implements return Tasks.forResult(null); } + @EngineThread @NonNull @Override protected Task onStartBind() { @@ -187,6 +190,7 @@ public class Camera1Engine extends CameraEngine implements return Tasks.forResult(null); } + @EngineThread @NonNull @Override protected Task onStartPreview() { @@ -238,6 +242,7 @@ public class Camera1Engine extends CameraEngine implements //region Stop + @EngineThread @NonNull @Override protected Task onStopPreview() { @@ -256,6 +261,7 @@ public class Camera1Engine extends CameraEngine implements return Tasks.forResult(null); } + @EngineThread @NonNull @Override protected Task onStopBind() { @@ -275,8 +281,8 @@ public class Camera1Engine extends CameraEngine implements return Tasks.forResult(null); } + @EngineThread @NonNull - @WorkerThread @Override protected Task onStopEngine() { LOG.i("onStopEngine:", "About to clean up."); @@ -306,7 +312,7 @@ public class Camera1Engine extends CameraEngine implements //region Pictures - @WorkerThread + @EngineThread @Override protected void onTakePicture(@NonNull PictureResult.Stub stub, boolean doMetering) { stub.rotation = getAngles().offset(Reference.SENSOR, Reference.OUTPUT, @@ -316,7 +322,7 @@ public class Camera1Engine extends CameraEngine implements mPictureRecorder.take(); } - @WorkerThread + @EngineThread @Override protected void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio outputRatio, @@ -337,6 +343,7 @@ public class Camera1Engine extends CameraEngine implements //region Videos + @EngineThread @Override protected void onTakeVideo(@NonNull VideoResult.Stub stub) { stub.rotation = getAngles().offset(Reference.SENSOR, Reference.OUTPUT, @@ -357,7 +364,7 @@ public class Camera1Engine extends CameraEngine implements } @SuppressLint("NewApi") - @WorkerThread + @EngineThread @Override protected void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio outputRatio) { @@ -765,7 +772,7 @@ public class Camera1Engine extends CameraEngine implements } @NonNull - @WorkerThread + @EngineThread private static List computeMeteringAreas(double viewClickX, double viewClickY, int viewWidth, int viewHeight, int sensorToDisplay) { 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 8995b162..87eae063 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -28,7 +28,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; -import androidx.annotation.WorkerThread; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.TaskCompletionSource; @@ -286,6 +285,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv //region Protected APIs + @EngineThread @NonNull @Override protected List getPreviewStreamAvailableSizes() { @@ -310,12 +310,13 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv } } - @WorkerThread + @EngineThread @Override protected void onPreviewStreamSizeChanged() { restartBind(); } + @EngineThread @Override protected final boolean collectCameraInfo(@NonNull Facing facing) { int internalFacing = mMapper.mapFacing(facing); @@ -353,6 +354,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv //region Start + @EngineThread @SuppressLint("MissingPermission") @NonNull @Override @@ -402,6 +404,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv return task.getTask(); } + @EngineThread @NonNull @Override protected Task onStartBind() { @@ -525,6 +528,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv return task.getTask(); } + @EngineThread @NonNull @Override protected Task onStartPreview() { @@ -569,6 +573,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv //region Stop + @EngineThread @NonNull @Override protected Task onStopPreview() { @@ -598,7 +603,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv return Tasks.forResult(null); } - + @EngineThread @NonNull @Override protected Task onStopBind() { @@ -627,7 +632,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv return Tasks.forResult(null); } - + @EngineThread @NonNull @Override protected Task onStopEngine() { @@ -660,7 +665,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv //region Pictures - @WorkerThread + @EngineThread @Override protected void onTakePictureSnapshot(@NonNull final PictureResult.Stub stub, @NonNull final AspectRatio outputRatio, @@ -692,6 +697,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv } } + @EngineThread @Override protected void onTakePicture(@NonNull final PictureResult.Stub stub, boolean doMetering) { if (doMetering) { @@ -752,7 +758,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv //region Videos - @WorkerThread + @EngineThread @Override protected void onTakeVideo(@NonNull VideoResult.Stub stub) { LOG.i("onTakeVideo", "called."); @@ -787,7 +793,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv } } - @WorkerThread + @EngineThread @Override protected void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio outputRatio) { 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 6616b0e0..2631b2b9 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java @@ -47,7 +47,6 @@ import androidx.annotation.CallSuper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import androidx.annotation.WorkerThread; import java.io.File; import java.util.ArrayList; @@ -303,7 +302,7 @@ public abstract class CameraEngine implements final CameraException cameraException = (CameraException) throwable; LOG.e("uncaughtException:", "Got CameraException:", cameraException, - "on engine state:", getEngineStateName()); + "on engine state:", getEngineState()); if (fromExceptionHandler) { // Got to restart the handler. thread.interrupt(); @@ -336,11 +335,6 @@ public abstract class CameraEngine implements return mPreviewStep.getState(); } - @NonNull - private String getEngineStateName() { - return mEngineStep.getStateName(); - } - private boolean canStartEngine() { return mEngineStep.isStoppingOrStopped(); } @@ -375,7 +369,7 @@ public abstract class CameraEngine implements //region Start & Stop the engine @NonNull - @WorkerThread + @EngineThread private Task startEngine() { if (canStartEngine()) { mEngineStep.doStart(false, new Callable>() { @@ -398,7 +392,7 @@ public abstract class CameraEngine implements } @NonNull - @WorkerThread + @EngineThread private Task stopEngine(boolean swallowExceptions) { if (needsStopEngine()) { mEngineStep.doStop(swallowExceptions, new Callable>() { @@ -421,7 +415,7 @@ public abstract class CameraEngine implements * @return a task */ @NonNull - @WorkerThread + @EngineThread protected abstract Task onStartEngine(); /** @@ -431,7 +425,7 @@ public abstract class CameraEngine implements * @return a task */ @NonNull - @WorkerThread + @EngineThread protected abstract Task onStopEngine(); //endregion @@ -439,7 +433,7 @@ public abstract class CameraEngine implements //region Start & Stop binding @NonNull - @WorkerThread + @EngineThread private Task startBind() { if (canStartBind()) { mBindStep.doStart(false, new Callable>() { @@ -453,7 +447,7 @@ public abstract class CameraEngine implements } @NonNull - @WorkerThread + @EngineThread private Task stopBind(boolean swallowExceptions) { if (needsStopBind()) { mBindStep.doStop(swallowExceptions, new Callable>() { @@ -471,7 +465,7 @@ public abstract class CameraEngine implements * @return a task */ @NonNull - @WorkerThread + @EngineThread protected abstract Task onStartBind(); /** @@ -481,7 +475,7 @@ public abstract class CameraEngine implements * @return a task */ @NonNull - @WorkerThread + @EngineThread protected abstract Task onStopBind(); @SuppressWarnings("WeakerAccess") @@ -522,7 +516,7 @@ public abstract class CameraEngine implements //region Start & Stop preview @NonNull - @WorkerThread + @EngineThread private Task startPreview() { LOG.i("startPreview", "canStartPreview:", canStartPreview()); if (canStartPreview()) { @@ -537,7 +531,7 @@ public abstract class CameraEngine implements } @NonNull - @WorkerThread + @EngineThread private Task stopPreview(boolean swallowExceptions) { LOG.i("stopPreview", "needsStopPreview:", needsStopPreview(), @@ -571,7 +565,7 @@ public abstract class CameraEngine implements * @return a task */ @NonNull - @WorkerThread + @EngineThread protected abstract Task onStartPreview(); /** @@ -581,7 +575,7 @@ public abstract class CameraEngine implements * @return a task */ @NonNull - @WorkerThread + @EngineThread protected abstract Task onStopPreview(); //endregion @@ -643,7 +637,7 @@ public abstract class CameraEngine implements * * It basically depends on the step at which the preview stream size is actually used. */ - @WorkerThread + @EngineThread protected abstract void onPreviewStreamSizeChanged(); @Override @@ -676,7 +670,7 @@ public abstract class CameraEngine implements * that would cause deadlocks due to us awaiting for {@link #stop()} to return. */ public void destroy() { - LOG.i("destroy:", "state:", getEngineStateName(), "thread:", Thread.currentThread()); + LOG.i("destroy:", "state:", getEngineState(), "thread:", Thread.currentThread()); // Prevent CameraEngine leaks. Don't set to null, or exceptions // inside the standard stop() method might crash the main thread. mHandler.getThread().setUncaughtExceptionHandler(new NoOpExceptionHandler()); @@ -710,7 +704,7 @@ public abstract class CameraEngine implements @NonNull public Task start() { - LOG.i("Start:", "posting runnable. State:", getEngineStateName()); + LOG.i("Start:", "posting runnable. State:", getEngineState()); final TaskCompletionSource outTask = new TaskCompletionSource<>(); mHandler.run(new Runnable() { @Override @@ -765,7 +759,7 @@ public abstract class CameraEngine implements @NonNull private Task stop(final boolean swallowExceptions) { - LOG.i("Stop:", "posting runnable. State:", getEngineStateName()); + LOG.i("Stop:", "posting runnable. State:", getEngineState()); final TaskCompletionSource outTask = new TaskCompletionSource<>(); mHandler.run(new Runnable() { @Override @@ -1077,6 +1071,7 @@ public abstract class CameraEngine implements * @param facing the facing value * @return true if we have one */ + @EngineThread protected abstract boolean collectCameraInfo(@NonNull Facing facing); /** @@ -1256,6 +1251,7 @@ public abstract class CameraEngine implements }); } + @EngineThread @SuppressWarnings("WeakerAccess") protected void onStopVideo() { if (mVideoRecorder != null) { @@ -1289,19 +1285,19 @@ public abstract class CameraEngine implements mCallback.dispatchOnVideoRecordingEnd(); } - @WorkerThread + @EngineThread protected abstract void onTakePicture(@NonNull PictureResult.Stub stub, boolean doMetering); - @WorkerThread + @EngineThread protected abstract void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio outputRatio, boolean doMetering); - @WorkerThread + @EngineThread protected abstract void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio outputRatio); - @WorkerThread + @EngineThread protected abstract void onTakeVideo(@NonNull VideoResult.Stub stub); //endregion @@ -1430,9 +1426,11 @@ public abstract class CameraEngine implements * we can be sure that the camera is available (engineState == STARTED). * @return a list of available sizes for preview */ + @EngineThread @NonNull protected abstract List getPreviewStreamAvailableSizes(); + @EngineThread @NonNull @SuppressWarnings("WeakerAccess") protected final Size computePreviewStreamSize() { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/EngineThread.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/EngineThread.java new file mode 100644 index 00000000..8d807c5c --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/EngineThread.java @@ -0,0 +1,7 @@ +package com.otaliastudios.cameraview.engine; + +/** + * Indicates that some action is being executed on the {@link CameraEngine} thread. + */ +@SuppressWarnings("WeakerAccess") +public @interface EngineThread {}