SnapdragonCamera: Show label and dialog when switch to new scene mode

Show label and instructional dialog when switch to new scene mode

Change-Id: I75becaa9bb898ca9ef68c94b1195069131745f14
CRs-Fixed: 1091210
diff --git a/res/drawable-hdpi/ic_scene_mode_black_auto.png b/res/drawable-hdpi/ic_scene_mode_black_auto.png
new file mode 100644
index 0000000..3f68e8e
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_auto.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_backlight.png b/res/drawable-hdpi/ic_scene_mode_black_backlight.png
new file mode 100644
index 0000000..a70502f
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_backlight.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_beach.png b/res/drawable-hdpi/ic_scene_mode_black_beach.png
new file mode 100644
index 0000000..d66a5ff
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_beach.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_best_photo.png b/res/drawable-hdpi/ic_scene_mode_black_best_photo.png
new file mode 100644
index 0000000..5ddd1aa
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_best_photo.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_blur_buster.png b/res/drawable-hdpi/ic_scene_mode_black_blur_buster.png
new file mode 100644
index 0000000..a5b930f
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_blur_buster.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_candlelight.png b/res/drawable-hdpi/ic_scene_mode_black_candlelight.png
new file mode 100644
index 0000000..cc8606e
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_candlelight.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_chroma_flash.png b/res/drawable-hdpi/ic_scene_mode_black_chroma_flash.png
new file mode 100644
index 0000000..9c8c110
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_chroma_flash.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_dual_camera.png b/res/drawable-hdpi/ic_scene_mode_black_dual_camera.png
new file mode 100644
index 0000000..16b8036
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_dual_camera.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_flowers.png b/res/drawable-hdpi/ic_scene_mode_black_flowers.png
new file mode 100644
index 0000000..527329e
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_flowers.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_hdr.png b/res/drawable-hdpi/ic_scene_mode_black_hdr.png
new file mode 100644
index 0000000..3baa454
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_hdr.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_landscape.png b/res/drawable-hdpi/ic_scene_mode_black_landscape.png
new file mode 100644
index 0000000..45a247e
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_landscape.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_night.png b/res/drawable-hdpi/ic_scene_mode_black_night.png
new file mode 100644
index 0000000..6cf2ce8
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_night.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_optizoom.png b/res/drawable-hdpi/ic_scene_mode_black_optizoom.png
new file mode 100644
index 0000000..3317057
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_optizoom.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_panorama.png b/res/drawable-hdpi/ic_scene_mode_black_panorama.png
new file mode 100644
index 0000000..38c4a1b
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_panorama.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_portrait.png b/res/drawable-hdpi/ic_scene_mode_black_portrait.png
new file mode 100644
index 0000000..564e3da
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_portrait.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_pro_mode.png b/res/drawable-hdpi/ic_scene_mode_black_pro_mode.png
new file mode 100644
index 0000000..bb9cd76
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_pro_mode.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_sharp_photo.png b/res/drawable-hdpi/ic_scene_mode_black_sharp_photo.png
new file mode 100644
index 0000000..a475cc7
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_sharp_photo.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_snow.png b/res/drawable-hdpi/ic_scene_mode_black_snow.png
new file mode 100644
index 0000000..2ac492c
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_snow.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_sports.png b/res/drawable-hdpi/ic_scene_mode_black_sports.png
new file mode 100644
index 0000000..932be98
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_sports.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_sunset.png b/res/drawable-hdpi/ic_scene_mode_black_sunset.png
new file mode 100644
index 0000000..68b6535
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_sunset.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_time_lapse.png b/res/drawable-hdpi/ic_scene_mode_black_time_lapse.png
new file mode 100644
index 0000000..868e51d
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_time_lapse.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_tracking_focus.png b/res/drawable-hdpi/ic_scene_mode_black_tracking_focus.png
new file mode 100644
index 0000000..e86a330
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_tracking_focus.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_scene_mode_black_ubifocus.png b/res/drawable-hdpi/ic_scene_mode_black_ubifocus.png
new file mode 100644
index 0000000..eb174e7
--- /dev/null
+++ b/res/drawable-hdpi/ic_scene_mode_black_ubifocus.png
Binary files differ
diff --git a/res/layout/capture_module.xml b/res/layout/capture_module.xml
index fc05fd0..affb6b0 100644
--- a/res/layout/capture_module.xml
+++ b/res/layout/capture_module.xml
@@ -93,6 +93,9 @@
     </com.android.camera.ui.RotateLayout>
 
     <include
+        layout="@layout/scene_mode_label"/>
+
+    <include
         style="@style/CameraControls"
         layout="@layout/one_ui_layout"
         android:layout_gravity="center" />
diff --git a/res/layout/pano_capture_module.xml b/res/layout/pano_capture_module.xml
index e382570..c8809af 100644
--- a/res/layout/pano_capture_module.xml
+++ b/res/layout/pano_capture_module.xml
@@ -34,6 +34,10 @@
         android:id="@+id/preview_process_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
