diff --git a/res/drawable-hdpi/ic_menuselect_camera_facing_back.png b/res/drawable-hdpi/ic_menuselect_camera_facing_back.png
new file mode 100644
index 0000000..53fcd8e
--- /dev/null
+++ b/res/drawable-hdpi/ic_menuselect_camera_facing_back.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menuselect_camera_facing_front.png b/res/drawable-hdpi/ic_menuselect_camera_facing_front.png
new file mode 100644
index 0000000..53fcd8e
--- /dev/null
+++ b/res/drawable-hdpi/ic_menuselect_camera_facing_front.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_viewfinder_camera_facing_back.png b/res/drawable-hdpi/ic_viewfinder_camera_facing_back.png
new file mode 100644
index 0000000..1a53019
--- /dev/null
+++ b/res/drawable-hdpi/ic_viewfinder_camera_facing_back.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_viewfinder_camera_facing_front.png b/res/drawable-hdpi/ic_viewfinder_camera_facing_front.png
new file mode 100644
index 0000000..1a53019
--- /dev/null
+++ b/res/drawable-hdpi/ic_viewfinder_camera_facing_front.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menuselect_camera_facing_back.png b/res/drawable-mdpi/ic_menuselect_camera_facing_back.png
new file mode 100644
index 0000000..023a5f7
--- /dev/null
+++ b/res/drawable-mdpi/ic_menuselect_camera_facing_back.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menuselect_camera_facing_front.png b/res/drawable-mdpi/ic_menuselect_camera_facing_front.png
new file mode 100644
index 0000000..023a5f7
--- /dev/null
+++ b/res/drawable-mdpi/ic_menuselect_camera_facing_front.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_viewfinder_camera_facing_back.png b/res/drawable-mdpi/ic_viewfinder_camera_facing_back.png
new file mode 100644
index 0000000..49b6ec9
--- /dev/null
+++ b/res/drawable-mdpi/ic_viewfinder_camera_facing_back.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_viewfinder_camera_facing_front.png b/res/drawable-mdpi/ic_viewfinder_camera_facing_front.png
new file mode 100644
index 0000000..49b6ec9
--- /dev/null
+++ b/res/drawable-mdpi/ic_viewfinder_camera_facing_front.png
Binary files differ
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c920a31..b3cff4a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -108,6 +108,8 @@
     <!-- Settings screen, camera selection dialog title. Users can select a camera from the phone (front-facing or back-facing). [CHAR LIMIT=20] -->
     <string name="pref_camera_id_title">Select camera</string>
 
+    <string name="pref_camera_id_default">0</string>
+
     <!-- In select camera setting, back facing camera. [CHAR LIMIT=14] -->
     <string name="pref_camera_id_entry_back">Back</string>
     <!-- In select camera setting, front-facing camera. [CHAR LIMIT=14] -->
diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml
index b0da97c..6968270 100644
--- a/res/xml/camera_preferences.xml
+++ b/res/xml/camera_preferences.xml
@@ -75,5 +75,9 @@
                 camera:title="@string/pref_camera_focusmode_title"
                 camera:entries="@array/pref_camera_focusmode_entries"
                 camera:entryValues="@array/pref_camera_focusmode_entryvalues" />
+        <IconListPreference
+                camera:key="pref_camera_id_key"
+                camera:defaultValue="@string/pref_camera_id_default"
+                camera:title="@string/pref_camera_id_title" />
     </PreferenceGroup>
 </PreferenceGroup>
diff --git a/res/xml/video_preferences.xml b/res/xml/video_preferences.xml
index eb8e344..3929b03 100644
--- a/res/xml/video_preferences.xml
+++ b/res/xml/video_preferences.xml
@@ -47,5 +47,9 @@
                 camera:title="@string/pref_camera_coloreffect_title"
                 camera:entries="@array/pref_camera_coloreffect_entries"
                 camera:entryValues="@array/pref_camera_coloreffect_entryvalues"/>
+        <IconListPreference
+                camera:key="pref_camera_id_key"
+                camera:defaultValue="@string/pref_camera_id_default"
+                camera:title="@string/pref_camera_id_title" />
     </PreferenceGroup>
 </PreferenceGroup>
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java
index 61c66d1..26b14f9 100644
--- a/src/com/android/camera/Camera.java
+++ b/src/com/android/camera/Camera.java
@@ -172,7 +172,6 @@
 
     private boolean mPreviewing;
     private boolean mPausing;
