diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java index 6439ee01..a63e2b54 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java @@ -248,7 +248,13 @@ public class CameraViewCallbacksTest extends BaseTest { verify(listener, times(1)).onOrientationChanged(anyInt()); } - // TODO: test onShutter, here or elsewhere + @Test + public void testOnShutter() { + doEndOp(op, true).when(listener).onPictureShutter(); + camera.mCameraCallbacks.dispatchOnPictureShutter(true); + assertNotNull(op.await(DELAY)); + verify(listener, times(1)).onPictureShutter(); + } @Test public void testCameraError() { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraListener.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraListener.java index c6d9094b..34161eea 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraListener.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraListener.java @@ -162,11 +162,12 @@ public abstract class CameraListener { } /** - * Notifies that the shutter event is happening. You can update UI to show some - * trigger effect, so user visually confirms that picture is being taken - * or video recording is about to start. + * Notifies that the picture capture has started. Can be used to update the UI for visual + * confirmation or sound effects. */ @UiThread - public void onShutter() {} + public void onPictureShutter() { + + } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index eb745722..f3fd9de8 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -2228,7 +2228,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { } @Override - public void onShutter(boolean shouldPlaySound) { + public void dispatchOnPictureShutter(boolean shouldPlaySound) { if (shouldPlaySound && mPlaySounds) { playSound(MediaActionSound.SHUTTER_CLICK); } @@ -2236,7 +2236,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { @Override public void run() { for (CameraListener listener : mListeners) { - listener.onShutter(); + listener.onPictureShutter(); } } }); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraBaseEngine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraBaseEngine.java index 07e3c231..98749d4e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraBaseEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraBaseEngine.java @@ -1,7 +1,5 @@ package com.otaliastudios.cameraview.engine; -import android.graphics.PointF; -import android.graphics.RectF; import android.location.Location; import androidx.annotation.CallSuper; @@ -28,7 +26,6 @@ import com.otaliastudios.cameraview.engine.offset.Angles; import com.otaliastudios.cameraview.engine.offset.Reference; import com.otaliastudios.cameraview.engine.orchestrator.CameraState; import com.otaliastudios.cameraview.frame.FrameManager; -import com.otaliastudios.cameraview.gesture.Gesture; import com.otaliastudios.cameraview.overlay.Overlay; import com.otaliastudios.cameraview.picture.PictureRecorder; import com.otaliastudios.cameraview.preview.CameraPreview; @@ -556,7 +553,7 @@ public abstract class CameraBaseEngine extends CameraEngine { @Override public void onPictureShutter(boolean didPlaySound) { - getCallback().onShutter(!didPlaySound); + getCallback().dispatchOnPictureShutter(!didPlaySound); } @Override 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 e695b61c..0614789d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java @@ -116,7 +116,7 @@ public abstract class CameraEngine implements void dispatchOnCameraOpened(@NonNull CameraOptions options); void dispatchOnCameraClosed(); void onCameraPreviewStreamSizeChanged(); - void onShutter(boolean shouldPlaySound); + void dispatchOnPictureShutter(boolean shouldPlaySound); void dispatchOnVideoTaken(@NonNull VideoResult.Stub stub); void dispatchOnPictureTaken(@NonNull PictureResult.Stub stub); void dispatchOnFocusStart(@Nullable Gesture trigger, @NonNull PointF where); diff --git a/docs/_about/changelog.md b/docs/_about/changelog.md index 1b0ba174..859313c9 100644 --- a/docs/_about/changelog.md +++ b/docs/_about/changelog.md @@ -11,7 +11,7 @@ Companies can share a tiny part of their revenue and get private support hours i ##### v2.7.0 -- New: onShutter() callback when taking pictures, thanks to [@EzequielAdrianM][EzequielAdrianM] ([#1030][1030]) +- New: onPictureShutter() callback when taking pictures, thanks to [@EzequielAdrianM][EzequielAdrianM] ([#1030][1030]) - New: GestureAction.TAKE_PICTURE_SNAPSHOT lets you take snapshots on gesture, thanks to [@EzequielAdrianM][EzequielAdrianM] ([#1030][1030]) - Improvement: try-catch internal exception when takePicture fails, thanks to [@michaelspecht][michaelspecht] ([#1024][1024]) - Improvement: log errors when file writing fails, thanks to [@bwt][bwt] ([#960][960]) diff --git a/docs/_docs/capturing-media.md b/docs/_docs/capturing-media.md index fdde9828..94c573d6 100644 --- a/docs/_docs/capturing-media.md +++ b/docs/_docs/capturing-media.md @@ -68,6 +68,11 @@ This is allowed at the following conditions: ```java camera.addCameraListener(new CameraListener() { + + @Override + public void onPictureShutter() { + // Picture capture started! + } @Override public void onPictureTaken(@NonNull PictureResult result) { diff --git a/docs/_docs/gestures.md b/docs/_docs/gestures.md index 961367d6..fb8212f7 100644 --- a/docs/_docs/gestures.md +++ b/docs/_docs/gestures.md @@ -24,8 +24,8 @@ Simple as that. There are two things to be noted: |Gesture|Description|Can be mapped to| |-------------|-----------|----------------| |`PINCH`|Pinch gesture, typically assigned to the zoom control.|`ZOOM` `EXPOSURE_CORRECTION` `FILTER_CONTROL_1` `FILTER_CONTROL_2` `NONE`| -|`TAP`|Single tap gesture, typically assigned to the focus control.|`AUTO_FOCUS` `TAKE_PICTURE` `NONE`| -|`LONG_TAP`|Long tap gesture.|`AUTO_FOCUS` `TAKE_PICTURE` `NONE`| +|`TAP`|Single tap gesture, typically assigned to the focus control.|`AUTO_FOCUS` `TAKE_PICTURE` `TAKE_PICTURE_SNAPSHOT` `NONE`| +|`LONG_TAP`|Long tap gesture.|`AUTO_FOCUS` `TAKE_PICTURE` `TAKE_PICTURE_SNAPSHOT` `NONE`| |`SCROLL_HORIZONTAL`|Horizontal movement gesture.|`ZOOM` `EXPOSURE_CORRECTION` `FILTER_CONTROL_1` `FILTER_CONTROL_2` `NONE`| |`SCROLL_VERTICAL`|Vertical movement gesture.|`ZOOM` `EXPOSURE_CORRECTION` `FILTER_CONTROL_1` `FILTER_CONTROL_2` `NONE`| @@ -38,6 +38,7 @@ Looking at this from the other side: |`NONE`|Disables this gesture.|`TAP` `LONG_TAP` `PINCH` `SCROLL_HORIZONTAL` `SCROLL_VERTICAL`| |`AUTO_FOCUS`|Launches a [touch metering operation](metering#touch-metering) on the finger position.|`TAP` `LONG_TAP`| |`TAKE_PICTURE`|Takes a picture using [takePicture](capturing-media).|`TAP` `LONG_TAP`| +|`TAKE_PICTURE_SNAPSHOT`|Takes a picture using [takePictureSnapshot](capturing-media).|`TAP` `LONG_TAP`| |`ZOOM`|[Zooms](controls#zoom) in or out.|`PINCH` `SCROLL_HORIZONTAL` `SCROLL_VERTICAL`| |`EXPOSURE_CORRECTION`|Controls the [exposure correction](metering#exposure-correction).|`PINCH` `SCROLL_HORIZONTAL` `SCROLL_VERTICAL`| |`FILTER_CONTROL_1`|Controls the first parameter (if any) of a [real-time filter](filters).|`PINCH` `SCROLL_HORIZONTAL` `SCROLL_VERTICAL`| @@ -48,8 +49,8 @@ Looking at this from the other side: ```xml ```