Merge "Use main looper to post start animation commands This is a workaround till we find a better solution. Posting start() on mail looper will make sure the animation starts but animation can stop randomly when the list gets refreshed which happens for example any time the user interacts with the list by check/uncheking boxes. This is because the list rebuilds itself and views gets detached/attached which binds to a new view."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e559325..bf7346c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4,8 +4,6 @@
 
     <original-package android:name="com.android.settings" />
 
-    <uses-permission android:name="com.google.android.gm.permission.WRITE_GMAIL" />
-    <uses-permission android:name="com.google.android.gm.permission.READ_GMAIL" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
     <uses-permission android:name="android.permission.DEVICE_POWER" />
@@ -138,7 +136,6 @@
                   android:theme="@android:style/Theme.Holo.NoActionBar"
                   android:windowBackground="@drawable/setups_bg_default"
                   android:clearTaskOnLaunch="true"
-                  android:screenOrientation="landscape"
                   android:exported="true" />
 
         <activity-alias android:name=".wifi.AdvancedSettings"
diff --git a/res/drawable-hdpi/ic_settings_accessibility.png b/res/drawable-hdpi/ic_settings_accessibility.png
index 8390084..849c19c 100755
--- a/res/drawable-hdpi/ic_settings_accessibility.png
+++ b/res/drawable-hdpi/ic_settings_accessibility.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_sound.png b/res/drawable-hdpi/ic_settings_sound.png
index ba7c674..42354cd 100755
--- a/res/drawable-hdpi/ic_settings_sound.png
+++ b/res/drawable-hdpi/ic_settings_sound.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_wireless.png b/res/drawable-hdpi/ic_settings_wireless.png
index 6161a38..20ceb20 100755
--- a/res/drawable-hdpi/ic_settings_wireless.png
+++ b/res/drawable-hdpi/ic_settings_wireless.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_accessibility.png b/res/drawable-mdpi/ic_settings_accessibility.png
index 71663ee..ba86d3d 100755
--- a/res/drawable-mdpi/ic_settings_accessibility.png
+++ b/res/drawable-mdpi/ic_settings_accessibility.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_sound.png b/res/drawable-mdpi/ic_settings_sound.png
index 9760e04..f647fea 100644
--- a/res/drawable-mdpi/ic_settings_sound.png
+++ b/res/drawable-mdpi/ic_settings_sound.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_wireless.png b/res/drawable-mdpi/ic_settings_wireless.png
index e998e06..f8acded 100755
--- a/res/drawable-mdpi/ic_settings_wireless.png
+++ b/res/drawable-mdpi/ic_settings_wireless.png
Binary files differ
diff --git a/res/layout-xlarge-land/date_time_settings_setupwizard.xml b/res/layout-xlarge-land/date_time_settings_setupwizard.xml
new file mode 100644
index 0000000..ee425eb
--- /dev/null
+++ b/res/layout-xlarge-land/date_time_settings_setupwizard.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+  -->
+<RelativeLayout
+    android:id="@+id/layout_root"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingTop="154dip"
+    android:paddingLeft="128dip"
+    android:paddingRight="128dip"
+    android:paddingBottom="96dip">
+
+    <!-- Title: Set date & time-->
+    <TextView
+        android:id="@+id/title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:minHeight="48dip"
+        android:layout_alignParentLeft="true"
+        android:layout_marginLeft="16dip"
+        android:layout_alignParentTop="true"
+        android:textSize="32dip"
+        android:textColor="#FF99cc00"
+        android:text="@string/date_and_time_settings_title_setup_wizard"
+        android:gravity="bottom" />
+
+    <!-- Divider -->
+    <View
+        android:id="@+id/top_divider"
+        android:layout_width="match_parent"
+        android:layout_height="3dip"
+        android:layout_below="@id/title"
+        android:layout_marginTop="6dip"
+        android:layout_marginBottom="17dip"
+        android:background="@color/divider_color" />
+
+    <RelativeLayout
+        android:id="@+id/timezone_auto_time"
+        android:layout_width="716dip"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_below="@id/top_divider">
+        <!-- timezone -->
+        <Button
+            android:id="@+id/time_zone_button"
+            style="?android:attr/dropDownSpinnerStyle"
+            android:layout_width="304dip"
+            android:layout_height="48dip"
+            android:layout_alignParentLeft="true"
+            android:layout_alignBottom="@+id/date_time_auto"
+            android:gravity="left|center_vertical"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:textSize="20dip" />
+
+        <LinearLayout
+            android:id="@+id/date_time_auto"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:layout_toRightOf="@id/time_zone_button"
+            android:layout_marginLeft="32dip"
+            android:layout_alignParentRight="true">
+
+            <Switch
+                android:id="@+id/date_time_auto_button"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:minHeight="?android:attr/listPreferredItemHeight"
+                android:layout_marginLeft="16dip"
+                android:text="@string/date_time_auto"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:textSize="20dip" />
+
+            <!-- Divider -->
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1px"
+                android:background="@color/divider_color" />
+        </LinearLayout>
+    </RelativeLayout>
+
+    <LinearLayout
+        android:layout_width="624dip"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_below="@+id/timezone_auto_time"
+        android:layout_marginTop="48dip"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:layout_width="312dip"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+            <TextView
+                android:id="@+id/date_picker_title"
+                android:layout_width="match_parent"
+                android:layout_height="48dip"
+                android:text="@string/date_picker_title"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:textSize="20dip"
+                android:clickable="false"
+                android:longClickable="false"
+                android:gravity="center" />
+            <DatePicker
+                android:id="@+id/date_picker"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/date_picker_title" />
+        </LinearLayout>
+
+        <!-- divider -->
+        <View
+            android:id="@+id/center_divider"
+            android:layout_width="1dip"
+            android:layout_height="match_parent"
+            android:background="@color/divider_color" />
+
+        <LinearLayout
+            android:layout_width="312dip"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+            <TextView
+                android:id="@+id/time_picker_title"
+                android:layout_width="match_parent"
+                android:layout_height="48dip"
+                android:text="@string/time_picker_title"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:textSize="20dip"
+                android:gravity="center" />
+
+            <TimePicker
+                android:id="@+id/time_picker"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/time_picker_title" />
+        </LinearLayout>
+    </LinearLayout>
+
+    <View
+        android:id="@+id/bottom_divider"
+        android:layout_width="match_parent"
+        android:layout_height="3dip"
+        android:layout_alignLeft="@id/timezone_auto_time"
+        android:layout_above="@+id/next_button"
+        android:layout_marginBottom="16dip"
+        android:background="@color/divider_color" />
+
+    <Button
+        android:id="@+id/next_button"
+        style="@style/setup_wizard_button"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentRight="true"
+        android:text="@string/next_label" />
+</RelativeLayout>
diff --git a/res/layout-xlarge-land/wifi_settings_for_setup_wizard_xl.xml b/res/layout-xlarge-land/wifi_settings_for_setup_wizard_xl.xml
new file mode 100644
index 0000000..78f182d
--- /dev/null
+++ b/res/layout-xlarge-land/wifi_settings_for_setup_wizard_xl.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+  -->
+
+<RelativeLayout
+    android:id="@+id/layout_root"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:paddingTop="60dip"
+    android:paddingLeft="128dip"
+    android:paddingRight="128dip"
+    android:paddingBottom="0dip" >
+
+    <FrameLayout
+        android:id="@+id/top_padding_layout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentTop="true">
+        <!-- Set to gone when software keyboard appears -->
+        <View
+             android:id="@+id/top_padding"
+             android:layout_width="match_parent"
+             android:layout_height="94dip" />
+    </FrameLayout>
+
+    <TextView
+        android:id="@+id/wifi_setup_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:minHeight="48dip"
+        android:layout_alignParentLeft="true"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="16dip"
+        android:layout_below="@id/top_padding_layout"
+        android:textSize="32dip"
+        android:textColor="#ff99cc00"
+        android:text="@string/wifi_setup_title"
+        android:gravity="bottom"/>
+
+    <!-- Divider -->
+    <RelativeLayout
+        android:id="@+id/top_divider"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/wifi_setup_title">
+        <ProgressBar
+            android:id="@+id/scanning_progress_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            style="?android:attr/progressBarStyleHorizontal" />
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:id="@+id/content"
+        android:layout_width="716dip"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/top_divider"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="10dip"
+        android:layout_marginBottom="0dip">
+
+        <FrameLayout
+            android:id="@+id/wifi_setup"
+            android:layout_width="match_parent"
+            android:layout_height="360dip">
+            <fragment
+                class="com.android.settings.wifi.WifiSettings"
+                android:id="@+id/wifi_setup_fragment"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+        </FrameLayout>
+        <FrameLayout
+            android:id="@+id/wifi_config_ui"
+            android:layout_width="wrap_content"
+            android:minWidth="406dip"
+            android:layout_height="wrap_content"
+            android:minHeight="160dip"
+            android:layout_alignParentLeft="true"
+            android:visibility="gone" />
+        <View
+            android:id="@+id/wifi_config_padding"
+            android:layout_width="match_parent"
+            android:layout_height="360dip"
+            android:visibility="gone" />
+        <LinearLayout
+            android:id="@+id/connecting_status_layout"
+            android:layout_width="match_parent"
+            android:layout_height="360dip"
+            android:visibility="gone">
+            <TextView
+                android:id="@+id/connecting_status"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:lineSpacingExtra="10dip"
+                android:inputType="textMultiLine"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:textSize="20sp"
+                android:clickable="false"
+                android:longClickable="false" />
+        </LinearLayout>
+
+    </RelativeLayout>
+
+    <!-- Divider -->
+    <View
+        android:id="@+id/bottom_divider"
+        android:layout_width="match_parent"
+        android:layout_height="3dip"
+        android:layout_marginBottom="16dip"
+        android:layout_below="@id/content"
+        android:layout_alignLeft="@id/content"
+        android:background="@color/divider_color" />  <!-- TODO: fix this -->
+
+    <RelativeLayout
+        android:id="@+id/bottom_buttons"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/bottom_divider"
+        android:layout_alignLeft="@id/bottom_divider"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentBottom="true">
+
+        <Button
+            android:id="@+id/wifi_setup_add_network"
+            style="@style/setup_wizard_button"
+            android:layout_alignParentLeft="true"
+            android:text="@string/wifi_setup_add_network"
+            android:enabled="false" />
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentRight="true"
+            android:orientation="horizontal">
+
+            <!-- This misleading name is for keeping consistency between non-XL
+                 layouts -->
+            <Button android:id="@+id/wifi_setup_cancel"
+                    style="@style/setup_wizard_button"
+                    android:text="@string/wifi_setup_back"
+                    android:visibility="gone" />
+
+            <Button android:id="@+id/wifi_setup_connect"
+                    style="@style/setup_wizard_button"
+                    android:layout_marginLeft="16dip"
+                    android:text="@string/wifi_setup_connect"
+                    android:enabled="false"
+                    android:visibility="gone" />
+
+            <Button android:id="@+id/wifi_setup_refresh_list"
+                    style="@style/setup_wizard_button"
+                    android:layout_marginLeft="16dip"
+                    android:text="@string/wifi_setup_refresh_list"
+                    android:enabled="false" />
+
+            <Button android:id="@+id/wifi_setup_skip_or_next"
+                    style="@style/setup_wizard_button"
+                    android:layout_marginLeft="16dip"
+                    android:text="@string/wifi_setup_skip"
+                    android:enabled="false" />
+        </LinearLayout>
+    </RelativeLayout>
+</RelativeLayout>
diff --git a/res/layout-xlarge/date_time_settings_setupwizard.xml b/res/layout-xlarge/date_time_settings_setupwizard.xml
index ee425eb..479e3fd 100644
--- a/res/layout-xlarge/date_time_settings_setupwizard.xml
+++ b/res/layout-xlarge/date_time_settings_setupwizard.xml
@@ -20,8 +20,8 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:paddingTop="154dip"
-    android:paddingLeft="128dip"
-    android:paddingRight="128dip"
+    android:paddingLeft="24dip"
+    android:paddingRight="24dip"
     android:paddingBottom="96dip">
 
     <!-- Title: Set date & time-->
