Merge "reset capture button state on swipes" into gb-ub-photos-denali
diff --git a/res/drawable-hdpi/ic_hdr_off.png b/res/drawable-hdpi/ic_hdr_off.png
deleted file mode 100644
index 28db73c..0000000
--- a/res/drawable-hdpi/ic_hdr_off.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_hdr_off_disabled.png b/res/drawable-hdpi/ic_hdr_off_disabled.png
new file mode 100644
index 0000000..8cd4956
--- /dev/null
+++ b/res/drawable-hdpi/ic_hdr_off_disabled.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_hdr_off_indicator.png b/res/drawable-hdpi/ic_hdr_off_indicator.png
new file mode 100644
index 0000000..c5c535d
--- /dev/null
+++ b/res/drawable-hdpi/ic_hdr_off_indicator.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_hdr_off_normal.png b/res/drawable-hdpi/ic_hdr_off_normal.png
new file mode 100644
index 0000000..06cb2c4
--- /dev/null
+++ b/res/drawable-hdpi/ic_hdr_off_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_hdr_on_disabled.png b/res/drawable-hdpi/ic_hdr_on_disabled.png
new file mode 100644
index 0000000..4ca8919
--- /dev/null
+++ b/res/drawable-hdpi/ic_hdr_on_disabled.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_hdr_on_indicator.png b/res/drawable-hdpi/ic_hdr_on_indicator.png
new file mode 100644
index 0000000..8b682bd
--- /dev/null
+++ b/res/drawable-hdpi/ic_hdr_on_indicator.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_hdr_on_normal.png b/res/drawable-hdpi/ic_hdr_on_normal.png
new file mode 100644
index 0000000..d5c56e8
--- /dev/null
+++ b/res/drawable-hdpi/ic_hdr_on_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_hdr_off.png b/res/drawable-mdpi/ic_hdr_off.png
deleted file mode 100644
index c5003e6..0000000
--- a/res/drawable-mdpi/ic_hdr_off.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_hdr_off_disabled.png b/res/drawable-mdpi/ic_hdr_off_disabled.png
new file mode 100644
index 0000000..6305f34
--- /dev/null
+++ b/res/drawable-mdpi/ic_hdr_off_disabled.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_hdr_off_indicator.png b/res/drawable-mdpi/ic_hdr_off_indicator.png
new file mode 100644
index 0000000..61e775c
--- /dev/null
+++ b/res/drawable-mdpi/ic_hdr_off_indicator.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_hdr_off_normal.png b/res/drawable-mdpi/ic_hdr_off_normal.png
new file mode 100644
index 0000000..541002e
--- /dev/null
+++ b/res/drawable-mdpi/ic_hdr_off_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_hdr_on_disabled.png b/res/drawable-mdpi/ic_hdr_on_disabled.png
new file mode 100644
index 0000000..ee1a877
--- /dev/null
+++ b/res/drawable-mdpi/ic_hdr_on_disabled.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_hdr_on_indicator.png b/res/drawable-mdpi/ic_hdr_on_indicator.png
new file mode 100644
index 0000000..ed89346
--- /dev/null
+++ b/res/drawable-mdpi/ic_hdr_on_indicator.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_hdr_on_normal.png b/res/drawable-mdpi/ic_hdr_on_normal.png
new file mode 100644
index 0000000..c911e40
--- /dev/null
+++ b/res/drawable-mdpi/ic_hdr_on_normal.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_hdr_off.png b/res/drawable-xhdpi/ic_hdr_off.png
deleted file mode 100644
index 66fe29e..0000000
--- a/res/drawable-xhdpi/ic_hdr_off.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_hdr_off_disabled.png b/res/drawable-xhdpi/ic_hdr_off_disabled.png
new file mode 100644
index 0000000..61e616c
--- /dev/null
+++ b/res/drawable-xhdpi/ic_hdr_off_disabled.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_hdr_off_indicator.png b/res/drawable-xhdpi/ic_hdr_off_indicator.png
new file mode 100644
index 0000000..637bfcb
--- /dev/null
+++ b/res/drawable-xhdpi/ic_hdr_off_indicator.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_hdr_off_normal.png b/res/drawable-xhdpi/ic_hdr_off_normal.png
new file mode 100644
index 0000000..ac26067
--- /dev/null
+++ b/res/drawable-xhdpi/ic_hdr_off_normal.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_hdr_on_disabled.png b/res/drawable-xhdpi/ic_hdr_on_disabled.png
new file mode 100644
index 0000000..fcc7911
--- /dev/null
+++ b/res/drawable-xhdpi/ic_hdr_on_disabled.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_hdr_on_indicator.png b/res/drawable-xhdpi/ic_hdr_on_indicator.png
new file mode 100644
index 0000000..74ae13f
--- /dev/null
+++ b/res/drawable-xhdpi/ic_hdr_on_indicator.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_hdr_on_normal.png b/res/drawable-xhdpi/ic_hdr_on_normal.png
new file mode 100644
index 0000000..cb3ae41
--- /dev/null
+++ b/res/drawable-xhdpi/ic_hdr_on_normal.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_hdr_off_disabled.png b/res/drawable-xxhdpi/ic_hdr_off_disabled.png
new file mode 100644
index 0000000..f29ab46
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_hdr_off_disabled.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_hdr_off_indicator.png b/res/drawable-xxhdpi/ic_hdr_off_indicator.png
new file mode 100644
index 0000000..1204315
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_hdr_off_indicator.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_hdr_off_normal.png b/res/drawable-xxhdpi/ic_hdr_off_normal.png
new file mode 100644
index 0000000..227d173
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_hdr_off_normal.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_hdr_on_disabled.png b/res/drawable-xxhdpi/ic_hdr_on_disabled.png
new file mode 100644
index 0000000..0abd17a
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_hdr_on_disabled.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_hdr_on_indicator.png b/res/drawable-xxhdpi/ic_hdr_on_indicator.png
new file mode 100644
index 0000000..b247343
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_hdr_on_indicator.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_hdr_on_normal.png b/res/drawable-xxhdpi/ic_hdr_on_normal.png
new file mode 100644
index 0000000..879e53d
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_hdr_on_normal.png
Binary files differ
diff --git a/res/drawable/bg_indicators.xml b/res/drawable/bg_indicators.xml
deleted file mode 100644
index 6a67996..0000000
--- a/res/drawable/bg_indicators.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-        android:shape="oval">
-  <solid android:color="@color/indicators_background_color" />
-</shape>
diff --git a/res/drawable/ic_hdr_off.xml b/res/drawable/ic_hdr_off.xml
new file mode 100644
index 0000000..0c6e544
--- /dev/null
+++ b/res/drawable/ic_hdr_off.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+          android:constantSize="true">
+    <item android:state_enabled="false">
+        <bitmap
+            android:gravity="center"
+            android:src="@drawable/ic_hdr_off_disabled" />
+    </item>
+    <item android:state_pressed="true">
+        <level-list>
+            <item android:maxLevel="0">
+                <layer-list>
+                   <item android:drawable="@drawable/button_background_pressed_light" />
+                   <item>
+                       <bitmap
+                            android:gravity="center"
+                            android:src="@drawable/ic_hdr_off_normal" />
+                   </item>
+                </layer-list>
+            </item>
+            <item android:maxLevel="1">
+                <layer-list>
+                   <item android:drawable="@drawable/button_background_pressed_dark" />
+                   <item>
+                       <bitmap
+                            android:gravity="center"
+                            android:src="@drawable/ic_hdr_off_normal" />
+                   </item>
+                </layer-list>
+            </item>
+        </level-list>
+    </item>
+    <item>
+        <bitmap
+            android:gravity="center"
+            android:src="@drawable/ic_hdr_off_normal" />
+    </item>
+</selector>
diff --git a/res/drawable/ic_hdr_on.xml b/res/drawable/ic_hdr_on.xml
new file mode 100644
index 0000000..2623a22
--- /dev/null
+++ b/res/drawable/ic_hdr_on.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+          android:constantSize="true">
+    <item android:state_enabled="false">
+        <bitmap
+            android:gravity="center"
+            android:src="@drawable/ic_hdr_on_disabled" />
+    </item>
+    <item android:state_pressed="true">
+        <level-list>
+            <item android:maxLevel="0">
+                <layer-list>
+                   <item android:drawable="@drawable/button_background_pressed_light" />
+                   <item>
+                       <bitmap
+                            android:gravity="center"
+                            android:src="@drawable/ic_hdr_on_normal" />
+                   </item>
+                </layer-list>
+            </item>
+            <item android:maxLevel="1">
+                <layer-list>
+                   <item android:drawable="@drawable/button_background_pressed_dark" />
+                   <item>
+                       <bitmap
+                            android:gravity="center"
+                            android:src="@drawable/ic_hdr_on_normal" />
+                   </item>
+                </layer-list>
+            </item>
+        </level-list>
+    </item>
+    <item>
+        <bitmap
+            android:gravity="center"
+            android:src="@drawable/ic_hdr_on_normal" />
+    </item>
+</selector>
diff --git a/res/layout/filmstrip_bottom_controls.xml b/res/layout/filmstrip_bottom_controls.xml
index d859242..a5dde05 100644
--- a/res/layout/filmstrip_bottom_controls.xml
+++ b/res/layout/filmstrip_bottom_controls.xml
@@ -28,42 +28,70 @@
     <!-- A filler view -->
     <View
         android:layout_width="0dp"
-        android:layout_height="match_parent"
+        android:layout_height="1dp"
         android:layout_weight="1"
         android:visibility="invisible" />
 
-    <FrameLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-
-        <ImageButton
-            android:id="@+id/filmstrip_bottom_control_view"
-            style="@style/FilmstripBottomControlButton"
-            android:layout_gravity="center"
-            android:src="@drawable/ic_view_photosphere"
-            android:visibility="invisible" />
-
-        <ImageButton
-            android:id="@+id/filmstrip_bottom_control_tiny_planet"
-            style="@style/FilmstripBottomControlButton"
-            android:layout_gravity="center"
-            android:src="@drawable/ic_menu_tiny_planet"
-            android:visibility="invisible" />
-    </FrameLayout>
-
-    <ImageButton
-        android:id="@+id/filmstrip_bottom_control_edit"
-        style="@style/FilmstripBottomControlButton"
-        android:src="@drawable/ic_menu_edit_holo_dark"
-        android:visibility="invisible" />
-
-
     <ImageButton
         android:id="@+id/filmstrip_bottom_control_share"
         style="@style/FilmstripBottomControlButton"
         android:src="@drawable/ic_menu_share_holo_light"
         android:visibility="invisible" />
 
+    <LinearLayout
+        android:layout_width="144dp"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:visibility="visible">
+
+        <View
+            android:layout_width="0dp"
+            android:layout_height="1dp"
+            android:layout_weight="1"
+            android:visibility="invisible" />
+
+        <FrameLayout
+            android:id="@+id/filmstrip_bottom_control_viewer_wrapper"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:visibility="gone">
+
+            <ImageButton
+                android:id="@+id/filmstrip_bottom_control_view"
+                style="@style/FilmstripBottomControlButton"
+                android:layout_gravity="center"
+                android:src="@drawable/ic_view_photosphere"
+                android:visibility="gone" />
+
+            <ImageButton
+                android:id="@+id/filmstrip_bottom_control_tiny_planet"
+                style="@style/FilmstripBottomControlButton"
+                android:layout_gravity="center"
+                android:src="@drawable/ic_menu_tiny_planet"
+                android:visibility="gone" />
+        </FrameLayout>
+
+        <View
+            android:id="@+id/filmstrip_bottom_control_middle_filler"
+            android:layout_width="0dp"
+            android:layout_height="1dp"
+            android:layout_weight="1"
+            android:visibility="invisible" />
+
+        <ImageButton
+            android:id="@+id/filmstrip_bottom_control_edit"
+            style="@style/FilmstripBottomControlButton"
+            android:src="@drawable/ic_menu_edit_holo_dark"
+            android:visibility="gone" />
+
+        <View
+            android:layout_width="0dp"
+            android:layout_height="1dp"
+            android:layout_weight="1"
+            android:visibility="invisible" />
+
+    </LinearLayout>
+
     <ImageButton
         android:id="@+id/filmstrip_bottom_control_delete"
         style="@style/FilmstripBottomControlButton"
@@ -73,7 +101,7 @@
     <!-- A filler view -->
     <View
         android:layout_width="0dp"
-        android:layout_height="match_parent"
+        android:layout_height="1dp"
         android:layout_weight="1"
         android:visibility="invisible" />
 
diff --git a/res/layout/generic_module.xml b/res/layout/generic_module.xml
index fcd5534..e223fcd 100644
--- a/res/layout/generic_module.xml
+++ b/res/layout/generic_module.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
+<!--
+     Copyright (C) 2013 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -15,14 +16,19 @@
 -->
 <!-- This layout is shared by phone and tablet in landscape orientation. -->
 <merge xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent">
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
 
     <TextureView
         android:id="@+id/preview_content"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
 
+    <com.android.camera.ui.FocusOverlay
+        android:id="@+id/focus_overlay"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
     <com.android.camera.ui.CaptureAnimationOverlay
         android:id="@+id/capture_overlay"
         android:layout_width="match_parent"
@@ -33,42 +39,12 @@
         android:id="@+id/preview_overlay"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
+
     <FrameLayout
         android:id="@+id/module_layout"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
 
-    <com.android.camera.ui.RotatableLinearLayout
-        android:id="@+id/indicator_bottombar_wrapper"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical" >
-      <com.android.camera.widget.IndicatorOverlay
-          android:id="@+id/indicator_overlay"
-          android:layout_width="match_parent"
-          android:layout_height="0px"
-          android:layout_weight="1"
-          android:padding="@dimen/indicator_overlay_padding"
-          android:layout_gravity="top|center_horizontal" >
-        <LinearLayout
-            android:id="@+id/indicator_overlay_icons"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:background="@drawable/bg_indicators"
-            android:layout_gravity="bottom|right" >
-          <ImageView
-              android:id="@+id/refocus_indicator"
-              style="@style/IndicatorIcon" />
-          <ImageView
-              android:id="@+id/hdr_indicator"
-              style="@style/IndicatorIcon" />
-          <ImageView
-              android:id="@+id/flash_indicator"
-              style="@style/IndicatorIcon" />
-        </LinearLayout>
-      </com.android.camera.widget.IndicatorOverlay>
+    <include layout="@layout/indicator_bottombar" />
 