-    private boolean mSwitching;
     private boolean mFirstTimeInitialized;
     private boolean mIsImageCaptureIntent;
     private boolean mRecordLocation;
@@ -359,6 +358,8 @@
         installIntentFilter();
         initializeFocusTone();
         initializeZoom();
+        mHeadUpDisplay = new CameraHeadUpDisplay(this);
+        mHeadUpDisplay.setListener(new MyHeadUpDisplayListener());
         initializeHeadUpDisplay();
         mFirstTimeInitialized = true;
         changeHeadUpDisplayState();
@@ -438,16 +439,13 @@
     }
 
     private float[] getZoomRatios() {
+        if(!mParameters.isZoomSupported()) return null;
         List<Integer> zoomRatios = mParameters.getZoomRatios();
-        if (zoomRatios != null) {
-            float result[] = new float[zoomRatios.size()];
-            for (int i = 0, n = result.length; i < n; ++i) {
-                result[i] = (float) zoomRatios.get(i) / 100f;
-            }
-            return result;
-        } else {
-            throw new IllegalStateException("cannot get zoom ratios");
+        float result[] = new float[zoomRatios.size()];
+        for (int i = 0, n = result.length; i < n; ++i) {
+            result[i] = (float) zoomRatios.get(i) / 100f;
         }
+        return result;
     }
 
     private class ZoomGestureListener extends
@@ -971,7 +969,7 @@
         // becomes landscape.
         Configuration config = getResources().getConfiguration();
         if (config.orientation == Configuration.ORIENTATION_LANDSCAPE
-                && !mPausing && !mSwitching && mFirstTimeInitialized) {
+                && !mPausing && mFirstTimeInitialized) {
             if (mGLRootView == null) attachHeadUpDisplay();
         } else if (mGLRootView != null) {
             detachHeadUpDisplay();
@@ -998,17 +996,12 @@
     }
 
     private void initializeHeadUpDisplay() {
-        mHeadUpDisplay = new CameraHeadUpDisplay(this);
-        CameraSettings settings = new CameraSettings(this, mInitialParams);
+        CameraSettings settings = new CameraSettings(this, mInitialParams,
+                CameraHolder.instance().getCameraInfo());
         mHeadUpDisplay.initialize(this,
-                settings.getPreferenceGroup(R.xml.camera_preferences));
-        mHeadUpDisplay.setListener(new MyHeadUpDisplayListener());
-    }
-
-    private void attachHeadUpDisplay() {
-        mHeadUpDisplay.setOrientation(mLastOrientation);
+                settings.getPreferenceGroup(R.xml.camera_preferences),
+                getZoomRatios(), mLastOrientation);
         if (mParameters.isZoomSupported()) {
-            mHeadUpDisplay.setZoomRatios(getZoomRatios());
             mHeadUpDisplay.setZoomIndex(mZoomValue);
             mHeadUpDisplay.setZoomListener(new ZoomControllerListener() {
                 public void onZoomChanged(
@@ -1016,13 +1009,18 @@
                     onZoomValueChanged(index);
                 }
             });
+        } else {
+            mHeadUpDisplay.setZoomListener(null);
         }
+        updateSceneModeInHud();
+    }
+
+    private void attachHeadUpDisplay() {
+        mHeadUpDisplay.setOrientation(mLastOrientation);
         FrameLayout frame = (FrameLayout) findViewById(R.id.frame);
         mGLRootView = new GLRootView(this);
         mGLRootView.setContentPane(mHeadUpDisplay);
         frame.addView(mGLRootView);
-
-        updateSceneModeInHud();
     }
 
     private void detachHeadUpDisplay() {
@@ -1821,7 +1819,7 @@
             Log.w(TAG, "invalid exposure: " + exposure);
         }
 
-        if (mGLRootView != null) updateSceneModeInHud();
+        if (mHeadUpDisplay != null) updateSceneModeInHud();
 
         if (Parameters.SCENE_MODE_AUTO.equals(mSceneMode)) {
             // Set flash mode.
@@ -2068,22 +2066,19 @@
                     R.string.switch_camera_id)
                     .setOnMenuItemClickListener(new OnMenuItemClickListener() {
                 public boolean onMenuItemClick(MenuItem item) {
-                    switchCameraId();
+                    switchCameraId((mCameraId + 1) % mNumberOfCameras);
                     return true;
                 }
             }).setIcon(android.R.drawable.ic_menu_camera);
         }
     }
 