diff --git a/res/layout-xlarge/wifi_settings_for_setup_wizard_xl.xml b/res/layout-xlarge/wifi_settings_for_setup_wizard_xl.xml
index 8926eee..dd76e70 100644
--- a/res/layout-xlarge/wifi_settings_for_setup_wizard_xl.xml
+++ b/res/layout-xlarge/wifi_settings_for_setup_wizard_xl.xml
@@ -21,8 +21,8 @@
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:paddingTop="60dip"
-    android:paddingLeft="128dip"
-    android:paddingRight="128dip"
+    android:paddingLeft="24dip"
+    android:paddingRight="24dip"
     android:paddingBottom="0dip" >
 
     <FrameLayout
diff --git a/res/layout/preference_dialog_ringervolume.xml b/res/layout/preference_dialog_ringervolume.xml
index 6d494c1..5aebedc 100644
--- a/res/layout/preference_dialog_ringervolume.xml
+++ b/res/layout/preference_dialog_ringervolume.xml
@@ -17,91 +17,119 @@
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
-        
+
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:orientation="vertical"
             android:gravity="center_horizontal"
-            android:paddingBottom="20dip">
-            
+            android:paddingBottom="12dip"
+            android:paddingTop="12dip">
+
         <ImageView android:id="@android:id/icon"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:paddingTop="20dip" />