-      <include layout="@layout/bottom_bar" />
-    </com.android.camera.ui.RotatableLinearLayout>
-</merge>
+</merge>
\ No newline at end of file
diff --git a/res/layout/indicator_bottombar.xml b/res/layout/indicator_bottombar.xml
new file mode 100644
index 0000000..f17f4f7
--- /dev/null
+++ b/res/layout/indicator_bottombar.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<!-- This layout is shared by phone and tablet in landscape orientation. -->
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_height="match_parent"
+    android:layout_width="match_parent">
+
+    <com.android.camera.ui.RotatableLinearLayout
+        android:id="@+id/indicator_bottombar_wrapper"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical" >
+      <com.android.camera.widget.IndicatorOverlay
+          android:id="@+id/indicator_overlay"
+          android:layout_width="match_parent"
+          android:layout_height="0px"
+          android:layout_weight="1"
+          android:padding="@dimen/indicator_overlay_padding"
+          android:layout_gravity="top|center_horizontal" >
+        <LinearLayout
+            android:id="@+id/indicator_overlay_icons"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:background="@drawable/bg_options_indicator"
+            android:layout_gravity="bottom|right" >
+          <ImageView
+              android:id="@+id/panorama_indicator"
+              style="@style/IndicatorIcon" />
+          <ImageView
+              android:id="@+id/refocus_indicator"
+              style="@style/IndicatorIcon" />
+          <ImageView
+              android:id="@+id/hdr_indicator"
+              style="@style/IndicatorIcon" />
+          <ImageView
+              android:id="@+id/flash_indicator"
+              style="@style/IndicatorIcon" />
+        </LinearLayout>
+      </com.android.camera.widget.IndicatorOverlay>
+
+      <include layout="@layout/bottom_bar" />
+    </com.android.camera.ui.RotatableLinearLayout>
+
+</merge>
diff --git a/res/layout/photo_module.xml b/res/layout/photo_module.xml
index 778ae17..250819b 100644
--- a/res/layout/photo_module.xml
+++ b/res/layout/photo_module.xml
@@ -24,10 +24,6 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_gravity="center">
-    <com.android.camera.ui.FocusOverlay
-        android:id="@+id/focus_overlay"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
     <ImageView
         android:id="@+id/review_image"
         android:layout_width="match_parent"
diff --git a/res/layout/video_module.xml b/res/layout/video_module.xml
index f2de26b..4f249db 100644
--- a/res/layout/video_module.xml
+++ b/res/layout/video_module.xml
@@ -21,10 +21,6 @@
             style="@style/ViewfinderLabelLayout">
         <include layout="@layout/viewfinder_labels_video" android:id="@+id/labels" />
     </com.android.camera.ui.RotateLayout>
-    <com.android.camera.ui.FocusOverlay
-        android:id="@+id/focus_overlay"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
     <ImageView android:id="@+id/review_image"
             android:layout_height="match_parent"
             android:layout_width="match_parent"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index f33cc29..3ea1f5b 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Videokamera-instellings"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Prentgrootte"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 M pieksels"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 M pieksels"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 M pieksels"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 M pieksels"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 M pieksels (16:9)"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 565f3bb..0b2bdec 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"የካምኮርደር ቅንብሮች"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"የምስል መጠን"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13ሚ ፒክሰሎች"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10ሜ ፒክስሎች"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8ሚ ፒክሰሎች"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5ሚ ፒክሰሎች"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4ሚ ፒክሰል (16:9)"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index bc36843..c7d7d8a 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"إعدادات كاميرا الفيديو"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"حجم الصورة"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 ميغا بكسل"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 ميغا بكسل"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 ميغا بكسل"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 ميغا بكسل"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 ميغا بكسل (16:9)"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 3145069..204186e 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Настройки на видеокамерата"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Размер на снимката"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 мегапиксела"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 мегапиксела"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 мегапиксела"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 мегапиксела"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 мегапиксела (16:9)"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index e156a8f..fd201f0 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Configuració de la càmera de vídeo"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Mida de la foto"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 Mp"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapíxels"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 Mp"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 Mp"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 Mp (16:9)"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index f33785f..cd71e05 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Nastavení videokamery"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Velikost fotografie"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 Mpx"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 Mpx"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 Mpx"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 Mpx"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 Mpx (16:9)"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index dc1c607..53c0c40 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Indstillinger for Videokamera"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Billedstørrelse"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapixels"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapixels"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapixels"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapixels"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 M pixels (16:9)"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 4f672bc..2312ef4 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Camcorder-Einstellungen"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Bildgröße"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 MP"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 Megapixel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 MP"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 MP"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 MP (16:9)"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 343fcfa..2a4b941 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Ρυθμίσεις βιντεοκάμερας"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Μέγεθος εικόνας"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13M εικονοστοιχεία"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 M pixel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8M εικονοστοιχεία"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5M εικονοστοιχεία"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 εκ.εικονοστ.(16:9)"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 2519e2d..1633471 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Camcorder settings"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Picture size"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 M pixels"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 Megapixels"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 M pixels"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 M pixels"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 M pixels (16:9)"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 2519e2d..1633471 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Camcorder settings"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Picture size"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 M pixels"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 Megapixels"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 M pixels"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 M pixels"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 M pixels (16:9)"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index edb1d18..754b967 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Configuración de cámara de video"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Tamaño de imagen"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapíxeles"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 MP"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapíxeles"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapíxeles"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 MP (16:9)"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 11d28a5..225c132 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Ajustes de videocámara"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Tamaño de imagen"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 MP"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 MP"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 MP"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 MP"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 MP (16:9)"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 164d77f..2c3d13b 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Videokaamera seaded"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Pildi suurus"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapikslit"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapikslit"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapikslit"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapikslit"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M pikslit (16 : 9)"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index fa9ead6..8081550 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"تنظیمات دوربین فیلم‌برداری"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"اندازه تصویر"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"۱۳ مگاپیکسل"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"۱۰ مگاپیکسل"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"۸ مگاپیکسل"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"۵ مگاپیکسل"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"‫۴ مگاپیکسل (۱۶:۹)‏"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 697a7f7..8655bd7 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Videokameran asetukset"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Kuvan koko"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapikseliä"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapikseliä"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapikseliä"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapikseliä"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapiks. (16:9)"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 6a1cc5f..bf077d7 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Paramètres de la caméra"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Taille de l\'image"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 mégapixels"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 mégapixels"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 mégapixels"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 mégapixels"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 mégapixels (16:9)"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 9e3d8ca..c7a950b 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Paramètres de la caméra"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Taille de l\'image"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 mégapixels"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 mégapixels"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 mégapixels"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 mégapixels"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 mégapixels (16:9)"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 7802d66..c9ec5e6 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"कैमकॉर्डर सेटिंग"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"फ़ोटो आकार"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13M पिक्सेल"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10M पिक्सेल"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8M पिक्सेल"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5M पिक्सेल"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M पिक्सेल (16:9)"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 5f97b39..0ad8f8d 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Postavke kamere"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Veličina slike"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapiksela"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapiksela"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapiksela"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapiksela"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapiksela (16:9)"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index f602248..30ed114 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Videokamera beállításai"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Képméret"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapixel"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapixel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapixel"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapixel"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapixel (16:9)"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index c5f6a45..58c846e 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Տեսախցիկի կարգավորումներ"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Նկարի չափը"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13Մ պիքսել"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10Մ փիքսել"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8Մ պիքսել"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5Մ պիքսել"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4Մ պիքսել (16:9)"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 199716e..aa3e632 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Setelan perekam video"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Ukuran gambar"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 M piksel"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapiksel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 M piksel"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 M piksel"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M piksel (16:9)"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 581c20a..2590c55 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Impostazioni videocamera"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Dimensioni immagine"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 Mpixel"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 Mpixel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 Mpixel"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 Mpixel"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 Mpixel (16:9)"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 51e446f..4615d7a 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"הגדרות של מצלמת וידאו"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"גודל תמונה"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 מגה פיקסל"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"‏10M פיקסלים"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 מגה פיקסל"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 מגה פיקסל"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 מגה פיקסל (16:9)"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index db2db01..0e6c235 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"ビデオ録画の設定"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"画像サイズ"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13メガピクセル"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10Mピクセル"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8メガピクセル"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5メガピクセル"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4Mピクセル(16:9)"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 92eeae0..ec00390 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"ვიდეოჩამწერის პარამეტრები"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"სურათის ზომა"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 მეგაპიქსელი"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 მეგაპიქსელი"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 მეგაპიქსელი"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 მეგაპიქსელი"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 მეგაპიქსელი (16:9)"</string>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 4e7f1a6..82fbf03 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"ការ​កំណត់​ម៉ាស៊ីន​ថត​វីដេអូ"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"ទំហំ​រូបភាព"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"១៣ មេហ្គាភីកសែល"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"១០ មេហ្គា​ភីកសែល"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"៨ មេហ្គា​ភីកសែល"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"៥ មេហ្គា​ភីកសែល"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"៤ មេហ្គា​ភីកសែល (16:9)"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 9fe7050..55b997f 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"캠코더 설정"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"사진 크기"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"1300만 화소"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"1천만 픽셀"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"800만 화소"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"500만 화소"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4백만 화소(16:9)"</string>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 5d3abb5..74d7854 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"ຕັ້ງຄ່າກ້ອງວິດີໂອ"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"ຂະໜາດຮູບ"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 ລ້ານພິກເຊວ"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 ລ້ານພິກເຊວ"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 ລ້ານພິກເຊວ"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 ລ້ານພິກເຊວ"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 ລ້ານພິກເຊວ (16:9)"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 70fb36e..4469bf0 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Vaizdo kameros nustatymai"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Nuotraukos dydis"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapikselių"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapikselių"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapikseliai"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapikseliai"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapiks. (16:9)"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 569e37e..55772a8 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Videokameras iestatījumi"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Attēla lielums"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapikseļi"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapikseļi"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapikseļi"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapikseļi"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapikseļi (16:9)"</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index d41e5de..1c3c71f 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Камерын тохиргоо"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Зургийн хэмжээ"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13M пиксел"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10M пиксел"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8M пиксел"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5M пиксел"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M пиксел (16:9)"</string>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 9447fb0..6b71746 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Tetapan kamkorder"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Saiz gambar"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13M piksel"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10M piksel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8M piksel"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5M piksel"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M piksel (16:9)"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 06c0f91..374f187 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Videoinnstillinger"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Bildestørrelse"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapiksler"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapiksler"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapiksler"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapiksler"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M piksler (16:9)"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 7aab02d..95d37c1 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Camcorderinstellingen"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Grootte van foto"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapixel"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapixel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapixel"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapixel"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapixel (16:9)"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 9a069e5..dc1cf45 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Ustawienia kamery"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Rozmiar zdjęcia"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 Mpix"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapikseli"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 Mpix"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 Mpix"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapiksele (16:9)"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 8fe7d33..b0b8d18 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Definições da câmara de vídeo"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Tamanho da imagem"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 MP"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapíxeis"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 MP"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 MP"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapíxeis (16:9)"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index a17d018..4f33aa3 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Configurações da câmera de vídeo"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Tamanho da imagem"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 MP"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 MP"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 MP"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 MP"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 MP (16:9)"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index d977bdd..acabcf5 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Setările camerei video"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Dimensiune fotografie"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 MP"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapixeli"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 MP"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 MP"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 MP (16:9)"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index c219485..212b1b3 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Настройки видеокамеры"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Размер изображения"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 Мпикс."</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 Мпикс."</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 Мпикс."</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 Мпикс."</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 Мпикс. (16:9)"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 0ebc644..ae993fa 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Nastavenie videokamery"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Veľkosť fotografie"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 Mpx"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 Mpx"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 Mpx"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 Mpx"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapixely (16:9)"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 9adab19..cc44fc5 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Nastavitve videokamere"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Velikost slike"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 M slikovnih pik"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 mio. slikovnih pik"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 M slikovnih pik"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 M slikovnih pik"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 mio. pik (16 : 9)"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index efe65a7..c4af5ed 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Подешавања камкордера"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Величина слике"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 мегапиксела"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 мегапиксела"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 мегапиксела"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 мегапиксела"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 мегапиксела (16:9)"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 7385cf6..8129c69 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Videokamerainställningar"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Bildstorlek"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapixlar"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 megapixlar"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapixlar"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapixlar"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 megapixlar (16:9)"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 163fec4..a9b71ff 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Mipangilio ya kamkoda"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Ukubwa wa picha"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"Megapikseli 13"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"Megapikseli 10"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"Megapikseli 8"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"Megapikseli 5"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"Pikseli milioni 4 (16:09)"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 964b152..6ab5b91 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"การตั้งค่ากล้องวิดีโอ"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"ขนาดของภาพ"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 ล้านพิกเซล"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 ล้านพิกเซล"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 ล้านพิกเซล"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 ล้านพิกเซล"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M พิกเซล (16:9)"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 03b7134..509db39 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Mga setting ng camcorder"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Laki ng larawan"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13M pixel"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10M pixel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8M pixel"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5M pixel"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M pixels (16:9)"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index d729575..cf9bf5c 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Video kamera ayarları"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Resim boyutu"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 megapiksel"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 M piksel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 megapiksel"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 megapiksel"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 M piksel (16:9)"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 5a5a28b..2c5febe 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Налаштування відеокамери"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Розмір фото"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13 Мпікс."</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10 Мпікс."</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 Мпікс."</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 Мпікс."</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4 Мпікс. (16:9)"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 358612b..a89a97f 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Cài đặt máy quay video"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Kích thước hình ảnh"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13M pixel"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10M pixel"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8M pixel"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5M pixel"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M pixel (16:9)"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 6b63a85..766295a 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"摄像机设置"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"照片尺寸"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"1300万像素"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"1000万像素"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"800万像素"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"500万像素"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"400万像素 (16:9)"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index a2b114c..b6e23ee 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"攝錄機設定"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"相片大小"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"1,300 萬像素"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"1 千萬像素"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8 百萬像素"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5 百萬像素"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"400 萬像素 (16:9)"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index dda0c94..dee25fc 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"攝錄影機設定"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"圖片大小"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"1300 萬像素"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"1000 萬像素"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"800 萬像素"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"500 萬像素"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"400 萬像素 (16:9)"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 332984e..d9b4c8d 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -116,6 +116,7 @@
     <string name="pref_camcorder_settings_category" msgid="3553148484755353397">"Izilungiselelo zevidiyo-khamela"</string>
     <string name="pref_camera_picturesize_title" msgid="686045304547541815">"Usayizi wesithombe"</string>
     <string name="pref_camera_picturesize_entry_13mp" msgid="6728485576074234195">"13M amaphikiseli"</string>
+    <string name="pref_camera_picturesize_entry_10mp" msgid="2768659791396478466">"10M amaphikiseli"</string>
     <string name="pref_camera_picturesize_entry_8mp" msgid="7088352012301633667">"8M amaphikiseli"</string>
     <string name="pref_camera_picturesize_entry_5mp" msgid="1501745661448065284">"5M amaphikiseli"</string>
     <string name="pref_camera_picturesize_entry_4mp_wide" msgid="3338812763544573634">"4M amaphikiseli (16:9)"</string>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 7395607..486e616 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -470,11 +470,21 @@
         <item>@drawable/ic_hdr_plus_on</item>
     </array>
 
+    <array name="pref_camera_hdr_icons" translatable="false">
+        <item>@drawable/ic_hdr_off</item>
+        <item>@drawable/ic_hdr_on</item>
+    </array>
+
     <array name="pref_camera_hdr_plus_indicator_icons" translatable="false">
         <item>@drawable/ic_hdr_plus_off_indicator</item>
         <item>@drawable/ic_hdr_plus_on_indicator</item>
     </array>
 
