diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java index 47e09f67..515b4e7d 100644 --- a/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java +++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java @@ -26,6 +26,7 @@ import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.controls.Preview; import java.io.File; +import java.util.Arrays; import java.util.List; @@ -33,9 +34,6 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis private CameraView camera; private ViewGroup controlPanel; - - - // To show stuff in the callback private long mCaptureTime; @Override @@ -68,9 +66,40 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis controlPanel = findViewById(R.id.controls); ViewGroup group = (ViewGroup) controlPanel.getChildAt(0); - List> options = Option.getAll(); - for (Option option : options) { - OptionView view = new OptionView(this, option, this); + View watermark = findViewById(R.id.watermark); + + List> options = Arrays.asList( + // Layout + new Option.Width(), new Option.Height(), + // Engine and preview + new Option.Mode(), new Option.Engine(), new Option.Preview(), + // Some controls + new Option.Flash(), new Option.WhiteBalance(), new Option.Hdr(), + // Video recording + new Option.VideoCodec(), new Option.Audio(), + // Gestures + new Option.Pinch(), new Option.HorizontalScroll(), new Option.VerticalScroll(), + new Option.Tap(), new Option.LongTap(), + // Watermarks + new Option.OverlayInPreview(watermark), new Option.OverlayInPictureSnapshot(watermark), + new Option.OverlayInVideoSnapshot(watermark), + // Other + new Option.Grid(), new Option.GridColor(), new Option.UseDeviceOrientation() + ); + List dividers = Arrays.asList( + false, true, + false, false, true, + false, false, true, + false, true, + false, false, false, false, true, + false, false, true, + false, false, true + ); + for (int i = 0; i < options.size(); i++) { + OptionView view = new OptionView(this); + //noinspection unchecked + view.setOption(options.get(i), this); + view.setHasDivider(dividers.get(i)); group.addView(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/Option.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/Option.java index 3d4c6f73..89ba17ea 100644 --- a/demo/src/main/java/com/otaliastudios/cameraview/demo/Option.java +++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/Option.java @@ -12,6 +12,8 @@ import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraView; import com.otaliastudios.cameraview.gesture.Gesture; import com.otaliastudios.cameraview.gesture.GestureAction; +import com.otaliastudios.cameraview.overlay.Overlay; +import com.otaliastudios.cameraview.overlay.OverlayLayout; import java.util.ArrayList; import java.util.Arrays; @@ -21,51 +23,13 @@ import java.util.List; /** * Controls that we want to display in a ControlView. */ +@SuppressWarnings("WeakerAccess") public abstract class Option { - public static List> getAll() { - return Arrays.asList( - // Layout - new Width(false), - new Height(true), - - // Engine and preview - new Mode(false), - new Engine(false), - new Preview(true), - - // Some controls - new Flash(false), - new WhiteBalance(false), - new Hdr(true), - - // Video recording - new VideoCodec(false), - new Audio(true), - // TODO audio bitRate - // TODO video bitRate - // They are a bit annoying because it's not clear what the default should be. - - // Gestures - new Pinch(false), - new HorizontalScroll(false), - new VerticalScroll(false), - new Tap(false), - new LongTap(true), - - // Other - new Grid(false), - new GridColor(false), - new UseDeviceOrientation(true) - ); - } - private String name; - private boolean hasDividerBelow; - private Option(@NonNull String name, boolean hasDividerBelow) { + private Option(@NonNull String name) { this.name = name; - this.hasDividerBelow = hasDividerBelow; } @SuppressWarnings("WeakerAccess") @@ -74,11 +38,6 @@ public abstract class Option { return name; } - @SuppressWarnings("WeakerAccess") - public final boolean hasDividerBelow() { - return hasDividerBelow; - } - @NonNull public abstract T get(@NonNull CameraView view); @@ -93,8 +52,8 @@ public abstract class Option { } public static class Width extends Option { - Width(boolean hasDividerBelow) { - super("Width", hasDividerBelow); + public Width() { + super("Width"); } @NonNull @@ -135,8 +94,8 @@ public abstract class Option { } public static class Height extends Option { - Height(boolean hasDividerBelow) { - super("Height", hasDividerBelow); + public Height() { + super("Height"); } @NonNull @@ -179,8 +138,8 @@ public abstract class Option { private static abstract class ControlOption extends Option { private final Class controlClass; - ControlOption(@NonNull Class controlClass, String name, boolean hasDividerBelow) { - super(name, hasDividerBelow); + ControlOption(@NonNull Class controlClass, String name) { + super(name); this.controlClass = controlClass; } @@ -203,14 +162,14 @@ public abstract class Option { } public static class Mode extends ControlOption { - Mode(boolean hasDividerBelow) { - super(com.otaliastudios.cameraview.controls.Mode.class, "Mode", hasDividerBelow); + public Mode() { + super(com.otaliastudios.cameraview.controls.Mode.class, "Mode"); } } public static class Engine extends ControlOption { - Engine(boolean hasDividerBelow) { - super(com.otaliastudios.cameraview.controls.Engine.class, "Engine", hasDividerBelow); + public Engine() { + super(com.otaliastudios.cameraview.controls.Engine.class, "Engine"); } @Override @@ -234,8 +193,8 @@ public abstract class Option { } public static class Preview extends ControlOption { - Preview(boolean hasDividerBelow) { - super(com.otaliastudios.cameraview.controls.Preview.class, "Preview Surface", hasDividerBelow); + public Preview() { + super(com.otaliastudios.cameraview.controls.Preview.class, "Preview Surface"); } @Override @@ -276,32 +235,32 @@ public abstract class Option { } public static class Flash extends ControlOption { - Flash(boolean hasDividerBelow) { - super(com.otaliastudios.cameraview.controls.Flash.class, "Flash", hasDividerBelow); + public Flash() { + super(com.otaliastudios.cameraview.controls.Flash.class, "Flash"); } } public static class WhiteBalance extends ControlOption { - WhiteBalance(boolean hasDividerBelow) { - super(com.otaliastudios.cameraview.controls.WhiteBalance.class, "White Balance", hasDividerBelow); + public WhiteBalance() { + super(com.otaliastudios.cameraview.controls.WhiteBalance.class, "White Balance"); } } public static class Hdr extends ControlOption { - Hdr(boolean hasDividerBelow) { - super(com.otaliastudios.cameraview.controls.Hdr.class, "HDR", hasDividerBelow); + public Hdr() { + super(com.otaliastudios.cameraview.controls.Hdr.class, "HDR"); } } public static class VideoCodec extends ControlOption { - VideoCodec(boolean hasDividerBelow) { - super(com.otaliastudios.cameraview.controls.VideoCodec.class, "Video Codec", hasDividerBelow); + public VideoCodec() { + super(com.otaliastudios.cameraview.controls.VideoCodec.class, "Video Codec"); } } public static class Audio extends ControlOption { - Audio(boolean hasDividerBelow) { - super(com.otaliastudios.cameraview.controls.Audio.class, "Audio", hasDividerBelow); + public Audio() { + super(com.otaliastudios.cameraview.controls.Audio.class, "Audio"); } } @@ -309,8 +268,8 @@ public abstract class Option { private final Gesture gesture; private final GestureAction[] allActions = GestureAction.values(); - GestureOption(@NonNull Gesture gesture, String name, boolean hasDividerBelow) { - super(name, hasDividerBelow); + GestureOption(@NonNull Gesture gesture, String name) { + super(name); this.gesture = gesture; } @@ -339,45 +298,103 @@ public abstract class Option { } public static class Pinch extends GestureOption { - Pinch(boolean hasDividerBelow) { - super(Gesture.PINCH, "Pinch", hasDividerBelow); + public Pinch() { + super(Gesture.PINCH, "Pinch"); } } public static class HorizontalScroll extends GestureOption { - HorizontalScroll(boolean hasDividerBelow) { - super(Gesture.SCROLL_HORIZONTAL, "Horizontal Scroll", hasDividerBelow); + public HorizontalScroll() { + super(Gesture.SCROLL_HORIZONTAL, "Horizontal Scroll"); } } public static class VerticalScroll extends GestureOption { - VerticalScroll(boolean hasDividerBelow) { - super(Gesture.SCROLL_VERTICAL, "Vertical Scroll", hasDividerBelow); + public VerticalScroll() { + super(Gesture.SCROLL_VERTICAL, "Vertical Scroll"); } } public static class Tap extends GestureOption { - Tap(boolean hasDividerBelow) { - super(Gesture.TAP, "Tap", hasDividerBelow); + public Tap() { + super(Gesture.TAP, "Tap"); } } public static class LongTap extends GestureOption { - LongTap(boolean hasDividerBelow) { - super(Gesture.LONG_TAP, "Long Tap", hasDividerBelow); + public LongTap() { + super(Gesture.LONG_TAP, "Long Tap"); + } + } + + private static abstract class OverlayOption extends Option { + private View overlay; + private Overlay.Target target; + + OverlayOption(@NonNull Overlay.Target target, @NonNull String name, @NonNull View overlay) { + super(name); + this.overlay = overlay; + this.target = target; + } + + @NonNull + @Override + public Collection getAll(@NonNull CameraView view, @NonNull CameraOptions options) { + return Arrays.asList(true, false); + } + + @NonNull + @Override + public Boolean get(@NonNull CameraView view) { + OverlayLayout.LayoutParams params = (OverlayLayout.LayoutParams) overlay.getLayoutParams(); + switch (target) { + case PREVIEW: return params.drawOnPreview; + case PICTURE_SNAPSHOT: return params.drawOnPictureSnapshot; + case VIDEO_SNAPSHOT: return params.drawOnVideoSnapshot; + } + return false; + } + + @Override + public void set(@NonNull CameraView view, @NonNull Boolean value) { + OverlayLayout.LayoutParams params = (OverlayLayout.LayoutParams) overlay.getLayoutParams(); + switch (target) { + case PREVIEW: params.drawOnPreview = value; break; + case PICTURE_SNAPSHOT: params.drawOnPictureSnapshot = value; break; + case VIDEO_SNAPSHOT: params.drawOnVideoSnapshot = value; break; + } + overlay.setLayoutParams(params); + } + } + + public static class OverlayInPreview extends OverlayOption { + public OverlayInPreview(@NonNull View overlay) { + super(Overlay.Target.PREVIEW, "Overlay in Preview", overlay); + } + } + + public static class OverlayInPictureSnapshot extends OverlayOption { + public OverlayInPictureSnapshot(@NonNull View overlay) { + super(Overlay.Target.PICTURE_SNAPSHOT, "Overlay in Picture Snapshot", overlay); + } + } + + public static class OverlayInVideoSnapshot extends OverlayOption { + public OverlayInVideoSnapshot(@NonNull View overlay) { + super(Overlay.Target.VIDEO_SNAPSHOT, "Overlay in Video Snapshot", overlay); } } public static class Grid extends ControlOption { - Grid(boolean hasDividerBelow) { - super(com.otaliastudios.cameraview.controls.Grid.class, "Grid Lines", hasDividerBelow); + public Grid() { + super(com.otaliastudios.cameraview.controls.Grid.class, "Grid Lines"); } } public static class GridColor extends Option> { - GridColor(boolean hasDividerBelow) { - super("Grid Color", hasDividerBelow); + public GridColor() { + super("Grid Color"); } private static final List> ALL = Arrays.asList( @@ -420,8 +437,8 @@ public abstract class Option { } public static class UseDeviceOrientation extends Option { - UseDeviceOrientation(boolean hasDividerBelow) { - super("Use Device Orientation", hasDividerBelow); + public UseDeviceOrientation() { + super("Use Device Orientation"); } @NonNull diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/OptionView.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/OptionView.java index 48937343..ea4bbd04 100644 --- a/demo/src/main/java/com/otaliastudios/cameraview/demo/OptionView.java +++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/OptionView.java @@ -33,23 +33,27 @@ public class OptionView extends LinearLayout implements Spinner.OnItemSel private Callback callback; private Spinner spinner; - public OptionView(Context context, Option option, Callback callback) { + public OptionView(@NonNull Context context) { super(context); - this.option = option; - this.callback = callback; setOrientation(VERTICAL); - inflate(context, R.layout.option_view, this); - TextView title = findViewById(R.id.title); - title.setText(option.getName()); - View divider = findViewById(R.id.divider); - divider.setVisibility(option.hasDividerBelow() ? View.VISIBLE : View.GONE); - ViewGroup content = findViewById(R.id.content); spinner = new Spinner(context, Spinner.MODE_DROPDOWN); content.addView(spinner); } + public void setHasDivider(boolean hasDivider) { + View divider = findViewById(R.id.divider); + divider.setVisibility(hasDivider ? View.VISIBLE : View.GONE); + } + + public void setOption(@NonNull Option option, @NonNull Callback callback) { + this.option = option; + this.callback = callback; + TextView title = findViewById(R.id.title); + title.setText(option.getName()); + } + @SuppressWarnings("all") public void onCameraOpened(CameraView view, CameraOptions options) { values = new ArrayList(option.getAll(view, options)); diff --git a/demo/src/main/res/layout/activity_camera.xml b/demo/src/main/res/layout/activity_camera.xml index c080b4aa..fb911b76 100644 --- a/demo/src/main/res/layout/activity_camera.xml +++ b/demo/src/main/res/layout/activity_camera.xml @@ -33,6 +33,7 @@