-                
+                android:paddingTop="20dip"
+                android:visibility="gone"/>
+
         <TextView
                 android:id="@+id/ringtone_label"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/incoming_call_volume_title"
                 android:paddingTop="10dip"
-                android:paddingLeft="20dip" 
+                android:paddingLeft="20dip"
                 android:paddingRight="20dip" />
-        
+
         <!-- Used for the ring volume.  This is what the superclass VolumePreference uses. -->
+        <!-- TODO - is this used? -->
         <SeekBar android:id="@*android:id/seekbar"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:paddingTop="2dip"
-                android:paddingLeft="20dip" 
-                android:paddingRight="20dip" />
-            
-        <!-- Used for the media volume -->
-        <TextView
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:text="@string/media_volume_title"
-                android:paddingTop="10dip"
-                android:paddingLeft="20dip" 
-                android:paddingRight="20dip" />
-        <SeekBar android:id="@+id/media_volume_seekbar"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:paddingTop="2dip"
                 android:paddingLeft="20dip"
                 android:paddingRight="20dip" />
 
-        <!-- Used for the alarm volume -->
-        <TextView
+        <!-- Used for the media volume -->
+        <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="@string/alarm_volume_title"
-                android:paddingTop="10dip"
-                android:paddingLeft="20dip" 
-                android:paddingRight="20dip" />
-        <SeekBar android:id="@+id/alarm_volume_seekbar"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:paddingTop="2dip"
-                android:paddingLeft="20dip" 
-                android:paddingRight="20dip" />
+                android:orientation="horizontal"
+                android:gravity="center_vertical">
 
