From 8e8dea9ddd85701b0ad544fae46f411b4e7b7746 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Mon, 5 Aug 2019 21:33:04 +0200 Subject: [PATCH] XML support, require experimental flag --- .../otaliastudios/cameraview/CameraView.java | 16 ++++++++- .../cameraview/filter/FilterParser.java | 33 +++++++++++++++++++ cameraview/src/main/res/values/attrs.xml | 2 ++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/filter/FilterParser.java diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 7c20c13a..979d2630 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -48,6 +48,7 @@ import com.otaliastudios.cameraview.engine.Camera2Engine; import com.otaliastudios.cameraview.engine.CameraEngine; import com.otaliastudios.cameraview.engine.offset.Reference; import com.otaliastudios.cameraview.filter.Filter; +import com.otaliastudios.cameraview.filter.FilterParser; import com.otaliastudios.cameraview.filter.Filters; import com.otaliastudios.cameraview.filter.NoFilter; import com.otaliastudios.cameraview.frame.Frame; @@ -111,6 +112,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { private HashMap mGestureMap = new HashMap<>(4); private Preview mPreview; private Engine mEngine; + private Filter mPendingFilter; // Components @VisibleForTesting CameraCallbacks mCameraCallbacks; @@ -179,6 +181,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { SizeSelectorParser sizeSelectors = new SizeSelectorParser(a); GestureParser gestures = new GestureParser(a); MarkerParser markers = new MarkerParser(a); + FilterParser filters = new FilterParser(a); a.recycle(); @@ -236,6 +239,9 @@ public class CameraView extends FrameLayout implements LifecycleObserver { // Apply markers setAutoFocusMarker(markers.getAutoFocusMarker()); + // Apply filters + setFilter(filters.getFilter()); + if (!isInEditMode()) { mOrientationHelper = new OrientationHelper(context, mCameraCallbacks); } @@ -263,6 +269,10 @@ public class CameraView extends FrameLayout implements LifecycleObserver { mCameraPreview = instantiatePreview(mPreview, getContext(), this); LOG.w("doInstantiateEngine:", "instantiated. preview:", mCameraPreview.getClass().getSimpleName()); mCameraEngine.setPreview(mCameraPreview); + if (mPendingFilter != null) { + setFilter(mPendingFilter); + mPendingFilter = null; + } } @@ -2151,7 +2161,11 @@ public class CameraView extends FrameLayout implements LifecycleObserver { * @param filter a new filter */ public void setFilter(@NonNull Filter filter) { - if (mCameraPreview instanceof FilterCameraPreview) { + if (mCameraPreview == null) { + mPendingFilter = filter; + } else if (!(filter instanceof NoFilter) && !mExperimental) { + LOG.w("Filters are an experimental features and need the experimental flag set."); + } else if (mCameraPreview instanceof FilterCameraPreview) { ((FilterCameraPreview) mCameraPreview).setFilter(filter); } else { LOG.w("setFilter() is supported only for GL_SURFACE. Preview:", mPreview); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filter/FilterParser.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filter/FilterParser.java new file mode 100644 index 00000000..d595c019 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filter/FilterParser.java @@ -0,0 +1,33 @@ +package com.otaliastudios.cameraview.filter; + +import android.content.res.TypedArray; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.otaliastudios.cameraview.R; + +/** + * Parses filters from XML attributes. + */ +public class FilterParser { + + private Filter filter = null; + + public FilterParser(@NonNull TypedArray array) { + String filterName = array.getString(R.styleable.CameraView_cameraFilter); + if (filterName != null) { + try { + Class filterClass = Class.forName(filterName); + filter = (Filter) filterClass.newInstance(); + } catch (Exception ignore) { + filter = new NoFilter(); + } + } + } + + @NonNull + public Filter getFilter() { + return filter; + } +} diff --git a/cameraview/src/main/res/values/attrs.xml b/cameraview/src/main/res/values/attrs.xml index 083105fa..83eb4dfc 100644 --- a/cameraview/src/main/res/values/attrs.xml +++ b/cameraview/src/main/res/values/attrs.xml @@ -131,6 +131,8 @@ + +