+
+    <include
+        layout="@layout/scene_mode_label"/>
+
     <include
         style="@style/CameraControls"
         layout="@layout/camera_controls"
diff --git a/res/layout/scene_mode_instructional.xml b/res/layout/scene_mode_instructional.xml
new file mode 100644
index 0000000..588dc35
--- /dev/null
+++ b/res/layout/scene_mode_instructional.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Copyright (c) 2016, The Linux Foundation. All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are
+    met:
+    * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+    copyright notice, this list of conditions and the following
+    disclaimer in the documentation and/or other materials provided
+    with the distribution.
+    * Neither the name of The Linux Foundation nor the names of its
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+    WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+    BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+    OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+    IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+    -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/mode_layout_rect"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@android:color/transparent"
+    android:gravity="center">
+
+    <LinearLayout
+        android:id="@+id/title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="30dp"
+        android:layout_marginTop="15dp"
+        android:orientation="horizontal"
+        android:gravity="center">
+        <ImageView
+            android:id="@+id/scene_mode_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/chroma_flash"/>
+        <TextView
+            android:id="@+id/scene_mode_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:layout_toRightOf="@id/scene_mode_icon"
+            android:text="@string/pref_camera_scenemode_entry_chromaflash"
+            android:textColor="@android:color/black"
+            android:textAppearance="?android:attr/textAppearanceMedium" />
+
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/scene_mode_instructional"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:layout_marginLeft="30dp"
+        android:layout_marginRight="30dp"
+        android:text="@string/pref_camera2_scene_mode_chroma_flash_instructional_content"
+        android:textColor="@android:color/black"
+        android:layout_below="@id/title" />
+    <CheckBox
+        android:id="@+id/remember_selected"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:layout_marginLeft="30dp"
+        android:layout_below="@id/scene_mode_instructional"
+        android:text="@string/pref_camera2_not_show_again"
+        android:textColor="@android:color/black"/>
+
+    <View
+        android:id="@+id/separator"
+        android:layout_width="wrap_content"
+        android:layout_height="1dp"
+        android:layout_marginTop="15dp"
+        android:layout_marginBottom="15dp"
+        android:layout_below="@id/remember_selected"
+        android:background="#c0c0c0" />
+
+    <Button
+        android:id="@+id/scene_mode_instructional_ok"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/separator"
+        android:background="@android:color/transparent"
+        android:layout_marginRight="30dp"
+        android:layout_alignParentRight="true"
+        android:text="@string/pref_camera2_scene_mode_instructional_ok"
+        android:textColor="@android:color/black"/>
+</RelativeLayout>
+
diff --git a/res/layout/scene_mode_label.xml b/res/layout/scene_mode_label.xml
new file mode 100644
index 0000000..aa5ef21
--- /dev/null
+++ b/res/layout/scene_mode_label.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (c) 2016, The Linux Foundation. All rights reserved.
+     Not a Contribution.
+
+     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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginTop="90dp"
+    android:layout_marginRight="20dp"
+    android:gravity="right">
+    <com.android.camera.ui.RotateLayout
+        android:id="@+id/scene_mode_label_rect"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+        <LinearLayout
+            android:id="@+id/scene_mode_label_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="20dp"
+            android:background="#90000000"
+            android:orientation="horizontal">
+            <TextView
+                android:id="@+id/scene_mode_label"
+                android:singleLine="true"
+                android:text="@string/pref_camera_scenemode_entry_chromaflash"
+                android:textColor="@android:color/white"
+                android:textSize="16dp"
+                style="@style/OnViewfinderSceneLabel" />
+            <ImageView
+                android:id="@+id/scene_mode_label_close"
+                android:src="@drawable/x"
+                style="@style/OnViewfinderSceneLabel"/>
+        </LinearLayout>
+    </com.android.camera.ui.RotateLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/values/camera2arrays.xml b/res/values/camera2arrays.xml
index 31d6b5a..fbb70b9 100644
--- a/res/values/camera2arrays.xml
+++ b/res/values/camera2arrays.xml
@@ -213,6 +213,59 @@
         <item>@drawable/promode</item>
     </array>
 
