diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fcabb3d..27166b8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +### v1.5.1 + +- Bug: byte array length for Frames was incorrect thanks to [@ssakhavi][ssakhavi] ([#205][205]) +- Bug: gestures were crashing in some conditions ([#222][222]) +- Bug: import correctly the ExifInterface library ([#222][222]) +- Updated dependencies thanks to [@caleb-allen][caleb-allen] ([#190][190]) + ## v1.5.0 - New: set encoder for video recordings with `cameraVideoCodec` ([#174][174]) @@ -80,6 +87,8 @@ https://github.com/natario1/CameraView/compare/v1.2.3...v1.3.0 [RobertoMorelos]: https://github.com/RobertoMorelos [RocketRider]: https://github.com/RocketRider [xp-vit]: https://github.com/xp-vit +[caleb-allen]: https://github.com/caleb-allen +[ssakhavi]: https://github.com/ssakhavi [73]: https://github.com/natario1/CameraView/pull/73 [80]: https://github.com/natario1/CameraView/pull/80 @@ -104,3 +113,6 @@ https://github.com/natario1/CameraView/compare/v1.2.3...v1.3.0 [172]: https://github.com/natario1/CameraView/pull/172 [173]: https://github.com/natario1/CameraView/pull/173 [174]: https://github.com/natario1/CameraView/pull/174 +[190]: https://github.com/natario1/CameraView/pull/190 +[205]: https://github.com/natario1/CameraView/pull/205 +[222]: https://github.com/natario1/CameraView/pull/222 diff --git a/README.md b/README.md index a4ec4dfa..a78546d7 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ addressing most of the common issues and needs, and still leaving you with flexi See [CHANGELOG](https://github.com/natario1/CameraView/blob/master/CHANGELOG.md). ```groovy -compile 'com.otaliastudios:cameraview:1.5.0' +compile 'com.otaliastudios:cameraview:1.5.1' ``` Make sure your project repositories include the `jcenter()`: @@ -370,7 +370,7 @@ to just square sizes: ```java SizeSelector width = SizeSelectors.minWidth(1000); -SizeSelector height = SizeSelectors.minWidth(2000); +SizeSelector height = SizeSelectors.minHeight(2000); SizeSelector dimensions = SizeSelectors.and(width, height); // Matches sizes bigger than 1000x2000. SizeSelector ratio = SizeSelectors.aspectRatio(AspectRatio.of(1, 1), 0); // Matches 1:1 sizes. diff --git a/build.gradle b/build.gradle index 4ef0d0af..129a0ad0 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.2.0-alpha15' // https://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en // https://www.theguardian.com/technology/developer-blog/2016/dec/06/how-to-publish-an-android-library-a-mysterious-conversation classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' @@ -25,7 +25,7 @@ allprojects { ext { compileSdkVersion = 27 buildToolsVersion = "27.0.3" - supportLibVersion = '27.1.0' + supportLibVersion = '27.1.1' minSdkVersion = 15 targetSdkVersion = 27 } diff --git a/cameraview/build.gradle b/cameraview/build.gradle index 7ace1dd9..4882e0ac 100644 --- a/cameraview/build.gradle +++ b/cameraview/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' // Required by bintray -version = '1.5.0' +version = '1.5.1' group = 'com.otaliastudios' //region android dependencies @@ -48,7 +48,7 @@ dependencies { androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' - implementation "com.android.support:exifinterface:$supportLibVersion" + api "com.android.support:exifinterface:$supportLibVersion" implementation "com.android.support:support-annotations:$supportLibVersion" } @@ -178,7 +178,7 @@ apply plugin: 'jacoco' def reportsDirectory = "$buildDir/reports/" jacoco { - toolVersion = "0.7.4+" + toolVersion = "0.8.1" reportsDir = file(reportsDirectory) } diff --git a/cameraview/src/main/utils/com/otaliastudios/cameraview/CameraUtils.java b/cameraview/src/main/utils/com/otaliastudios/cameraview/CameraUtils.java index a81870f7..dd7a74e2 100644 --- a/cameraview/src/main/utils/com/otaliastudios/cameraview/CameraUtils.java +++ b/cameraview/src/main/utils/com/otaliastudios/cameraview/CameraUtils.java @@ -8,6 +8,7 @@ import android.graphics.Matrix; import android.hardware.Camera; import android.os.Handler; import android.support.annotation.UiThread; +import android.support.annotation.WorkerThread; import android.support.media.ExifInterface; import java.io.ByteArrayInputStream; @@ -55,6 +56,19 @@ public class CameraUtils { } + /** + * Decodes an input byte array and outputs a Bitmap that is ready to be displayed. + * The difference with {@link android.graphics.BitmapFactory#decodeByteArray(byte[], int, int)} + * is that this cares about orientation, reading it from the EXIF header. + * + * @param source a JPEG byte array + */ + @SuppressWarnings("WeakerAccess") + @WorkerThread + public static void decodeBitmap(final byte[] source) { + decodeBitmap(source, Integer.MAX_VALUE, Integer.MAX_VALUE); + } + /** * Decodes an input byte array and outputs a Bitmap that is ready to be displayed. * The difference with {@link android.graphics.BitmapFactory#decodeByteArray(byte[], int, int)} @@ -100,9 +114,21 @@ public class CameraUtils { } + /** + * Decodes an input byte array and outputs a Bitmap that is ready to be displayed. + * The difference with {@link android.graphics.BitmapFactory#decodeByteArray(byte[], int, int)} + * is that this cares about orientation, reading it from the EXIF header. + * + * The image is also downscaled taking care of the maxWidth and maxHeight arguments. + * + * @param source a JPEG byte array + * @param maxWidth the max allowed width + * @param maxHeight the max allowed height + */ // TODO ignores flipping @SuppressWarnings({"SuspiciousNameCombination", "WeakerAccess"}) - /* for tests */ static Bitmap decodeBitmap(byte[] source, int maxWidth, int maxHeight) { + @WorkerThread + public static Bitmap decodeBitmap(byte[] source, int maxWidth, int maxHeight) { if (maxWidth <= 0) maxWidth = Integer.MAX_VALUE; if (maxHeight <= 0) maxHeight = Integer.MAX_VALUE; int orientation; diff --git a/cameraview/src/main/utils/com/otaliastudios/cameraview/OrientationHelper.java b/cameraview/src/main/utils/com/otaliastudios/cameraview/OrientationHelper.java index 99c2cb17..8006d095 100644 --- a/cameraview/src/main/utils/com/otaliastudios/cameraview/OrientationHelper.java +++ b/cameraview/src/main/utils/com/otaliastudios/cameraview/OrientationHelper.java @@ -22,7 +22,7 @@ class OrientationHelper { OrientationHelper(Context context, @NonNull Callback callback) { mCallback = callback; - mListener = new OrientationEventListener(context, SensorManager.SENSOR_DELAY_NORMAL) { + mListener = new OrientationEventListener(context.getApplicationContext(), SensorManager.SENSOR_DELAY_NORMAL) { @Override public void onOrientationChanged(int orientation) { @@ -72,4 +72,4 @@ class OrientationHelper { int getDisplayOffset() { return mDisplayOffset; } -} \ No newline at end of file +} diff --git a/cameraview/src/main/views/com/otaliastudios/cameraview/ScrollGestureLayout.java b/cameraview/src/main/views/com/otaliastudios/cameraview/ScrollGestureLayout.java index f8e3b17a..23a2fc46 100644 --- a/cameraview/src/main/views/com/otaliastudios/cameraview/ScrollGestureLayout.java +++ b/cameraview/src/main/views/com/otaliastudios/cameraview/ScrollGestureLayout.java @@ -29,6 +29,7 @@ class ScrollGestureLayout extends GestureLayout { public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { boolean horizontal; LOG.i("onScroll:", "distanceX="+distanceX, "distanceY="+distanceY); + if (e1 == null || e2 == null) return false; // Got some crashes about this. if (e1.getX() != mPoints[0].x || e1.getY() != mPoints[0].y) { // First step. We choose now if it's a vertical or horizontal scroll, and // stick to it for the whole gesture. diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bb725f70..3facb3bd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip