Merge "Add external camera support"
diff --git a/src/com/android/camera/DisableCameraReceiver.java b/src/com/android/camera/DisableCameraReceiver.java
index 5237c1d..ed58783 100644
--- a/src/com/android/camera/DisableCameraReceiver.java
+++ b/src/com/android/camera/DisableCameraReceiver.java
@@ -42,7 +42,7 @@
             ? hasBackCamera()
             : hasCamera();
 
-        if (!needCameraActivity) {
+        if (!needCameraActivity && !supportExternalCamera(context)) {
             Log.i(TAG, "disable all camera activities");
             for (int i = 0; i < ACTIVITIES.length; i++) {
                 disableComponent(context, ACTIVITIES[i]);
@@ -53,6 +53,11 @@
         disableComponent(context, "com.android.camera.DisableCameraReceiver");
     }
 
+    private boolean supportExternalCamera(Context context) {
+        PackageManager pm = context.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_EXTERNAL);
+    }
+
     private boolean hasCamera() {
         int n = android.hardware.Camera.getNumberOfCameras();
         Log.i(TAG, "number of camera: " + n);
diff --git a/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java b/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java
index 283ac67..c755245 100644
--- a/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java
+++ b/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java
@@ -157,6 +157,10 @@
         String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_BACK);
         if (cameraId == null) {
             Log.w(TAG, "No back-facing camera found.");
+            cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_EXTERNAL);
+            if (cameraId == null) {
+                Log.w(TAG, "No external camera found.");
+            }
         }
         return cameraId;
     }
@@ -167,6 +171,10 @@
         String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_FRONT);
         if (cameraId == null) {
             Log.w(TAG, "No front-facing camera found.");
+            cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_EXTERNAL);
+            if (cameraId == null) {
+                Log.w(TAG, "No external camera found.");
+            }
         }
         return cameraId;
     }
diff --git a/src/com/android/camera/settings/SettingsManager.java b/src/com/android/camera/settings/SettingsManager.java
index c5c494e..d2794e5 100644
--- a/src/com/android/camera/settings/SettingsManager.java
+++ b/src/com/android/camera/settings/SettingsManager.java
@@ -128,8 +128,11 @@
     protected SharedPreferences openPreferences(String scope) {
         synchronized (mLock) {
             SharedPreferences preferences;
+            // For external camera, scope could have "/" separator which is a invalid path
+            // for the shared preference.
+            String validScope = scope.replaceAll("/", "_");
             preferences = mContext.getSharedPreferences(
-                    mPackageName + scope, Context.MODE_PRIVATE);
+                    mPackageName + validScope, Context.MODE_PRIVATE);
 
             for (OnSharedPreferenceChangeListener listener : mSharedPreferenceListeners) {
                 preferences.registerOnSharedPreferenceChangeListener(listener);