From 3a6f3426b0a8711a352b35073251c91e98244536 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Sat, 13 Jul 2019 09:22:54 -0300 Subject: [PATCH] Reorder to overlay package --- .../otaliastudios/cameraview/CameraView.java | 114 ++++++++++-------- .../cameraview/engine/CameraEngine.java | 2 +- .../OverlayLayout.java} | 30 ++--- .../OverlayLayoutInner.java} | 8 +- .../{ => overlay}/SurfaceDrawer.java | 2 +- .../picture/SnapshotGlPictureRecorder.java | 2 +- .../video/SnapshotVideoRecorder.java | 3 +- 7 files changed, 87 insertions(+), 74 deletions(-) rename cameraview/src/main/java/com/otaliastudios/cameraview/{OverlayLayoutManager.java => overlay/OverlayLayout.java} (82%) rename cameraview/src/main/java/com/otaliastudios/cameraview/{OverlayLayout.java => overlay/OverlayLayoutInner.java} (63%) rename cameraview/src/main/java/com/otaliastudios/cameraview/{ => overlay}/SurfaceDrawer.java (80%) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index d9d9b363..989e5a37 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -63,6 +63,7 @@ import com.otaliastudios.cameraview.internal.utils.CropHelper; import com.otaliastudios.cameraview.internal.utils.OrientationHelper; import com.otaliastudios.cameraview.internal.utils.WorkerHandler; import com.otaliastudios.cameraview.markers.MarkerParser; +import com.otaliastudios.cameraview.overlay.OverlayLayout; import com.otaliastudios.cameraview.preview.CameraPreview; import com.otaliastudios.cameraview.preview.GlCameraPreview; import com.otaliastudios.cameraview.preview.SurfaceCameraPreview; @@ -133,8 +134,8 @@ public class CameraView extends FrameLayout implements LifecycleObserver { private boolean mExperimental; // Overlays - private OverlayLayoutManager mOverlayLayoutManager; // see OverlayLayoutManager for why having two of them - private OverlayLayoutManager mOverlayLayoutManagerBelow; + private OverlayLayout mOverlayLayoutManager; // see OverlayLayoutManager for why having two of them + private OverlayLayout mOverlayLayoutManagerBelow; // Threading private Handler mUiHandler; @@ -192,8 +193,8 @@ public class CameraView extends FrameLayout implements LifecycleObserver { // Views mGridLinesLayout = new GridLinesLayout(context); - mOverlayLayoutManager = new OverlayLayoutManager(context); - mOverlayLayoutManagerBelow = new OverlayLayoutManager(context); + mOverlayLayoutManager = new OverlayLayout(context); + mOverlayLayoutManagerBelow = new OverlayLayout(context); mMarkerLayout = new MarkerLayout(context); addView(mGridLinesLayout); addView(mMarkerLayout); @@ -246,7 +247,17 @@ public class CameraView extends FrameLayout implements LifecycleObserver { * {@link #setEngine(Engine)} is called. */ private void doInstantiateEngine() { + if (mCameraEngine != null) { + mCameraEngine.removePictureSurfaceDrawer(mOverlayLayoutManager); + mCameraEngine.removePictureSurfaceDrawer(mOverlayLayoutManagerBelow); + mCameraEngine.removeVideoSurfaceDrawer(mOverlayLayoutManager); + mCameraEngine.removeVideoSurfaceDrawer(mOverlayLayoutManagerBelow); + } mCameraEngine = instantiateCameraEngine(mEngine, mCameraCallbacks); + mCameraEngine.addPictureSurfaceDrawer(mOverlayLayoutManager); + mCameraEngine.addPictureSurfaceDrawer(mOverlayLayoutManagerBelow); + mCameraEngine.addVideoSurfaceDrawer(mOverlayLayoutManager); + mCameraEngine.addVideoSurfaceDrawer(mOverlayLayoutManagerBelow); } /** @@ -313,10 +324,6 @@ public class CameraView extends FrameLayout implements LifecycleObserver { // isHardwareAccelerated will return the real value only after we are // attached. That's why we instantiate the preview here. doInstantiatePreview(); - mCameraEngine.addPictureSurfaceDrawer(mOverlayLayoutManager); - mCameraEngine.addPictureSurfaceDrawer(mOverlayLayoutManagerBelow); - mCameraEngine.addVideoSurfaceDrawer(mOverlayLayoutManager); - mCameraEngine.addVideoSurfaceDrawer(mOverlayLayoutManagerBelow); } if (!isInEditMode()) { mOrientationHelper.enable(getContext()); @@ -331,49 +338,6 @@ public class CameraView extends FrameLayout implements LifecycleObserver { super.onDetachedFromWindow(); } - @Override - public void addView(View child, ViewGroup.LayoutParams params) { - if (params instanceof OverlayLayoutParams) { - if (((OverlayLayoutParams) params).drawInPreview) { - mOverlayLayoutManager.addView(child, params); - } else { - mOverlayLayoutManagerBelow.addView(child, params); - } - } else { - super.addView(child, params); - } - } - - @Override - public void removeView(View child) { - if (child.getLayoutParams() instanceof OverlayLayoutParams) { - if (((OverlayLayoutParams) child.getLayoutParams()).drawInPreview) { - mOverlayLayoutManager.removeView(child); - } else { - mOverlayLayoutManagerBelow.removeView(child); - } - } else { - super.removeView(child); - } - } - - @Override - public LayoutParams generateLayoutParams(AttributeSet attributeSet) { - OverlayLayoutParams toBeChecked = new OverlayLayoutParams(this.getContext(), attributeSet); - if (toBeChecked.isOverlay()) { - return toBeChecked; - } - return super.generateLayoutParams(attributeSet); - } - - @Override - protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { - if (p instanceof OverlayLayoutParams) { - return p; - } - return super.generateLayoutParams(p); - } - //endregion //region Measuring behavior @@ -2135,6 +2099,54 @@ public class CameraView extends FrameLayout implements LifecycleObserver { } } + //endregion + + //region Overlays + + @Override + public void addView(View child, ViewGroup.LayoutParams params) { + if (params instanceof OverlayLayoutParams) { + if (((OverlayLayoutParams) params).drawInPreview) { + mOverlayLayoutManager.addView(child, params); + } else { + mOverlayLayoutManagerBelow.addView(child, params); + } + } else { + super.addView(child, params); + } + } + + @Override + public void removeView(View child) { + if (child.getLayoutParams() instanceof OverlayLayoutParams) { + if (((OverlayLayoutParams) child.getLayoutParams()).drawInPreview) { + mOverlayLayoutManager.removeView(child); + } else { + mOverlayLayoutManagerBelow.removeView(child); + } + } else { + super.removeView(child); + } + } + + @Override + public LayoutParams generateLayoutParams(AttributeSet attributeSet) { + OverlayLayoutParams toBeChecked = new OverlayLayoutParams(this.getContext(), attributeSet); + if (toBeChecked.isOverlay()) { + return toBeChecked; + } + return super.generateLayoutParams(attributeSet); + } + + @Override + protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + if (p instanceof OverlayLayoutParams) { + return p; + } + return super.generateLayoutParams(p); + } + + public static class OverlayLayoutParams extends FrameLayout.LayoutParams { private boolean drawInPreview = false; 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 bc51c606..21b5967a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java @@ -18,7 +18,7 @@ import com.otaliastudios.cameraview.CameraException; import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.PictureResult; -import com.otaliastudios.cameraview.SurfaceDrawer; +import com.otaliastudios.cameraview.overlay.SurfaceDrawer; import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.engine.offset.Angles; import com.otaliastudios.cameraview.engine.offset.Reference; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/OverlayLayoutManager.java b/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayLayout.java similarity index 82% rename from cameraview/src/main/java/com/otaliastudios/cameraview/OverlayLayoutManager.java rename to cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayLayout.java index 713b87de..cb6e66a5 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/OverlayLayoutManager.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayLayout.java @@ -1,4 +1,4 @@ -package com.otaliastudios.cameraview; +package com.otaliastudios.cameraview.overlay; import android.content.Context; @@ -11,11 +11,13 @@ import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.otaliastudios.cameraview.CameraView; + import java.util.HashMap; import java.util.Map; /** - * This class manages {@link OverlayLayout}s. + * This class manages {@link OverlayLayoutInner}s. * The necessity for this class comes from two features of {@link View}s: * - a {@link View} can only have one parent * - the View framework does not provide a straightforward way for a {@link ViewGroup} to draw @@ -25,26 +27,26 @@ import java.util.Map; * - picture snapshot * - video snapshot * Given the two constraints above in order to draw exclusively on a subset of targets we need a - * different {@link OverlayLayout} for each subset of targets. This class manages those different - * {@link OverlayLayout}s. + * different {@link OverlayLayoutInner} for each subset of targets. This class manages those different + * {@link OverlayLayoutInner}s. * * A problem remains: the views are drawn on preview when {@link #draw(Canvas)} is called on this * class, for not drawing on the preview but drawing on picture snapshot, for instance, we cannot * change the child's visibility. - * One way to solve this problem is to have two instances of {@link OverlayLayoutManager} and layer + * One way to solve this problem is to have two instances of {@link OverlayLayout} and layer * them so that the one below is covered and hidden by the camera preview. This way only the top - * {@link OverlayLayoutManager} is shown on top of the camera preview and we can still access the - * bottom one's {@link OverlayLayout#draw(Canvas)} for drawing on picture snapshots. + * {@link OverlayLayout} is shown on top of the camera preview and we can still access the + * bottom one's {@link OverlayLayoutInner#draw(Canvas)} for drawing on picture snapshots. */ -class OverlayLayoutManager extends FrameLayout implements SurfaceDrawer { +public class OverlayLayout extends FrameLayout implements SurfaceDrawer { - private Map mLayouts = new HashMap<>(); + private Map mLayouts = new HashMap<>(); - public OverlayLayoutManager(@NonNull Context context) { + public OverlayLayout(@NonNull Context context) { super(context); } - public OverlayLayoutManager(@NonNull Context context, @Nullable AttributeSet attrs) { + public OverlayLayout(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } @@ -59,7 +61,7 @@ class OverlayLayoutManager extends FrameLayout implements SurfaceDrawer { if (mLayouts.containsKey(viewOverlayType)) { mLayouts.get(viewOverlayType).addView(child, params); } else { - OverlayLayout newLayout = new OverlayLayout(getContext()); + OverlayLayoutInner newLayout = new OverlayLayoutInner(getContext()); newLayout.addView(child, params); super.addView(newLayout); mLayouts.put(viewOverlayType, newLayout); @@ -87,7 +89,7 @@ class OverlayLayoutManager extends FrameLayout implements SurfaceDrawer { // scale factor between canvas height and this View's height float heightScale = surfaceCanvas.getHeight() / (float) getHeight(); surfaceCanvas.scale(widthScale, heightScale); - for (Map.Entry entry : mLayouts.entrySet()) { + for (Map.Entry entry : mLayouts.entrySet()) { if (entry.getKey().pictureSnapshot) { entry.getValue().drawOverlay(surfaceCanvas); } @@ -103,7 +105,7 @@ class OverlayLayoutManager extends FrameLayout implements SurfaceDrawer { // scale factor between canvas height and this View's height float heightScale = surfaceCanvas.getHeight() / (float) getHeight(); surfaceCanvas.scale(widthScale, heightScale); - for (Map.Entry entry : mLayouts.entrySet()) { + for (Map.Entry entry : mLayouts.entrySet()) { if (entry.getKey().videoSnapshot) { entry.getValue().drawOverlay(surfaceCanvas); } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/OverlayLayout.java b/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayLayoutInner.java similarity index 63% rename from cameraview/src/main/java/com/otaliastudios/cameraview/OverlayLayout.java rename to cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayLayoutInner.java index 56e38d99..3948f7f3 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/OverlayLayout.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayLayoutInner.java @@ -1,4 +1,4 @@ -package com.otaliastudios.cameraview; +package com.otaliastudios.cameraview.overlay; import android.content.Context; import android.graphics.Canvas; @@ -8,14 +8,14 @@ import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -class OverlayLayout extends FrameLayout { +public class OverlayLayoutInner extends FrameLayout { - public OverlayLayout(@NonNull Context context) { + public OverlayLayoutInner(@NonNull Context context) { super(context); setWillNotDraw(false); } - public OverlayLayout(@NonNull Context context, @Nullable AttributeSet attrs) { + public OverlayLayoutInner(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); setWillNotDraw(false); } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/SurfaceDrawer.java b/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/SurfaceDrawer.java similarity index 80% rename from cameraview/src/main/java/com/otaliastudios/cameraview/SurfaceDrawer.java rename to cameraview/src/main/java/com/otaliastudios/cameraview/overlay/SurfaceDrawer.java index 652d7884..11aaa6a2 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/SurfaceDrawer.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/SurfaceDrawer.java @@ -1,4 +1,4 @@ -package com.otaliastudios.cameraview; +package com.otaliastudios.cameraview.overlay; import android.graphics.Canvas; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java index 026939e7..01c7f21f 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java @@ -14,7 +14,7 @@ import android.os.Build; import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.PictureResult; -import com.otaliastudios.cameraview.SurfaceDrawer; +import com.otaliastudios.cameraview.overlay.SurfaceDrawer; import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.engine.CameraEngine; import com.otaliastudios.cameraview.engine.offset.Axis; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java index fe88fcd9..7a2d9879 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java @@ -6,13 +6,12 @@ import android.graphics.PorterDuff; import android.graphics.SurfaceTexture; import android.opengl.EGL14; import android.os.Build; -import android.util.Log; import android.view.Surface; import java.util.List; import com.otaliastudios.cameraview.CameraLogger; -import com.otaliastudios.cameraview.SurfaceDrawer; +import com.otaliastudios.cameraview.overlay.SurfaceDrawer; import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.controls.Audio; import com.otaliastudios.cameraview.engine.CameraEngine;