+    <array name="pref_camera_hdr_indicator_icons" translatable="false">
+        <item>@drawable/ic_hdr_off_indicator</item>
+        <item>@drawable/ic_hdr_on_indicator</item>
+    </array>
+
     <string-array name="pref_camera_hdr_plus_entryvalues" translatable="false">
         <item>@string/setting_off_value</item>
         <item>@string/setting_on_value</item>
@@ -490,11 +500,6 @@
         <item>@string/pref_camera_scenemode_entry_turn_hdr_off</item>
     </string-array>
 
-    <array name="pref_camera_hdr_icons" translatable="false">
-        <item>@drawable/ic_hdr_off</item>
-        <item>@drawable/ic_hdr</item>
-    </array>
-
     <string-array name="pref_camera_hdr_entryvalues" translatable="false">
         <item>@string/setting_off_value</item>
         <item>@string/setting_on_value</item>
@@ -557,6 +562,11 @@
       <item>@drawable/ic_refocus_on_indicator</item>
     </array>
 
+    <string-array name="pref_camera_pano_orientation_entryvalues">
+      <item>@string/pano_orientation_horizontal</item>
+      <item>@string/pano_orientation_vertical</item>
+    </string-array>
+
     <array name="settings_toggle_icons" translatable="false">
       <item>@drawable/ic_options</item>
       <item>@drawable/ic_options_active</item>
@@ -579,8 +589,8 @@
         <item>@integer/camera_mode_photo</item>
         <item>@integer/camera_mode_video</item>
         <item>@integer/camera_mode_craft</item>
-        <item>@integer/camera_mode_photosphere</item>
         <item>@integer/camera_mode_panorama</item>
+        <item>@integer/camera_mode_photosphere</item>
         <item>@integer/camera_mode_timelapse</item>
         <item>@integer/camera_mode_setting</item>
     </integer-array>
@@ -643,8 +653,8 @@
         <item>@drawable/ic_camera_normal</item>
         <item>@drawable/ic_video_normal</item>
         <item>@drawable/ic_camera_normal</item>
-        <item>@drawable/ic_camera_normal</item>
-        <item>@drawable/ic_camera_normal</item>
+        <item>@null</item>
+        <item>@drawable/ic_panorama_normal</item>
         <item>@null</item>
         <item>@null</item>
         <item>@drawable/ic_craft_normal</item>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 99b9152..fff0349 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -159,7 +159,7 @@
 
     <!-- Filmstrip bottom controls -->
     <dimen name="filmstrip_bottom_control_size">48dp</dimen>
-    <dimen name="filmstrip_bottom_control_spacing">8dp</dimen>
+    <dimen name="filmstrip_bottom_control_spacing">16dp</dimen>
 
     <!-- Bottom bar ui -->
     <dimen name="bottom_bar_height_min">80dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4a09e89..e380bab 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -729,4 +729,10 @@
 
     <!-- A message shown to the user, indicating that an HDR+ photo is being processed. [CHAR LIMIT=25] -->
     <string name="processing_hdr_plus">Processing HDR+ &#8230;</string>
+
+    <string name="pano_orientation_horizontal" translatable="false">pano_horizontal</string>
+    <string name="pano_orientation_vertical" translatable="false">pano_vertical</string>
+
+    <string name="tag_enabled_id" translatable="false">enabled_id</string>
+
  </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 3f732c5..be00503 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -277,7 +277,6 @@
         <item name="android:alpha">1.0</item>
     </style>
     <style name="FilmstripBottomControlButton">
-        <item name="android:layout_margin">@dimen/filmstrip_bottom_control_spacing</item>
         <item name="android:layout_width">@dimen/filmstrip_bottom_control_size</item>
         <item name="android:layout_height">@dimen/filmstrip_bottom_control_size</item>
         <item name="android:background">@drawable/transparent_button_background</item>
@@ -285,9 +284,8 @@
         <item name="android:layout_gravity">center_vertical</item>
     </style>
     <style name="IndicatorIcon">
-        <item name="android:layout_width">@dimen/indicator_icon_radius</item>
-        <item name="android:layout_height">@dimen/indicator_icon_radius</item>
-        <item name="android:scaleType">center</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
         <item name="android:background">@null</item>
     </style>
 </resources>
diff --git a/src/com/android/camera/ButtonManager.java b/src/com/android/camera/ButtonManager.java
index 22707bf..7cf909c 100644
--- a/src/com/android/camera/ButtonManager.java
+++ b/src/com/android/camera/ButtonManager.java
@@ -38,11 +38,14 @@
     public static final int BUTTON_TORCH = 1;
     public static final int BUTTON_CAMERA = 2;
     public static final int BUTTON_HDRPLUS = 3;
-    public static final int BUTTON_REFOCUS = 4;
-    public static final int BUTTON_CANCEL = 5;
-    public static final int BUTTON_DONE = 6;
-    public static final int BUTTON_RETAKE = 7;
-    public static final int BUTTON_REVIEW = 8;
+    public static final int BUTTON_HDR = 4;
+    public static final int BUTTON_REFOCUS = 5;
+    public static final int BUTTON_CANCEL = 6;
+    public static final int BUTTON_DONE = 7;
+    public static final int BUTTON_RETAKE = 8;
+    public static final int BUTTON_REVIEW = 9;
+    public static final int BUTTON_PANO_HORIZONTAL = 10;
+    public static final int BUTTON_PANO_VERTICAL = 11;
 
     /** For two state MultiToggleImageButtons, the off index. */
     public static final int OFF = 0;
@@ -52,11 +55,11 @@
     /** A reference to the application's settings manager. */
     private final SettingsManager mSettingsManager;
 
-    /** Bottom bar options buttons. */
-    private MultiToggleImageButton mButtonFlash; // same as torch.
-    private MultiToggleImageButton mButtonCamera;
-    private MultiToggleImageButton mButtonHdrPlus;
-    private MultiToggleImageButton mButtonRefocus;
+    /** Bottom bar options toggle buttons. */
+    private MultiToggleImageButton mButtonPos1;
+    private MultiToggleImageButton mButtonPos2;
+    private MultiToggleImageButton mButtonPos3;
+    private MultiToggleImageButton mButtonPos4;
 
     /** Intent UI buttons. */
     private ImageButton mButtonCancel;
@@ -122,13 +125,13 @@
      * Gets references to all known buttons.
      */
     private void getButtonsReferences(View root) {
-        mButtonFlash
-            = (MultiToggleImageButton) root.findViewById(R.id.flash_toggle_button);
-        mButtonCamera
+        mButtonPos1
             = (MultiToggleImageButton) root.findViewById(R.id.camera_toggle_button);
-        mButtonHdrPlus
+        mButtonPos2
+            = (MultiToggleImageButton) root.findViewById(R.id.flash_toggle_button);
+        mButtonPos3
             = (MultiToggleImageButton) root.findViewById(R.id.hdr_plus_toggle_button);
-        mButtonRefocus
+        mButtonPos4
             = (MultiToggleImageButton) root.findViewById(R.id.refocus_toggle_button);
         mButtonCancel
             = (ImageButton) root.findViewById(R.id.cancel_button);
@@ -201,30 +204,35 @@
     private MultiToggleImageButton getButtonOrError(int buttonId) {
         switch (buttonId) {
             case BUTTON_FLASH:
-                if (mButtonFlash == null) {
+                if (mButtonPos2 == null) {
                     throw new IllegalStateException("Flash button could not be found.");
                 }
-                return mButtonFlash;
+                return mButtonPos2;
             case BUTTON_TORCH:
-                if (mButtonFlash == null) {
+                if (mButtonPos2 == null) {
                     throw new IllegalStateException("Torch button could not be found.");
                 }
-                return mButtonFlash;
+                return mButtonPos2;
             case BUTTON_CAMERA:
-                if (mButtonCamera == null) {
+                if (mButtonPos1 == null) {
                     throw new IllegalStateException("Camera button could not be found.");
                 }
-                return mButtonCamera;
+                return mButtonPos1;
             case BUTTON_HDRPLUS:
-                if (mButtonHdrPlus == null) {
+                if (mButtonPos3 == null) {
+                    throw new IllegalStateException("Hdr plus button could not be found.");
+                }
+                return mButtonPos3;
+            case BUTTON_HDR:
+                if (mButtonPos3 == null) {
                     throw new IllegalStateException("Hdr button could not be found.");
                 }
-                return mButtonHdrPlus;
+                return mButtonPos3;
             case BUTTON_REFOCUS:
-                if (mButtonRefocus == null) {
+                if (mButtonPos4 == null) {
                     throw new IllegalStateException("Refocus button could not be found.");
                 }
-                return mButtonRefocus;
+                return mButtonPos4;
             default:
                 throw new IllegalArgumentException("button not known by id=" + buttonId);
         }
@@ -237,6 +245,16 @@
      */
     private ImageButton getImageButtonOrError(int buttonId) {
         switch (buttonId) {
+            case BUTTON_PANO_VERTICAL:
+                if (mButtonPos1 == null) {
+                    throw new IllegalStateException("Flash button could not be found.");
+                }
+                return (ImageButton) mButtonPos1;
+            case BUTTON_PANO_HORIZONTAL:
+                if (mButtonPos2 == null) {
+                    throw new IllegalStateException("Flash button could not be found.");
+                }
+                return (ImageButton) mButtonPos2;
             case BUTTON_CANCEL:
                 if (mButtonCancel == null) {
                     throw new IllegalStateException("Cancel button could not be found.");
@@ -266,40 +284,26 @@
      * Enable a known button by id, with a state change callback and
      * a resource id that points to an array of drawables.
      */
-    public void enableButton(int buttonId, ButtonCallback cb, int resIdImages) {
+    public void enableButton(int buttonId, ButtonCallback cb) {
         MultiToggleImageButton button = getButtonOrError(buttonId);
         switch (buttonId) {
             case BUTTON_FLASH:
-                if (!mSettingsManager.isCameraBackFacing()) {
-                    disableButton(BUTTON_FLASH);
-                    return;
-                }
-                enableFlashButton(button, cb, resIdImages);
+                enableFlashButton(button, cb, R.array.camera_flashmode_icons);
                 break;
             case BUTTON_TORCH:
-                if (!mSettingsManager.isCameraBackFacing()) {
-                    disableButton(BUTTON_TORCH);
-                    return;
-                }
-                enableTorchButton(button, cb, resIdImages);
+                enableTorchButton(button, cb, R.array.video_flashmode_icons);
                 break;
             case BUTTON_CAMERA:
-                int modeIndex = mAppController.getCurrentModuleIndex();
-                if (modeIndex == sGcamIndex && mSettingsManager.isHdrPlusOn()) {
-                    disableButton(BUTTON_CAMERA);
-                    return;
-                }
-                enableCameraButton(button, cb, resIdImages);
+                enableCameraButton(button, cb, R.array.camera_id_icons);
                 break;
             case BUTTON_HDRPLUS:
-                if (!mSettingsManager.isCameraBackFacing()) {
-                    disableButton(BUTTON_HDRPLUS);
-                    return;
-                }
-                enableHdrPlusButton(button, cb, resIdImages);
+                enableHdrPlusButton(button, cb, R.array.pref_camera_hdr_plus_icons);
+                break;
+            case BUTTON_HDR:
+                enableHdrPlusButton(button, cb, R.array.pref_camera_hdr_icons);
                 break;
             case BUTTON_REFOCUS:
-                enableRefocusButton(button, cb, resIdImages);
+                enableRefocusButton(button, cb, R.array.refocus_icons);
                 break;
             default:
                 throw new IllegalArgumentException("button not known by id=" + buttonId);
@@ -311,6 +315,7 @@
                 mListener.onButtonEnabledChanged(this, buttonId);
             }
         }
+        button.setTag(R.string.tag_enabled_id, (Integer) buttonId);
 
         if (button.getVisibility() != View.VISIBLE) {
             button.setVisibility(View.VISIBLE);
@@ -336,6 +341,14 @@
                 mListener.onButtonEnabledChanged(this, buttonId);
             }
         }
+        button.setTag(R.string.tag_enabled_id, (Integer) buttonId);
+
+        if (button.getVisibility() != View.VISIBLE) {
+            button.setVisibility(View.VISIBLE);
+            if (mListener != null) {
+                mListener.onButtonVisibilityChanged(this, buttonId);
+            }
+        }
     }
 
     /**
@@ -351,6 +364,14 @@
                 mListener.onButtonEnabledChanged(this, buttonId);
             }
         }
+        button.setTag(R.string.tag_enabled_id, (Integer) buttonId);
+
+        if (button.getVisibility() != View.VISIBLE) {
+            button.setVisibility(View.VISIBLE);
+            if (mListener != null) {
+                mListener.onButtonVisibilityChanged(this, buttonId);
+            }
+        }
     }
 
     /**
@@ -364,6 +385,7 @@
                 mListener.onButtonEnabledChanged(this, buttonId);
             }
         }
+        button.setTag(R.string.tag_enabled_id, null);
 
         if (button.getVisibility() != View.VISIBLE) {
             button.setVisibility(View.VISIBLE);
@@ -377,7 +399,12 @@
      * Hide a button by id.
      */
     public void hideButton(int buttonId) {
-        MultiToggleImageButton button = getButtonOrError(buttonId);
+        View button;
+        try {
+            button = (View) getButtonOrError(buttonId);
+        } catch (IllegalArgumentException e) {
+            button = (View) getImageButtonOrError(buttonId);
+        }
         if (button.getVisibility() == View.VISIBLE) {
             button.setVisibility(View.INVISIBLE);
             if (mListener != null) {
@@ -387,18 +414,34 @@
     }
 
     /**
-     * Check if a button is enabled.
+     * Check if a button is enabled with the given button id..
      */
     public boolean isEnabled(int buttonId) {
-        MultiToggleImageButton button = getButtonOrError(buttonId);
-        return button.isEnabled();
+        View button;
+        try {
+            button = (View) getButtonOrError(buttonId);
+        } catch (IllegalArgumentException e) {
+            button = (View) getImageButtonOrError(buttonId);
+        }
+
+        Integer enabledId = (Integer) button.getTag(R.string.tag_enabled_id);
+        if (enabledId != null) {
+            return (enabledId.intValue() == buttonId) && button.isEnabled();
+        } else {
+            return false;
+        }
     }
 
     /**
      * Check if a button is visible.
      */
     public boolean isVisible(int buttonId) {
-        MultiToggleImageButton button = getButtonOrError(buttonId);
+        View button;
+        try {
+            button = (View) getButtonOrError(buttonId);
+        } catch (IllegalArgumentException e) {
+            button = (View) getImageButtonOrError(buttonId);
+        }
         return (button.getVisibility() == View.VISIBLE);
     }
 
@@ -472,22 +515,12 @@
                 if (cb != null) {
                     cb.onStateChanged(cameraId);
                 }
-                onCameraChanged();
+                mAppController.getCameraAppUI().onChangeCamera();
             }
         });
     }
 
     /**
-     * Re-sync the bottom bar buttons with the current module.
-     */
-    private void onCameraChanged() {
-        ModuleController moduleController = mAppController.getCurrentModuleController();
-        if (moduleController != null) {
-            moduleController.customizeButtons(this);
-        }
-    }
-
-    /**
      * Enable an hdr plus button.
      */
     private void enableHdrPlusButton(MultiToggleImageButton button,
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 6b67eb5..e8b33b8 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -1027,10 +1027,11 @@
 
         int modeIndex = -1;
         int photoIndex = getResources().getInteger(R.integer.camera_mode_photo);
+        int videoIndex = getResources().getInteger(R.integer.camera_mode_video);
         int gcamIndex = getResources().getInteger(R.integer.camera_mode_gcam);
         if (MediaStore.INTENT_ACTION_VIDEO_CAMERA.equals(getIntent().getAction())
                 || MediaStore.ACTION_VIDEO_CAPTURE.equals(getIntent().getAction())) {
-            modeIndex = photoIndex;
+            modeIndex = videoIndex;
         } else if (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA.equals(getIntent().getAction())
                 || MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(getIntent()
                         .getAction())) {
@@ -1068,7 +1069,6 @@
         syncBottomBarColor();
         syncBottomBarShutterIcon();
         mCurrentModule.init(this, isSecureCamera(), isCaptureIntent());
-        mCurrentModule.customizeButtons(getButtonManager());
 
         if (!mSecureCamera) {
             mFilmstripController.setDataAdapter(mDataAdapter);
@@ -1434,7 +1434,7 @@
             }
             if (refocusOn) {
                 modeIndex = getResources().getInteger(R.integer.camera_mode_refocus);
-            } else if (hdrPlusOn) {
+            } else if (hdrPlusOn && GcamHelper.hasGcamCapture()) {
                 modeIndex = getResources().getInteger(R.integer.camera_mode_gcam);
             } else {
                 // Do nothing, keep MODULE_CRAFT.
@@ -1619,7 +1619,6 @@
         syncBottomBarColor();
         syncBottomBarShutterIcon();
         module.init(this, isSecureCamera(), isCaptureIntent());
-        module.customizeButtons(getButtonManager());
         module.resume();
         module.onPreviewVisibilityChanged(!mFilmstripVisible);
     }
diff --git a/src/com/android/camera/FocusOverlayManager.java b/src/com/android/camera/FocusOverlayManager.java
index 5a211cd..d306cfc 100644
--- a/src/com/android/camera/FocusOverlayManager.java
+++ b/src/com/android/camera/FocusOverlayManager.java
@@ -100,8 +100,8 @@
         public void clearFocus();
         public void setFocusPosition(int x, int y);
         public void onFocusStarted();
-        public void onFocusSucceeded(boolean timeOut);
-        public void onFocusFailed(boolean timeOut);
+        public void onFocusSucceeded();
+        public void onFocusFailed();
         public void pauseFaceDetection();
         public void resumeFaceDetection();
     }
@@ -324,7 +324,7 @@
             mUI.setFocusPosition(mPreviewRect.centerX(), mPreviewRect.centerY());
             mUI.onFocusStarted();
         } else if (!moving) {
-            mUI.onFocusSucceeded(true);
+            mUI.onFocusSucceeded();
         }
         mPreviousMoving = moving;
     }
@@ -353,10 +353,6 @@
         calculateTapArea(x, y, 1.5f, mMeteringArea.get(0).rect);
     }
 
-    private void resetMeteringAreas() {
-        mMeteringArea = null;
-    }
-
     public void onSingleTapUp(int x, int y) {
         if (!mInitialized || mState == STATE_FOCUSING_SNAP_ON_FINISH) return;
 
@@ -504,11 +500,11 @@
         } else {
             if (CameraUtil.FOCUS_MODE_CONTINUOUS_PICTURE.equals(mFocusMode)) {
                 // TODO: check HAL behavior and decide if this can be removed.
-                mUI.onFocusSucceeded(false);
+                mUI.onFocusSucceeded();
             } else if (mState == STATE_SUCCESS) {
-                mUI.onFocusSucceeded(false);
+                mUI.onFocusSucceeded();
             } else if (mState == STATE_FAIL) {
-                mUI.onFocusFailed(false);
+                mUI.onFocusFailed();
             }
         }
     }
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 6bfc07e..147ac65 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -50,6 +50,7 @@
 
 import com.android.camera.PhotoModule.NamedImages.NamedEntity;
 import com.android.camera.app.AppController;
+import com.android.camera.app.CameraAppUI;
 import com.android.camera.app.CameraManager.CameraAFCallback;
 import com.android.camera.app.CameraManager.CameraAFMoveCallback;
 import com.android.camera.app.CameraManager.CameraPictureCallback;
@@ -62,6 +63,8 @@
 import com.android.camera.exif.ExifInterface;
 import com.android.camera.exif.ExifTag;
 import com.android.camera.exif.Rational;
+import com.android.camera.hardware.HardwareSpec;
+import com.android.camera.hardware.HardwareSpecImpl;
 import com.android.camera.module.ModuleController;
 import com.android.camera.settings.SettingsManager;
 import com.android.camera.ui.RotateTextToast;
@@ -340,7 +343,6 @@
 
         mActivity.getCameraProvider().requestCamera(mCameraId);
 
-        initializeControlByIntent();
         mQuickCapture = mActivity.getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false);
         mLocationManager = mActivity.getLocationManager();
         mSensorManager = (SensorManager) (mActivity.getSystemService(Context.SENSOR_SERVICE));
@@ -353,8 +355,8 @@
     }
 
     private void initializeControlByIntent() {
-        mUI.initializeControlByIntent();
         if (mIsImageCaptureIntent) {
+            mActivity.getCameraAppUI().transitionToIntentLayout();
             setupCaptureParams();
         }
     }
@@ -407,6 +409,7 @@
 
     private void onCameraOpened() {
         openCameraCommon();
+        initializeControlByIntent();
     }
 
     private void switchCamera() {
@@ -479,15 +482,67 @@
             }
         };
 
+    private final View.OnClickListener mCancelCallback = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            onCaptureCancelled();
+        }
+    };
+
+    private final View.OnClickListener mDoneCallback = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            onCaptureDone();
+        }
+    };
+
+    private final View.OnClickListener mRetakeCallback = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            mActivity.getCameraAppUI().transitionToIntentLayout();
+            onCaptureRetake();
+        }
+    };
+
     @Override