+                <ImageView android:id="@+id/volume_mute_button"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+
+                <SeekBar android:id="@+id/media_volume_seekbar"
+                        android:layout_width="0dip"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:paddingTop="2dip"
+                        android:paddingLeft="20dip"
+                        android:paddingRight="20dip" />
+        </LinearLayout>
+
+        <!-- TODO - is this used? -->
         <CheckBox android:id="@+id/same_notification_volume"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/checkbox_notification_same_as_incoming_call"
                 android:textAppearance="?android:attr/textAppearanceSmall"
                 android:layout_marginTop="6dip"
-                android:layout_marginLeft="20dip" 
+                android:layout_marginLeft="20dip"
                 android:layout_marginRight="20dip" />
-    
-        <TextView android:id="@+id/notification_volume_title"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:text="@string/notification_volume_title"
-                android:paddingTop="6dip"
-                android:paddingLeft="20dip" 
-                android:paddingRight="20dip" />
-        
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="#1bffffff"
+            android:layout_marginTop="16dip"
+            android:layout_marginBottom="16dip"/>
+
         <!-- Used for the notification volume -->
-        <SeekBar android:id="@+id/notification_volume_seekbar"
+        <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingTop="2dip"
-                android:paddingLeft="20dip" 
-                android:paddingRight="20dip" />
-        
+                android:orientation="horizontal">
+
+                <ImageView android:id="@+id/notification_mute_button"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+
+                <SeekBar android:id="@+id/notification_volume_seekbar"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:paddingTop="2dip"
+                        android:paddingLeft="20dip"
+                        android:paddingRight="20dip" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="#1bffffff"
+            android:layout_marginTop="16dip"
+            android:layout_marginBottom="16dip"/>
+
+        <!-- Used for the alarm volume -->
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+                <ImageView android:id="@+id/alarm_mute_button"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+
+                <SeekBar android:id="@+id/alarm_volume_seekbar"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:paddingTop="2dip"
+                        android:paddingLeft="20dip"
+                        android:paddingRight="20dip" />
+        </LinearLayout>
+
     </LinearLayout>