-    private void switchCameraId() {
-        mSwitching = true;
-
-        mCameraId = (mCameraId + 1) % mNumberOfCameras;
-        CameraSettings.writePreferredCameraId(mPreferences, mCameraId);
+    private void switchCameraId(int cameraId) {
+        mCameraId = cameraId;
+        CameraSettings.writePreferredCameraId(mPreferences, cameraId);
 
         stopPreview();
         closeCamera();
-        changeHeadUpDisplayState();
 
         // Remove the messages in the event queue.
         mHandler.removeMessages(RESTART_PREVIEW);
@@ -2096,7 +2091,6 @@
         mPreferences.setLocalId(this, mCameraId);
         CameraSettings.upgradeLocalPreferences(mPreferences.getLocal());
 
-
         // Restart the preview.
         resetExposureCompensation();
         if (!restartPreview()) return;
@@ -2107,9 +2101,6 @@
         if (mFirstTimeInitialized) {
             initializeHeadUpDisplay();
         }
-
-        mSwitching = false;
-        changeHeadUpDisplayState();
     }
 
     private boolean switchToVideoMode() {
@@ -2145,8 +2136,12 @@
                 stopReceivingLocationUpdates();
             }
         }
-
-        setCameraParametersWhenIdle(UPDATE_PARAM_PREFERENCE);
+        int cameraId = CameraSettings.readPreferredCameraId(mPreferences);
+        if (mCameraId != cameraId) {
+            switchCameraId(cameraId);
+        } else {
+            setCameraParametersWhenIdle(UPDATE_PARAM_PREFERENCE);
+        }
     }
 
     @Override
diff --git a/src/com/android/camera/CameraHolder.java b/src/com/android/camera/CameraHolder.java
index fc6e687..ec1a61e 100644
--- a/src/com/android/camera/CameraHolder.java
+++ b/src/com/android/camera/CameraHolder.java
@@ -18,6 +18,7 @@
 
 import static com.android.camera.Util.Assert;
 
+import android.hardware.Camera.CameraInfo;
 import android.hardware.Camera.Parameters;
 import android.os.Build;
 import android.os.Handler;
@@ -48,6 +49,7 @@
     private final Handler mHandler;
     private int mUsers = 0;  // number of open() - number of release()
     private int mNumberOfCameras;
+    private CameraInfo[] mInfo;
 
     // We store the camera parameters when we actually open the device,
     // so we can restore them in the subsequent open() requests by the user.
@@ -92,15 +94,10 @@
         ht.start();
         mHandler = new MyHandler(ht.getLooper());
         mNumberOfCameras = android.hardware.Camera.getNumberOfCameras();
-
-        android.hardware.Camera.CameraInfo info =
-                new android.hardware.Camera.CameraInfo();
-        Log.v(TAG, "# of cameras:" + mNumberOfCameras);
+        mInfo = new CameraInfo[mNumberOfCameras];
         for (int i = 0; i < mNumberOfCameras; i++) {
-            Log.v(TAG, "camera info #" + i);
-            android.hardware.Camera.getCameraInfo(i, info);
-            Log.v(TAG, "facing: " + info.mFacing);
-            Log.v(TAG, "orientation: " + info.mOrientation);
+            mInfo[i] = new CameraInfo();
+            android.hardware.Camera.getCameraInfo(i, mInfo[i]);
         }
     }
 
@@ -108,6 +105,10 @@
         return mNumberOfCameras;
     }
 