-    public void customizeButtons(ButtonManager buttonManager) {
-        mUI.customizeButtons(buttonManager, mCameraCallback, mHdrPlusCallback,
-            mRefocusCallback);
+    public HardwareSpec getHardwareSpec() {
+        return new HardwareSpecImpl(mParameters);
+    }
+
+    @Override
+    public CameraAppUI.BottomBarUISpec getBottomBarSpec() {
+        CameraAppUI.BottomBarUISpec bottomBarSpec = new CameraAppUI.BottomBarUISpec();
+
+        bottomBarSpec.enableCamera = true;
+        bottomBarSpec.cameraCallback = mCameraCallback;
+        bottomBarSpec.enableFlash = true;
+
+        if (mActivity.getCurrentModuleIndex() ==
+                mActivity.getResources().getInteger(R.integer.camera_mode_photo)) {
+            bottomBarSpec.hideHdr= true;
+            bottomBarSpec.hideRefocus = true;
+        } else {
+            bottomBarSpec.enableHdr = true;
+            bottomBarSpec.hdrCallback = mHdrPlusCallback;
+            bottomBarSpec.enableRefocus = true;
+            bottomBarSpec.refocusCallback = mRefocusCallback;
+        }
+
+        if (isImageCaptureIntent()) {
+            bottomBarSpec.showCancel = true;
+            bottomBarSpec.cancelCallback = mCancelCallback;
+            bottomBarSpec.showDone = true;
+            bottomBarSpec.doneCallback = mDoneCallback;
+            bottomBarSpec.showRetake = true;
+            bottomBarSpec.retakeCallback = mRetakeCallback;
+        }
+
+        return bottomBarSpec;
     }
 
     // either open a new camera or switch cameras
     private void openCameraCommon() {
-        mUI.onCameraOpened(mParameters, mCameraCallback, mHdrPlusCallback, mRefocusCallback);
+        mUI.onCameraOpened(mParameters);
         if (mIsImageCaptureIntent) {
             // Set hdr plus to default: off.
             SettingsManager settingsManager = mActivity.getSettingsManager();
diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java
index dc67353..236e4c3 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -28,12 +28,10 @@
 import android.view.MotionEvent;
 import android.view.TextureView;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.view.ViewStub;
 
 import com.android.camera.FocusOverlayManager.FocusUI;
-import com.android.camera.app.CameraAppUI;
 import com.android.camera.app.CameraManager;
 import com.android.camera.ui.FaceView;
 import com.android.camera.ui.PreviewOverlay;
@@ -52,10 +50,10 @@
 
     private final PreviewOverlay mPreviewOverlay;
     private final FocusUI mFocusUI;
-    private CameraActivity mActivity;
-    private PhotoController mController;
+    private final CameraActivity mActivity;
+    private final PhotoController mController;
 
-    private View mRootView;
+    private final View mRootView;
     private SurfaceTexture mSurfaceTexture;
 
     private FaceView mFaceView;
@@ -66,36 +64,10 @@
 
     private int mPreviewWidth = 0;
     private int mPreviewHeight = 0;
-    private TextureView mTextureView;
+    private final TextureView mTextureView;
     private float mAspectRatio = UNSET;
     private final Object mSurfaceTextureLock = new Object();
 
-    private ButtonManager.ButtonCallback mCameraCallback;
-    private ButtonManager.ButtonCallback mHdrCallback;
-    private ButtonManager.ButtonCallback mRefocusCallback;
-
-    private final OnClickListener mCancelCallback = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            mController.onCaptureCancelled();
-        }
-    };
-    private final OnClickListener mDoneCallback = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            mController.onCaptureDone();
-        }
-    };
-    private final OnClickListener mRetakeCallback = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            customizeButtons(mActivity.getButtonManager(), mCameraCallback, mHdrCallback,
-                mRefocusCallback);
-            mActivity.getCameraAppUI().transitionToIntentLayout();
-            mController.onCaptureRetake();
-        }
-    };
-
     private final GestureDetector.OnGestureListener mPreviewGestureListener
             = new GestureDetector.SimpleOnGestureListener() {
         @Override
@@ -138,8 +110,8 @@
 
     private class DecodeTask extends AsyncTask<Void, Void, Bitmap> {
         private final byte [] mData;
-        private int mOrientation;
-        private boolean mMirror;
+        private final int mOrientation;
+        private final boolean mMirror;
 
         public DecodeTask(byte[] data, int orientation, boolean mirror) {
             mData = data;
@@ -186,7 +158,7 @@
 
         ViewGroup moduleRoot = (ViewGroup) mRootView.findViewById(R.id.module_layout);
         mActivity.getLayoutInflater().inflate(R.layout.photo_module,
-                 (ViewGroup) moduleRoot, true);
+                 moduleRoot, true);
         // display the view
         mTextureView = (TextureView) mRootView.findViewById(R.id.preview_content);
         initIndicators();
@@ -263,70 +235,16 @@
         // TODO init toggle buttons on bottom bar here
     }
 
-    public void onCameraOpened(Camera.Parameters params,
-            ButtonManager.ButtonCallback cameraCallback,
-            ButtonManager.ButtonCallback hdrCallback,
-            ButtonManager.ButtonCallback refocusCallback) {
-
-        mCameraCallback = cameraCallback;
-        mHdrCallback = hdrCallback;
-        mRefocusCallback = refocusCallback;
-
+    public void onCameraOpened(Camera.Parameters params) {
         initializeZoom(params);
     }
 
-    /**
-     * Customize the mode options such that flash and camera
-     * switching are enabled in simple photo mode, and flash, camera, refocus,
-     * and hdr are enabled in advanced photo mode.
-     */
-    public void customizeButtons(ButtonManager buttonManager,
-            ButtonManager.ButtonCallback cameraCallback,
-            ButtonManager.ButtonCallback hdrCallback,
-            ButtonManager.ButtonCallback refocusCallback) {
-
-        buttonManager.enableButton(ButtonManager.BUTTON_CAMERA,
-            cameraCallback, R.array.camera_id_icons);
-        buttonManager.enableButton(ButtonManager.BUTTON_FLASH,
-            null, R.array.camera_flashmode_icons);
-
-        if (mActivity.getCurrentModuleIndex() ==
-                mActivity.getResources().getInteger(R.integer.camera_mode_photo)) {
-            // Simple photo mode.
-            buttonManager.hideButton(ButtonManager.BUTTON_HDRPLUS);
-            buttonManager.hideButton(ButtonManager.BUTTON_REFOCUS);
-        } else {
-            // Advanced photo mode.
-            buttonManager.enableButton(ButtonManager.BUTTON_HDRPLUS,
-                hdrCallback, R.array.pref_camera_hdr_plus_icons);
-            buttonManager.enableButton(ButtonManager.BUTTON_REFOCUS,
-                refocusCallback, R.array.refocus_icons);
-        }
-
-        if (mController.isImageCaptureIntent()) {
-            buttonManager.enablePushButton(ButtonManager.BUTTON_CANCEL,
-                mCancelCallback);
-            buttonManager.enablePushButton(ButtonManager.BUTTON_DONE,
-                mDoneCallback);
-            buttonManager.enablePushButton(ButtonManager.BUTTON_RETAKE,
-                mRetakeCallback);
-        }
-    }
-
     public void animateCapture(final byte[] jpegData, int orientation, boolean mirror) {
         // Decode jpeg byte array and then animate the jpeg
         DecodeTask task = new DecodeTask(jpegData, orientation, mirror);
         task.execute();
     }
 
-    public void initializeControlByIntent() {
-        if (mController.isImageCaptureIntent()) {
-            customizeButtons(mActivity.getButtonManager(), mCameraCallback, mHdrCallback,
-                mRefocusCallback);
-            mActivity.getCameraAppUI().transitionToIntentLayout();
-        }
-    }
-
     // called from onResume but only the first time
     public void initializeFirstTime() {
 
@@ -379,10 +297,7 @@
         mDecodeTaskForReview = new DecodeImageForReview(jpegData, orientation, mirror);
         mDecodeTaskForReview.execute();
 
-        customizeButtons(mActivity.getButtonManager(), mCameraCallback, mHdrCallback,
-            mRefocusCallback);
         mActivity.getCameraAppUI().transitionToIntentReviewLayout();
-
         pauseFaceDetection();
     }
 
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 963326e..9195195 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -61,6 +61,8 @@
 import com.android.camera.app.MemoryManager;
 import com.android.camera.app.MemoryManager.MemoryListener;
 import com.android.camera.exif.ExifInterface;
+import com.android.camera.hardware.HardwareSpec;
+import com.android.camera.hardware.HardwareSpecImpl;
 import com.android.camera.module.ModuleController;
 import com.android.camera.settings.SettingsManager;
 import com.android.camera.util.AccessibilityUtils;
@@ -294,6 +296,9 @@
         }
     }
 
+    private int mShutterIconId;
+
+
     /**
      * Construct a new video module.
      */
@@ -348,6 +353,10 @@
         mUI.showTimeLapseUI(mCaptureTimeLapse);
         mPendingSwitchCameraId = -1;
         mAppController = app;
+
+        mShutterIconId = CameraUtil.getCameraShutterIconId(
+                mAppController.getCurrentModuleIndex(), mAppController.getAndroidContext());
+
     }
 
     @Override