-     
-</ScrollView>    
\ No newline at end of file
+
+</ScrollView>
\ No newline at end of file
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index cb45473..6d55264 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -464,6 +464,22 @@
         <item>3</item>
     </string-array>
 
+    <!-- Authentication Types used in APN editor -->
+    <string-array name="apn_protocol_entries">
+        <item>IPv4</item>
+        <item>IPv6</item>
+        <item>IPv4/IPv6</item>
+    </string-array>
+
+    <string-array translatable="false" name="apn_protocol_values">
+        <!-- Do not translate. -->
+        <item>IP</item>
+        <!-- Do not translate. -->
+        <item>IPV6</item>
+        <!-- Do not translate. -->
+        <item>IPV4V6</item>
+    </string-array>
+
     <!-- Apps on SD instalaltion location options in ApplicationSettings -->
     <string-array name="app_install_location_entries">
         <item>Internal device storage</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fb1ec8c..5cc4d73 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1677,6 +1677,8 @@
     <string name="apn_auth_type_pap_chap">PAP or CHAP</string>
     <!-- Edit access point labels: The type of APN -->
     <string name="apn_type">APN type</string>
+    <!-- Edit access point labels: The protocol of the APN, e.g., "IPv4", "IPv6", or "IPv4/IPv6". -->
+    <string name="apn_protocol">APN protocol</string>
     <!-- Edit access point screen menu option to delete this APN -->
     <string name="menu_delete">Delete APN</string>
     <!-- APNs screen menu option to create a brand spanking new APN -->
diff --git a/res/xml/apn_editor.xml b/res/xml/apn_editor.xml
index 68a1b31..f000dd0 100644
--- a/res/xml/apn_editor.xml
+++ b/res/xml/apn_editor.xml
@@ -114,4 +114,11 @@
         android:singleLine="true"
         android:inputType="textNoSuggestions"
         />
+    <ListPreference
+        android:title="@string/apn_protocol"
+        android:dialogTitle="@string/apn_protocol"
+        android:key="apn_protocol"
+        android:entries="@array/apn_protocol_entries"
+        android:entryValues="@array/apn_protocol_values"
+        />
 </PreferenceScreen>   
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index 9328c14..f738823 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -48,6 +48,7 @@
 
     private final static String SAVED_POS = "pos";
     private final static String KEY_AUTH_TYPE = "auth_type";
+    private final static String KEY_PROTOCOL = "apn_protocol";
 
     private static final int MENU_DELETE = Menu.FIRST;
     private static final int MENU_SAVE = Menu.FIRST + 1;
@@ -69,6 +70,7 @@
     private EditTextPreference mMmsPort;
     private ListPreference mAuthType;
     private EditTextPreference mApnType;
+    private ListPreference mProtocol;
 
     private String mCurMnc;
     private String mCurMcc;
@@ -99,6 +101,7 @@
             Telephony.Carriers.MMSPORT, // 13
             Telephony.Carriers.AUTH_TYPE, // 14
             Telephony.Carriers.TYPE, // 15
+            Telephony.Carriers.PROTOCOL, // 16
     };
 
     private static final int ID_INDEX = 0;
@@ -116,6 +119,7 @@
     private static final int MMSPORT_INDEX = 13;
     private static final int AUTH_TYPE_INDEX = 14;
     private static final int TYPE_INDEX = 15;
+    private static final int PROTOCOL_INDEX = 16;
 
 
     @Override
@@ -139,9 +143,12 @@
         mMnc = (EditTextPreference) findPreference("apn_mnc");
         mApnType = (EditTextPreference) findPreference("apn_type");
 
-        mAuthType = (ListPreference) findPreference("auth_type");
+        mAuthType = (ListPreference) findPreference(KEY_AUTH_TYPE);
         mAuthType.setOnPreferenceChangeListener(this);
 
+        mProtocol = (ListPreference) findPreference(KEY_PROTOCOL);
+        mProtocol.setOnPreferenceChangeListener(this);
+
         mRes = getResources();
 
         final Intent intent = getIntent();
