Adds a check for that the FOV is the same before takePicture() and in onPictureTaken().
Bug: 9377901
Change-Id: Ica904f8d0cdb24e26c36d94e02fe2f24dd9a95a2
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 79db2b0..ed2ecd4 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -568,6 +568,11 @@
<string name="camera_fov_choose_preview_size_for_camera">Choose preview size for camera %1$s</string>
<string name="camera_fov_displayed_fov_label">Displayed FOV : </string>
<string name="camera_fov_reported_fov_label">Reported FOV : </string>
+ <string name="camera_fov_reported_fov_problem">Reported FOV problem</string>
+ <string name="camera_fov_reported_fov_problem_message">The reported FOV before takePicture() is
+ different from when onPictureTaken() is called.\nAs picture size has not been changed, the
+ reported FOV should be identical at both times.\n\nFOV before/after: %1$f / %2$f</string>
+
<string name="camera_fov_panorama_wallpaper_title">Photo Sphere Live Wallpaper</string>
<string name="camera_fov_panorama_wallpaper_description">This live wallapper displays photo
spheres.</string>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/fov/PhotoCaptureActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/fov/PhotoCaptureActivity.java
index 913ff4f..05013ed 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/fov/PhotoCaptureActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/fov/PhotoCaptureActivity.java
@@ -18,12 +18,14 @@
import android.app.Activity;
import android.app.AlertDialog;
+import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
+import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
@@ -58,6 +60,7 @@
private static final int FOV_REQUEST_CODE = 1006;
private static final String PICTURE_FILENAME = "photo.jpg";
private static float mReportedFovDegrees = 0;
+ private float mReportedFovPrePictureTaken = -1;
private SurfaceView mPreview;
private SurfaceHolder mSurfaceHolder;
@@ -72,9 +75,12 @@
private boolean mPreviewActive = false;
private int mResolutionSpinnerIndex = -1;
private WakeLock mWakeLock;
+ private long shutterStartTime;
private ArrayList<Integer> mPreviewSizeCamerasToProcess = new ArrayList<Integer>();
+ private Dialog mActiveDialog;
+
/**
* Selected preview size per camera. If null, preview size should be
* automatically detected.
@@ -139,7 +145,15 @@
previewView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- mCamera.takePicture(null, null, PhotoCaptureActivity.this);
+ shutterStartTime = System.currentTimeMillis();
+
+ mCamera.takePicture(new ShutterCallback() {
+ @Override
+ public void onShutter() {
+ long dT = System.currentTimeMillis() - shutterStartTime;
+ Log.d("CTS", "Shutter Lag: " + dT);
+ }
+ }, null, PhotoCaptureActivity.this);
}
});
@@ -151,11 +165,17 @@
if (mSupportedResolutions != null) {
SelectableResolution resolution = mSupportedResolutions.get(position);
- switchToCamera(resolution.cameraId);
+ switchToCamera(resolution.cameraId, false);
+
Camera.Parameters params = mCamera.getParameters();
params.setPictureSize(resolution.width, resolution.height);
mCamera.setParameters(params);
+
+ // It should be guaranteed that the FOV is correctly updated after setParameters().
+ mReportedFovPrePictureTaken = mCamera.getParameters().getHorizontalViewAngle();
+
mResolutionSpinnerIndex = position;
+ initializeCamera();
}
}
@@ -227,6 +247,32 @@
File pictureFile = getPictureFile(this);
Camera.Parameters params = mCamera.getParameters();
mReportedFovDegrees = params.getHorizontalViewAngle();
+
+ // Show error if FOV does not match the value reported before takePicture().
+ if (mReportedFovPrePictureTaken != mReportedFovDegrees) {
+ mSupportedResolutions.get(mResolutionSpinnerIndex).tested = true;
+ mSupportedResolutions.get(mResolutionSpinnerIndex).passed = false;
+
+ AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
+ dialogBuilder.setTitle(R.string.camera_fov_reported_fov_problem);
+ dialogBuilder.setNeutralButton(
+ android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (mActiveDialog != null) {
+ mActiveDialog.dismiss();
+ mActiveDialog = null;
+ initializeCamera();
+ }
+ }
+ });
+
+ String message = getResources().getString(R.string.camera_fov_reported_fov_problem_message);
+ dialogBuilder.setMessage(String.format(message, mReportedFovPrePictureTaken, mReportedFovDegrees));
+ mActiveDialog = dialogBuilder.show();
+ return;
+ }
+
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
@@ -329,7 +375,7 @@
public void onCancel(DialogInterface arg0) {
// User cancelled preview size selection.
mPreviewSizes = null;
- switchToCamera(mCameraId);
+ switchToCamera(mCameraId, true);
}
}).
setSingleChoiceItems(choices, 0, new DialogInterface.OnClickListener() {
@@ -342,7 +388,7 @@
if (mPreviewSizeCamerasToProcess.isEmpty()) {
// We're done, re-initialize camera.
- switchToCamera(mCameraId);
+ switchToCamera(mCameraId, true);
} else {
// Process other cameras.
showNextDialogToChoosePreviewSize();
@@ -385,14 +431,17 @@
}
}
- private void switchToCamera(int cameraId) {
+ private void switchToCamera(int cameraId, boolean initializeCamera) {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
}
mCameraId = cameraId;
mCamera = Camera.open(cameraId);
- initializeCamera();
+
+ if (initializeCamera){
+ initializeCamera();
+ }
}
/**