+    <array name="pref_camera2_scenemode_black_thumbnails" translatable="false">
+        <item>@drawable/ic_scene_mode_black_auto</item>
+        <item>@drawable/ic_scene_mode_black_dual_camera</item>
+        <item>@drawable/ic_scene_mode_black_hdr</item>
+        <item>@drawable/ic_scene_mode_black_ubifocus</item>
+        <item>@drawable/ic_scene_mode_black_optizoom</item>
+        <item>@drawable/ic_scene_mode_black_portrait</item>
+        <item>@drawable/ic_scene_mode_black_landscape</item>
+        <item>@drawable/ic_scene_mode_black_sports</item>
+        <item>@drawable/ic_scene_mode_black_flowers</item>
+        <item>@drawable/ic_scene_mode_black_backlight</item>
+        <item>@drawable/ic_scene_mode_black_candlelight</item>
+        <item>@drawable/ic_scene_mode_black_sunset</item>
+        <item>@drawable/ic_scene_mode_black_night</item>
+        <item>@drawable/ic_scene_mode_black_beach</item>
+        <item>@drawable/ic_scene_mode_black_snow</item>
+        <item>@drawable/ic_scene_mode_smartauto</item>
+        <item>@drawable/ic_scene_mode_black_best_photo</item>
+        <item>@drawable/ic_scene_mode_black_chroma_flash</item>
+        <item>@drawable/ic_scene_mode_black_blur_buster</item>
+        <item>@drawable/ic_scene_mode_black_sharp_photo</item>
+        <item>@drawable/ic_scene_mode_black_tracking_focus</item>
+        <item>@drawable/ic_scene_mode_black_panorama</item>
+        <item>@drawable/ic_scene_mode_black_dual_camera</item>
+    </array>
+
+    <!-- Camera Preferences Scene Mode dialog box entries -->
+    <string-array name="pref_camera2_scenemode_instructional_entries" translatable="false">
+        <item>@string/pref_camera_scenemode_entry_auto</item>
+        <item>@string/pref_camera2_scene_mode_dual_camera_instructional_content</item>
+        <item>@string/pref_camera2_scene_mode_hdr_instructional_content</item>
+        <item>@string/pref_camera2_scene_mode_ubi_focus_instructional_content</item>
+        <item>@string/pref_camera2_scene_mode_opti_zoom_instructional_content</item>
+        <item>""</item>
+        <item>""</item>
+        <item>@string/pref_camera2_scene_mode_sports_instructional_content</item>
+        <item>""</item>
+        <item>""</item>
+        <item>""</item>
+        <item>""</item>
+        <item>""</item>
+        <item>""</item>
+        <item>""</item>
+        <item>""</item>
+        <item>@string/pref_camera2_scene_mode_best_photo_instructional_content</item>
+        <item>@string/pref_camera2_scene_mode_chroma_flash_instructional_content</item>
+        <item>@string/pref_camera2_scene_mode_blur_buster_instructional_content</item>
+        <item>@string/pref_camera2_scene_mode_sharp_photo_instructional_content</item>
+        <item>@string/pref_camera2_scene_mode_tracking_focus_instructional_content</item>
+        <item>@string/pref_camera2_scene_mode_panorama_instructional_content</item>
+        <item>@string/pref_camera2_scene_mode_pro_instructional_content</item>
+    </string-array>
+
     <string-array name="pref_camera2_whitebalance_entryvalues" translatable="false">
         <item>1</item>
         <item>2</item>
diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml
index d53b2c2..509fae3 100644
--- a/res/values/qcomstrings.xml
+++ b/res/values/qcomstrings.xml
@@ -1063,5 +1063,22 @@
     <string name="perf_camera2_preferences_category_photo" translatable="true">Still camera</string>
     <string name="perf_camera2_preferences_category_video" translatable="true">Video camera</string>
     <string name="perf_camera2_preferences_category_system" translatable="true">System</string>
+
+    <string name="pref_camera2_scene_mode_dual_camera_instructional_content" translatable="true">In dual camera mode, your pictures will be clearer. You can also apply background effects, by editing your dual camera pictures in the Gallery.</string>
+    <string name="pref_camera2_scene_mode_ubi_focus_instructional_content"  translatable="true">With UbiFocus, your camera will take five pictures and combine them into one picture,where everything is in focus. You can choose to re-focus, after you take the picture.</string>
+    <string name="pref_camera2_scene_mode_opti_zoom_instructional_content"  translatable="true">Use Optizoom when you want to zoom in for a clear picture.You can zoom before, or after taking the picture.</string>
+    <string name="pref_camera2_scene_mode_sports_instructional_content"  translatable="true">Sports mode helps you take better sports or action shots.\n\nImporves your photos, but has no effect on video recording.</string>
+    <string name="pref_camera2_scene_mode_hdr_instructional_content"  translatable="true">When you are in mixed lighting conditions such as low light and backlit scenes select "HDR" for best possible pictures.</string>
+    <string name="pref_camera2_scene_mode_best_photo_instructional_content"  translatable="true">Allows you to take a burst of 10 photos, and you can choose the best one(s).</string>
+    <string name="pref_camera2_scene_mode_chroma_flash_instructional_content"  translatable="true">With ChromaFlash, the lighting in your flash photos will be optimized for all of the people and objects in your pictures.This feature applies only to the back camera.</string>
+    <string name="pref_camera2_scene_mode_sharp_photo_instructional_content"  translatable="true">Sharp Phot reduces blur that is due to motion in the scene, or due to hand motion.</string>
+    <string name="pref_camera2_scene_mode_tracking_focus_instructional_content"  translatable="true">Allows you to track and focus a selected person or object while taking pictures or videos. To start, position the focus rectangle on a person or object you want to track.</string>
+    <string name="pref_camera2_scene_mode_time_lapse_instructional_content"  translatable="true">With Time Lapse, you can transform a long video recording into a few seconds of video.This effect applies to videos, but not photos.</string>
+    <string name="pref_camera2_scene_mode_panorama_instructional_content"  translatable="true">Allows you to pan left or right to take a wide landscape photo. You can alse pan up or down to take tall photos.</string>
+    <string name="pref_camera2_scene_mode_blur_buster_instructional_content"  translatable="true">BlurBuster reduces blur from shaky hands.It can be helpful when taking photos in difficult places.</string>
+    <string name="pref_camera2_scene_mode_pro_instructional_content"  translatable="true">With Pro Mode, you can manually control settings for ISO,Exposure, White Balance, and Focus. You will have easy access to all of these advanced settings</string>
+
+    <string name="pref_camera2_not_show_again">Do not show again</string>
+    <string name="pref_camera2_scene_mode_instructional_ok" translatable="true">OK</string>
 </resources>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 082c5ed..8432c11 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -316,4 +316,18 @@
     <style name="PanoViewHorizontalBar">
         <item name="android:background">@android:color/transparent</item>
     </style>