@@ -238,6 +245,7 @@
                 mAuthType.setValue(null);
             }
 
+            mProtocol.setValue(mCursor.getString(PROTOCOL_INDEX));
         }
 
         mName.setSummary(checkNull(mName.getText()));
@@ -264,6 +272,28 @@
         } else {
             mAuthType.setSummary(sNotSet);
         }
+
+        mProtocol.setSummary(
+                checkNull(protocolDescription(mProtocol.getValue())));
+    }
+
+    /**
+     * Returns the UI choice (e.g., "IPv4/IPv6") corresponding to the given
+     * raw value of the protocol preference (e.g., "IPV4V6"). If unknown,
+     * return null.
+     */
+    private String protocolDescription(String raw) {
+        int protocolIndex = mProtocol.findIndexOfValue(raw);
+        if (protocolIndex == -1) {
+            return null;
+        } else {
+            String[] values = mRes.getStringArray(R.array.apn_protocol_entries);
+            try {
+                return values[protocolIndex];
+            } catch (ArrayIndexOutOfBoundsException e) {
+                return null;
+            }
+        }
     }
 
     public boolean onPreferenceChange(Preference preference, Object newValue) {
@@ -278,6 +308,16 @@
             } catch (NumberFormatException e) {
                 return false;
             }
+            return true;
+        }
+
+        if (KEY_PROTOCOL.equals(key)) {
+            String protocol = protocolDescription((String) newValue);
+            if (protocol == null) {
+                return false;
+            }
+            mProtocol.setSummary(protocol);
+            mProtocol.setValue((String) newValue);
         }
         return true;
     }
@@ -389,6 +429,8 @@
             values.put(Telephony.Carriers.AUTH_TYPE, Integer.parseInt(authVal));
         }
 
+        values.put(Telephony.Carriers.PROTOCOL, checkNotSet(mProtocol.getValue()));
+
         values.put(Telephony.Carriers.TYPE, checkNotSet(mApnType.getText()));
 
         values.put(Telephony.Carriers.MCC, mcc);
diff --git a/src/com/android/settings/DateTimeSettingsSetupWizard.java b/src/com/android/settings/DateTimeSettingsSetupWizard.java
index c3d3bfd..08c0227 100644
--- a/src/com/android/settings/DateTimeSettingsSetupWizard.java
+++ b/src/com/android/settings/DateTimeSettingsSetupWizard.java
@@ -95,8 +95,6 @@
         mAutoTimeZoneButton.setText(autoTimeZoneEnabled ? R.string.zone_auto_summaryOn :
                 R.string.zone_auto_summaryOff);*/
 
-        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
-
         final TimeZone tz = TimeZone.getDefault();
         mSelectedTimeZone = tz;
         mTimeZoneButton = (Button)findViewById(R.id.time_zone_button);
diff --git a/src/com/android/settings/RingerVolumePreference.java b/src/com/android/settings/RingerVolumePreference.java
index daae1a7..b546265 100644
--- a/src/com/android/settings/RingerVolumePreference.java
+++ b/src/com/android/settings/RingerVolumePreference.java
@@ -16,20 +16,34 @@
 
 package com.android.settings;
 
+import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN;
+import static android.provider.Telephony.Intents.SPN_STRINGS_UPDATED_ACTION;
+
+import com.android.internal.telephony.TelephonyIntents;
+
 import android.app.Dialog;
+import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.media.AudioManager;
 import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.preference.VolumePreference;
 import android.provider.Settings;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.KeyEvent;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.widget.CheckBox;
 import android.widget.CompoundButton;
+import android.widget.ImageView;
 import android.widget.SeekBar;
 import android.widget.TextView;
 
@@ -38,12 +52,15 @@
  * notification volume.
  */
 public class RingerVolumePreference extends VolumePreference implements