@@ -355,6 +364,12 @@
         return true;
     }
 
+    private void initializeControlByIntent() {
+        if (isVideoCaptureIntent()) {
+            mActivity.getCameraAppUI().transitionToIntentLayout();
+        }
+    }
+
     @Override
     public void onSingleTapUp(View view, int x, int y) {
         if (mPaused || mCameraDevice == null) {
@@ -467,9 +482,53 @@
             }
         };
 
+    private final View.OnClickListener mCancelCallback = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            onReviewCancelClicked(v);
+        }
+    };
+
+    private final View.OnClickListener mDoneCallback = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            onReviewDoneClicked(v);
+        }
+    };
+    private final View.OnClickListener mReviewCallback = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            mActivity.getCameraAppUI().transitionToIntentLayout();
+            onReviewPlayClicked(v);
+        }
+    };
+
     @Override
-    public void customizeButtons(ButtonManager buttonManager) {
-        mUI.customizeButtons(buttonManager, mFlashCallback, mCameraCallback);
+    public HardwareSpec getHardwareSpec() {
+        return new HardwareSpecImpl(mParameters);
+    }
+
+    @Override
+    public CameraAppUI.BottomBarUISpec getBottomBarSpec() {
+        CameraAppUI.BottomBarUISpec bottomBarSpec = new CameraAppUI.BottomBarUISpec();
+
+        bottomBarSpec.enableCamera = true;
+        bottomBarSpec.cameraCallback = mCameraCallback;
+        bottomBarSpec.enableTorchFlash = true;
+        bottomBarSpec.flashCallback = mFlashCallback;
+        bottomBarSpec.hideHdr = true;
+        bottomBarSpec.hideRefocus = true;
+
+        if (isVideoCaptureIntent()) {
+            bottomBarSpec.showCancel = true;
+            bottomBarSpec.cancelCallback = mCancelCallback;
+            bottomBarSpec.showDone = true;
+            bottomBarSpec.doneCallback = mDoneCallback;
+            bottomBarSpec.showReview = true;
+            bottomBarSpec.reviewCallback = mReviewCallback;
+        }
+
+        return bottomBarSpec;
     }
 
     @Override
@@ -484,7 +543,7 @@
         startPreview();
         initializeVideoSnapshot();
         mUI.initializeZoom(mParameters);
-        mUI.onCameraOpened(mFlashCallback, mCameraCallback);
+        initializeControlByIntent();
     }
 
     private void startPlayVideoActivity() {
@@ -573,12 +632,8 @@
 
         if (stop) {
             onStopVideoRecording();
-            int shutterIconId = CameraUtil.getCameraShutterIconId(
-                mAppController.getCurrentModuleIndex(), mAppController.getAndroidContext());
-            mAppController.getCameraAppUI().animateBottomBarToFullSize(shutterIconId);
         } else {
             startVideoRecording();
-            mAppController.getCameraAppUI().animateBottomBarToCircle(R.drawable.ic_stop_normal);
         }
         mUI.enableShutter(false);
         mFocusManager.onShutterUp();
@@ -1142,6 +1197,8 @@
         mUI.setSwipingEnabled(false);
         mUI.showFocusUI(false);
 
+        mAppController.getCameraAppUI().animateBottomBarToCircle(R.drawable.ic_stop_normal);
+
         mActivity.updateStorageSpaceAndHint();
         if (mActivity.getStorageSpaceBytes() <= Storage.LOW_STORAGE_THRESHOLD_BYTES) {
             Log.v(TAG, "Storage issue, ignore the start request");
@@ -1238,6 +1295,8 @@
         mUI.setSwipingEnabled(true);
         mUI.showFocusUI(true);
 
+        mAppController.getCameraAppUI().animateBottomBarToFullSize(mShutterIconId);
+
         boolean fail = false;
         if (mMediaRecorderRecording) {
             boolean shouldAddToMediaStoreNow = false;
@@ -1284,8 +1343,8 @@
         }
         // release media recorder
         releaseMediaRecorder();
-        setFocusParameters();
         if (!mPaused) {
+            setFocusParameters();
             mCameraDevice.lock();
             if (!ApiHelper.HAS_SURFACE_TEXTURE_RECORDING) {
                 stopPreview();
diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java
index 0956cd1..715b469 100644
--- a/src/com/android/camera/VideoUI.java
+++ b/src/com/android/camera/VideoUI.java
@@ -26,7 +26,6 @@
 import android.view.SurfaceView;
 import android.view.TextureView;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -72,29 +71,6 @@
     private float mSurfaceTextureUncroppedWidth;
     private float mSurfaceTextureUncroppedHeight;
 
-    private ButtonManager.ButtonCallback mFlashCallback;
-    private ButtonManager.ButtonCallback mCameraCallback;
-
-    private final OnClickListener mCancelCallback = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            mController.onReviewCancelClicked(v);
-        }
-    };
-    private final OnClickListener mDoneCallback = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            mController.onReviewDoneClicked(v);
-        }
-    };
-    private final OnClickListener mReviewCallback = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            customizeButtons(mActivity.getButtonManager(), mFlashCallback, mCameraCallback);
-            mActivity.getCameraAppUI().transitionToIntentLayout();
-            mController.onReviewPlayClicked(v);
-        }
-    };
 
     private float mAspectRatio = UNSET;
     private final AnimationManager mAnimationManager;
@@ -142,7 +118,6 @@
         mSurfaceTexture = mTextureView.getSurfaceTexture();
 
         initializeMiscControls();
-        initializeControlByIntent();
         mAnimationManager = new AnimationManager();
         mFocusUI = (FocusOverlay) mRootView.findViewById(R.id.focus_overlay);
     }
@@ -153,38 +128,6 @@
         mSurfaceView.getHolder().addCallback(this);
     }
 
-    /**
-     * Customize the mode options such that flash and camera
-     * switching are enabled.
-     */
-    public void customizeButtons(ButtonManager buttonManager,
-                                   ButtonManager.ButtonCallback flashCallback,
-                                   ButtonManager.ButtonCallback cameraCallback) {
-
-        buttonManager.enableButton(ButtonManager.BUTTON_CAMERA,
-            cameraCallback, R.array.camera_id_icons);
-        buttonManager.enableButton(ButtonManager.BUTTON_TORCH,
-            flashCallback, R.array.video_flashmode_icons);
-        buttonManager.hideButton(ButtonManager.BUTTON_HDRPLUS);
-        buttonManager.hideButton(ButtonManager.BUTTON_REFOCUS);
-
-        if (mController.isVideoCaptureIntent()) {
-            buttonManager.enablePushButton(ButtonManager.BUTTON_CANCEL,
-                mCancelCallback);
-            buttonManager.enablePushButton(ButtonManager.BUTTON_DONE,
-                mDoneCallback);
-            buttonManager.enablePushButton(ButtonManager.BUTTON_REVIEW,
-                mReviewCallback, R.drawable.ic_play);
-        }
-    }
-
-    private void initializeControlByIntent() {
-        if (mController.isVideoCaptureIntent()) {
-            customizeButtons(mActivity.getButtonManager(), mFlashCallback, mCameraCallback);
-            mActivity.getCameraAppUI().transitionToIntentLayout();
-        }
-    }
-
     public void setPreviewSize(int width, int height) {
         if (width == 0 || height == 0) {
             Log.w(TAG, "Preview size should not be 0.");
@@ -267,12 +210,6 @@
         mTextureView.setVisibility(View.GONE);
     }
 
-    public void onCameraOpened(ButtonManager.ButtonCallback flashCallback,
-            ButtonManager.ButtonCallback cameraCallback) {
-        mFlashCallback = flashCallback;
-        mCameraCallback = cameraCallback;
-    }
-
     private void initializeMiscControls() {
         mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image);
         mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time);
@@ -331,7 +268,6 @@
     }
 
     public void showReviewControls() {
-        customizeButtons(mActivity.getButtonManager(), mFlashCallback, mCameraCallback);
         mActivity.getCameraAppUI().transitionToIntentReviewLayout();
         mReviewImage.setVisibility(View.VISIBLE);
     }
diff --git a/src/com/android/camera/app/CameraApp.java b/src/com/android/camera/app/CameraApp.java
index bb27cc9..451d75a 100644
--- a/src/com/android/camera/app/CameraApp.java
+++ b/src/com/android/camera/app/CameraApp.java
@@ -25,6 +25,8 @@
 import com.android.camera.session.CaptureSessionManagerImpl;
 import com.android.camera.session.PlaceholderManager;
 import com.android.camera.session.ProcessingNotificationManager;
+import com.android.camera.session.SessionStorageManager;
+import com.android.camera.session.SessionStorageManagerImpl;
 import com.android.camera.util.CameraUtil;
 import com.android.camera.util.UsageStatistics;
 
@@ -35,6 +37,7 @@
 public class CameraApp extends Application implements CameraServices {
     private MediaSaver mMediaSaver;
     private CaptureSessionManager mSessionManager;
+    private SessionStorageManager mSessionStorageManager;
     private MemoryManagerImpl mMemoryManager;
     private ProcessingNotificationManager mNotificationManager;
     private PlaceholderManager mPlaceHolderManager;
@@ -51,8 +54,9 @@
         mMediaSaver = new MediaSaverImpl();
         mNotificationManager = new ProcessingNotificationManager(this);
         mPlaceHolderManager = new PlaceholderManager(context);
+        mSessionStorageManager = SessionStorageManagerImpl.create(this);
         mSessionManager = new CaptureSessionManagerImpl(mMediaSaver, getContentResolver(),
-                mNotificationManager, mPlaceHolderManager);
+                mNotificationManager, mPlaceHolderManager, mSessionStorageManager);
         mMemoryManager = MemoryManagerImpl.create(getApplicationContext(), mMediaSaver);
     }
 
diff --git a/src/com/android/camera/app/CameraAppUI.java b/src/com/android/camera/app/CameraAppUI.java
index 4fa4068..bea5796 100644
--- a/src/com/android/camera/app/CameraAppUI.java
+++ b/src/com/android/camera/app/CameraAppUI.java
@@ -32,9 +32,13 @@
 import android.widget.FrameLayout;
 
 import com.android.camera.AnimationManager;
+import com.android.camera.ButtonManager;
 import com.android.camera.ShutterButton;
 import com.android.camera.TextureViewHelper;
 import com.android.camera.filmstrip.FilmstripContentPanel;
+import com.android.camera.hardware.HardwareSpec;
+import com.android.camera.module.ModuleController;
+import com.android.camera.settings.SettingsManager;
 import com.android.camera.ui.BottomBar;
 import com.android.camera.ui.CaptureAnimationOverlay;
 import com.android.camera.ui.MainActivityLayout;
@@ -44,6 +48,7 @@
 import com.android.camera.ui.PreviewStatusListener;
 import com.android.camera.util.ApiHelper;
 import com.android.camera.util.CameraUtil;
+import com.android.camera.util.PhotoSphereHelper;
 import com.android.camera.widget.FilmstripLayout;
 import com.android.camera.widget.IndicatorIconController;
 import com.android.camera.widget.IndicatorOverlay;
@@ -171,6 +176,185 @@
         }
     }
 
+    /**
+     * BottomBarUISpec provides a structure for modules
+     * to specify their ideal bottom bar mode options layout.
+     *
+     * Once constructed by a module, this class should be
+     * treated as read only.
+     *
+     * The application then edits this spec according to
+     * hardware limitations and displays the final bottom
+     * bar ui.
+     */
+    public static class BottomBarUISpec {
+        /** Mode options UI */
+
+        /**
+         * Set true if the camera option should be enabled.
+         * If not set or false, and multiple cameras are supported,
+         * the camera option will be disabled.
+         *
+         * If multiple cameras are not supported, this preference
+         * is ignored and the camera option will not be visible.
+         */
+        public boolean enableCamera;
+
+        /**
+         * Set true if the photo flash option should be enabled.
+         * If not set or false, the photo flash option will be
+         * disabled.
+         *
+         * If the hardware does not support multiple flash values,
+         * this preference is ignored and the flash option will
+         * be disabled.  It will not be made invisible in order to
+         * preserve a consistent experience across devices and between
+         * front and back cameras.
+         */
+        public boolean enableFlash;
+
+        /**
+         * Set true if the video flash option should be enabled.
+         * Same disable rules apply as the photo flash option.
+         */
+        public boolean enableTorchFlash;
+
+        /**
+         * Set true if the hdr/hdr+ option should be enabled.
+         * If not set or false, the hdr/hdr+ option will be disabled.
+         *
+         * Hdr or hdr+ will be chosen based on hardware limitations,
+         * with hdr+ prefered.
+         *
+         * If hardware supports neither hdr nor hdr+, then the hdr/hdr+
+         * will not be visible.
+         */
+        public boolean enableHdr;
+
+        /**
+         * Set true if hdr/hdr+ should not be visible, regardless of
+         * hardware limitations.
+         */
+        public boolean hideHdr;
+
+        /**
+         * Set true if the refocus option should be enabled.
+         * If not set or false, the refocus option will be disabled.
+         *
+         * This option is not constrained by hardware limitations.
+         */
+        public boolean enableRefocus;
+
+        /**
+         * Set true if refocus should not be visible.
+         */
+        public boolean hideRefocus;
+
+        /**
+         * Set true if the panorama horizontal option should be visible.
+         *
+         * This option is not constrained by hardware limitations.
+         */
+        public boolean enablePanoHorizontal;
+
+        /**
+         * Set true if the panorama vertical option should be visible.
+         *
+         * This option is not constrained by hardware limitations.
+         */
+        public boolean enablePanoVertical;
+
+        /** Intent UI */
+
+        /**
+         * Set true if the intent ui cancel option should be visible.
+         */
+        public boolean showCancel;
+        /**
+         * Set true if the intent ui done option should be visible.
+         */
+        public boolean showDone;
+        /**
+         * Set true if the intent ui retake option should be visible.
+         */
+        public boolean showRetake;
+        /**
+         * Set true if the intent ui review option should be visible.
+         */
+        public boolean showReview;
+
+        /** Mode options callbacks */
+
+        /**
+         * A {@link android.com.android.camera.ButtonManager.ButtonCallback}
+         * that will be executed when the camera option is pressed. This
+         * callback can be null.
+         */
+        public ButtonManager.ButtonCallback cameraCallback;
+
+        /**
+         * A {@link android.com.android.camera.ButtonManager.ButtonCallback}
+         * that will be executed when the flash option is pressed. This
+         * callback can be null.
+         */
+        public ButtonManager.ButtonCallback flashCallback;
+
+        /**
+         * A {@link android.com.android.camera.ButtonManager.ButtonCallback}
+         * that will be executed when the hdr/hdr+ option is pressed. This
+         * callback can be null.
+         */
+        public ButtonManager.ButtonCallback hdrCallback;
+
+        /**
+         * A {@link android.com.android.camera.ButtonManager.ButtonCallback}
+         * that will be executed when the refocus option is pressed. This
+         * callback can be null.
+         */
+        public ButtonManager.ButtonCallback refocusCallback;
+
+        /**
+         * A {@link android.view.View.OnClickListener} that will execute
+         * when the panorama horizontal option is pressed.
+         * This callback can be null.
+         */
+        public View.OnClickListener panoHorizontalCallback;
+
+        /**
+         * A {@link android.view.View.OnClickListener} that will execute
+         * when the panorama vertical option is pressed.
+         * This callback can be null.
+         */
+        public View.OnClickListener panoVerticalCallback;
+
+        /** Intent UI callbacks */
+
+        /**
+         * A {@link android.view.View.OnClickListener} that will execute
+         * when the cancel option is pressed. This callback can be null.
+         */
+        public View.OnClickListener cancelCallback;
+
+        /**
+         * A {@link android.view.View.OnClickListener} that will execute
+         * when the done option is pressed. This callback can be null.
+         */
+        public View.OnClickListener doneCallback;
+
+        /**
+         * A {@link android.view.View.OnClickListener} that will execute
+         * when the retake option is pressed. This callback can be null.
+         */
+        public View.OnClickListener retakeCallback;
+
+        /**
+         * A {@link android.view.View.OnClickListener} that will execute
+         * when the review option is pressed. This callback can be null.
+         */
+        public View.OnClickListener reviewCallback;
+    }
+
+
     private final static String TAG = "CameraAppUI";
 
     private final AppController mController;