+
+    <style name="OnViewfinderSceneLabel">
+        <item name="android:gravity">center</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_marginLeft">10dp</item>
+        <item name="android:layout_marginRight">10dp</item>
+        <item name="android:layout_marginTop">5dp</item>
+        <item name="android:layout_marginBottom">5dp</item>
+        <item name="android:singleLine">true</item>
+        <item name="android:textColor">@android:color/white</item>
+        <item name="android:textSize">16dp</item>
+        <item name="android:background">@android:color/transparent</item>
+    </style>
 </resources>
diff --git a/res/xml/capture_preferences.xml b/res/xml/capture_preferences.xml
index f3603c4..8ad300f 100644
--- a/res/xml/capture_preferences.xml
+++ b/res/xml/capture_preferences.xml
@@ -124,6 +124,14 @@
         camera:title="@string/pref_camera_scenemode_title"/>
 
     <IconListPreference
+        camera:defaultValue="@string/pref_camera2_scenemode_default"
+        camera:entries="@array/pref_camera2_scenemode_instructional_entries"
+        camera:entryValues="@array/pref_camera2_scenemode_entryvalues"
+        camera:key="pref_camera2_scenemode_instructional"
+        camera:thumbnails="@array/pref_camera2_scenemode_black_thumbnails"
+        camera:title="@string/pref_camera_scenemode_title"/>
+
+    <IconListPreference
         camera:defaultValue="@string/setting_off_value"
         camera:entries="@array/pref_camera2_redeyereduction_entries"
         camera:entryValues="@array/pref_camera2_redeyereduction_entryvalues"
diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java
old mode 100755
new mode 100644
index b026af8..e2935b9
--- a/src/com/android/camera/CaptureUI.java
+++ b/src/com/android/camera/CaptureUI.java
@@ -38,8 +38,10 @@
 import android.renderscript.ScriptIntrinsicYuvToRGB;
 import android.renderscript.Type;
 import android.text.TextUtils;
+import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.Display;
+import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.Surface;
@@ -49,12 +51,14 @@
 import android.view.ViewPropertyAnimator;
 import android.view.Window;
 import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.CheckBox;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
 import android.widget.SeekBar;
 import android.widget.TextView;
-
 import com.android.camera.ui.AutoFitSurfaceView;
 import com.android.camera.ui.Camera2FaceView;
 import com.android.camera.ui.CameraControls;
@@ -186,10 +190,16 @@
     private RotateImageView mMuteButton;
     private ImageView mSeekbarToggleButton;
     private View mProModeCloseButton;
+    private RotateLayout mSceneModeLabelRect;
+    private LinearLayout mSceneModeLabelView;
+    private TextView mSceneModeName;
+    private ImageView mSceneModeLabelCloseIcon;
+    private AlertDialog  mSceneModeInstructionalDialog = null;
 
     int mPreviewWidth;
     int mPreviewHeight;
     private boolean mIsVideoUI = false;
