[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
This commit is contained in:
Arc Wang
2019-10-25 16:12:52 +08:00
parent 578990ec7e
commit cdfd1ff192
2 changed files with 40 additions and 11 deletions

View File

@@ -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<Context> 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>(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);

View File

@@ -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<Camera.Size> 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);
}
}