+    public CameraInfo[] getCameraInfo() {
+        return mInfo;
+    }
+
     public synchronized android.hardware.Camera open(int cameraId)
             throws CameraHardwareException {
         Assert(mUsers == 0);
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index 29eb187..7743fd3 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
+import android.hardware.Camera.CameraInfo;
 import android.hardware.Camera.Parameters;
 import android.hardware.Camera.Size;
 import android.media.CamcorderProfile;
@@ -47,7 +48,7 @@
     public static final String KEY_WHITE_BALANCE = "pref_camera_whitebalance_key";
     public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key";
     public static final String KEY_EXPOSURE = "pref_camera_exposure_key";
-    public static final String KEY_CAMERA_ID = "pref_camera_id";
+    public static final String KEY_CAMERA_ID = "pref_camera_id_key";
 
     private static final String VIDEO_QUALITY_HIGH = "high";
     private static final String VIDEO_QUALITY_MMS = "mms";
@@ -73,10 +74,13 @@
 
     private final Context mContext;
     private final Parameters mParameters;
+    private final CameraInfo[] mCameraInfo;
 
-    public CameraSettings(Activity activity, Parameters parameters) {
+    public CameraSettings(Activity activity, Parameters parameters,
+                          CameraInfo[] cameraInfo) {
         mContext = activity;
         mParameters = parameters;
+        mCameraInfo = cameraInfo;
     }
 
     public PreferenceGroup getPreferenceGroup(int preferenceRes) {
@@ -136,6 +140,8 @@
         ListPreference flashMode = group.findPreference(KEY_FLASH_MODE);
         ListPreference focusMode = group.findPreference(KEY_FOCUS_MODE);
         ListPreference exposure = group.findPreference(KEY_EXPOSURE);
+        IconListPreference cameraId =
+                (IconListPreference)group.findPreference(KEY_CAMERA_ID);
         ListPreference videoFlashMode =
                 group.findPreference(KEY_VIDEOCAMERA_FLASH_MODE);
 
@@ -185,10 +191,8 @@
             filterUnsupportedOptions(group,
                     videoFlashMode, mParameters.getSupportedFlashModes());
         }
-
-        if (exposure != null) {
-            buildExposureCompensation(group, exposure);
-        }
+        if (exposure != null) buildExposureCompensation(group, exposure);
+        if (cameraId != null) buildCameraId(group, cameraId);
     }
 
     private void buildExposureCompensation(
@@ -216,6 +220,38 @@
         exposure.setEntryValues(entryValues);
     }
 
+    private void buildCameraId(
+            PreferenceGroup group, IconListPreference cameraId) {
+        int numOfCameras = mCameraInfo.length;
+        if (numOfCameras < 2) {
+            removePreference(group, cameraId.getKey());
+            return;
+        }
+
+        CharSequence entries[] = new CharSequence[numOfCameras];
+        CharSequence entryValues[] = new CharSequence[numOfCameras];
+        int[] iconIds = new int[numOfCameras];
+        int[] largeIconIds = new int[numOfCameras];
+        for (int i = 0; i < numOfCameras; i++) {
+            entryValues[i] = Integer.toString(i);
+            if (mCameraInfo[i].mFacing == CameraInfo.CAMERA_FACING_FRONT) {
+                entries[i] = mContext.getString(
+                        R.string.pref_camera_id_entry_front);
+                iconIds[i] = R.drawable.ic_menuselect_camera_facing_front;
+                largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_front;
+            } else {
+                entries[i] = mContext.getString(
+                        R.string.pref_camera_id_entry_back);
+                iconIds[i] = R.drawable.ic_menuselect_camera_facing_back;
+                largeIconIds[i] = R.drawable.ic_viewfinder_camera_facing_back;
+            }
+        }
+        cameraId.setEntries(entries);
+        cameraId.setEntryValues(entryValues);
+        cameraId.setIconIds(iconIds);
+        cameraId.setLargeIconIds(largeIconIds);
+    }
+
     private static boolean removePreference(PreferenceGroup group, String key) {
         for (int i = 0, n = group.size(); i < n; i++) {
             CameraPreference child = group.get(i);
@@ -340,13 +376,14 @@
     }
 
     public static int readPreferredCameraId(SharedPreferences pref) {
-        return pref.getInt(KEY_CAMERA_ID, 0);
+        String id = Integer.toString(android.hardware.Camera.CAMERA_ID_DEFAULT);
+        return Integer.parseInt(pref.getString(KEY_CAMERA_ID, id));
     }
 
     public static void writePreferredCameraId(SharedPreferences pref,
             int cameraId) {
         Editor editor = pref.edit();
-        editor.putInt(KEY_CAMERA_ID, cameraId);
+        editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId));
         editor.apply();
     }
 }