+    private boolean mIsSceneModeLabelClose = false;
 
     private void previewUIReady() {
         if((mSurfaceHolder != null && mSurfaceHolder.getSurface().isValid())) {
@@ -326,6 +336,17 @@
         RotateImageView muteButton = (RotateImageView) mRootView.findViewById(R.id.mute_button);
         muteButton.setVisibility(View.GONE);
 
+        mSceneModeLabelRect = (RotateLayout)mRootView.findViewById(R.id.scene_mode_label_rect);
+        mSceneModeName = (TextView)mRootView.findViewById(R.id.scene_mode_label);
+        mSceneModeLabelCloseIcon = (ImageView)mRootView.findViewById(R.id.scene_mode_label_close);
+        mSceneModeLabelCloseIcon.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mIsSceneModeLabelClose = true;
+                mSceneModeLabelRect.setVisibility(View.GONE);
+            }
+        });
+
         mCameraControls = (OneUICameraControls) mRootView.findViewById(R.id.camera_controls);
         mFaceView = (Camera2FaceView) mRootView.findViewById(R.id.face_view);
 
@@ -418,6 +439,7 @@
         initFilterModeButton();
         initFlashButton();
         setMakeupButtonIcon();
+        showSceneModeLabel();
         if(mModule.isTrackingFocusSettingOn()) {
             mTrackingFocusRenderer.setVisible(false);
             mTrackingFocusRenderer.setVisible(true);
@@ -601,6 +623,117 @@
         }
     }
 