@@ -594,6 +778,12 @@
      * specific changes that depend on the camera or camera settings.
      */
     public void onChangeCamera() {
+        ModuleController moduleController = mController.getCurrentModuleController();
+        if (moduleController.isUsingBottomBar()) {
+            applyModuleSpecs(moduleController.getHardwareSpec(),
+                moduleController.getBottomBarSpec());
+        }
+
         if (mIndicatorIconController != null) {
             // Sync the settings state with the indicator state.
             mIndicatorIconController.syncIndicators();
@@ -840,6 +1030,7 @@
         mBottomBar.setBackgroundPressedColor(colorId);
     }
 
+    // TODO: refactor this out so it can controlled by the app.
     /**
      * Sets the shutter button icon on the bottom bar
      */
@@ -881,13 +1072,137 @@
      * Performs a transition to the global intent layout.
      */
     public void transitionToIntentLayout() {
-        mBottomBar.transitionToIntentLayout();
+        ModuleController moduleController = mController.getCurrentModuleController();
+        if (moduleController.isUsingBottomBar()) {
+            applyModuleSpecs(moduleController.getHardwareSpec(),
+                moduleController.getBottomBarSpec());
+            mBottomBar.transitionToIntentLayout();
+        }
     }
 
     /**
      * Performs a transition to the global intent review layout.
      */
     public void transitionToIntentReviewLayout() {
-        mBottomBar.transitionToIntentReviewLayout();
+        ModuleController moduleController = mController.getCurrentModuleController();
+        if (moduleController.isUsingBottomBar()) {
+            applyModuleSpecs(moduleController.getHardwareSpec(),
+                moduleController.getBottomBarSpec());
+            mBottomBar.transitionToIntentReviewLayout();
+        }
+    }
+
+    /**
+     * Applies a {@link com.android.camera.CameraAppUI.BottomBarUISpec}
+     * to the bottom bar mode options based on limitations from a
+     * {@link com.android.camera.hardware.HardwareSpec}.
+     *
+     * Options not supported by the hardware are either hidden
+     * or disabled, depending on the option.
+     *
+     * Otherwise, the option is fully enabled and clickable.
+     */
+    public void applyModuleSpecs(final HardwareSpec hardwareSpec,
+           final BottomBarUISpec bottomBarSpec) {
+        if (hardwareSpec == null) {
+            throw new IllegalArgumentException();
+        }
+        if (bottomBarSpec == null) {
+            throw new IllegalArgumentException();
+        }
+
+        ButtonManager buttonManager = mController.getButtonManager();
+        SettingsManager settingsManager = mController.getSettingsManager();
+
+        /** Standard mode options */
+        if (hardwareSpec.isFrontCameraSupported()) {
+            if (bottomBarSpec.enableCamera) {
+                buttonManager.enableButton(ButtonManager.BUTTON_CAMERA,
+                    bottomBarSpec.cameraCallback);
+            } else {
+                buttonManager.disableButton(ButtonManager.BUTTON_CAMERA);
+            }
+        } else {
+            // Hide camera icon if front camera not available.
+            buttonManager.hideButton(ButtonManager.BUTTON_CAMERA);
+        }
+
+        if (hardwareSpec.isFlashSupported()) {
+            if (bottomBarSpec.enableFlash && settingsManager.isCameraBackFacing()) {
+                buttonManager.enableButton(ButtonManager.BUTTON_FLASH, bottomBarSpec.flashCallback);
+            } else if (bottomBarSpec.enableTorchFlash && settingsManager.isCameraBackFacing()) {
+                buttonManager.enableButton(ButtonManager.BUTTON_TORCH, bottomBarSpec.flashCallback);
+            } else {
+                buttonManager.disableButton(ButtonManager.BUTTON_FLASH);
+            }
+        } else {
+            // Disable flash icon if not supported by the hardware.
+            buttonManager.disableButton(ButtonManager.BUTTON_FLASH);
+        }
+
+        if (bottomBarSpec.hideHdr) {
+            // Force hide hdr or hdr plus icon.
+            buttonManager.hideButton(ButtonManager.BUTTON_HDRPLUS);
+        } else {
+            if (hardwareSpec.isHdrPlusSupported()) {
+                if (bottomBarSpec.enableHdr && settingsManager.isCameraBackFacing()) {
+                    buttonManager.enableButton(ButtonManager.BUTTON_HDRPLUS,
+                        bottomBarSpec.hdrCallback);
+                } else {
+                    buttonManager.disableButton(ButtonManager.BUTTON_HDRPLUS);
+                }
+            } else if (hardwareSpec.isHdrSupported()) {
+                if (bottomBarSpec.enableHdr && settingsManager.isCameraBackFacing()) {
+                    buttonManager.enableButton(ButtonManager.BUTTON_HDR,
+                        bottomBarSpec.hdrCallback);
+                } else {
+                    buttonManager.disableButton(ButtonManager.BUTTON_HDR);
+                }
+            } else {
+                // Hide hdr plus or hdr icon if neither are supported.
+                buttonManager.hideButton(ButtonManager.BUTTON_HDRPLUS);
+            }
+        }
+
+        if (bottomBarSpec.hideRefocus) {
+            buttonManager.hideButton(ButtonManager.BUTTON_REFOCUS);
+        } else {
+            if (bottomBarSpec.enableRefocus) {
+                buttonManager.enableButton(ButtonManager.BUTTON_REFOCUS,
+                    bottomBarSpec.refocusCallback);
+            } else {
+                // Disable refocus icon when not enabled, not dependent
+                // on hardware spec.
+                buttonManager.disableButton(ButtonManager.BUTTON_REFOCUS);
+            }
+        }
+
+        if (bottomBarSpec.enablePanoHorizontal
+                && PhotoSphereHelper.getPanoramaHorizontalDrawableId() > 0) {
+            buttonManager.enablePushButton(ButtonManager.BUTTON_PANO_HORIZONTAL,
+                bottomBarSpec.panoHorizontalCallback,
+                PhotoSphereHelper.getPanoramaHorizontalDrawableId());
+        }
+
+        if (bottomBarSpec.enablePanoVertical
+                && PhotoSphereHelper.getPanoramaVerticalDrawableId() > 0) {
+            buttonManager.enablePushButton(ButtonManager.BUTTON_PANO_VERTICAL,
+                bottomBarSpec.panoVerticalCallback,
+                PhotoSphereHelper.getPanoramaVerticalDrawableId());
+        }
+
+        /** Intent UI */
+        if (bottomBarSpec.showCancel) {
+            buttonManager.enablePushButton(ButtonManager.BUTTON_CANCEL,
+                bottomBarSpec.cancelCallback);
+        }
+        if (bottomBarSpec.showDone) {
+            buttonManager.enablePushButton(ButtonManager.BUTTON_DONE,
+                bottomBarSpec.doneCallback);
+        }
+        if (bottomBarSpec.showRetake) {
+            buttonManager.enablePushButton(ButtonManager.BUTTON_RETAKE,
+                bottomBarSpec.retakeCallback);
+        }
     }
 }
diff --git a/src/com/android/camera/app/FilmstripBottomControls.java b/src/com/android/camera/app/FilmstripBottomControls.java
index 400139a..2c09592 100644
--- a/src/com/android/camera/app/FilmstripBottomControls.java
+++ b/src/com/android/camera/app/FilmstripBottomControls.java
@@ -32,12 +32,15 @@
     private ViewGroup mLayout;
     private ImageButton mEditButton;
     private ImageButton mViewButton;
+    private View  mViewerWrapperLayout;
     private ImageButton mTinyPlanetButton;
     private ImageButton mDeleteButton;
     private ImageButton mShareButton;
+    private View mMiddleFiller;
 
     public FilmstripBottomControls(ViewGroup bottomControlsLayout) {
         mLayout = bottomControlsLayout;
+        mMiddleFiller = mLayout.findViewById(R.id.filmstrip_bottom_control_middle_filler);
         setupEditButton();
         setupViewButton();
         setupTinyPlanetButton();
@@ -61,7 +64,8 @@
 
     @Override
     public void setEditButtonVisibility(boolean visible) {
-        setVisibility(mEditButton, visible);
+        mEditButton.setVisibility(visible ? View.VISIBLE : View.GONE);
+        updateMiddleFillerLayoutVisibility();
     }
 
     @Override
@@ -72,12 +76,12 @@
     @Override
     public void setViewerButtonVisibility(int state) {
         if (state == VIEWER_NONE) {
-            setVisibility(mViewButton, false);
-            return;
+            mViewButton.setVisibility(View.GONE);
+        } else {
+            mViewButton.setImageResource(getViewButtonResource(state));
+            mViewButton.setVisibility(View.VISIBLE);
         }
-        mViewButton.setImageResource(getViewButtonResource(state));
-        setVisibility(mViewButton, true);
-
+        updateMiddleFillerLayoutVisibility();
     }
 
     @Override
@@ -87,7 +91,8 @@
 
     @Override
     public void setTinyPlanetButtonVisibility(final boolean visible) {
-        setVisibility(mTinyPlanetButton, visible);
+        mTinyPlanetButton.setVisibility(visible ? View.VISIBLE : View.GONE);
+        updateMiddleFillerLayoutVisibility();
     }
 
     @Override
@@ -97,7 +102,7 @@
 
     @Override
     public void setDeleteButtonVisibility(boolean visible) {
-        setVisibility(mDeleteButton, visible);
+        mDeleteButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
     }
 
     @Override
@@ -107,7 +112,7 @@
 
     @Override
     public void setShareButtonVisibility(boolean visible) {
-        setVisibility(mShareButton, visible);
+        mShareButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
     }
 
     @Override
@@ -115,13 +120,6 @@
         mShareButton.setEnabled(enabled);
     }
 
-    /**
-     * Sets the visibility of the given view.
-     */
-    private static void setVisibility(final View view, final boolean visible) {
-        view.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
-    }
-
     private int getViewButtonResource(int state) {
         switch (state) {
             case VIEWER_REFOCUS:
@@ -146,6 +144,7 @@
     }
 
     private void setupViewButton() {
+        mViewerWrapperLayout = mLayout.findViewById(R.id.filmstrip_bottom_control_viewer_wrapper);
         mViewButton = (ImageButton) mLayout.findViewById(R.id.filmstrip_bottom_control_view);
         mViewButton.setOnClickListener(new View.OnClickListener() {
             @Override
@@ -193,4 +192,28 @@
             }
         });
     }
+
+    /**
+     * Updates the visibility of the middle filler view in the center and the
+     * visibility of wrapper layout of viewer buttons and the tinyplanet button.
+     * The middle filler view should be visible when edit button and viewer
+     * buttons are both visible. The wrapper layout of viewer buttons and
+     * tinyplanet should be gone if no viewer button is shown and the
+     * tinyplanet button is invisible.
+     */
+    private void updateMiddleFillerLayoutVisibility() {
+        if (mViewButton.getVisibility() == View.VISIBLE ||
+                mTinyPlanetButton.getVisibility() == View.VISIBLE) {
+            mViewerWrapperLayout.setVisibility(View.VISIBLE);
+        } else {
+            mViewerWrapperLayout.setVisibility(View.GONE);
+        }
+
+        if (mEditButton.getVisibility() == View.VISIBLE &&
+                mViewerWrapperLayout.getVisibility() == View.VISIBLE) {
+            mMiddleFiller.setVisibility(View.INVISIBLE);
+        } else {
+            mMiddleFiller.setVisibility(View.GONE);
+        }
+    }
 }