diff --git a/src/com/android/camera/ComboPreferences.java b/src/com/android/camera/ComboPreferences.java
index 1fbfdaa..b2b0d14 100644
--- a/src/com/android/camera/ComboPreferences.java
+++ b/src/com/android/camera/ComboPreferences.java
@@ -49,8 +49,8 @@
         }
     }
 
-    public void setLocalId(Context context, int id) {
-        String prefName = context.getPackageName() + "_preferences_" + id;
+    public void setLocalId(Context context, int cameraId) {
+        String prefName = context.getPackageName() + "_preferences_" + cameraId;
         if (mPrefLocal != null) {
             mPrefLocal.unregisterOnSharedPreferenceChangeListener(this);
         }
diff --git a/src/com/android/camera/IconListPreference.java b/src/com/android/camera/IconListPreference.java
index 5a8d383..fc23f6c 100644
--- a/src/com/android/camera/IconListPreference.java
+++ b/src/com/android/camera/IconListPreference.java
@@ -51,6 +51,14 @@
         return mIconIds;
     }
 
+    public void setLargeIconIds(int[] largeIconIds) {
+        mLargeIconIds = largeIconIds;
+    }
+
+    public void setIconIds(int[] iconIds) {
+        mIconIds = iconIds;
+    }
+
     private int[] getIconIds(Resources res, int iconsRes) {
         if (iconsRes == 0) return null;
         TypedArray array = res.obtainTypedArray(iconsRes);
diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java
index cb0bb02..d617e4c 100644
--- a/src/com/android/camera/VideoCamera.java
+++ b/src/com/android/camera/VideoCamera.java
@@ -161,7 +161,6 @@
     private int mMaxVideoDurationInMs;
 
     boolean mPausing = false;
-    boolean mSwitching;
     boolean mPreviewing = false; // True if preview is started.
 
     private ContentResolver mContentResolver;
@@ -379,6 +378,8 @@
 
         // Initialize the HeadUpDiplay after startPreview(). We need mParameters
         // for HeadUpDisplay and it is initialized in that function.
+        mHeadUpDisplay = new CamcorderHeadUpDisplay(this);
+        mHeadUpDisplay.setListener(new MyHeadUpDisplayListener());
         initializeHeadUpDisplay();
     }
 
@@ -390,7 +391,7 @@
         // becomes landscape.
         Configuration config = getResources().getConfiguration();
         if (config.orientation == Configuration.ORIENTATION_LANDSCAPE
-                && !mPausing && !mSwitching && mGLRootView == null) {
+                && !mPausing && mGLRootView == null) {
             attachHeadUpDisplay();
         } else if (mGLRootView != null) {
             detachHeadUpDisplay();
@@ -398,8 +399,8 @@
     }
 
     private void initializeHeadUpDisplay() {
-        mHeadUpDisplay = new CamcorderHeadUpDisplay(this);
-        CameraSettings settings = new CameraSettings(this, mParameters);
+        CameraSettings settings = new CameraSettings(this, mParameters,
+                CameraHolder.instance().getCameraInfo());
 
         PreferenceGroup group =
                 settings.getPreferenceGroup(R.xml.video_preferences);
@@ -407,7 +408,6 @@
             group = filterPreferenceScreenByIntent(group);
         }
         mHeadUpDisplay.initialize(this, group);
-        mHeadUpDisplay.setListener(new MyHeadUpDisplayListener());
     }
 
     private void attachHeadUpDisplay() {
@@ -1083,20 +1083,16 @@
                     R.string.switch_camera_id)
                     .setOnMenuItemClickListener(new OnMenuItemClickListener() {
                 public boolean onMenuItemClick(MenuItem item) {
-                    switchCameraId();
+                    switchCameraId((mCameraId + 1) % mNumberOfCameras);
                     return true;
                 }
             }).setIcon(android.R.drawable.ic_menu_camera);
         }
     }
 