-        CheckBox.OnCheckedChangeListener {
+        CheckBox.OnCheckedChangeListener, OnClickListener {
     private static final String TAG = "RingerVolumePreference";
+    private static final int MSG_RINGER_MODE_CHANGED = 101;
 
     private CheckBox mNotificationsUseRingVolumeCheckbox;
     private SeekBarVolumizer [] mSeekBarVolumizer;
     private boolean mIgnoreVolumeKeys;
+
+    // These arrays must all match in length and order
     private static final int[] SEEKBAR_ID = new int[] {
         R.id.notification_volume_seekbar,
         R.id.media_volume_seekbar,
@@ -51,9 +68,9 @@
     };
 
     private static final int[] NEED_VOICE_CAPABILITY_ID = new int[] {
-            R.id.ringtone_label,
-            com.android.internal.R.id.seekbar,
-            R.id.same_notification_volume
+        R.id.ringtone_label,
+        com.android.internal.R.id.seekbar,
+        R.id.same_notification_volume
     };
 
     private static final int[] SEEKBAR_TYPE = new int[] {
@@ -61,8 +78,63 @@
         AudioManager.STREAM_MUSIC,
         AudioManager.STREAM_ALARM
     };
+
+    private static final int[] CHECKBOX_VIEW_ID = new int[] {
+        R.id.notification_mute_button,
+        R.id.volume_mute_button,
+        R.id.alarm_mute_button
+    };
+
+    private static final int[] SEEKBAR_MUTED_RES_ID = new int[] {
+        com.android.internal.R.drawable.ic_audio_notification_mute,
+        com.android.internal.R.drawable.ic_audio_vol_mute,
+        com.android.internal.R.drawable.ic_audio_alarm_mute
+    };
+
+    private static final int[] SEEKBAR_UNMUTED_RES_ID = new int[] {
+        com.android.internal.R.drawable.ic_audio_notification,
+        com.android.internal.R.drawable.ic_audio_vol,
+        com.android.internal.R.drawable.ic_audio_alarm
+    };
+
+    private ImageView[] mCheckBoxes = new ImageView[SEEKBAR_MUTED_RES_ID.length];
+    private SeekBar[] mSeekBars = new SeekBar[SEEKBAR_ID.length];
+
+    private Handler mHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            updateSlidersAndMutedStates();
+        }
+    };
+
+    @Override
+    public void createActionButtons() {
+        setPositiveButtonText(android.R.string.ok);
+        setNegativeButtonText(null);
+    }
+
+    private void updateSlidersAndMutedStates() {
+        for (int i = 0; i < SEEKBAR_TYPE.length; i++) {
+            int streamType = SEEKBAR_TYPE[i];
+            boolean muted = mAudioManager.isStreamMute(streamType);
+
+            if (mCheckBoxes[i] != null) {
+                mCheckBoxes[i].setImageResource(
+                        muted ? SEEKBAR_MUTED_RES_ID[i] : SEEKBAR_UNMUTED_RES_ID[i]);
+            }
+            if (mSeekBars[i] != null) {
+                mSeekBars[i].setEnabled(!muted);
+                final int volume = muted ? mAudioManager.getLastAudibleStreamVolume(streamType)
+                        : mAudioManager.getStreamVolume(streamType);
+                mSeekBars[i].setProgress(volume);
+            }
+        }
+    }
+
+    private BroadcastReceiver mRingModeChangedReceiver;
+    private AudioManager mAudioManager;
+
     //private SeekBarVolumizer mNotificationSeekBarVolumizer;
-    private TextView mNotificationVolumeTitle;
+    //private TextView mNotificationVolumeTitle;
 
     public RingerVolumePreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -71,10 +143,12 @@
         setStreamType(AudioManager.STREAM_RING);
 
         setDialogLayoutResource(R.layout.preference_dialog_ringervolume);
-        setDialogIcon(R.drawable.ic_settings_sound);
+        //setDialogIcon(R.drawable.ic_settings_sound);
 
         mSeekBarVolumizer = new SeekBarVolumizer[SEEKBAR_ID.length];
         mIgnoreVolumeKeys = !Utils.isVoiceCapable(context);
+
+        mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
     }
 
     @Override
@@ -83,6 +157,7 @@
 
         for (int i = 0; i < SEEKBAR_ID.length; i++) {
             SeekBar seekBar = (SeekBar) view.findViewById(SEEKBAR_ID[i]);
+            mSeekBars[i] = seekBar;
             if (SEEKBAR_TYPE[i] == AudioManager.STREAM_MUSIC) {
                 mSeekBarVolumizer[i] = new SeekBarVolumizer(getContext(), seekBar,
                         SEEKBAR_TYPE[i], getMediaVolumeUri(getContext()));
@@ -92,7 +167,7 @@
             }
         }
 
