From cdfd1ff19272de182d6a0ff6c17e3efba3feb33f Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Fri, 25 Oct 2019 16:12:52 +0800 Subject: [PATCH] [Wi-Fi] Fix Wi-Fi QR code camera bug Should not setPreviewSize from the value of getBestPictureSize. Bug: 142630420 Test: QrCameraTest manual: visually make sure QR code scanner image not distorted. Change-Id: I280beddac95ed65118af802c396d15da306e029b --- .../settings/wifi/qrcode/QrCamera.java | 11 +++-- .../settings/wifi/qrcode/QrCameraTest.java | 40 +++++++++++++++---- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/wifi/qrcode/QrCamera.java b/src/com/android/settings/wifi/qrcode/QrCamera.java index 3e9c0b25c3d..21be399f625 100644 --- a/src/com/android/settings/wifi/qrcode/QrCamera.java +++ b/src/com/android/settings/wifi/qrcode/QrCamera.java @@ -80,14 +80,16 @@ public class QrCamera extends Handler { HINTS.put(DecodeHintType.POSSIBLE_FORMATS, FORMATS); } - private Camera mCamera; + @VisibleForTesting + Camera mCamera; private Size mPreviewSize; private WeakReference mContext; private ScannerCallback mScannerCallback; private MultiFormatReader mReader; private DecodingTask mDecodeTask; private int mCameraOrientation; - private Camera.Parameters mParameters; + @VisibleForTesting + Camera.Parameters mParameters; public QrCamera(Context context, ScannerCallback callback) { mContext = new WeakReference(context); @@ -171,12 +173,13 @@ public class QrCamera extends Handler { boolean isValid(String qrCode); } - private void setCameraParameter() { + @VisibleForTesting + void setCameraParameter() { mParameters = mCamera.getParameters(); mPreviewSize = getBestPreviewSize(mParameters); mParameters.setPreviewSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); Size pictureSize = getBestPictureSize(mParameters); - mParameters.setPreviewSize(pictureSize.getWidth(), pictureSize.getHeight()); + mParameters.setPictureSize(pictureSize.getWidth(), pictureSize.getHeight()); if (mParameters.getSupportedFlashModes().contains(Parameters.FLASH_MODE_OFF)) { mParameters.setFlashMode(Parameters.FLASH_MODE_OFF); diff --git a/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java b/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java index 3f67137717d..de0df732990 100644 --- a/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java +++ b/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java @@ -18,14 +18,19 @@ package com.android.settings.wifi.qrcode; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.SurfaceTexture; -import android.util.Size; +import android.hardware.Camera; +import android.hardware.Camera.Parameters; +import android.hardware.Camera.Size; import com.google.zxing.BinaryBitmap; import com.google.zxing.LuminanceSource; @@ -33,9 +38,6 @@ import com.google.zxing.RGBLuminanceSource; import com.google.zxing.WriterException; import com.google.zxing.common.HybridBinarizer; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -43,6 +45,12 @@ import org.mockito.Mock; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + @RunWith(RobolectricTestRunner.class) public class QrCameraTest { @@ -58,12 +66,12 @@ public class QrCameraTest { private class ScannerTestCallback implements QrCamera.ScannerCallback { @Override - public Size getViewSize() { - return new Size(0, 0); + public android.util.Size getViewSize() { + return new android.util.Size(0, 0); } @Override - public Rect getFramePosition(Size previewSize, int cameraOrientation) { + public Rect getFramePosition(android.util.Size previewSize, int cameraOrientation) { return new Rect(0,0,0,0); } @@ -147,4 +155,22 @@ public class QrCameraTest { assertThat(mQrCode).isEqualTo(unicodeTest); } + + @Test + public void setCameraParameter_shouldSetParameters() { + mCamera.mCamera = mock(Camera.class); + Parameters parameters = mock(Camera.Parameters.class); + Size size = mCamera.mCamera.new Size(1920, 1440); + List sizes = new ArrayList<>(Arrays.asList(size)); + when(parameters.getPreviewSize()).thenReturn(size); + when(parameters.getSupportedPreviewSizes()).thenReturn(sizes); + when(parameters.getSupportedPictureSizes()).thenReturn(sizes); + when(mCamera.mCamera.getParameters()).thenReturn(parameters); + + mCamera.setCameraParameter(); + + verify(mCamera.mParameters).setPreviewSize(anyInt(), anyInt()); + verify(mCamera.mParameters).setPictureSize(anyInt(), anyInt()); + verify(mCamera.mCamera).setParameters(mCamera.mParameters); + } }