Release v2.7.0 (#1040)

* Release v2.7.0

* Improve docs
pull/1047/head v2.7.0
Mattia Iavarone 4 years ago committed by GitHub
parent d89491195c
commit a219073468
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      .github/workflows/build.yml
  2. 2
      README.md
  3. 10
      build.gradle.kts
  4. 18
      cameraview/build.gradle.kts
  5. 8
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java
  6. 9
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraListener.java
  7. 4
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
  8. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraBaseEngine.java
  9. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java
  10. 20
      docs/_about/changelog.md
  11. 2
      docs/_config.yml
  12. 5
      docs/_docs/capturing-media.md
  13. 9
      docs/_docs/gestures.md
  14. 2
      gradle/wrapper/gradle-wrapper.properties

@ -5,6 +5,7 @@ on:
push: push:
branches: branches:
- master - master
- main
pull_request: pull_request:
jobs: jobs:
ANDROID_BASE_CHECKS: ANDROID_BASE_CHECKS:

@ -22,7 +22,7 @@ CameraView is a well documented, high-level library that makes capturing picture
addressing most of the common issues and needs, and still leaving you with flexibility where needed. addressing most of the common issues and needs, and still leaving you with flexibility where needed.
```groovy ```groovy
api 'com.otaliastudios:cameraview:2.6.4' api 'com.otaliastudios:cameraview:2.7.0'
``` ```
- Fast & reliable - Fast & reliable

@ -2,8 +2,8 @@
buildscript { buildscript {
extra["minSdkVersion"] = 15 extra["minSdkVersion"] = 15
extra["compileSdkVersion"] = 29 extra["compileSdkVersion"] = 30
extra["targetSdkVersion"] = 29 extra["targetSdkVersion"] = 30
repositories { repositories {
google() google()
@ -12,9 +12,9 @@ buildscript {
} }
dependencies { dependencies {
classpath("com.android.tools.build:gradle:4.0.1") classpath("com.android.tools.build:gradle:4.1.2")
classpath("com.otaliastudios.tools:publisher:0.3.3") classpath("io.deepmedia.tools:publisher:0.4.1")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.0") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21")
} }
} }

@ -1,10 +1,10 @@
import com.otaliastudios.tools.publisher.common.License import io.deepmedia.tools.publisher.common.License
import com.otaliastudios.tools.publisher.common.Release import io.deepmedia.tools.publisher.common.Release
plugins { plugins {
id("com.android.library") id("com.android.library")
id("kotlin-android") id("kotlin-android")
id("com.otaliastudios.tools.publisher") id("io.deepmedia.tools.publisher")
id("jacoco") id("jacoco")
} }
@ -14,7 +14,7 @@ android {
setMinSdkVersion(property("minSdkVersion") as Int) setMinSdkVersion(property("minSdkVersion") as Int)
setTargetSdkVersion(property("targetSdkVersion") as Int) setTargetSdkVersion(property("targetSdkVersion") as Int)
versionCode = 1 versionCode = 1
versionName = "2.6.4" versionName = "2.7.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunnerArgument("filter", "" + testInstrumentationRunnerArgument("filter", "" +
"com.otaliastudios.cameraview.tools.SdkExcludeFilter," + "com.otaliastudios.cameraview.tools.SdkExcludeFilter," +
@ -30,11 +30,11 @@ dependencies {
androidTestImplementation("androidx.test:runner:1.3.0") androidTestImplementation("androidx.test:runner:1.3.0")
androidTestImplementation("androidx.test:rules:1.3.0") androidTestImplementation("androidx.test:rules:1.3.0")
androidTestImplementation("androidx.test.ext:junit:1.1.1") androidTestImplementation("androidx.test.ext:junit:1.1.2")
androidTestImplementation("org.mockito:mockito-android:2.28.2") androidTestImplementation("org.mockito:mockito-android:2.28.2")
androidTestImplementation("androidx.test.espresso:espresso-core:3.2.0") androidTestImplementation("androidx.test.espresso:espresso-core:3.2.0")
api("androidx.exifinterface:exifinterface:1.2.0") api("androidx.exifinterface:exifinterface:1.3.2")
api("androidx.lifecycle:lifecycle-common:2.2.0") api("androidx.lifecycle:lifecycle-common:2.2.0")
api("com.google.android.gms:play-services-tasks:17.2.0") api("com.google.android.gms:play-services-tasks:17.2.0")
implementation("androidx.annotation:annotation:1.1.0") implementation("androidx.annotation:annotation:1.1.0")
@ -52,8 +52,8 @@ publisher {
project.url = "https://github.com/natario1/CameraView" project.url = "https://github.com/natario1/CameraView"
project.addLicense(License.APACHE_2_0) project.addLicense(License.APACHE_2_0)
bintray { bintray {
release.setSources(Release.SOURCES_AUTO) release.sources = Release.SOURCES_AUTO
release.setDocs(Release.DOCS_AUTO) release.docs = Release.DOCS_AUTO
auth.user = "BINTRAY_USER" auth.user = "BINTRAY_USER"
auth.key = "BINTRAY_KEY" auth.key = "BINTRAY_KEY"
auth.repo = "BINTRAY_REPO" auth.repo = "BINTRAY_REPO"
@ -97,7 +97,7 @@ jacoco { toolVersion = "0.8.5" }
tasks.register("computeCoverage", JacocoReport::class) { tasks.register("computeCoverage", JacocoReport::class) {
dependsOn("compileDebugSources") // Compile sources, needed below dependsOn("compileDebugSources") // Compile sources, needed below
executionData.from(fileTree(coverageInputDir)) executionData.from(fileTree(coverageInputDir))
sourceDirectories.from(android.sourceSets["main"].java.sourceFiles) sourceDirectories.from(android.sourceSets["main"].java.srcDirs)
additionalSourceDirs.from("$buildDir/generated/source/buildConfig/debug") additionalSourceDirs.from("$buildDir/generated/source/buildConfig/debug")
additionalSourceDirs.from("$buildDir/generated/source/r/debug") additionalSourceDirs.from("$buildDir/generated/source/r/debug")
classDirectories.from(fileTree("$buildDir/intermediates/javac/debug") { classDirectories.from(fileTree("$buildDir/intermediates/javac/debug") {

@ -248,7 +248,13 @@ public class CameraViewCallbacksTest extends BaseTest {
verify(listener, times(1)).onOrientationChanged(anyInt()); 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 @Test
public void testCameraError() { public void testCameraError() {

@ -162,11 +162,12 @@ public abstract class CameraListener {
} }
/** /**
* Notifies that the shutter event is happening. You can update UI to show some * Notifies that the picture capture has started. Can be used to update the UI for visual
* trigger effect, so user visually confirms that picture is being taken * confirmation or sound effects.
* or video recording is about to start.
*/ */
@UiThread @UiThread
public void onShutter() {} public void onPictureShutter() {
}
} }

@ -2228,7 +2228,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
} }
@Override @Override
public void onShutter(boolean shouldPlaySound) { public void dispatchOnPictureShutter(boolean shouldPlaySound) {
if (shouldPlaySound && mPlaySounds) { if (shouldPlaySound && mPlaySounds) {
playSound(MediaActionSound.SHUTTER_CLICK); playSound(MediaActionSound.SHUTTER_CLICK);
} }
@ -2236,7 +2236,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
@Override @Override
public void run() { public void run() {
for (CameraListener listener : mListeners) { for (CameraListener listener : mListeners) {
listener.onShutter(); listener.onPictureShutter();
} }
} }
}); });

@ -1,7 +1,5 @@
package com.otaliastudios.cameraview.engine; package com.otaliastudios.cameraview.engine;
import android.graphics.PointF;
import android.graphics.RectF;
import android.location.Location; import android.location.Location;
import androidx.annotation.CallSuper; 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.offset.Reference;
import com.otaliastudios.cameraview.engine.orchestrator.CameraState; import com.otaliastudios.cameraview.engine.orchestrator.CameraState;
import com.otaliastudios.cameraview.frame.FrameManager; import com.otaliastudios.cameraview.frame.FrameManager;
import com.otaliastudios.cameraview.gesture.Gesture;
import com.otaliastudios.cameraview.overlay.Overlay; import com.otaliastudios.cameraview.overlay.Overlay;
import com.otaliastudios.cameraview.picture.PictureRecorder; import com.otaliastudios.cameraview.picture.PictureRecorder;
import com.otaliastudios.cameraview.preview.CameraPreview; import com.otaliastudios.cameraview.preview.CameraPreview;
@ -556,7 +553,7 @@ public abstract class CameraBaseEngine extends CameraEngine {
@Override @Override
public void onPictureShutter(boolean didPlaySound) { public void onPictureShutter(boolean didPlaySound) {
getCallback().onShutter(!didPlaySound); getCallback().dispatchOnPictureShutter(!didPlaySound);
} }
@Override @Override

@ -116,7 +116,7 @@ public abstract class CameraEngine implements
void dispatchOnCameraOpened(@NonNull CameraOptions options); void dispatchOnCameraOpened(@NonNull CameraOptions options);
void dispatchOnCameraClosed(); void dispatchOnCameraClosed();
void onCameraPreviewStreamSizeChanged(); void onCameraPreviewStreamSizeChanged();
void onShutter(boolean shouldPlaySound); void dispatchOnPictureShutter(boolean shouldPlaySound);
void dispatchOnVideoTaken(@NonNull VideoResult.Stub stub); void dispatchOnVideoTaken(@NonNull VideoResult.Stub stub);
void dispatchOnPictureTaken(@NonNull PictureResult.Stub stub); void dispatchOnPictureTaken(@NonNull PictureResult.Stub stub);
void dispatchOnFocusStart(@Nullable Gesture trigger, @NonNull PointF where); void dispatchOnFocusStart(@Nullable Gesture trigger, @NonNull PointF where);

@ -9,6 +9,18 @@ New versions are released through GitHub, so the reference page is the [GitHub R
> Starting from 2.4.0, you can now [support development](https://github.com/sponsors/natario1) through the GitHub Sponsors program. > Starting from 2.4.0, you can now [support development](https://github.com/sponsors/natario1) through the GitHub Sponsors program.
Companies can share a tiny part of their revenue and get private support hours in return. Thanks! Companies can share a tiny part of their revenue and get private support hours in return. Thanks!
##### v2.7.0
- 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])
- Fix: Avoid preview deadlocks ([#1020][1020])
- Fix: Workaround for messed-up preview on Pixel 4 ([#1020][1020])
- Fix: Avoid internal StackOverflow errors ([#992][992])
<https://github.com/natario1/CameraView/compare/v2.6.4...v2.7.0>
##### v2.6.4 ##### v2.6.4
- Fix: Fix many small bugs ([#953][953]) - Fix: Fix many small bugs ([#953][953])
@ -322,6 +334,7 @@ This is the last release before v2.
[aartikov]: https://github.com/aartikov [aartikov]: https://github.com/aartikov
[athornz]: https://github.com/athornz [athornz]: https://github.com/athornz
[bwt]: https://github.com/bwt
[v-gar]: https://github.com/v-gar [v-gar]: https://github.com/v-gar
[andrewmunn]: https://github.com/andrewmunn [andrewmunn]: https://github.com/andrewmunn
[chaitanyaraghav]: https://github.com/chaitanyaraghav [chaitanyaraghav]: https://github.com/chaitanyaraghav
@ -344,6 +357,8 @@ This is the last release before v2.
[hualong-shen]: https://github.com/hualong-shen [hualong-shen]: https://github.com/hualong-shen
[EverydayPineapple]: https://github.com/EverydayPineapple [EverydayPineapple]: https://github.com/EverydayPineapple
[jeffreyfjohnson]: https://github.com/jeffreyfjohnson [jeffreyfjohnson]: https://github.com/jeffreyfjohnson
[michaelspecht]: https://github.com/michaelspecht
[EzequielAdrianM]: https://github.com/EzequielAdrianM
[73]: https://github.com/natario1/CameraView/pull/73 [73]: https://github.com/natario1/CameraView/pull/73
@ -442,3 +457,8 @@ This is the last release before v2.
[877]: https://github.com/natario1/CameraView/pull/877 [877]: https://github.com/natario1/CameraView/pull/877
[897]: https://github.com/natario1/CameraView/pull/897 [897]: https://github.com/natario1/CameraView/pull/897
[953]: https://github.com/natario1/CameraView/pull/953 [953]: https://github.com/natario1/CameraView/pull/953
[960]: https://github.com/natario1/CameraView/pull/960
[992]: https://github.com/natario1/CameraView/pull/992
[1020]: https://github.com/natario1/CameraView/pull/1020
[1024]: https://github.com/natario1/CameraView/pull/1024
[1030]: https://github.com/natario1/CameraView/pull/1030

@ -12,7 +12,7 @@ google_analytics_id: 'UA-155077779-1'
google_site_verification: '4x49i17ABIrSvUl52SeL0-t0341aTnWWaC62-FYCRT4' google_site_verification: '4x49i17ABIrSvUl52SeL0-t0341aTnWWaC62-FYCRT4'
github: [metadata] # TODO What's this? github: [metadata] # TODO What's this?
github_repo: CameraView github_repo: CameraView
github_version: 2.6.4 github_version: 2.7.0
github_branch: master github_branch: master
baseurl: '/CameraView' # Keep as an empty string if served up at the root baseurl: '/CameraView' # Keep as an empty string if served up at the root
collections: collections:

@ -68,6 +68,11 @@ This is allowed at the following conditions:
```java ```java
camera.addCameraListener(new CameraListener() { camera.addCameraListener(new CameraListener() {
@Override
public void onPictureShutter() {
// Picture capture started!
}
@Override @Override
public void onPictureTaken(@NonNull PictureResult result) { public void onPictureTaken(@NonNull PictureResult result) {

@ -24,8 +24,8 @@ Simple as that. There are two things to be noted:
|Gesture|Description|Can be mapped to| |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`| |`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`| |`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` `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_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`| |`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`| |`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`| |`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`|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`| |`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`| |`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`| |`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 ```xml
<com.otaliastudios.cameraview.CameraView <com.otaliastudios.cameraview.CameraView
app:cameraGesturePinch="zoom|exposureCorrection|filterControl1|filterControl2|none" app:cameraGesturePinch="zoom|exposureCorrection|filterControl1|filterControl2|none"
app:cameraGestureTap="autoFocus|takePicture|none" app:cameraGestureTap="autoFocus|takePicture|takePictureSnapshot|none"
app:cameraGestureLongTap="autoFocus|takePicture|none" app:cameraGestureLongTap="autoFocus|takePicture|takePictureSnapshot|none"
app:cameraGestureScrollHorizontal="zoom|exposureCorrection|filterControl1|filterControl2|none" app:cameraGestureScrollHorizontal="zoom|exposureCorrection|filterControl1|filterControl2|none"
app:cameraGestureScrollVertical="zoom|exposureCorrection|filterControl1|filterControl2|none"/> app:cameraGestureScrollVertical="zoom|exposureCorrection|filterControl1|filterControl2|none"/>
``` ```

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.6-all.zip

Loading…
Cancel
Save