-        mNotificationVolumeTitle = (TextView) view.findViewById(R.id.notification_volume_title);
+        //mNotificationVolumeTitle = (TextView) view.findViewById(R.id.notification_volume_title);
         mNotificationsUseRingVolumeCheckbox =
                 (CheckBox) view.findViewById(R.id.same_notification_volume);
         mNotificationsUseRingVolumeCheckbox.setOnCheckedChangeListener(this);
@@ -103,6 +178,32 @@
                         Settings.System.NOTIFICATIONS_USE_RING_VOLUME, 1) == 1);
         setNotificationVolumeVisibility(!mNotificationsUseRingVolumeCheckbox.isChecked());
         disableSettingsThatNeedVoice(view);
+
+        // Register callbacks for mute/unmute buttons
+        for (int i = 0; i < mCheckBoxes.length; i++) {
+            ImageView checkbox = (ImageView) view.findViewById(CHECKBOX_VIEW_ID[i]);
+            checkbox.setOnClickListener(this);
+            mCheckBoxes[i] = checkbox;
+        }
+
+        // Load initial states from AudioManager
+        updateSlidersAndMutedStates();
+
+        // Listen for updates from AudioManager
+        if (mRingModeChangedReceiver == null) {
+            final IntentFilter filter = new IntentFilter();
+            filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
+            mRingModeChangedReceiver = new BroadcastReceiver() {
+                public void onReceive(Context context, Intent intent) {
+                    final String action = intent.getAction();
+                    if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) {
+                        mHandler.sendMessage(mHandler.obtainMessage(MSG_RINGER_MODE_CHANGED,
+                                intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1), 0));
+                    }
+                }
+            };
+            getContext().registerReceiver(mRingModeChangedReceiver, filter);
+        }
     }
 
     private Uri getMediaVolumeUri(Context context) {
@@ -147,10 +248,8 @@
         if (isChecked) {
             // The user wants the notification to be same as ring, so do a
             // one-time sync right now
-            AudioManager audioManager = (AudioManager) getContext()
-                    .getSystemService(Context.AUDIO_SERVICE);
-            audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION,
-                    audioManager.getStreamVolume(AudioManager.STREAM_RING), 0);
+            mAudioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION,
+                    mAudioManager.getStreamVolume(AudioManager.STREAM_RING), 0);
         }
     }
 
@@ -184,7 +283,7 @@
             mSeekBarVolumizer[0].getSeekBar().setVisibility(
                     visible ? View.VISIBLE : View.GONE);
         }
-        mNotificationVolumeTitle.setVisibility(visible ? View.VISIBLE : View.GONE);
+        // mNotificationVolumeTitle.setVisibility(visible ? View.VISIBLE : View.GONE);
     }
 
     private void cleanup() {
@@ -199,6 +298,10 @@
                 mSeekBarVolumizer[i] = null;
             }
         }
+        if (mRingModeChangedReceiver != null) {
+            getContext().unregisterReceiver(mRingModeChangedReceiver);
+            mRingModeChangedReceiver = null;
+        }
     }
 
     @Override
@@ -286,4 +389,17 @@
             }
         };
     }
+
+    public void onClick(View v) {
+        // Touching any of the mute buttons causes us to get the state from the system and toggle it
+        switch(mAudioManager.getRingerMode()) {
+            case AudioManager.RINGER_MODE_NORMAL:
+                mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
+                break;
+            case AudioManager.RINGER_MODE_VIBRATE:
+            case AudioManager.RINGER_MODE_SILENT:
+                mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
+            break;
+        }
+    }
 }
diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java
index 648a9fe..b619145 100644
--- a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java
+++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java
@@ -21,6 +21,7 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Configuration;
 import android.net.NetworkInfo.DetailedState;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
@@ -670,7 +671,8 @@
      * Replace the current background with a new background whose id is resId if needed.
      */
     private void trySetBackground(int resId) {
-        if (mBackgroundId != resId) {
+        final int orientation = getResources().getConfiguration().orientation;
+        if (orientation == Configuration.ORIENTATION_LANDSCAPE && mBackgroundId != resId) {
             getWindow().setBackgroundDrawable(getResources().getDrawable(resId));
             mBackgroundId = resId;
         }