-    private void switchCameraId() {
-        mSwitching = true;
-
-        mCameraId = (mCameraId + 1) % mNumberOfCameras;
-        CameraSettings.writePreferredCameraId(mPreferences, mCameraId);
-
-        changeHeadUpDisplayState();
+    private void switchCameraId(int cameraId) {
+        mCameraId = cameraId;
+        CameraSettings.writePreferredCameraId(mPreferences, cameraId);
 
         // This is similar to what mShutterButton.performClick() does,
         // but not quite the same.
@@ -1125,9 +1121,6 @@
         if (mSurfaceHolder != null) {
             mHandler.sendEmptyMessage(INIT_RECORDER);
         }
-
-        mSwitching = false;
-        changeHeadUpDisplayState();
     }
 
     private PreferenceGroup filterPreferenceScreenByIntent(
@@ -1604,7 +1597,14 @@
             // If mCameraDevice is not ready then we can set the parameter in
             // startPreview().
             if (mCameraDevice == null) return;
-            resetCameraParameters();
+
+            // Check if camera id is changed.
+            int cameraId = CameraSettings.readPreferredCameraId(mPreferences);
+            if (mCameraId != cameraId) {
+                switchCameraId(cameraId);
+            } else {
+                resetCameraParameters();
+            }
         }
     }
 }
diff --git a/src/com/android/camera/ui/BasicIndicator.java b/src/com/android/camera/ui/BasicIndicator.java
index bb1102c..7630a8e 100644
--- a/src/com/android/camera/ui/BasicIndicator.java
+++ b/src/com/android/camera/ui/BasicIndicator.java
@@ -19,7 +19,6 @@
 import android.content.Context;
 
 import com.android.camera.IconListPreference;
-import com.android.camera.PreferenceGroup;
 import com.android.camera.R;
 import com.android.camera.Util;
 import com.android.camera.ui.GLListView.OnItemSelectedListener;
@@ -34,8 +33,7 @@
     private PreferenceAdapter mModel;
     private String mOverride;
 
-    public BasicIndicator(Context context,
-            PreferenceGroup group, IconListPreference preference) {
+    public BasicIndicator(Context context, IconListPreference preference) {
         super(context);
         mPreference = preference;
         mIcon = new ResourceTexture[preference.getLargeIconIds().length];
diff --git a/src/com/android/camera/ui/CamcorderHeadUpDisplay.java b/src/com/android/camera/ui/CamcorderHeadUpDisplay.java
index c90917d..8e98100 100644
--- a/src/com/android/camera/ui/CamcorderHeadUpDisplay.java
+++ b/src/com/android/camera/ui/CamcorderHeadUpDisplay.java
@@ -58,5 +58,6 @@
         addIndicator(context, group, CameraSettings.KEY_WHITE_BALANCE);
         addIndicator(context, group, CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE);
         addIndicator(context, group, CameraSettings.KEY_VIDEO_QUALITY);
+        addIndicator(context, group, CameraSettings.KEY_CAMERA_ID);
     }
 }
diff --git a/src/com/android/camera/ui/CameraHeadUpDisplay.java b/src/com/android/camera/ui/CameraHeadUpDisplay.java
index 9bdb68f..473ec2a 100644
--- a/src/com/android/camera/ui/CameraHeadUpDisplay.java
+++ b/src/com/android/camera/ui/CameraHeadUpDisplay.java
@@ -31,12 +31,21 @@
     private GpsIndicator mGpsIndicator;
     private ZoomIndicator mZoomIndicator;
     private Context mContext;
+    private float[] mInitialZoomRatios;
+    private int mInitialOrientation;
 
     public CameraHeadUpDisplay(Context context) {
         super(context);
         mContext = context;
     }
 