+    private boolean needShowInstructional() {
+        boolean needShow = true;
+        final SharedPreferences pref = mActivity.getSharedPreferences(
+                ComboPreferences.getGlobalSharedPreferencesName(mActivity), Context.MODE_PRIVATE);
+        int index = mSettingsManager.getValueIndex(SettingsManager.KEY_SCENE_MODE);
+        if ( index < 1 ) {
+            needShow = false;
+        }else{
+            final String instructionalKey = SettingsManager.KEY_SCENE_MODE + "_" + index;
+            needShow = pref.getBoolean(instructionalKey, false) ? false : true;
+        }
+
+        return needShow;
+
+    }
+
+    private void showSceneInstructionalDialog(int orientation) {
+        LayoutInflater inflater =
+                (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        View view = inflater.inflate(R.layout.scene_mode_instructional, null);
+
+        int index = mSettingsManager.getValueIndex(SettingsManager.KEY_SCENE_MODE);
+        TextView name = (TextView)view.findViewById(R.id.scene_mode_name);
+        CharSequence sceneModeNameArray[] =
+                mSettingsManager.getEntries(SettingsManager.KEY_SCENE_MODE);
+        name.setText(sceneModeNameArray[index]);
+
+        ImageView icon = (ImageView)view.findViewById(R.id.scene_mode_icon);
+        int[] resId = mSettingsManager.getResource(SettingsManager.KEY_SCEND_MODE_INSTRUCTIONAL,
+                SettingsManager.RESOURCE_TYPE_THUMBNAIL);
+        icon.setImageResource(resId[index]);
+
+        TextView instructional = (TextView)view.findViewById(R.id.scene_mode_instructional);
+        CharSequence instructionalArray[] =
+                mSettingsManager.getEntries(SettingsManager.KEY_SCEND_MODE_INSTRUCTIONAL);
+        if ( instructionalArray[index].length() == 0 ) {
+            //For now, not all scene mode has instructional
+            return;
+        }
+        instructional.setText(instructionalArray[index]);
+
+        final CheckBox remember = (CheckBox)view.findViewById(R.id.remember_selected);
+        Button ok = (Button)view.findViewById(R.id.scene_mode_instructional_ok);
+        ok.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View view) {
+
+                if ( remember.isChecked()) {
+                    final SharedPreferences pref = mActivity.getSharedPreferences(
+                            ComboPreferences.getGlobalSharedPreferencesName(mActivity),
+                            Context.MODE_PRIVATE);
+
+                    String instructionalKey = SettingsManager.KEY_SCENE_MODE + "_" + index;
+                    SharedPreferences.Editor editor = pref.edit();
+                    editor.putBoolean(instructionalKey, true);
+                    editor.commit();
+                }
+                mSceneModeInstructionalDialog.dismiss();
+                mSceneModeInstructionalDialog = null;
+            }
+        });
+
+        mSceneModeInstructionalDialog =
+                new AlertDialog.Builder(mActivity, AlertDialog.THEME_HOLO_LIGHT)
+                        .setView(view).create();
+        try {
+            mSceneModeInstructionalDialog.show();
+        }catch(Exception e) {
+            e.printStackTrace();
+            return;
+        }
+        if ( orientation != 0 ) {
+            rotationSceneModeInstructionalDialog(view, orientation);
+        }
+    }
+
+    private int getScreenWidth() {
+        DisplayMetrics metric = new DisplayMetrics();
+        mActivity.getWindowManager().getDefaultDisplay().getMetrics(metric);
+        return metric.widthPixels < metric.heightPixels ? metric.widthPixels : metric.heightPixels;
+    }
+
+    private void rotationSceneModeInstructionalDialog(View view, int orientation) {
+        view.setRotation(-orientation);
+        int screenWidth = getScreenWidth();
+        int dialogSize = screenWidth*9/10;
+        Window dialogWindow = mSceneModeInstructionalDialog.getWindow();
+        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
+        dialogWindow.setGravity(Gravity.CENTER);
+        lp.width = lp.height = dialogSize;
+        dialogWindow.setAttributes(lp);
+        if ( orientation == 180 ) {
+            dialogSize -= 40;
+            RelativeLayout layout = (RelativeLayout)view.findViewById(R.id.mode_layout_rect);
+            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(dialogSize, dialogSize);
+            layout.setLayoutParams(params);
+        }
+    }
+
+    private void showSceneModeLabel() {
+        mIsSceneModeLabelClose = false;
+        int index = mSettingsManager.getValueIndex(SettingsManager.KEY_SCENE_MODE);
+        CharSequence sceneModeNameArray[] = mSettingsManager.getEntries(SettingsManager.KEY_SCENE_MODE);
+        if ( index > 0 && index < sceneModeNameArray.length ) {
+            mSceneModeName.setText(sceneModeNameArray[index]);
+            mSceneModeLabelRect.setVisibility(View.VISIBLE);
+        }else{
+            mSceneModeLabelRect.setVisibility(View.GONE);
+        }
+    }
+
+
     public void resetTrackingFocus() {
         if(mModule.isTrackingFocusSettingOn()) {
             mTrackingFocusRenderer.setVisible(false);
@@ -1215,6 +1348,24 @@
         if (mZoomRenderer != null) {
             mZoomRenderer.setOrientation(orientation);
         }
+
+        if ( mSceneModeLabelRect != null ) {
+            if (orientation == 180) {
+                mSceneModeName.setRotation(180);
+                mSceneModeLabelCloseIcon.setRotation(180);
+                mSceneModeLabelRect.setOrientation(0, false);
+            } else {
+                mSceneModeName.setRotation(0);
+                mSceneModeLabelCloseIcon.setRotation(0);
+                mSceneModeLabelRect.setOrientation(orientation, false);
+            }
+        }
+
+        if ( mSceneModeInstructionalDialog != null && mSceneModeInstructionalDialog.isShowing()) {
+            mSceneModeInstructionalDialog.dismiss();
+            mSceneModeInstructionalDialog = null;
+            showSceneInstructionalDialog(orientation);
+        }
     }
 
     public int getOrientation() {
@@ -1338,9 +1489,18 @@
     @Override
     public void onSettingsChanged(List<SettingsManager.SettingState> settings) {
         for( SettingsManager.SettingState state : settings) {
-            if( state.key.equals(SettingsManager.KEY_COLOR_EFFECT) ) {
+            if (state.key.equals(SettingsManager.KEY_COLOR_EFFECT)) {
                 enableView(mFilterModeSwitcher, SettingsManager.KEY_COLOR_EFFECT);
-                break;
+            } else if (state.key.equals(SettingsManager.KEY_SCENE_MODE)) {
+                String value = mSettingsManager.getValue(SettingsManager.KEY_SCENE_MODE);
+                if ( value.equals("104") ) {//panorama
+                    mSceneModeLabelRect.setVisibility(View.GONE);
+                }else{
+                    if ( needShowInstructional() ) {
+                        showSceneInstructionalDialog(mOrientation);
+                    }
+                    showSceneModeLabel();
+                }
             }
         }
     }
@@ -1425,4 +1585,5 @@
     public ImageView getVideoButton() {
         return mVideoButton;
     }
+
 }
diff --git a/src/com/android/camera/ComboPreferences.java b/src/com/android/camera/ComboPreferences.java
index 1979d1b..a30dd94 100644
--- a/src/com/android/camera/ComboPreferences.java
+++ b/src/com/android/camera/ComboPreferences.java
@@ -73,7 +73,7 @@
         return context.getPackageName() + "_preferences_" + cameraId;
     }
 
-    private static String getGlobalSharedPreferencesName(Context context) {
+    public static String getGlobalSharedPreferencesName(Context context) {
         return context.getPackageName() + "_preferences_camera";
     }
 
diff --git a/src/com/android/camera/PanoCaptureModule.java b/src/com/android/camera/PanoCaptureModule.java
index ff5715e..c6045d1 100644
--- a/src/com/android/camera/PanoCaptureModule.java
+++ b/src/com/android/camera/PanoCaptureModule.java
@@ -271,10 +271,12 @@
         mCameraOpened = false;
         mSurfaceReady = false;
         mActivity = activity;
-
+        SettingsManager settingsManager = SettingsManager.getInstance();
+        settingsManager.init();
         mUI = new PanoCaptureUI(activity, this, parent);
         mContentResolver = mActivity.getContentResolver();
         mLocationManager = new LocationManager(mActivity, null);
+
     }
 
     public void changePanoStatus(boolean newStatus, boolean isCancelling) {
diff --git a/src/com/android/camera/PanoCaptureUI.java b/src/com/android/camera/PanoCaptureUI.java
index 3ab43f9..5e96929 100644
--- a/src/com/android/camera/PanoCaptureUI.java
+++ b/src/com/android/camera/PanoCaptureUI.java
@@ -24,16 +24,29 @@
 import android.graphics.Point;
 import android.graphics.RectF;
 import android.hardware.Camera.Face;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.Size;
 import android.view.Gravity;
+import android.view.LayoutInflater;
 import android.view.SurfaceHolder;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnLayoutChangeListener;
 import android.view.ViewGroup;
+
+import android.view.Window;
+import android.view.WindowManager;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
 
 import com.android.camera.ui.AutoFitSurfaceView;
 import com.android.camera.ui.CameraControls;
@@ -41,6 +54,7 @@
 import com.android.camera.ui.FocusIndicator;
 import com.android.camera.ui.ModuleSwitcher;
 import com.android.camera.ui.PanoCaptureProcessView;
+import com.android.camera.ui.RotateLayout;
 import com.android.camera.util.CameraUtil;
 
 import org.codeaurora.snapcam.R;
@@ -60,6 +74,12 @@
     private ShutterButton mShutterButton;
     private ModuleSwitcher mSwitcher;
     private CameraControls mCameraControls;
+    private RotateLayout mSceneModeLabelRect;
+    private LinearLayout mSceneModeLabelView;
+    private TextView mSceneModeName;
+    private ImageView mSceneModeLabelCloseIcon;
+    private AlertDialog  mSceneModeInstructionalDialog = null;
+
     // Small indicators which show the camera settings in the viewfinder.
     private OnScreenIndicators mOnScreenIndicators;
 
@@ -74,6 +94,7 @@
     private ImageView mThumbnail;
 
     private int mOrientation;
+    private boolean mIsSceneModeLabelClose = false;
 
     public void clearSurfaces() {
         mSurfaceHolder = null;
@@ -193,12 +214,26 @@
             }
         });
 
