From 3b18d29557c3727d33688f83a32723363b97a4e3 Mon Sep 17 00:00:00 2001 From: Sanjeev Garg Date: Mon, 12 Oct 2015 11:58:01 +0530 Subject: SnapdragonCamera: Handle startPreview exception in camera. If any exception occurs in start preview then camera app should handle this exception and should display error pop-up and exit gracefully. CRs-Fixed: 919778 Change-Id: I80b60224d5d47a96dad78c40f8a23e3e9be45e65 --- .../android/camera/AndroidCameraManagerImpl.java | 28 ++++++++++++++++++---- src/com/android/camera/CameraActivity.java | 9 +++++++ src/com/android/camera/CameraManager.java | 9 +++++++ .../com/android/camera/util/UsageStatistics.java | 1 + 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/com/android/camera/AndroidCameraManagerImpl.java b/src/com/android/camera/AndroidCameraManagerImpl.java index 3bfe0c2cb..86a8b3e08 100644 --- a/src/com/android/camera/AndroidCameraManagerImpl.java +++ b/src/com/android/camera/AndroidCameraManagerImpl.java @@ -115,6 +115,8 @@ class AndroidCameraManagerImpl implements CameraManager { } private class CameraHandler extends Handler { + CameraOpenErrorCallbackForward errorCbInstance; + CameraHandler(Looper looper) { super(looper); } @@ -238,6 +240,7 @@ class AndroidCameraManagerImpl implements CameraManager { return; } mCamera.release(); + errorCbInstance = null; mCamera = null; return; @@ -271,7 +274,13 @@ class AndroidCameraManagerImpl implements CameraManager { return; case START_PREVIEW_ASYNC: - mCamera.startPreview(); + try { + mCamera.startPreview(); + } catch (Exception e) { + e.printStackTrace(); + if (errorCbInstance != null) + errorCbInstance.onStartPreviewFailure(msg.arg1); + } return; case STOP_PREVIEW: @@ -397,9 +406,10 @@ class AndroidCameraManagerImpl implements CameraManager { @Override public CameraManager.CameraProxy cameraOpen( Handler handler, int cameraId, CameraOpenErrorCallback callback) { - mCameraHandler.obtainMessage(OPEN_CAMERA, cameraId, 0, - CameraOpenErrorCallbackForward.getNewInstance( - handler, callback)).sendToTarget(); + mCameraHandler.errorCbInstance = CameraOpenErrorCallbackForward + .getNewInstance(handler, callback); + mCameraHandler.obtainMessage(OPEN_CAMERA, cameraId, 0, mCameraHandler.errorCbInstance) + .sendToTarget(); mCameraHandler.waitDone(); if (mCamera != null) { return new AndroidCameraProxyImpl(); @@ -960,5 +970,15 @@ class AndroidCameraManagerImpl implements CameraManager { } }); } + + @Override + public void onStartPreviewFailure(final int cameraId) { + mHandler.post(new Runnable() { + @Override + public void run() { + mCallback.onStartPreviewFailure(cameraId); + } + }); + } } } diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 09476afc3..fb14aad8d 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -309,6 +309,15 @@ public class CameraActivity extends Activity CameraUtil.showErrorAndFinish(CameraActivity.this, R.string.cannot_connect_camera); } + + @Override + public void onStartPreviewFailure(int cameraId) { + UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, + UsageStatistics.ACTION_START_PREVIEW_FAIL, "startpreview"); + + CameraUtil.showErrorAndFinish(CameraActivity.this, + R.string.cannot_connect_camera); + } }; // update the status of storage space when SD card status changed. diff --git a/src/com/android/camera/CameraManager.java b/src/com/android/camera/CameraManager.java index e7d535060..7f59975df 100644 --- a/src/com/android/camera/CameraManager.java +++ b/src/com/android/camera/CameraManager.java @@ -130,6 +130,15 @@ public interface CameraManager { * with the reconnect failure. */ public void onReconnectionFailure(CameraManager mgr); + + /** + * Callback when startPreview failure runtime exception is + * caught. + * + * @param cameraId The camera with the hardware failure. + */ + public void onStartPreviewFailure(int cameraId); + } /** diff --git a/src_pd/com/android/camera/util/UsageStatistics.java b/src_pd/com/android/camera/util/UsageStatistics.java index 98dc89c9f..b39dcf137 100644 --- a/src_pd/com/android/camera/util/UsageStatistics.java +++ b/src_pd/com/android/camera/util/UsageStatistics.java @@ -31,6 +31,7 @@ public class UsageStatistics { public static final String ACTION_FOREGROUNDED = "Foregrounded"; public static final String ACTION_OPEN_FAIL = "OpenFailure"; + public static final String ACTION_START_PREVIEW_FAIL = "StartPreviewFailure"; public static final String ACTION_SCREEN_CHANGED = "ScreenChanged"; public static final String ACTION_FILMSTRIP = "Filmstrip"; public static final String ACTION_TOUCH_FOCUS= "TouchFocus"; -- cgit v1.2.3