diff --git a/build.gradle b/build.gradle index 7b2b8d2e..d26434d3 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ allprojects { ext { compileSdkVersion = 28 supportLibVersion = '28.0.0-rc02' + lifecycleVersion = '1.1.1' minSdkVersion = 15 targetSdkVersion = 28 } diff --git a/cameraview/build.gradle b/cameraview/build.gradle index 27c0ea5d..ab9c9440 100644 --- a/cameraview/build.gradle +++ b/cameraview/build.gradle @@ -49,6 +49,7 @@ dependencies { androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' api "com.android.support:exifinterface:$supportLibVersion" + api "android.arch.lifecycle:common:$lifecycleVersion" implementation "com.android.support:support-annotations:$supportLibVersion" } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index da30b4f5..3f44b18e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -4,6 +4,11 @@ import android.Manifest; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; +import android.arch.lifecycle.Lifecycle; +import android.arch.lifecycle.LifecycleObserver; +import android.arch.lifecycle.LifecycleOwner; +import android.arch.lifecycle.Lifecycling; +import android.arch.lifecycle.OnLifecycleEvent; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.PackageInfo; @@ -38,7 +43,7 @@ import static android.view.View.MeasureSpec.UNSPECIFIED; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -public class CameraView extends FrameLayout { +public class CameraView extends FrameLayout implements LifecycleObserver { private final static String TAG = CameraView.class.getSimpleName(); private static final CameraLogger LOG = CameraLogger.create(TAG); @@ -63,6 +68,7 @@ public class CameraView extends FrameLayout { private MediaActionSound mSound; /* for tests */ List mListeners = new CopyOnWriteArrayList<>(); /* for tests */ List mFrameProcessors = new CopyOnWriteArrayList<>(); + private Lifecycle mLifecycle; // Views GridLinesLayout mGridLinesLayout; @@ -138,7 +144,7 @@ public class CameraView extends FrameLayout { if (a.getBoolean(R.styleable.CameraView_cameraPictureSizeSmallest, false)) constraints.add(SizeSelectors.smallest()); if (a.getBoolean(R.styleable.CameraView_cameraPictureSizeBiggest, false)) constraints.add(SizeSelectors.biggest()); SizeSelector selector = !constraints.isEmpty() ? - SizeSelectors.and(constraints.toArray(new SizeSelector[constraints.size()])) : + SizeSelectors.and(constraints.toArray(new SizeSelector[0])) : SizeSelectors.biggest(); // Gestures @@ -537,11 +543,24 @@ public class CameraView extends FrameLayout { return mCameraController.getState() == CameraController.STATE_STOPPED; } + /** + * Sets the lifecycle owner for this view. This means you don't need + * to call {@link #start()}, {@link #stop()} or {@link #destroy()} at all. + * + * @param owner the owner activity or fragment + */ + public void setLifecycleOwner(LifecycleOwner owner) { + if (mLifecycle != null) mLifecycle.removeObserver(this); + mLifecycle = owner.getLifecycle(); + mLifecycle.addObserver(this); + } + /** * Starts the camera preview, if not started already. * This should be called onResume(), or when you are ready with permissions. */ + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void start() { if (!isEnabled()) return; @@ -611,6 +630,7 @@ public class CameraView extends FrameLayout { * Stops the current preview, if any was started. * This should be called onPause(). */ + @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void stop() { mCameraController.stop(); } @@ -620,6 +640,7 @@ public class CameraView extends FrameLayout { * Destroys this instance, releasing immediately * the camera resource. */ + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void destroy() { clearCameraListeners(); clearFrameProcessors();