+    public void initialize(Context context, PreferenceGroup group,
+            float[] initialZoomRatios, int initialOrientation) {
+        mInitialZoomRatios = initialZoomRatios;
+        mInitialOrientation = initialOrientation;
+        super.initialize(context, group);
+    }
+
     @Override
     protected void initializeIndicatorBar(
             Context context, PreferenceGroup group) {
@@ -61,12 +70,24 @@
         mIndicatorBar.addComponent(mOtherSettings);
 
         mGpsIndicator = new GpsIndicator(
-                context, group, (IconListPreference)
+                context, (IconListPreference)
                 group.findPreference(CameraSettings.KEY_RECORD_LOCATION));
         mIndicatorBar.addComponent(mGpsIndicator);
 
         addIndicator(context, group, CameraSettings.KEY_WHITE_BALANCE);
         addIndicator(context, group, CameraSettings.KEY_FLASH_MODE);
+
+        if (mInitialZoomRatios != null) {
+            mZoomIndicator = new ZoomIndicator(mContext);
+            mZoomIndicator.setZoomRatios(mInitialZoomRatios);
+            mIndicatorBar.addComponent(mZoomIndicator);
+        } else {
+            mZoomIndicator = null;
+        }
+
+        addIndicator(context, group, CameraSettings.KEY_CAMERA_ID);
+
+        mIndicatorBar.setOrientation(mInitialOrientation);
     }
 
     public void setZoomListener(ZoomControllerListener listener) {
@@ -114,10 +135,6 @@
     }
 
     private void setZoomRatiosLocked(float[] zoomRatios) {
-        if (mZoomIndicator == null) {
-            mZoomIndicator = new ZoomIndicator(mContext);
-            mIndicatorBar.addComponent(mZoomIndicator);
-        }
         mZoomIndicator.setZoomRatios(zoomRatios);
     }
 }
diff --git a/src/com/android/camera/ui/GpsIndicator.java b/src/com/android/camera/ui/GpsIndicator.java
index 45f10b3..78a80b8 100644
--- a/src/com/android/camera/ui/GpsIndicator.java
+++ b/src/com/android/camera/ui/GpsIndicator.java
@@ -20,7 +20,6 @@
 
 import com.android.camera.R;
 import com.android.camera.IconListPreference;
-import com.android.camera.PreferenceGroup;
 
 class GpsIndicator extends BasicIndicator {
 
@@ -29,9 +28,8 @@
     private ResourceTexture mNoSignalIcon;
     private boolean mHasSignal = false;
 
-    public GpsIndicator(Context context,
-            PreferenceGroup group, IconListPreference preference) {
-        super(context, group, preference);
+    public GpsIndicator(Context context, IconListPreference preference) {
+        super(context, preference);
     }
 
     @Override
diff --git a/src/com/android/camera/ui/HeadUpDisplay.java b/src/com/android/camera/ui/HeadUpDisplay.java
index 05d575d..6a7c604 100644
--- a/src/com/android/camera/ui/HeadUpDisplay.java
+++ b/src/com/android/camera/ui/HeadUpDisplay.java
@@ -181,7 +181,10 @@
     public void initialize(Context context, PreferenceGroup preferenceGroup) {
         mPreferenceGroup = preferenceGroup;
         mSharedPrefs = ComboPreferences.get(context);
+        mPopupWindow = null;
+        clearComponents();
         initializeIndicatorBar(context, preferenceGroup);
+        requestLayout();
     }
 
     private void layoutPopupWindow(GLView anchorView) {
@@ -329,7 +332,7 @@
         IconListPreference iconPref =
                 (IconListPreference) group.findPreference(key);
         if (iconPref == null) return null;
-        BasicIndicator indicator = new BasicIndicator(context, group, iconPref);
+        BasicIndicator indicator = new BasicIndicator(context, iconPref);
         mIndicatorBar.addComponent(indicator);
         return indicator;
     }
diff --git a/src/com/android/camera/ui/ZoomIndicator.java b/src/com/android/camera/ui/ZoomIndicator.java
index ce6bef8..e74cefd 100644
--- a/src/com/android/camera/ui/ZoomIndicator.java
+++ b/src/com/android/camera/ui/ZoomIndicator.java
@@ -17,6 +17,7 @@
 package com.android.camera.ui;
 
 import android.content.Context;
+import android.util.Log;
 
 import com.android.camera.R;
 import com.android.camera.ui.ZoomControllerListener;
@@ -69,7 +70,7 @@
         if (mDrawIndex != mZoomIndex) {
             mDrawIndex = mZoomIndex;
             if (mTitle != null) mTitle.deleteFromGL();
-            float value = mZoomRatios == null ? 0 : mZoomRatios[mZoomIndex];
+            float value = mZoomRatios[mZoomIndex];
             mTitle = StringTexture.newInstance(
                     sZoomFormat.format(value), mFontSize, FONT_COLOR);
         }
@@ -110,7 +111,8 @@
 
     public void setZoomRatios(float[] ratios) {
         mZoomRatios = ratios;
-        requestLayout();
+        mDrawIndex = -1;
+        invalidate();
     }
 
     private class MyZoomListener implements ZoomControllerListener {
