summaryrefslogtreecommitdiff
path: root/android-core/src/main/java/com/google
diff options
context:
space:
mode:
authorSean Owen <sowen@cloudera.com>2017-05-05 02:29:57 +0300
committerSean Owen <sowen@cloudera.com>2017-05-05 02:30:05 +0300
commit3d0468e92f0cc8a7fba9c6e1355e3f7bc1f7d93f (patch)
treea04184e37ee1f0e4293bbdb02c5b2ad4c3d11c3f /android-core/src/main/java/com/google
parentff7137e512b5464e15f5f2ef8870d3c7e0d1baa0 (diff)
downloadzxing-3d0468e92f0cc8a7fba9c6e1355e3f7bc1f7d93f.tar.xz
Issue #795: avoid sorting preview sizes
Diffstat (limited to 'android-core/src/main/java/com/google')
-rw-r--r--android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java52
1 files changed, 18 insertions, 34 deletions
diff --git a/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java b/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java
index 1a28ffa6e..c9d3eff1a 100644
--- a/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java
+++ b/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java
@@ -22,11 +22,9 @@ import android.hardware.Camera;
import android.os.Build;
import android.util.Log;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
@@ -284,42 +282,24 @@ public final class CameraConfigurationUtils {
return new Point(defaultSize.width, defaultSize.height);
}
- // Sort by size, descending
- List<Camera.Size> supportedPreviewSizes = new ArrayList<>(rawSupportedSizes);
- Collections.sort(supportedPreviewSizes, new Comparator<Camera.Size>() {
- @Override
- public int compare(Camera.Size a, Camera.Size b) {
- int aPixels = a.height * a.width;
- int bPixels = b.height * b.width;
- if (bPixels < aPixels) {
- return -1;
- }
- if (bPixels > aPixels) {
- return 1;
- }
- return 0;
- }
- });
-
if (Log.isLoggable(TAG, Log.INFO)) {
StringBuilder previewSizesString = new StringBuilder();
- for (Camera.Size supportedPreviewSize : supportedPreviewSizes) {
- previewSizesString.append(supportedPreviewSize.width).append('x')
- .append(supportedPreviewSize.height).append(' ');
+ for (Camera.Size size : rawSupportedSizes) {
+ previewSizesString.append(size.width).append('x').append(size.height).append(' ');
}
Log.i(TAG, "Supported preview sizes: " + previewSizesString);
}
double screenAspectRatio = screenResolution.x / (double) screenResolution.y;
- // Remove sizes that are unsuitable
- Iterator<Camera.Size> it = supportedPreviewSizes.iterator();
- while (it.hasNext()) {
- Camera.Size supportedPreviewSize = it.next();
- int realWidth = supportedPreviewSize.width;
- int realHeight = supportedPreviewSize.height;
- if (realWidth * realHeight < MIN_PREVIEW_PIXELS) {
- it.remove();
+ // Find a suitable size, with max resolution
+ int maxResolution = 0;
+ Camera.Size maxResPreviewSize = null;
+ for (Camera.Size size : rawSupportedSizes) {
+ int realWidth = size.width;
+ int realHeight = size.height;
+ int resolution = realWidth * realHeight;
+ if (resolution < MIN_PREVIEW_PIXELS) {
continue;
}
@@ -329,7 +309,6 @@ public final class CameraConfigurationUtils {
double aspectRatio = maybeFlippedWidth / (double) maybeFlippedHeight;
double distortion = Math.abs(aspectRatio - screenAspectRatio);
if (distortion > MAX_ASPECT_DISTORTION) {
- it.remove();
continue;
}
@@ -338,14 +317,19 @@ public final class CameraConfigurationUtils {
Log.i(TAG, "Found preview size exactly matching screen size: " + exactPoint);
return exactPoint;
}
+
+ // Resolution is suitable; record the one with max resolution
+ if (resolution > maxResolution) {
+ maxResolution = resolution;
+ maxResPreviewSize = size;
+ }
}
// If no exact match, use largest preview size. This was not a great idea on older devices because
// of the additional computation needed. We're likely to get here on newer Android 4+ devices, where
// the CPU is much more powerful.
- if (!supportedPreviewSizes.isEmpty()) {
- Camera.Size largestPreview = supportedPreviewSizes.get(0);
- Point largestSize = new Point(largestPreview.width, largestPreview.height);
+ if (maxResPreviewSize != null) {
+ Point largestSize = new Point(maxResPreviewSize.width, maxResPreviewSize.height);
Log.i(TAG, "Using largest suitable preview size: " + largestSize);
return largestSize;
}