summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorChien-Yu Chen <cychen@google.com>2015-07-14 20:48:54 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-07-14 20:48:56 +0000
commit6eec00ecf456b8a24487828b6f515cccc465cc1a (patch)
treec2c32f7395b4081fea6daf8074bdda2632143405 /core/java/android
parent5cf30c608f21a9685310e6cf7d5970c8b7fb36c8 (diff)
parent0f69b4655f635302fd8ce5653888a397723f3acc (diff)
downloadframeworks_base-6eec00ecf456b8a24487828b6f515cccc465cc1a.zip
frameworks_base-6eec00ecf456b8a24487828b6f515cccc465cc1a.tar.gz
frameworks_base-6eec00ecf456b8a24487828b6f515cccc465cc1a.tar.bz2
Merge "Camera: Reconnect after camera service crashes" into mnc-dev
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java55
1 files changed, 47 insertions, 8 deletions
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 0fb6889..2e4f628 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -723,6 +723,8 @@ public final class CameraManager {
private static final String TAG = "CameraManagerGlobal";
private final boolean DEBUG = false;
+ private final int CAMERA_SERVICE_RECONNECT_DELAY_MS = 1000;
+
// Singleton instance
private static final CameraManagerGlobal gCameraManager =
new CameraManagerGlobal();
@@ -1158,6 +1160,45 @@ public final class CameraManager {
}
/**
+ * Try to connect to camera service after some delay if any client registered camera
+ * availability callback or torch status callback.
+ */
+ private void scheduleCameraServiceReconnectionLocked() {
+ final Handler handler;
+
+ if (mCallbackMap.size() > 0) {
+ handler = mCallbackMap.valueAt(0);
+ } else if (mTorchCallbackMap.size() > 0) {
+ handler = mTorchCallbackMap.valueAt(0);
+ } else {
+ // Not necessary to reconnect camera service if no client registers a callback.
+ return;
+ }
+
+ if (DEBUG) {
+ Log.v(TAG, "Reconnecting Camera Service in " + CAMERA_SERVICE_RECONNECT_DELAY_MS +
+ " ms");
+ }
+
+ handler.postDelayed(
+ new Runnable() {
+ @Override
+ public void run() {
+ ICameraService cameraService = getCameraService();
+ if (cameraService == null) {
+ synchronized(mLock) {
+ if (DEBUG) {
+ Log.v(TAG, "Reconnecting Camera Service failed.");
+ }
+ scheduleCameraServiceReconnectionLocked();
+ }
+ }
+ }
+ },
+ CAMERA_SERVICE_RECONNECT_DELAY_MS);
+ }
+
+ /**
* Listener for camera service death.
*
* <p>The camera service isn't supposed to die under any normal circumstances, but can be
@@ -1171,21 +1212,19 @@ public final class CameraManager {
mCameraService = null;
- // Tell listeners that the cameras and torch modes are _available_, because any
- // existing clients will have gotten disconnected. This is optimistic under the
- // assumption that the service will be back shortly.
- //
- // Without this, a camera service crash while a camera is open will never signal
- // to listeners that previously in-use cameras are now available.
+ // Tell listeners that the cameras and torch modes are unavailable and schedule a
+ // reconnection to camera service. When camera service is reconnected, the camera
+ // and torch statuses will be updated.
for (int i = 0; i < mDeviceStatus.size(); i++) {
String cameraId = mDeviceStatus.keyAt(i);
- onStatusChangedLocked(STATUS_PRESENT, cameraId);
+ onStatusChangedLocked(STATUS_NOT_PRESENT, cameraId);
}
for (int i = 0; i < mTorchStatus.size(); i++) {
String cameraId = mTorchStatus.keyAt(i);
- onTorchStatusChangedLocked(TORCH_STATUS_AVAILABLE_OFF, cameraId);
+ onTorchStatusChangedLocked(TORCH_STATUS_NOT_AVAILABLE, cameraId);
}
+ scheduleCameraServiceReconnectionLocked();
}
}