diff --git a/src/com/android/camera/hardware/HardwareSpec.java b/src/com/android/camera/hardware/HardwareSpec.java
new file mode 100644
index 0000000..93c1660
--- /dev/null
+++ b/src/com/android/camera/hardware/HardwareSpec.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.hardware;
+
+/**
+ * HardwareSpec is a interface for specifying whether
+ * high-level features are supported by the camera device
+ * hardware limitations.
+ */
+public interface HardwareSpec {
+
+    /**
+     * Returns whether a front facing camera is available
+     * on the current hardware.
+     */
+    public boolean isFrontCameraSupported();
+
+    /**
+     * Returns whether hdr scene mode is supported on the
+     * current hardware.
+     */
+    public boolean isHdrSupported();
+
+    /**
+     * Returns whether hdr plus is supported on the current
+     * hardware.
+     */
+    public boolean isHdrPlusSupported();
+
+    /**
+     * Returns whether flash is supported and has more than
+     * one supported setting.  If flash is supported but is
+     * always off, this method should return false.
+     */
+    public boolean isFlashSupported();
+}
\ No newline at end of file
diff --git a/src/com/android/camera/hardware/HardwareSpecImpl.java b/src/com/android/camera/hardware/HardwareSpecImpl.java
new file mode 100644
index 0000000..180a44e
--- /dev/null
+++ b/src/com/android/camera/hardware/HardwareSpecImpl.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.hardware;
+
+import android.hardware.Camera;
+
+import com.android.camera.util.CameraUtil;
+import com.android.camera.util.GcamHelper;
+
+import java.util.List;
+
+/**
+ * HardwareSpecImpl is the default implementation of
+ * {@link com.android.camera.hardware.HardwareSpec} for
+ * a camera device opened using the {@link android.hardware.Camera}
+ * api.
+ */
+public class HardwareSpecImpl implements HardwareSpec {
+
+    private final boolean mIsFrontCameraSupported;
+    private final boolean mIsHdrSupported;
+    private final boolean mIsHdrPlusSupported;
+    private final boolean mIsFlashSupported;
+
+    /**
+     * Compute the supported values for all
+     * {@link com.android.camera.hardware.HardwareSpec} methods
+     * based on {@link android.hardware.Camera.Parameters}.
+     */
+    public HardwareSpecImpl(Camera.Parameters parameters) {
+        // Cache whether front camera is supported.
+        mIsFrontCameraSupported = (Camera.getNumberOfCameras() > 1);
+
+        // Cache whether hdr is supported.
+        mIsHdrSupported = CameraUtil.isCameraHdrSupported(parameters);
+
+        // Cache whether hdr plus is supported.
+        mIsHdrPlusSupported = GcamHelper.hasGcamCapture();
+
+        // Cache whether flash is supported.
+        mIsFlashSupported = isFlashSupported(parameters);
+    }
+
+    @Override
+    public boolean isFrontCameraSupported() {
+        return mIsFrontCameraSupported;
+    }
+
+    @Override
+    public boolean isHdrSupported() {
+        return mIsHdrSupported;
+    }
+
+    @Override
+    public boolean isHdrPlusSupported() {
+        return mIsHdrPlusSupported;
+    }
+
+    @Override
+    public boolean isFlashSupported() {
+        return mIsFlashSupported;
+    }
+
+    /**
+     * Returns whether flash is supported and flash has more than
+     * one possible value.
+     */
+    private boolean isFlashSupported(Camera.Parameters parameters) {
+        List<String> supportedFlashModes = parameters.getSupportedFlashModes();
+        return !(supportedFlashModes == null || (supportedFlashModes.size() == 1));
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/camera/module/ModuleController.java b/src/com/android/camera/module/ModuleController.java
index a5b3886..e126ad8 100644
--- a/src/com/android/camera/module/ModuleController.java
+++ b/src/com/android/camera/module/ModuleController.java
@@ -20,7 +20,9 @@
 
 import com.android.camera.ButtonManager;
 import com.android.camera.app.AppController;
+import com.android.camera.app.CameraAppUI.BottomBarUISpec;
 import com.android.camera.app.CameraManager;
+import com.android.camera.hardware.HardwareSpec;
 
 /**
  * The controller at app level.
@@ -106,10 +108,18 @@
     public void onCameraAvailable(CameraManager.CameraProxy cameraProxy);
 
     /**
-     * Called when the module needs to customize global buttons according
-     * to its supported feature set.
+     * Returns a {@link com.android.camera.hardware.HardwareSpec}
+     * based on the module's open camera device.
      */
-    public void customizeButtons(ButtonManager buttonManager);
+    public HardwareSpec getHardwareSpec();
+
+    /**
+     * Returns a {@link com.android.camera.app.CameraAppUI.BottomBarUISpec}
+     * which represents the module's ideal bottom bar layout of the
+     * mode options.  The app edits the final layout based on the
+     * {@link com.android.camera.hardware.HardwareSpec}.
+     */
+    public BottomBarUISpec getBottomBarSpec();
 
     /**
      * Used by the app on configuring the bottom bar color and visibility.
diff --git a/src/com/android/camera/module/ModulesInfo.java b/src/com/android/camera/module/ModulesInfo.java
index 5536ea8..1bf50a6 100644
--- a/src/com/android/camera/module/ModulesInfo.java
+++ b/src/com/android/camera/module/ModulesInfo.java
@@ -22,7 +22,6 @@
 import com.android.camera.VideoModule;
 import com.android.camera.app.AppController;
 import com.android.camera.app.ModuleManager;
-import com.android.camera.ui.ModeListView;
 import com.android.camera.util.GcamHelper;
 import com.android.camera.util.PhotoSphereHelper;
 import com.android.camera.util.RefocusHelper;
@@ -168,7 +167,6 @@
 
             @Override
             public ModuleController createModule(AppController app) {
-                // TODO: remove the type casting.
                 return RefocusHelper.createRefocusModule(app);
             }
         });
diff --git a/src/com/android/camera/session/CaptureSessionManager.java b/src/com/android/camera/session/CaptureSessionManager.java
index c9f60fb..52ac483 100644
--- a/src/com/android/camera/session/CaptureSessionManager.java
+++ b/src/com/android/camera/session/CaptureSessionManager.java
@@ -22,6 +22,9 @@
 import com.android.camera.app.MediaSaver.OnMediaSavedListener;
 import com.android.camera.exif.ExifInterface;
 
+import java.io.File;
+import java.io.IOException;
+
 /**
  * Modules use this manager to store capture results.
  */
@@ -109,4 +112,11 @@
      * @return The current progress message.
      */
     public CharSequence getSessionProgressMessage(Uri uri);
+
+    /**
+     * Gets the directory to be used for temporary data.
+     *
+     * See {@link SessionStorageManager#getSessionDirectory(String)}
+     */
+    public File getSessionDirectory(String subDirectory) throws IOException;
 }
diff --git a/src/com/android/camera/session/CaptureSessionManagerImpl.java b/src/com/android/camera/session/CaptureSessionManagerImpl.java
index 1d9dd8f..0bffce3 100644
--- a/src/com/android/camera/session/CaptureSessionManagerImpl.java
+++ b/src/com/android/camera/session/CaptureSessionManagerImpl.java
@@ -28,6 +28,8 @@
 import com.android.camera.data.LocalData;
 import com.android.camera.exif.ExifInterface;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
@@ -182,6 +184,7 @@
     private final MediaSaver mMediaSaver;
     private final ProcessingNotificationManager mNotificationManager;
     private final PlaceholderManager mPlaceholderManager;
+    private final SessionStorageManager mSessionStorageManager;
     private final ContentResolver mContentResolver;
 
     /**
@@ -204,15 +207,18 @@
      *            progress
      * @param placeholderManager used to manage placeholders in the filmstrip
      *            before the final result is ready
+     * @param sessionStorageManager used to tell modules where to store
+     *            temporary session data
      */
     public CaptureSessionManagerImpl(MediaSaver mediaSaver,
             ContentResolver contentResolver, ProcessingNotificationManager notificationManager,
-            PlaceholderManager placeholderManager) {
+            PlaceholderManager placeholderManager, SessionStorageManager sessionStorageManager) {
         mSessions = new HashMap<String, CaptureSession>();
         mMediaSaver = mediaSaver;
         mContentResolver = contentResolver;
         mNotificationManager = notificationManager;
         mPlaceholderManager = placeholderManager;
+        mSessionStorageManager = sessionStorageManager;
     }
 
     @Override
@@ -267,6 +273,11 @@
         return session.getProgressMessage();
     }
 
+    @Override
+    public File getSessionDirectory(String subDirectory) throws IOException {
+      return mSessionStorageManager.getSessionDirectory(subDirectory);
+    }
+
     private void removeSession(String sessionUri) {
         mSessions.remove(sessionUri);
     }
diff --git a/src/com/android/camera/session/SessionStorageManager.java b/src/com/android/camera/session/SessionStorageManager.java
new file mode 100644
index 0000000..8520c1a
--- /dev/null
+++ b/src/com/android/camera/session/SessionStorageManager.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.session;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Interface for the session storage manager which handles management of storage
+ * space that can be used for temporary session files.
+ */
+public interface SessionStorageManager {
+
+    /**
+     * Returns the directory that can be used for temporary sessions of a
+     * specific type, defined by 'subDirectory'.
+     * <p>
+     * Before returning, this method will make sure the returned directory is
+     * clean of expired session data.
+     *
+     * @param subFolder The subfolder to use/create within the temporary session
+     *            space, e.g. "foo".
+     * @return A valid file object that points to an existing directory.
+     * @throws IOException If the directory could not be made available.
+     */
+    public File getSessionDirectory(String subDirectory) throws IOException;
+}
diff --git a/src/com/android/camera/session/SessionStorageManagerImpl.java b/src/com/android/camera/session/SessionStorageManagerImpl.java
new file mode 100644
index 0000000..8673036
--- /dev/null
+++ b/src/com/android/camera/session/SessionStorageManagerImpl.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.session;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.android.camera.util.FileUtil;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+
+/**
+ * Default implementation of {@link SessionStorageManager}.
+ */
+public class SessionStorageManagerImpl implements SessionStorageManager {
+    private static final String TAG = "SessionStorageManagerImpl";
+
+    /** Delete temporary session directory remnants after ONE day. */
+    private static final int MAX_SESSION_AGE_MILLIS = 24 * 60 * 60 * 1000;
+
+    /** The base directory for all temporary data. */
+    private final File mBaseDirectory;
+
+    /**
+     * Creates a new {@link SessionStorageManager} instance.
+     *
+     * @param context A valid Android context to be used for determining the
+     *            base directory.
+     * @return A session storage manager.
+     */
+    public static SessionStorageManager create(Context context) {
+        return new SessionStorageManagerImpl(context.getExternalFilesDir(null));
+    }
+
+    SessionStorageManagerImpl(File baseDirectory) {
+        mBaseDirectory = baseDirectory;
+    }
+
+    @Override
+    public File getSessionDirectory(String subDirectory) throws IOException {
+        File sessionDirectory = new File(mBaseDirectory, subDirectory);
+        if (!sessionDirectory.exists() && !sessionDirectory.mkdirs()) {
+            throw new IOException("Could not create session directory: " + sessionDirectory);
+        }
+
+        if (!sessionDirectory.isDirectory()) {
+            throw new IOException("Session directory is not a directory: " + sessionDirectory);
+        }
+
+        // Make sure there are no expired sessions in this directory.
+        cleanUpExpiredSessions(sessionDirectory);
+        return sessionDirectory;
+    }
+
+    /**
+     * Goes through all temporary sessions and deletes the ones that are older
+     * than a certain age.
+     */
+    private void cleanUpExpiredSessions(File baseDirectory) {
+        File[] sessionDirs = baseDirectory.listFiles(new FileFilter() {
+            @Override
+            public boolean accept(File file) {
+                return file.isDirectory();
+            }
+        });
+
+        final long nowInMillis = System.currentTimeMillis();
+        for (File sessionDir : sessionDirs) {
+            if (sessionDir.lastModified() < (nowInMillis - MAX_SESSION_AGE_MILLIS)) {
+                if (!FileUtil.deleteDirectoryRecursively(sessionDir)) {
+                    Log.w(TAG, "Could not clean up " + sessionDir.getAbsolutePath());
+                }
+            }
+        }
+    }
+}
diff --git a/src/com/android/camera/settings/SettingsCache.java b/src/com/android/camera/settings/SettingsCache.java
index 5b4653b..c6d31e0 100644
--- a/src/com/android/camera/settings/SettingsCache.java
+++ b/src/com/android/camera/settings/SettingsCache.java
@@ -125,6 +125,8 @@
                 SettingsManager.SETTING_SHIMMY_REMAINING_PLAY_TIMES_INDEX);
         mKeyMap.put(SettingsManager.KEY_CAMERA_MODULE_LAST_USED,
                 SettingsManager.SETTING_KEY_CAMERA_MODULE_LAST_USED_INDEX);
+        mKeyMap.put(SettingsManager.KEY_CAMERA_PANO_ORIENTATION,
+                SettingsManager.SETTING_CAMERA_PANO_ORIENTATION);
     }
 
     /**
@@ -201,6 +203,8 @@
             return SettingsManager.getShimmyRemainingTimesSetting(mContext);
         case SettingsManager.SETTING_KEY_CAMERA_MODULE_LAST_USED_INDEX:
             return SettingsManager.getLastUsedCameraModule(mContext);
+        case SettingsManager.SETTING_CAMERA_PANO_ORIENTATION:
+            return SettingsManager.getPanoOrientationSetting(mContext);
         default:
             return mExtraSettings.settingFromId(id);
         }
diff --git a/src/com/android/camera/settings/SettingsManager.java b/src/com/android/camera/settings/SettingsManager.java
index 9251f62..256955c 100644
--- a/src/com/android/camera/settings/SettingsManager.java
+++ b/src/com/android/camera/settings/SettingsManager.java
@@ -21,6 +21,7 @@
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.hardware.Camera.Size;
 import android.preference.PreferenceManager;
+import android.util.Log;
 import android.util.SparseArray;
 
 import com.android.camera.ListPreference;
@@ -132,6 +133,8 @@
                     Integer settingId = mSettingsCache.getId(key);
                     if (settingId != null) {
                         listener.onSettingChanged(SettingsManager.this, settingId);
+                    } else {
+                        Log.w(TAG, "Setting id from key=" + key + " is null");
                     }
                 }
             };
@@ -306,6 +309,7 @@
     public static final int SETTING_CAMERA_REFOCUS = 20;
     public static final int SETTING_SHIMMY_REMAINING_PLAY_TIMES_INDEX = 21;
     public static final int SETTING_KEY_CAMERA_MODULE_LAST_USED_INDEX = 22;
+    public static final int SETTING_CAMERA_PANO_ORIENTATION = 23;
 
     // Shared preference keys.
     public static final String KEY_RECORD_LOCATION = "pref_camera_recordlocation_key";
@@ -336,6 +340,7 @@
             "pref_shimmy_remaining_play_times";
     public static final String KEY_CAMERA_MODULE_LAST_USED =
             "pref_camera_module_last_used_index";
+    public static final String KEY_CAMERA_PANO_ORIENTATION = "pref_camera_pano_orientation";
 
     public static final int WHITE_BALANCE_DEFAULT_INDEX = 2;
 
@@ -804,6 +809,14 @@
             KEY_CAMERA_REFOCUS, values, FLUSH_OFF);
     }
 
+    public static Setting getPanoOrientationSetting(Context context) {
+        String defaultValue = context.getString(R.string.pano_orientation_horizontal);
+        String[] values = context.getResources().getStringArray(
+            R.array.pref_camera_pano_orientation_entryvalues);
+        return new Setting(SOURCE_GLOBAL, TYPE_STRING, defaultValue,
+            KEY_CAMERA_PANO_ORIENTATION, values, FLUSH_OFF);
+    }
+
     // Utilities.
 
     /**
diff --git a/src/com/android/camera/ui/BottomBar.java b/src/com/android/camera/ui/BottomBar.java
index 4e41bb2..3ee8b73 100644
--- a/src/com/android/camera/ui/BottomBar.java
+++ b/src/com/android/camera/ui/BottomBar.java
@@ -121,6 +121,9 @@
     private void setPaintColor(int alpha, int color, boolean isCaptureChange) {
         int computedColor = (alpha << 24) | (color & 0x00ffffff);
         mCirclePaint.setColor(computedColor);
+        if (mOptionsToggle == null) {
+            mOptionsToggle = (ToggleImageButton) findViewById(R.id.bottombar_options_toggle);
+        }
         if (!isCaptureChange) {
             mOptionsToggle.setBackgroundColor(computedColor);
         }
@@ -251,9 +254,13 @@
      * Perform a transition from the bottom bar options layout to the
      * bottom bar capture layout.
      */
