|
|
|
@ -5,10 +5,13 @@ import androidx.annotation.NonNull; |
|
|
|
|
import android.view.View; |
|
|
|
|
import android.view.ViewGroup; |
|
|
|
|
|
|
|
|
|
import com.otaliastudios.cameraview.CameraListener; |
|
|
|
|
import com.otaliastudios.cameraview.controls.Audio; |
|
|
|
|
import com.otaliastudios.cameraview.CameraOptions; |
|
|
|
|
import com.otaliastudios.cameraview.CameraView; |
|
|
|
|
import com.otaliastudios.cameraview.controls.Engine; |
|
|
|
|
import com.otaliastudios.cameraview.controls.Flash; |
|
|
|
|
import com.otaliastudios.cameraview.controls.Preview; |
|
|
|
|
import com.otaliastudios.cameraview.gesture.Gesture; |
|
|
|
|
import com.otaliastudios.cameraview.gesture.GestureAction; |
|
|
|
|
import com.otaliastudios.cameraview.controls.Grid; |
|
|
|
@ -18,6 +21,7 @@ import com.otaliastudios.cameraview.controls.VideoCodec; |
|
|
|
|
import com.otaliastudios.cameraview.controls.WhiteBalance; |
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.Arrays; |
|
|
|
|
import java.util.Collection; |
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
@ -26,28 +30,38 @@ import java.util.List; |
|
|
|
|
*/ |
|
|
|
|
public enum Control { |
|
|
|
|
|
|
|
|
|
// Layout
|
|
|
|
|
WIDTH("Width", false), |
|
|
|
|
HEIGHT("Height", true), |
|
|
|
|
|
|
|
|
|
// Some controls
|
|
|
|
|
MODE("Mode", false), |
|
|
|
|
FLASH("Flash", false), |
|
|
|
|
WHITE_BALANCE("White balance", false), |
|
|
|
|
HDR("Hdr", true), |
|
|
|
|
|
|
|
|
|
GRID("Grid lines", false), |
|
|
|
|
GRID_COLOR("Grid color", true), |
|
|
|
|
// Engine and preview
|
|
|
|
|
ENGINE("Engine", false), |
|
|
|
|
PREVIEW("Preview Surface", true), |
|
|
|
|
|
|
|
|
|
// TODO audio bitRate
|
|
|
|
|
// TODO video bitRate
|
|
|
|
|
// THey are a bit annoying because it's not clear what the default should be.
|
|
|
|
|
// Video recording
|
|
|
|
|
VIDEO_CODEC("Video codec", false), |
|
|
|
|
AUDIO("Audio", true), |
|
|
|
|
// TODO audio bitRate
|
|
|
|
|
// TODO video bitRate
|
|
|
|
|
// They are a bit annoying because it's not clear what the default should be.
|
|
|
|
|
|
|
|
|
|
// Gestures
|
|
|
|
|
PINCH("Pinch", false), |
|
|
|
|
HSCROLL("Horizontal scroll", false), |
|
|
|
|
VSCROLL("Vertical scroll", false), |
|
|
|
|
TAP("Single tap", false), |
|
|
|
|
LONG_TAP("Long tap", true); |
|
|
|
|
LONG_TAP("Long tap", true), |
|
|
|
|
|
|
|
|
|
// Others
|
|
|
|
|
GRID("Grid lines", false), |
|
|
|
|
GRID_COLOR("Grid color", false), |
|
|
|
|
USE_DEVICE_ORIENTATION("Use device orientation", true); |
|
|
|
|
|
|
|
|
|
private String name; |
|
|
|
|
private boolean last; |
|
|
|
@ -88,6 +102,8 @@ public enum Control { |
|
|
|
|
case GRID: return options.getSupportedControls(Grid.class); |
|
|
|
|
case AUDIO: return options.getSupportedControls(Audio.class); |
|
|
|
|
case VIDEO_CODEC: return options.getSupportedControls(VideoCodec.class); |
|
|
|
|
case ENGINE: return options.getSupportedControls(Engine.class); |
|
|
|
|
case PREVIEW: return options.getSupportedControls(Preview.class); |
|
|
|
|
case PINCH: |
|
|
|
|
case HSCROLL: |
|
|
|
|
case VSCROLL: |
|
|
|
@ -110,6 +126,8 @@ public enum Control { |
|
|
|
|
list3.add(new GridColor(Color.BLACK, "black")); |
|
|
|
|
list3.add(new GridColor(Color.YELLOW, "yellow")); |
|
|
|
|
return list3; |
|
|
|
|
case USE_DEVICE_ORIENTATION: |
|
|
|
|
return Arrays.asList(true, false); |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
@ -135,11 +153,14 @@ public enum Control { |
|
|
|
|
case VSCROLL: return view.getGestureAction(Gesture.SCROLL_VERTICAL); |
|
|
|
|
case TAP: return view.getGestureAction(Gesture.TAP); |
|
|
|
|
case LONG_TAP: return view.getGestureAction(Gesture.LONG_TAP); |
|
|
|
|
case USE_DEVICE_ORIENTATION: return view.getUseDeviceOrientation(); |
|
|
|
|
case ENGINE: return view.getEngine(); |
|
|
|
|
case PREVIEW: return view.getPreview(); |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void applyValue(CameraView camera, Object value) { |
|
|
|
|
public void applyValue(final CameraView camera, final Object value) { |
|
|
|
|
switch (this) { |
|
|
|
|
case WIDTH: |
|
|
|
|
camera.getLayoutParams().width = (int) value; |
|
|
|
@ -175,9 +196,61 @@ public enum Control { |
|
|
|
|
break; |
|
|
|
|
case GRID_COLOR: |
|
|
|
|
camera.setGridColor(((GridColor) value).color); |
|
|
|
|
break; |
|
|
|
|
case USE_DEVICE_ORIENTATION: |
|
|
|
|
camera.setUseDeviceOrientation((Boolean) value); |
|
|
|
|
break; |
|
|
|
|
case ENGINE: |
|
|
|
|
boolean started = camera.isOpened(); |
|
|
|
|
if (started) { |
|
|
|
|
camera.addCameraListener(new CameraListener() { |
|
|
|
|
@Override |
|
|
|
|
public void onCameraClosed() { |
|
|
|
|
super.onCameraClosed(); |
|
|
|
|
camera.removeCameraListener(this); |
|
|
|
|
camera.setEngine((Engine) value); |
|
|
|
|
camera.open(); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
camera.close(); |
|
|
|
|
} else { |
|
|
|
|
camera.setEngine((Engine) value); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case PREVIEW: |
|
|
|
|
boolean opened = camera.isOpened(); |
|
|
|
|
if (opened) { |
|
|
|
|
camera.addCameraListener(new CameraListener() { |
|
|
|
|
@Override |
|
|
|
|
public void onCameraClosed() { |
|
|
|
|
super.onCameraClosed(); |
|
|
|
|
camera.removeCameraListener(this); |
|
|
|
|
applyPreview(camera, (Preview) value, true); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
camera.close(); |
|
|
|
|
} else { |
|
|
|
|
applyPreview(camera, (Preview) value, false); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// This is really tricky since the preview can only be changed when not attached to window.
|
|
|
|
|
private void applyPreview(@NonNull CameraView cameraView, @NonNull Preview newPreview, boolean openWhenDone) { |
|
|
|
|
ViewGroup.LayoutParams params = cameraView.getLayoutParams(); |
|
|
|
|
ViewGroup parent = (ViewGroup) cameraView.getParent(); |
|
|
|
|
int index = 0; |
|
|
|
|
for (int i = 0; i < parent.getChildCount(); i++) { |
|
|
|
|
if (parent.getChildAt(i) == cameraView) { |
|
|
|
|
index = i; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
parent.removeView(cameraView); |
|
|
|
|
cameraView.setPreview(newPreview); |
|
|
|
|
parent.addView(cameraView, index, params); |
|
|
|
|
if (openWhenDone) cameraView.open(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static class GridColor { |
|
|
|
|
int color; |
|
|
|
|