From a5c04b2b7948403565d401b5a63532212b782174 Mon Sep 17 00:00:00 2001 From: Fabin Paul Date: Fri, 24 Mar 2017 12:03:01 +0530 Subject: [PATCH 1/3] fix: get Supported AspectRatio depends on supported picture size getSupportedAspectRatio returns aspect ratios of preview sizes for which picture sizes doesn't exist. This results in NullPointerException. So getSuportedAspectRatio now depends on suported Picture Sizes Resolves: #88 --- .../main/api14/com/google/android/cameraview/Camera1.java | 8 +++++++- .../main/base/com/google/android/cameraview/SizeMap.java | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/library/src/main/api14/com/google/android/cameraview/Camera1.java b/library/src/main/api14/com/google/android/cameraview/Camera1.java index 74ca3832..1830c185 100644 --- a/library/src/main/api14/com/google/android/cameraview/Camera1.java +++ b/library/src/main/api14/com/google/android/cameraview/Camera1.java @@ -150,7 +150,13 @@ int getFacing() { @Override Set getSupportedAspectRatios() { - return mPreviewSizes.ratios(); + SizeMap idealAspectRatios = mPreviewSizes; + for (AspectRatio aspectRatio : idealAspectRatios.ratios()) { + if (mPictureSizes.sizes(aspectRatio) == null) { + idealAspectRatios.remove(aspectRatio); + } + } + return idealAspectRatios.ratios(); } @Override diff --git a/library/src/main/base/com/google/android/cameraview/SizeMap.java b/library/src/main/base/com/google/android/cameraview/SizeMap.java index 667d12bf..e136dd5f 100644 --- a/library/src/main/base/com/google/android/cameraview/SizeMap.java +++ b/library/src/main/base/com/google/android/cameraview/SizeMap.java @@ -70,4 +70,7 @@ boolean isEmpty() { return mRatios.isEmpty(); } + public void remove(AspectRatio ratio) { + mRatios.remove(ratio); + } } From 4640ec659b40ac7841d3a81019efaaca9ecd6d24 Mon Sep 17 00:00:00 2001 From: Fabin Paul Date: Fri, 24 Mar 2017 16:38:01 +0530 Subject: [PATCH 2/3] fix: Removed blank screen after changing aspect ratio TextureView/SurfaceView was added twice to CameraView. So when requestLayout is called on CameraView blank surface comes up. Note that CameraView parent is FrameLayout, so last added view comes in front. In the solution, I have simply removed last added TextureView/SurfaceView before adding new TextureView/SurfaceView inside start function on CameraView. This makes sure that new Surface is created for each start. Resolves: #111 --- .../main/java/com/google/android/cameraview/CameraView.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/src/main/java/com/google/android/cameraview/CameraView.java b/library/src/main/java/com/google/android/cameraview/CameraView.java index 04826d84..fe4d550f 100644 --- a/library/src/main/java/com/google/android/cameraview/CameraView.java +++ b/library/src/main/java/com/google/android/cameraview/CameraView.java @@ -244,6 +244,9 @@ protected void onRestoreInstanceState(Parcelable state) { */ public void start() { if (!mImpl.start()) { + if (mImpl.getView() != null) { + this.removeView(mImpl.getView()); + } //store the state ,and restore this state after fall back o Camera1 Parcelable state=onSaveInstanceState(); // Camera2 uses legacy hardware layer; fall back to Camera1 From 93611ff09337aaefea152886a321ef5cba098a3f Mon Sep 17 00:00:00 2001 From: Fabin Paul Date: Tue, 28 Mar 2017 16:54:50 +0530 Subject: [PATCH 3/3] fix: added Set of ratios to avoid `ConcurrentModificationException` It is not safe to traverse and remove from the same set. It will result is `ConcurrentModificationException` or `NullpointerException` in case of ArrayMap. So new `Set` was added to traverse the ArrayMap. Check commit: 6ceaf867d34cd4af6761c63c804cf086609544b0 --- .../main/api14/com/google/android/cameraview/Camera1.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/library/src/main/api14/com/google/android/cameraview/Camera1.java b/library/src/main/api14/com/google/android/cameraview/Camera1.java index 1830c185..8dc6f9f0 100644 --- a/library/src/main/api14/com/google/android/cameraview/Camera1.java +++ b/library/src/main/api14/com/google/android/cameraview/Camera1.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Set; import java.util.SortedSet; +import java.util.TreeSet; import java.util.concurrent.atomic.AtomicBoolean; @@ -151,7 +152,9 @@ int getFacing() { @Override Set getSupportedAspectRatios() { SizeMap idealAspectRatios = mPreviewSizes; - for (AspectRatio aspectRatio : idealAspectRatios.ratios()) { + + Set ratios = new TreeSet<>(idealAspectRatios.ratios()); + for (AspectRatio aspectRatio : ratios) { if (mPictureSizes.sizes(aspectRatio) == null) { idealAspectRatios.remove(aspectRatio); }