-    private void transitionToCapture() {
+    public void transitionToCapture() {
+        mOptionsOverlay.setVisibility(View.VISIBLE);
         mOptionsLayout.setVisibility(View.INVISIBLE);
         mCaptureLayout.setVisibility(View.VISIBLE);
+        if (mMode == MODE_INTENT || mMode == MODE_INTENT_REVIEW) {
+            mIntentLayout.setVisibility(View.INVISIBLE);
+        }
 
         mMode = MODE_CAPTURE;
     }
@@ -262,7 +269,7 @@
      * Perform a transition from the bottom bar capture layout to the
      * bottom bar options layout.
      */
-    private void transitionToOptions() {
+    public void transitionToOptions() {
         mCaptureLayout.setVisibility(View.INVISIBLE);
         mOptionsLayout.setVisibility(View.VISIBLE);
 
diff --git a/src/com/android/camera/ui/FocusOverlay.java b/src/com/android/camera/ui/FocusOverlay.java
index 9bf0ea9..1b5dcef 100644
--- a/src/com/android/camera/ui/FocusOverlay.java
+++ b/src/com/android/camera/ui/FocusOverlay.java
@@ -43,7 +43,7 @@
     private int mPositionY;
     private int mAngle;
     // TODO: make this dp in dimens.xml when UI has a spec
-    private int mFocusIndicatorSize = 200;
+    private final int mFocusIndicatorSize = 200;
     private boolean mShowIndicator;
 
     public FocusOverlay(Context context, AttributeSet attrs) {
@@ -87,14 +87,14 @@
     }
 
     @Override
-    public void onFocusSucceeded(boolean timeOut) {
+    public void onFocusSucceeded() {
         mFocusAnimation.cancel();
         mShowIndicator = false;
         invalidate();
     }
 
     @Override
-    public void onFocusFailed(boolean timeOut) {
+    public void onFocusFailed() {
         mFocusAnimation.cancel();
         mShowIndicator = false;
         invalidate();
@@ -110,6 +110,7 @@
         // TODO: Add face detection support.
     }
 
+    @Override
     public void onDraw(Canvas canvas) {
         super.onDraw(canvas);
 
diff --git a/src/com/android/camera/ui/ModeListView.java b/src/com/android/camera/ui/ModeListView.java
index fd500c3..d7386b9 100644
--- a/src/com/android/camera/ui/ModeListView.java
+++ b/src/com/android/camera/ui/ModeListView.java
@@ -244,7 +244,7 @@
             int index = getFocusItem(ev.getX(), ev.getY());
             // Validate the selection
             if (index != NO_ITEM_SELECTED) {
-                int modeId = getModeIndex(index);
+                final int modeId = getModeIndex(index);
                 mModeSelectorItems[index].highlight();
                 mState = MODE_SELECTED;
                 PeepholeAnimationEffect effect = new PeepholeAnimationEffect();
@@ -260,7 +260,15 @@
                 effect.setAnimationStartingPosition((int) ev.getX(), (int) ev.getY());
                 mCurrentEffect = effect;
 
-                onModeSelected(modeId);
+                // Post mode selection runnable to the end of the message queue
+                // so that current UI changes can finish before mode initialization
+                // clogs up UI thread.
+                post(new Runnable() {
+                    @Override
+                    public void run() {
+                        onModeSelected(modeId);
+                    }
+                });
             }
             return true;
         }
diff --git a/src/com/android/camera/util/FileUtil.java b/src/com/android/camera/util/FileUtil.java
new file mode 100644
index 0000000..e1fac89
--- /dev/null
+++ b/src/com/android/camera/util/FileUtil.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.util;
+
+import java.io.File;
+
+/**
+ * Common file operations.
+ */
+public class FileUtil {
+    /**
+     * Deletes the given directory and all it's contents, including
+     * sub-directories.
+     *
+     * @param directory The directory to delete.
+     * @return Whether The deletion was a success.
+     */
+    public static boolean deleteDirectoryRecursively(File directory) {
+        if (!directory.exists() || !directory.isDirectory()) {
+            return false;
+        }
+
+        for (File entry : directory.listFiles()) {
+            if (entry.isDirectory()) {
+                deleteDirectoryRecursively(entry);
+            }
+            if (!entry.delete()) {
+                return false;
+            }
+        }
+        return directory.delete();
+    }
+}
diff --git a/src/com/android/camera/widget/IndicatorIconController.java b/src/com/android/camera/widget/IndicatorIconController.java
index 3cd2d07..7d9284d 100644
--- a/src/com/android/camera/widget/IndicatorIconController.java
+++ b/src/com/android/camera/widget/IndicatorIconController.java
@@ -29,6 +29,7 @@
 import com.android.camera.app.AppController;
 import com.android.camera.module.ModulesInfo;
 import com.android.camera.settings.SettingsManager;
+import com.android.camera.util.PhotoSphereHelper;
 
 import com.android.camera2.R;
 
@@ -48,11 +49,14 @@
     private ImageView mFlashIndicator;
     private ImageView mHdrIndicator;
     private ImageView mRefocusIndicator;
+    private ImageView mPanoramaIndicator;
 
     private TypedArray mFlashIndicatorPhotoIcons;
     private TypedArray mFlashIndicatorVideoIcons;
+    private TypedArray mHdrPlusIndicatorIcons;
     private TypedArray mHdrIndicatorIcons;
     private TypedArray mRefocusIndicatorIcons;
+    private TypedArray mPanoramaIndicatorIcons;
 
     private AppController mController;
 
@@ -63,15 +67,22 @@
         mFlashIndicator = (ImageView) root.findViewById(R.id.flash_indicator);
         mHdrIndicator = (ImageView) root.findViewById(R.id.hdr_indicator);
         mRefocusIndicator = (ImageView) root.findViewById(R.id.refocus_indicator);
+        mPanoramaIndicator = (ImageView) root.findViewById(R.id.panorama_indicator);
 
         mFlashIndicatorPhotoIcons = context.getResources().obtainTypedArray(
             R.array.camera_flashmode_indicator_icons);
         mFlashIndicatorVideoIcons = context.getResources().obtainTypedArray(
             R.array.video_flashmode_indicator_icons);
-        mHdrIndicatorIcons = context.getResources().obtainTypedArray(
+        mHdrPlusIndicatorIcons = context.getResources().obtainTypedArray(
             R.array.pref_camera_hdr_plus_indicator_icons);
+        mHdrIndicatorIcons = context.getResources().obtainTypedArray(
+            R.array.pref_camera_hdr_indicator_icons);
         mRefocusIndicatorIcons = context.getResources().obtainTypedArray(
             R.array.refocus_indicator_icons);
+        if (PhotoSphereHelper.getPanoramaIndicatorArrayId() > 0) {
+            mPanoramaIndicatorIcons = context.getResources().obtainTypedArray(
+                PhotoSphereHelper.getPanoramaIndicatorArrayId());
+        }
     }
 
     @Override
@@ -102,13 +113,25 @@
                 syncHdrIndicator();
                 break;
             }
+            case ButtonManager.BUTTON_HDR: {
+                syncHdrIndicator();
+                break;
+            }
             case ButtonManager.BUTTON_REFOCUS: {
                 syncRefocusIndicator();
                 break;
             }
-        default:
-            // Do nothing.  The indicator doesn't care
-            // about button that don't correspond to indicators.
+            case ButtonManager.BUTTON_PANO_HORIZONTAL: {
+                syncPanoramaIndicator();
+                break;
+            }
+            case ButtonManager.BUTTON_PANO_VERTICAL: {
+                syncPanoramaIndicator();
+                break;
+            }
+            default:
+                // Do nothing.  The indicator doesn't care
+                // about button that don't correspond to indicators.
         }
     }
 
@@ -120,6 +143,7 @@
         syncFlashIndicator();
         syncHdrIndicator();
         syncRefocusIndicator();
+        syncPanoramaIndicator();
     }
 
     /**
@@ -137,11 +161,11 @@
                     .getInteger(R.integer.camera_mode_video)) {
                 setIndicatorState(mController.getSettingsManager(),
                                   SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE,
-                                  mFlashIndicator, mFlashIndicatorVideoIcons);
+                                  mFlashIndicator, mFlashIndicatorVideoIcons, false);
             } else {
                 setIndicatorState(mController.getSettingsManager(),
                                   SettingsManager.SETTING_FLASH_MODE,
-                                  mFlashIndicator, mFlashIndicatorPhotoIcons);
+                                  mFlashIndicator, mFlashIndicatorPhotoIcons, false);
             }
         } else {
             mFlashIndicator.setVisibility(View.GONE);
@@ -149,7 +173,7 @@
     }
 
     /**
-     * Sync the icon and the visibility of the hdr indicator.
+     * Sync the icon and the visibility of the hdr/hdrplus indicator.
      */
     private void syncHdrIndicator() {
         ButtonManager buttonManager = mController.getButtonManager();
@@ -159,7 +183,12 @@
                 && buttonManager.isVisible(ButtonManager.BUTTON_HDRPLUS)) {
             setIndicatorState(mController.getSettingsManager(),
                               SettingsManager.SETTING_CAMERA_HDR,
-                              mHdrIndicator, mHdrIndicatorIcons);
+                              mHdrIndicator, mHdrPlusIndicatorIcons, false);
+        } else if (buttonManager.isEnabled(ButtonManager.BUTTON_HDR)
+                && buttonManager.isVisible(ButtonManager.BUTTON_HDR)) {
+            setIndicatorState(mController.getSettingsManager(),
+                              SettingsManager.SETTING_CAMERA_HDR,
+                              mHdrIndicator, mHdrIndicatorIcons, false);
         } else {
             mHdrIndicator.setVisibility(View.GONE);
         }
@@ -176,18 +205,38 @@
                 && buttonManager.isVisible(ButtonManager.BUTTON_REFOCUS)) {
             setIndicatorState(mController.getSettingsManager(),
                               SettingsManager.SETTING_CAMERA_REFOCUS,
-                              mRefocusIndicator, mRefocusIndicatorIcons);
+                              mRefocusIndicator, mRefocusIndicatorIcons, false);
         } else {
             mRefocusIndicator.setVisibility(View.GONE);
         }
     }
 
     /**
+     * Sync the icon and the visibility of the panorama indicator.
+     */
+    private void syncPanoramaIndicator() {
+        ButtonManager buttonManager = mController.getButtonManager();
+        // If refocus isn't an enabled and visible option,
+        // do not show the indicator.
+        boolean panoEnabled = (buttonManager.isEnabled(ButtonManager.BUTTON_PANO_HORIZONTAL)
+            && buttonManager.isEnabled(ButtonManager.BUTTON_PANO_VERTICAL));
+        boolean panoVisible = (buttonManager.isVisible(ButtonManager.BUTTON_PANO_HORIZONTAL)
+            && buttonManager.isVisible(ButtonManager.BUTTON_PANO_VERTICAL));
+        if (panoEnabled && panoVisible && mPanoramaIndicatorIcons != null) {
+            setIndicatorState(mController.getSettingsManager(),
+                              SettingsManager.SETTING_CAMERA_PANO_ORIENTATION,
+                              mPanoramaIndicator, mPanoramaIndicatorIcons, true);
+        } else {
+            mPanoramaIndicator.setVisibility(View.GONE);
+        }
+    }
+
+    /**
      * Sets the image resource and visibility of the indicator
      * based on the indicator's corresponding setting state.
      */
     private void setIndicatorState(SettingsManager settingsManager, int id,
-            ImageView imageView, TypedArray iconArray) {
+            ImageView imageView, TypedArray iconArray, boolean showDefault) {
 
         // Set the correct image src.
         String value = settingsManager.get(id);
@@ -207,7 +256,7 @@
         imageView.setImageDrawable(drawable);
 
         // Set the indicator visible if not in default state.
-        if (settingsManager.isDefault(id)) {
+        if (!showDefault && settingsManager.isDefault(id)) {
             imageView.setVisibility(View.GONE);
         } else {
             imageView.setVisibility(View.VISIBLE);
@@ -218,15 +267,23 @@
     public void onSettingChanged(SettingsManager settingsManager, int id) {
         switch (id) {
             case SettingsManager.SETTING_FLASH_MODE: {
-                setIndicatorState(settingsManager, id, mFlashIndicator, mFlashIndicatorPhotoIcons);
+                syncFlashIndicator();
                 break;
             }
             case SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE: {
-                setIndicatorState(settingsManager, id, mFlashIndicator, mFlashIndicatorVideoIcons);
+                syncFlashIndicator();
                 break;
             }
             case SettingsManager.SETTING_CAMERA_HDR: {
-                setIndicatorState(settingsManager, id, mHdrIndicator, mHdrIndicatorIcons);
+                syncHdrIndicator();
+                break;
+            }
+            case SettingsManager.SETTING_CAMERA_REFOCUS: {
+                syncRefocusIndicator();
+                break;
+            }
+            case SettingsManager.SETTING_CAMERA_PANO_ORIENTATION: {
+                syncPanoramaIndicator();
                 break;
             }
             default: {
diff --git a/src/com/android/camera/widget/IndicatorOverlay.java b/src/com/android/camera/widget/IndicatorOverlay.java
index 29f591e..703c8f3 100644
--- a/src/com/android/camera/widget/IndicatorOverlay.java
+++ b/src/com/android/camera/widget/IndicatorOverlay.java
@@ -21,6 +21,7 @@
 import android.graphics.RectF;
 import android.util.AttributeSet;
 import android.view.Gravity;
+import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
@@ -47,6 +48,34 @@
 
     private LinearLayout mIndicatorOverlayIcons;
 
+    /**
+     * A listener for setting a {@link android.view.ViewGroup} invisible
+     * once all of its children are gone.
+     *
+     * This is necessary if the group has a background with a minimum height
+     * and width greater than zero. Otherwise, the background would show
+     * despite an empty group.
+     */
+    private View.OnLayoutChangeListener mLayoutChangeListener =
+        new View.OnLayoutChangeListener() {
+            @Override
+            public void onLayoutChange(View v, int left, int top, int right, int bottom,
+                                       int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                ViewGroup group = (ViewGroup) v;
+                if (group.getChildCount() > 0) {
+                    int visibility = View.INVISIBLE;
+                    for (int i = 0; i < group.getChildCount(); i++) {
+                        View child = group.getChildAt(i);
+                        if (child != null && child.getVisibility() != View.GONE) {
+                            visibility = View.VISIBLE;
+                            break;
+                        }
+                    }
+                    v.setVisibility(visibility);
+                }
+            }
+        };
+
     public IndicatorOverlay(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
@@ -54,6 +83,7 @@
     @Override
     public void onFinishInflate() {
         mIndicatorOverlayIcons = (LinearLayout) findViewById(R.id.indicator_overlay_icons);
+        mIndicatorOverlayIcons.addOnLayoutChangeListener(mLayoutChangeListener);
         Configuration configuration = getContext().getResources().getConfiguration();
         checkOrientation(configuration.orientation);
     }
diff --git a/src_pd/com/android/camera/util/PhotoSphereHelper.java b/src_pd/com/android/camera/util/PhotoSphereHelper.java
index 3b22576..1e04eca 100644
--- a/src_pd/com/android/camera/util/PhotoSphereHelper.java
+++ b/src_pd/com/android/camera/util/PhotoSphereHelper.java
@@ -101,4 +101,25 @@
     public static long getModifiedTimeFromURI(ContentResolver contentResolver, Uri contentUri) {
         return 0;
     }
+
+    /**
+     * Get the resource id of the panorama horizontal icon.
+     */
+    public static int getPanoramaHorizontalDrawableId() {
+        return 0;
+    }
+
+    /**
+     * Get the resource id of the panorama vertical icon.
+     */
+    public static int getPanoramaVerticalDrawableId() {
+        return 0;
+    }
+
+    /**
+     * Get the resource id of the panorama indicator icon array.
+     */
+    public static int getPanoramaIndicatorArrayId() {
+        return 0;
+    }
 }