+        mSceneModeLabelRect = (RotateLayout)mRootView.findViewById(R.id.scene_mode_label_rect);
+        mSceneModeName = (TextView)mRootView.findViewById(R.id.scene_mode_label);
+        mSceneModeName.setText(R.string.pref_camera_scenemode_entry_panorama);
+        mSceneModeLabelCloseIcon = (ImageView)mRootView.findViewById(R.id.scene_mode_label_close);
+        mSceneModeLabelCloseIcon.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mIsSceneModeLabelClose = true;
+                mSceneModeLabelRect.setVisibility(View.GONE);
+            }
+        });
         initIndicators();
 
         Point size = new Point();
         mActivity.getWindowManager().getDefaultDisplay().getSize(size);
         calculateMargins(size);
         mCameraControls.setMargins(mTopMargin, mBottomMargin);
+        if ( needShowInstructional() ) {
+            showSceneInstructionalDialog(mOrientation);
+        }
     }
 
     private void calculateMargins(Point size) {
@@ -381,6 +416,24 @@
         mOrientation = orientation;
         mCameraControls.setOrientation(orientation, animation);
         mPreviewProcessView.setOrientation(orientation);
+
+        if ( mSceneModeLabelRect != null ) {
+            if (orientation == 180) {
+                mSceneModeName.setRotation(180);
+                mSceneModeLabelCloseIcon.setRotation(180);
+                mSceneModeLabelRect.setOrientation(0, false);
+            } else {
+                mSceneModeName.setRotation(0);
+                mSceneModeLabelCloseIcon.setRotation(0);
+                mSceneModeLabelRect.setOrientation(orientation, false);
+            }
+        }
+
+        if ( mSceneModeInstructionalDialog != null && mSceneModeInstructionalDialog.isShowing()) {
+            mSceneModeInstructionalDialog.dismiss();
+            mSceneModeInstructionalDialog = null;
+            showSceneInstructionalDialog(orientation);
+        }
     }
 
     public int getOrientation() {
@@ -391,4 +444,83 @@
     public void onErrorListener(int error) {
 
     }
+
+    private boolean needShowInstructional() {
+        final SharedPreferences pref = mActivity.getSharedPreferences(
+                ComboPreferences.getGlobalSharedPreferencesName(mActivity), Context.MODE_PRIVATE);
+        SettingsManager settingsManager = SettingsManager.getInstance();
+        int index = settingsManager.getValueIndex(SettingsManager.KEY_SCENE_MODE);
+        final String instructionalKey = SettingsManager.KEY_SCENE_MODE + "_" + index;
+        return !pref.getBoolean(instructionalKey, false);
+    }
+
+    private void showSceneInstructionalDialog(int orientation) {
+        LayoutInflater inflater =
+                (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        View view = inflater.inflate(R.layout.scene_mode_instructional, null);
+
+        TextView name = (TextView)view.findViewById(R.id.scene_mode_name);
+        name.setText(R.string.pref_camera_scenemode_entry_panorama);
+
+        ImageView icon = (ImageView)view.findViewById(R.id.scene_mode_icon);
+        icon.setImageResource(R.drawable.ic_scene_mode_black_panorama);
+
+        TextView instructional = (TextView)view.findViewById(R.id.scene_mode_instructional);
+        instructional.setText(R.string.pref_camera2_scene_mode_panorama_instructional_content);
+
+        final CheckBox remember = (CheckBox)view.findViewById(R.id.remember_selected);
+        Button ok = (Button)view.findViewById(R.id.scene_mode_instructional_ok);
+        ok.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View view) {
+                SharedPreferences pref = mActivity.getSharedPreferences(
+                        ComboPreferences.getGlobalSharedPreferencesName(mActivity),
+                        Context.MODE_PRIVATE);
+                int index =
+                        SettingsManager.getInstance().getValueIndex(SettingsManager.KEY_SCENE_MODE);
+                String instructionalKey = SettingsManager.KEY_SCENE_MODE + "_" + index;
+                if ( remember.isChecked()) {
+                    SharedPreferences.Editor editor = pref.edit();
+                    editor.putBoolean(instructionalKey, true);
+                    editor.commit();
+                }
+                mSceneModeInstructionalDialog.dismiss();
+                mSceneModeInstructionalDialog = null;
+            }
+        });
+        mSceneModeInstructionalDialog =
+                new AlertDialog.Builder(mActivity, AlertDialog.THEME_HOLO_LIGHT)
+                        .setView(view).create();
+        try {
+            mSceneModeInstructionalDialog.show();
+        }catch(Exception e){
+            e.printStackTrace();
+            return;
+        }
+        if ( orientation != 0 ) {
+            rotationSceneModeInstructionalDialog(view, orientation);
+        }
+    }
+
+    private int getScreenWidth() {
+        DisplayMetrics metric = new DisplayMetrics();
+        mActivity.getWindowManager().getDefaultDisplay().getMetrics(metric);
+        return metric.widthPixels < metric.heightPixels ? metric.widthPixels : metric.heightPixels;
+    }
+
+    private void rotationSceneModeInstructionalDialog(View view, int orientation) {
+        view.setRotation(-orientation);
+        int screenWidth = getScreenWidth();
+        int dialogSize = screenWidth*9/10;
+        Window dialogWindow = mSceneModeInstructionalDialog.getWindow();
+        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
+        dialogWindow.setGravity(Gravity.CENTER);
+        lp.width = lp.height = dialogSize;
+        dialogWindow.setAttributes(lp);
+        if ( orientation == 180 ) {
+            dialogSize -= 40;
+            RelativeLayout layout = (RelativeLayout)view.findViewById(R.id.mode_layout_rect);
+            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(dialogSize, dialogSize);
+            layout.setLayoutParams(params);
+        }
+    }
 }
diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java
index 520a247..c1c6442 100644
--- a/src/com/android/camera/SettingsManager.java
+++ b/src/com/android/camera/SettingsManager.java
@@ -112,6 +112,7 @@
     public static final String KEY_FILTER_MODE = "pref_camera2_filter_mode_key";
     public static final String KEY_COLOR_EFFECT = "pref_camera2_coloreffect_key";
     public static final String KEY_SCENE_MODE = "pref_camera2_scenemode_key";
+    public static final String KEY_SCEND_MODE_INSTRUCTIONAL = "pref_camera2_scenemode_instructional";
     public static final String KEY_REDEYE_REDUCTION = "pref_camera2_redeyereduction_key";
     public static final String KEY_CAMERA_ID = "pref_camera2_id_key";
     public static final String KEY_PICTURE_SIZE = "pref_camera2_picturesize_key";
@@ -540,6 +541,9 @@
         ListPreference flashMode = mPreferenceGroup.findPreference(KEY_FLASH_MODE);
         ListPreference colorEffect = mPreferenceGroup.findPreference(KEY_COLOR_EFFECT);
         ListPreference sceneMode = mPreferenceGroup.findPreference(KEY_SCENE_MODE);
+        ListPreference sceneModeInstructional =
+                mPreferenceGroup.findPreference(KEY_SCEND_MODE_INSTRUCTIONAL);
+
         ListPreference cameraIdPref = mPreferenceGroup.findPreference(KEY_CAMERA_ID);
         ListPreference pictureSize = mPreferenceGroup.findPreference(KEY_PICTURE_SIZE);
         ListPreference exposure = mPreferenceGroup.findPreference(KEY_EXPOSURE);
@@ -579,6 +583,13 @@
             }
         }
 
+        if ( sceneModeInstructional != null ) {
+            if (filterUnsupportedOptions(sceneModeInstructional,
+                    getSupportedSceneModes(cameraId)) ){
+                mFilteredKeys.add(sceneModeInstructional.getKey());
+            }
+        }
+
         if (cameraIdPref != null) buildCameraId();
 
         if (pictureSize != null) {