Merge "Remove pin and add restrictions for Security settings."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 059e9a0..c8362f0 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -130,8 +130,7 @@
         <activity android:name="Settings$WifiSettingsActivity"
                 android:taskAffinity=""
                 android:label="@string/wifi_settings"
-                android:configChanges="orientation|keyboardHidden|screenSize"
-                android:excludeFromRecents="true">
+                android:configChanges="orientation|keyboardHidden|screenSize">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.WIFI_SETTINGS" />
@@ -270,8 +269,7 @@
 
         <activity android:name="Settings$BluetoothSettingsActivity"
                 android:label="@string/bluetooth_settings_title"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.BLUETOOTH_SETTINGS" />
@@ -309,8 +307,7 @@
 
         <activity android:name="Settings$TetherSettingsActivity"
                 android:label="@string/tether_settings_title_all"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -352,8 +349,7 @@
 
         <activity android:name="Settings$VpnSettingsActivity"
                 android:label="@string/vpn_settings_title"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.net.vpn.SETTINGS" />
@@ -369,8 +365,7 @@
 
         <activity android:name="Settings$DateTimeSettingsActivity"
                 android:label="@string/date_and_time"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.DATE_SETTINGS" />
@@ -527,8 +522,7 @@
         <activity android:name="Settings$ZenModeSettingsActivity"
                 android:label="@string/zen_mode_settings_title"
                 android:exported="true"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.ZEN_MODE_SETTINGS" />
@@ -543,8 +537,7 @@
 
         <activity android:name="Settings$DisplaySettingsActivity"
                 android:label="@string/display_settings"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="com.android.settings.DISPLAY_SETTINGS" />
@@ -608,8 +601,7 @@
 
         <activity android:name="Settings$ManageApplicationsActivity"
                 android:label="@string/applications_settings"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.APPLICATION_SETTINGS" />
@@ -737,8 +729,7 @@
         <activity android:name="Settings$NotificationStationActivity"
                 android:theme="@android:style/Theme.DeviceDefault"
                 android:label="@string/notification_log_title"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -752,7 +743,6 @@
         <activity android:name="Settings$AppOpsSummaryActivity"
                 android:label="@string/app_ops_settings"
                 android:taskAffinity=""
-                android:excludeFromRecents="true"
                 android:enabled="false">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -771,8 +761,7 @@
         <activity android:name="Settings$LocationSettingsActivity"
                 android:label="@string/location_settings_title"
                 android:configChanges="orientation|keyboardHidden|screenSize"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.LOCATION_SOURCE_SETTINGS" />
@@ -807,8 +796,7 @@
         <activity android:name="MonitoringCertInfoActivity"
                 android:label="@string/ssl_ca_cert_dialog_title"
                 android:theme="@style/Transparent"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="com.android.settings.MONITORING_CERT_INFO" />
@@ -818,8 +806,7 @@
 
         <activity android:name="Settings$TrustedCredentialsSettingsActivity"
                 android:label="@string/trusted_credentials"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="com.android.settings.TRUSTED_CREDENTIALS" />
@@ -930,8 +917,7 @@
         <activity android:name="Settings$AccessibilitySettingsActivity"
                 android:label="@string/accessibility_settings"
                 android:configChanges="orientation|keyboardHidden|screenSize"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.ACCESSIBILITY_SETTINGS" />
@@ -1308,8 +1294,7 @@
 
         <activity android:name="Settings$WifiDisplaySettingsActivity"
                 android:label="@string/wifi_display_settings_title"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.WIFI_DISPLAY_SETTINGS" />
@@ -1437,8 +1422,7 @@
 
         <activity android:name="Settings$PowerUsageSummaryActivity"
                 android:label="@string/power_usage_summary_title"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.intent.action.POWER_USAGE_SUMMARY" />
@@ -1464,8 +1448,7 @@
 
         <activity android:name="Settings$BatterySaverSettingsActivity"
                 android:label="@string/battery_saver"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.BATTERY_SAVER_SETTINGS" />
@@ -1567,8 +1550,7 @@
 
         <activity android:name="Settings$DataUsageSummaryActivity"
                 android:label="@string/data_usage_summary_title"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -1582,8 +1564,7 @@
 
         <activity android:name="Settings$DreamSettingsActivity"
                 android:label="@string/screensaver_settings_title"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.DREAM_SETTINGS" />
@@ -1598,8 +1579,7 @@
 
         <activity android:name="Settings$UserSettingsActivity"
                 android:label="@string/user_settings_title"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.USER_SETTINGS" />
@@ -1613,8 +1593,7 @@
 
         <activity android:name="Settings$PaymentSettingsActivity"
                 android:label="@string/nfc_payment_settings_title"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.NFC_PAYMENT_SETTINGS" />
@@ -1657,8 +1636,7 @@
 
         <activity android:name="Settings$NotificationAccessSettingsActivity"
                   android:label="@string/manage_notification_access"
-                  android:taskAffinity=""
-                  android:excludeFromRecents="true">
+                  android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS" />
@@ -1672,8 +1650,7 @@
 
         <activity android:name="Settings$ConditionProviderSettingsActivity"
                   android:label="@string/manage_condition_providers"
-                  android:taskAffinity=""
-                  android:excludeFromRecents="true">
+                  android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.ACTION_CONDITION_PROVIDER_SETTINGS" />
@@ -1688,8 +1665,7 @@
         <activity android:name="Settings$NotificationSettingsActivity"
                 android:label="@string/notification_settings"
                 android:exported="true"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.NOTIFICATION_SETTINGS" />
@@ -1706,7 +1682,6 @@
         <activity-alias android:name="Settings$SoundSettingsActivity"
                 android:label="@string/notification_settings"
                 android:taskAffinity=""
-                android:excludeFromRecents="true"
                 android:targetActivity="Settings$NotificationSettingsActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -1735,8 +1710,7 @@
         <activity android:name="Settings$NotificationDisplaySettingsActivity"
                 android:label="@string/notification_display_settings"
                 android:exported="true"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.ACTION_NOTIFICATION_DISPLAY_SETTINGS" />
@@ -1751,8 +1725,7 @@
         <activity android:name="Settings$OtherSoundSettingsActivity"
                 android:label="@string/other_sound_settings"
                 android:exported="true"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.ACTION_OTHER_SOUND_SETTINGS" />
@@ -1767,8 +1740,7 @@
         <activity android:name="Settings$AppNotificationSettingsActivity"
                 android:label="@string/app_notifications_title"
                 android:exported="true"
-                android:taskAffinity=""
-                android:excludeFromRecents="true">
+                android:taskAffinity="">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.ACTION_APP_NOTIFICATION_SETTINGS" />
@@ -1784,7 +1756,6 @@
         <activity android:name="RegulatoryInfoDisplayActivity"
                   android:label="@string/regulatory_information"
                   android:taskAffinity=""
-                  android:excludeFromRecents="true"
                   android:enabled="@bool/config_show_regulatory_info">
             <intent-filter>
                 <action android:name="android.settings.SHOW_REGULATORY_INFO" />
diff --git a/res/layout/battery_history_chart.xml b/res/layout/battery_history_chart.xml
index 0d3e185..48eb7ed 100644
--- a/res/layout/battery_history_chart.xml
+++ b/res/layout/battery_history_chart.xml
@@ -14,22 +14,29 @@
      limitations under the License.
 -->
 
-<com.android.settings.fuelgauge.BatteryHistoryChart
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res/com.android.settings"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="center_vertical"
-    android:id="@+android:id/battery_history_chart"
-    android:paddingEnd="?android:attr/scrollbarSize"
-    android:textAppearance="?android:attr/textAppearanceSmall"
-    android:textColor="#ff000000"
-    app:headerAppearance="?android:attr/textAppearanceMedium"
-    android:shadowRadius="4"
-    android:shadowColor="?android:attr/colorBackground"
-    android:shadowDx="2"
-    android:shadowDy="2"
-    app:barPrimaryColor="?android:attr/colorControlActivated"
-    app:barPredictionColor="@color/material_empty_color_light"
-    app:chartMinHeight="@dimen/battery_history_chart_height">
-</com.android.settings.fuelgauge.BatteryHistoryChart>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <com.android.settings.fuelgauge.BatteryHistoryChart
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res/com.android.settings"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center_vertical"
+        android:id="@+android:id/battery_history_chart"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="#ff000000"
+        app:headerAppearance="?android:attr/textAppearanceMedium"
+        android:shadowRadius="4"
+        android:shadowColor="?android:attr/colorBackground"
+        android:shadowDx="2"
+        android:shadowDy="2"
+        app:barPrimaryColor="?android:attr/colorControlActivated"
+        app:barPredictionColor="@color/material_empty_color_light"
+        app:chartMinHeight="@dimen/battery_history_chart_height">
+    </com.android.settings.fuelgauge.BatteryHistoryChart>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/preference_batteryhistory.xml b/res/layout/preference_batteryhistory.xml
index 766ec51..723b0e1 100644
--- a/res/layout/preference_batteryhistory.xml
+++ b/res/layout/preference_batteryhistory.xml
@@ -18,11 +18,11 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="vertical"
-        android:minHeight="@dimen/battery_history_chart_height"
-        android:paddingEnd="?android:attr/scrollbarSize">
+        android:minHeight="@dimen/battery_history_chart_height">
     <include layout="@layout/battery_history_chart" />
     <TextView android:id="@+id/labelsHeader"
-              android:layout_width="match_parent" android:layout_height="48dp"
+              android:layout_width="match_parent"
+              android:layout_height="48dp"
               android:textAppearance="?android:attr/textAppearanceMedium"
               android:textSize="14sp"
               android:textColor="?android:attr/colorControlActivated"
diff --git a/res/layout/preference_progress_category.xml b/res/layout/preference_progress_category.xml
index 17d87d7..d0cf60c 100644
--- a/res/layout/preference_progress_category.xml
+++ b/res/layout/preference_progress_category.xml
@@ -22,7 +22,8 @@
 
     <!-- This text view has the style of the list separator text view without the background and padding. -->
     <TextView
-        style="?android:attr/listSeparatorTextViewStyle"
+        android:textAppearance="@android:style/TextAppearance.Material.Body2"
+        android:textColor="?android:attr/colorAccent"
         android:background="@null"
         android:id="@+android:id/title"
         android:paddingStart="0dp"
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 30516a1..b835add 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -47,27 +47,12 @@
     <color name="lock_pattern_view_success_color">#ff009688</color>
     <color name="lock_pattern_view_error_color">#fff4511e</color>
 
-    <color name="material_blue_grey_50">#ffeceff1</color>
-    <color name="material_blue_grey_100">#ffcfd8dc</color>
-    <color name="material_blue_grey_300">#ff90a4ae</color>
-    <color name="material_blue_grey_500">#ff607d8b</color>
-    <color name="material_blue_grey_700">#ff455a64</color>
-
-    <color name="material_orange_100">#ffffe0b2</color>
-    <color name="material_orange_300">#ffffb74d</color>
-    <color name="material_orange_500">#ffff9800</color>
-    <color name="material_orange_700">#fff57c00</color>
-    <color name="material_orange_A200">#ffffab40</color>
-    <color name="material_orange_A400">#ffff9100</color>
-
-    <color name="material_accent_color_light">#FF009688</color>
-    <color name="material_accent_color_dark">#FF80CBC4</color>
     <color name="material_empty_color_light">#FFCED7DB</color>
 
-    <!-- Palette colors referenced by top-level themes and manually copied into base theme. -->
+    <!-- Palette colors referenced by top-level themes. -->
     <color name="theme_primary">#ff263238</color>
-    <color name="theme_primary_dark">@color/theme_primary</color>
-    <color name="theme_accent">@color/material_accent_color_light</color>
+    <color name="theme_primary_dark">#ff21272b</color>
+    <color name="theme_accent">#ff009688</color>
 
     <color name="dashboard_background_color">#ffe1e1e0</color>
     <color name="switchbar_background_color">#ff384248</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d3c4334..eef43a7 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -74,7 +74,7 @@
 
     <dimen name="captioning_preview_height">200dp</dimen>
 
-    <dimen name="settings_side_margin">@*android:dimen/preference_fragment_padding_side</dimen>
+    <dimen name="settings_side_margin">0dip</dimen>
 
     <!-- Weight of the left pane in a multi-pane preference layout. -->
     <integer name="preferences_left_pane_weight">4</integer>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8281ee1..5e06432 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3741,6 +3741,9 @@
     <!-- [CHAR_LIMIT=40] Battery saver: Label for feature, title + menu item -->
     <string name="battery_saver">Battery saver</string>
 
+    <!-- [CHAR_LIMIT=40] Battery saver: Title for always on option -->
+    <string name="battery_saver_always_on_title">Always on</string>
+
     <!-- [CHAR_LIMIT=40] Battery saver: Title for automatic entry option -->
     <string name="battery_saver_turn_on_automatically_title">Turn on automatically</string>
 
@@ -3751,7 +3754,7 @@
     <string name="battery_saver_turn_on_automatically_pct">at %1$d%% battery</string>
 
     <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description -->
-    <string name="battery_saver_description">To help improve battery life, Battery saver will reduce your device’s performance.\n\nBattery saver will turn off when your device is plugged in.</string>
+    <string name="battery_saver_description">To help improve battery life, Battery saver will reduce your device’s performance.\n\nBattery saver will be disabled when your device is plugged in.</string>
 
     <!-- Process Stats strings -->
     <skip />
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 91685a2..e23b300 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -30,6 +30,8 @@
         <item name="ic_wps">@drawable/ic_wps_dark</item>
         <item name="setup_divider_color">@color/setup_divider_color_dark</item>
         <item name="wifi_signal">@drawable/wifi_signal_dark</item>
+        <item name="switchBarMarginStart">0dip</item>
+        <item name="switchBarMarginEnd">0dip</item>
     </style>
 
     <style name="SetupWizardWifiTheme.Light" parent="android:Theme.Material.Light.NoActionBar">
@@ -41,6 +43,8 @@
         <item name="ic_wps">@drawable/ic_wps_light</item>
         <item name="setup_divider_color">@color/setup_divider_color_light</item>
         <item name="wifi_signal">@drawable/wifi_signal_light</item>
+        <item name="switchBarMarginStart">0dip</item>
+        <item name="switchBarMarginEnd">0dip</item>
     </style>
 
     <style name="Theme.WifiDialog" parent="@*android:style/Theme.Material.Dialog.Alert">
@@ -63,14 +67,7 @@
          layouts against a remote context using our local theme colors. Due to the implementation
          details of Theme, we can't reference any local resources and MUST instead use the values
          directly. So use #ff263238 instead of @color/theme_primary and so on. -->
-    <style name="Theme.SettingsBase" parent="@android:style/Theme.Material.Light.DarkActionBar">
-        <!-- Should match @color/theme_primary. -->
-        <item name="android:colorPrimary">#ff263238</item>
-        <!-- Should match @color/theme_primary_dark. -->
-        <item name="android:colorPrimaryDark">#ff263238</item>
-        <!-- Should match @color/theme_accent. -->
-        <item name="android:colorAccent">#ff009688</item>
-    </style>
+    <style name="Theme.SettingsBase" parent="@android:style/Theme.Material.Settings" />
 
     <style name="Theme.Settings" parent="Theme.SettingsBase">
         <item name="@*android:preferenceHeaderPanelStyle">@style/PreferenceHeaderPanelSinglePane</item>
@@ -115,7 +112,7 @@
         <item name="android:contentInsetStart">@dimen/actionbar_subsettings_contentInsetStart</item>
     </style>
 
-    <style name="Theme.DialogWhenLarge" parent="android:style/Theme.Material.Light.DialogWhenLarge">
+    <style name="Theme.DialogWhenLarge" parent="@android:style/Theme.Material.Light.DialogWhenLarge">
         <!-- Used by the ActionBar -->
         <item name="android:colorPrimary">@color/theme_primary</item>
         <!-- Used by the StatusBar -->
diff --git a/res/xml/battery_saver_settings.xml b/res/xml/battery_saver_settings.xml
index a3729c5..472586a 100644
--- a/res/xml/battery_saver_settings.xml
+++ b/res/xml/battery_saver_settings.xml
@@ -18,6 +18,14 @@
         android:title="@string/battery_saver"
         android:key="battery_saver">
 
+    <!-- Always on -->
+    <SwitchPreference
+            android:key="always_on"
+            android:title="@string/battery_saver_always_on_title"
+            android:switchTextOff=""
+            android:switchTextOn=""
+            android:persistent="false" />
+
     <!-- Turn on automatically -->
     <com.android.settings.notification.DropDownPreference
             android:key="turn_on_automatically"
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 93cb8c6..6d1cadc 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -167,7 +167,6 @@
     private WifiManager mWifiManager;
 
     private SwitchBar mSwitchBar;
-    private Switch mEnabledSwitch;
     private boolean mLastEnabledState;
     private boolean mHaveDebugSettings;
     private boolean mDontPokeProperties;
@@ -386,11 +385,12 @@
         final SettingsActivity activity = (SettingsActivity) getActivity();
 
         mSwitchBar = activity.getSwitchBar();
-        mEnabledSwitch = mSwitchBar.getSwitch();
-        if (mUnavailable) {
-            mEnabledSwitch.setEnabled(false);
+       if (mUnavailable) {
+            mSwitchBar.setEnabled(false);
             return;
         }
+
+        mSwitchBar.addOnSwitchChangeListener(this);
     }
 
     private boolean removePreferenceForProduction(Preference preference) {
@@ -441,7 +441,7 @@
         final ContentResolver cr = getActivity().getContentResolver();
         mLastEnabledState = Settings.Global.getInt(cr,
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
-        mEnabledSwitch.setChecked(mLastEnabledState);
+        mSwitchBar.setChecked(mLastEnabledState);
         setPrefsEnabledState(mLastEnabledState);
 
         if (mHaveDebugSettings && !mLastEnabledState) {
@@ -452,17 +452,15 @@
             Settings.Global.putInt(getActivity().getContentResolver(),
                     Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
             mLastEnabledState = true;
-            mEnabledSwitch.setChecked(mLastEnabledState);
+            mSwitchBar.setChecked(mLastEnabledState);
             setPrefsEnabledState(mLastEnabledState);
         }
-
-        mSwitchBar.addOnSwitchChangeListener(this);
         mSwitchBar.show();
     }
 
     @Override
-    public void onPause() {
-        super.onPause();
+    public void onDestroyView() {
+        super.onDestroyView();
 
         if (mUnavailable) {
             return;
@@ -1213,7 +1211,7 @@
 
     @Override
     public void onSwitchChanged(Switch switchView, boolean isChecked) {
-        if (switchView != mEnabledSwitch) {
+        if (switchView != mSwitchBar.getSwitch()) {
             return;
         }
         if (isChecked != mLastEnabledState) {
@@ -1466,7 +1464,7 @@
                 setPrefsEnabledState(mLastEnabledState);
             } else {
                 // Reset the toggle
-                mEnabledSwitch.setChecked(false);
+                mSwitchBar.setChecked(false);
             }
         }
     }
@@ -1480,7 +1478,7 @@
             mAdbDialog = null;
         } else if (dialog == mEnableDialog) {
             if (!mDialogClicked) {
-                mEnabledSwitch.setChecked(false);
+                mSwitchBar.setChecked(false);
             }
             mEnableDialog = null;
         }
diff --git a/src/com/android/settings/DreamSettings.java b/src/com/android/settings/DreamSettings.java
index 1175639..38cba7a 100644
--- a/src/com/android/settings/DreamSettings.java
+++ b/src/com/android/settings/DreamSettings.java
@@ -61,7 +61,6 @@
     private DreamBackend mBackend;
     private DreamInfoAdapter mAdapter;
     private SwitchBar mSwitchBar;
-    private Switch mSwitch;
     private MenuItem[] mMenuItemsWhenEnabled;
     private boolean mRefreshing;
 
@@ -105,6 +104,9 @@
     public void onDestroyView() {
         logd("onDestroyView()");
         super.onDestroyView();
+
+        mSwitchBar.removeOnSwitchChangeListener(this);
+        mSwitchBar.hide();
     }
 
     @Override
@@ -124,7 +126,8 @@
 
         final SettingsActivity sa = (SettingsActivity) getActivity();
         mSwitchBar = sa.getSwitchBar();
-        mSwitch = mSwitchBar.getSwitch();
+        mSwitchBar.addOnSwitchChangeListener(this);
+        mSwitchBar.show();
     }
 
     @Override
@@ -212,9 +215,6 @@
         super.onPause();
 
         mContext.unregisterReceiver(mPackageReceiver);
-
-        mSwitchBar.removeOnSwitchChangeListener(this);
-        mSwitchBar.hide();
     }
 
     @Override
@@ -231,9 +231,6 @@
         filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
         filter.addDataScheme(PACKAGE_SCHEME);
         mContext.registerReceiver(mPackageReceiver , filter);
-
-        mSwitchBar.addOnSwitchChangeListener(this);
-        mSwitchBar.show();
     }
 
     public static int getSummaryResource(Context context) {
@@ -263,8 +260,8 @@
         logd("refreshFromBackend()");
         mRefreshing = true;
         boolean dreamsEnabled = mBackend.isEnabled();
-        if (mSwitch.isChecked() != dreamsEnabled)
-            mSwitch.setChecked(dreamsEnabled);
+        if (mSwitchBar.isChecked() != dreamsEnabled)
+            mSwitchBar.setChecked(dreamsEnabled);
 
         mAdapter.clear();
         if (dreamsEnabled) {
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 5b3a61d..60a086a 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -22,6 +22,7 @@
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -43,6 +44,7 @@
 import android.security.KeyStore;
 import android.service.trust.TrustAgentService;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.internal.widget.LockPatternUtils;
@@ -311,27 +313,30 @@
             PackageManager pm = getPackageManager();
             List<ResolveInfo> resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT,
                     PackageManager.GET_META_DATA);
-            for (ResolveInfo resolveInfo : resolveInfos) {
-                if (resolveInfo.serviceInfo == null) continue;
-                if (!TrustAgentUtils.checkProvidePermission(resolveInfo, pm)) continue;
-                TrustAgentUtils.TrustAgentComponentInfo trustAgentComponentInfo =
-                        TrustAgentUtils.getSettingsComponent(pm, resolveInfo);
-                if (trustAgentComponentInfo.componentName == null ||
-                        trustAgentComponentInfo.title == null ||
-                        trustAgentComponentInfo.title == "") continue;
-                Preference trustAgentPreference =
-                        new Preference(securityCategory.getContext());
-                trustAgentPreference.setKey(KEY_TRUST_AGENT);
-                trustAgentPreference.setTitle(trustAgentComponentInfo.title);
-                trustAgentPreference.setSummary(trustAgentComponentInfo.summary);
-                // Create intent for this preference.
-                Intent intent = new Intent();
-                intent.setComponent(trustAgentComponentInfo.componentName);
-                intent.setAction(Intent.ACTION_MAIN);
-                trustAgentPreference.setIntent(intent);
-                // Add preference to the settings menu.
-                securityCategory.addPreference(trustAgentPreference);
-                break; // Only render the first one.
+            List<ComponentName> enabledTrustAgents = mLockPatternUtils.getEnabledTrustAgents();
+            if (enabledTrustAgents != null && !enabledTrustAgents.isEmpty()) {
+                for (ResolveInfo resolveInfo : resolveInfos) {
+                    if (resolveInfo.serviceInfo == null) continue;
+                    if (!TrustAgentUtils.checkProvidePermission(resolveInfo, pm)) continue;
+                    TrustAgentUtils.TrustAgentComponentInfo trustAgentComponentInfo =
+                            TrustAgentUtils.getSettingsComponent(pm, resolveInfo);
+                    if (trustAgentComponentInfo.componentName == null ||
+                            !enabledTrustAgents.contains(trustAgentComponentInfo.componentName) ||
+                            TextUtils.isEmpty(trustAgentComponentInfo.title)) continue;
+                    Preference trustAgentPreference =
+                            new Preference(securityCategory.getContext());
+                    trustAgentPreference.setKey(KEY_TRUST_AGENT);
+                    trustAgentPreference.setTitle(trustAgentComponentInfo.title);
+                    trustAgentPreference.setSummary(trustAgentComponentInfo.summary);
+                    // Create intent for this preference.
+                    Intent intent = new Intent();
+                    intent.setComponent(trustAgentComponentInfo.componentName);
+                    intent.setAction(Intent.ACTION_MAIN);
+                    trustAgentPreference.setIntent(intent);
+                    // Add preference to the settings menu.
+                    securityCategory.addPreference(trustAgentPreference);
+                    break; // Only render the first one.
+                }
             }
         }
 
diff --git a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
index 41c80ae..53d614d 100644
--- a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
+++ b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
@@ -142,27 +142,30 @@
                 refreshPreviewText();
             }
         });
+    }
 
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        final boolean enabled = mCaptioningManager.isEnabled();
         SettingsActivity activity = (SettingsActivity) getActivity();
         mSwitchBar = activity.getSwitchBar();
+        mSwitchBar.setTextViewLabel(enabled);
         mToggleSwitch = mSwitchBar.getSwitch();
         mToggleSwitch.setCheckedInternal(enabled);
 
         getPreferenceScreen().setEnabled(enabled);
 
         refreshPreviewText();
-    }
 
-    @Override
-    public void onResume() {
-        super.onResume();
         installSwitchBarToggleSwitch();
     }
 
     @Override
-    public void onPause() {
+    public void onDestroyView() {
+        super.onDestroyView();
         removeSwitchBarToggleSwitch();
-        super.onPause();
     }
 
     private void refreshPreviewText() {
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 331c0e3..bc21759 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -95,17 +95,17 @@
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
 
         installActionBarToggleSwitch();
     }
 
     @Override
-    public void onPause() {
-        removeActionBarToggleSwitch();
+    public void onDestroyView() {
+        super.onDestroyView();
 
-        super.onPause();
+        removeActionBarToggleSwitch();
     }
 
     protected abstract void onPreferenceToggled(String preferenceKey, boolean enabled);
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java
index be03b63..45f3d06 100644
--- a/src/com/android/settings/bluetooth/BluetoothEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java
@@ -89,6 +89,16 @@
         mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
     }
 
+    public void setupSwitchBar() {
+        mSwitchBar.addOnSwitchChangeListener(this);
+        mSwitchBar.show();
+    }
+
+    public void teardownSwitchBar() {
+        mSwitchBar.removeOnSwitchChangeListener(this);
+        mSwitchBar.hide();
+    }
+
     public void resume(Context context) {
         if (mLocalAdapter == null) {
             mSwitch.setEnabled(false);
@@ -103,8 +113,6 @@
         handleStateChanged(mLocalAdapter.getBluetoothState());
 
         mContext.registerReceiver(mReceiver, mIntentFilter);
-        mSwitchBar.addOnSwitchChangeListener(this);
-        mSwitchBar.show();
         mValidListener = true;
     }
 
@@ -114,8 +122,6 @@
         }
 
         mContext.unregisterReceiver(mReceiver);
-        mSwitchBar.removeOnSwitchChangeListener(this);
-        mSwitchBar.hide();
         mValidListener = false;
     }
 
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index dd4edff..eb318cd 100755
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -119,6 +119,14 @@
         mSwitchBar = activity.getSwitchBar();
 
         mBluetoothEnabler = new BluetoothEnabler(activity, mSwitchBar);
+        mBluetoothEnabler.setupSwitchBar();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+
+        mBluetoothEnabler.teardownSwitchBar();
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryChart.java b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
index 04f4050..85047ce 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
@@ -201,10 +201,7 @@
     int mLevelBottom;
     int mLevelLeft;
     int mLevelRight;
-    static final int PHONE_SIGNAL_X_MASK = CHART_DATA_X_MASK;
-    static final int PHONE_SIGNAL_BIN_MASK = CHART_DATA_BIN_MASK;
-    static final int PHONE_SIGNAL_BIN_SHIFT = CHART_DATA_BIN_SHIFT;
-    
+
     int mNumHist;
     long mHistStart;
     long mHistDataEnd;
@@ -360,18 +357,22 @@
         mBatteryCriticalPaint.setStyle(Paint.Style.STROKE);
         mTimeRemainPaint.setColor(0xFFCED7BB);
         mTimeRemainPaint.setStyle(Paint.Style.FILL);
-        mChargingPaint.setARGB(255, 0, 128, 0);
         mChargingPaint.setStyle(Paint.Style.STROKE);
         mScreenOnPaint.setStyle(Paint.Style.STROKE);
         mGpsOnPaint.setStyle(Paint.Style.STROKE);
         mWifiRunningPaint.setStyle(Paint.Style.STROKE);
         mCpuRunningPaint.setStyle(Paint.Style.STROKE);
         mPhoneSignalChart.setColors(new int[] {
-                0x00000000, 0xffa00000, 0xffa07000, 0xffa0a000,
-                0xff80a000, 0xff409000, 0xff008000
+                0x00000000, 0xffc43828, 0xffe54918, 0xfff47b00,
+                0xfffabf2c, 0xff679e37, 0xff0a7f42
         });
         mDebugRectPaint.setARGB(255, 255, 0, 0);
         mDebugRectPaint.setStyle(Paint.Style.STROKE);
+        mScreenOnPaint.setColor(0xFF009688);
+        mGpsOnPaint.setColor(0xFF009688);
+        mWifiRunningPaint.setColor(0xFF009688);
+        mCpuRunningPaint.setColor(0xFF009688);
+        mChargingPaint.setColor(0xFF009688);
 
         TypedArray a =
             context.obtainStyledAttributes(
@@ -428,6 +429,11 @@
 
                 case R.styleable.BatteryHistoryChart_barPrimaryColor:
                     mBatteryBackgroundPaint.setColor(a.getInt(attr, 0));
+                    mScreenOnPaint.setColor(a.getInt(attr, 0));
+                    mGpsOnPaint.setColor(a.getInt(attr, 0));
+                    mWifiRunningPaint.setColor(a.getInt(attr, 0));
+                    mCpuRunningPaint.setColor(a.getInt(attr, 0));
+                    mChargingPaint.setColor(a.getInt(attr, 0));
                     break;
 
                 case R.styleable.BatteryHistoryChart_barPredictionColor:
@@ -483,11 +489,9 @@
                 R.string.percentage, 0);
 
         int batteryLevel = com.android.settings.Utils.getBatteryLevel(mBatteryBroadcast);
-        final int status = mBatteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
-                BatteryManager.BATTERY_STATUS_UNKNOWN);
         long remainingTimeUs = 0;
         mDischarging = true;
-        if (status == BatteryManager.BATTERY_STATUS_DISCHARGING) {
+        if (mBatteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) == 0) {
             final long drainTime = mStats.computeBatteryTimeRemaining(elapsedRealtimeUs);
             if (drainTime > 0) {
                 remainingTimeUs = drainTime;
@@ -503,6 +507,8 @@
             final long chargeTime = mStats.computeChargeTimeRemaining(elapsedRealtimeUs);
             final String statusLabel = com.android.settings.Utils.getBatteryStatus(getResources(),
                     mBatteryBroadcast);
+            final int status = mBatteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
+                    BatteryManager.BATTERY_STATUS_UNKNOWN);
             if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) {
                 mDischarging = false;
                 remainingTimeUs = chargeTime;
@@ -692,17 +698,9 @@
                 // Compress lines to make more room for chart.
                 mLineWidth = textHeight/3;
             }
-            mScreenOnPaint.setARGB(255, 32, 64, 255);
-            mGpsOnPaint.setARGB(255, 32, 64, 255);
-            mWifiRunningPaint.setARGB(255, 32, 64, 255);
-            mCpuRunningPaint.setARGB(255, 32, 64, 255);
         } else {
             mLargeMode = false;
             mLineWidth = mThinLineWidth;
-            mScreenOnPaint.setARGB(255, 0, 0, 255);
-            mGpsOnPaint.setARGB(255, 0, 0, 255);
-            mWifiRunningPaint.setARGB(255, 0, 0, 255);
-            mCpuRunningPaint.setARGB(255, 0, 0, 255);
         }
         if (mLineWidth <= 0) mLineWidth = 1;
 
diff --git a/src/com/android/settings/fuelgauge/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
index b62ddb7..808fb25 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverSettings.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
@@ -24,40 +24,50 @@
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.Message;
 import android.provider.Settings.Global;
 import android.util.Log;
-import android.widget.Switch;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.notification.SettingPref;
-import com.android.settings.widget.SwitchBar;
 
-public class BatterySaverSettings extends SettingsPreferenceFragment
-        implements SwitchBar.OnSwitchChangeListener {
+public class BatterySaverSettings extends SettingsPreferenceFragment {
     private static final String TAG = "BatterySaverSettings";
+    private static final String KEY_ALWAYS_ON = "always_on";
     private static final String KEY_TURN_ON_AUTOMATICALLY = "turn_on_automatically";
     private static final long WAIT_FOR_SWITCH_ANIM = 500;
 
-    private final H mHandler = new H();
+    private final Handler mHandler = new Handler();
     private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler);
 
     private Context mContext;
-    private SwitchBar mSwitchBar;
-    private boolean mSwitchBarListenerAdded;
+    private boolean mCreated;
+    private SettingPref mAlwaysOnPref;
     private SettingPref mTriggerPref;
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-
+        if (mCreated) return;
+        mCreated = true;
         addPreferencesFromResource(R.xml.battery_saver_settings);
 
         mContext = getActivity();
-        mSwitchBar = ((SettingsActivity) mContext).getSwitchBar();
-        updateSwitchBar();
+        mAlwaysOnPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_ALWAYS_ON,
+                Global.LOW_POWER_MODE, 0) {
+            @Override
+            protected boolean setSetting(Context context, int value) {
+                mHandler.removeCallbacks(mStartMode);
+                if (value == 0) {
+                    return super.setSetting(context, value);
+                } else {
+                    // about lose animations, make sure we don't turn the mode on until the switch
+                    // stops moving
+                    mHandler.postDelayed(mStartMode, WAIT_FOR_SWITCH_ANIM);
+                    return true;
+                }
+            }
+        };
         mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY,
                 Global.LOW_POWER_MODE_TRIGGER_LEVEL,
                 mContext.getResources().getInteger(
@@ -71,76 +81,34 @@
                 return res.getString(R.string.battery_saver_turn_on_automatically_never);
             }
         };
+        mAlwaysOnPref.init(this);
         mTriggerPref.init(this);
     }
 
-    private void updateSwitchBar() {
-        final boolean mode = Global.getInt(getContentResolver(), Global.LOW_POWER_MODE, 0) != 0;
-        if (mSwitchBarListenerAdded) {
-            mSwitchBar.removeOnSwitchChangeListener(this);
-        }
-        mSwitchBar.getSwitch().setChecked(mode);
-        if (mSwitchBarListenerAdded) {
-            mSwitchBar.addOnSwitchChangeListener(this);
-        }
-    }
-
-    private void updateTriggerLevel() {
-        mTriggerPref.update(mContext);
-    }
-
     @Override
     public void onResume() {
         super.onResume();
-        updateSwitchBar();
         mSettingsObserver.setListening(true);
-        mSwitchBar.show();
-        mSwitchBar.addOnSwitchChangeListener(this);
-        mSwitchBarListenerAdded = true;
     }
 
     @Override
     public void onPause() {
         super.onPause();
         mSettingsObserver.setListening(false);
-        if (mSwitchBarListenerAdded) {
-            mSwitchBar.removeOnSwitchChangeListener(this);
-            mSwitchBarListenerAdded = false;
-        }
-        mSwitchBar.hide();
     }
 
-    @Override
-    public void onSwitchChanged(Switch switchView, boolean isChecked) {
-        mHandler.postSetMode(isChecked);
-    }
-
-    private void handleSetMode(final boolean mode) {
-        AsyncTask.execute(new Runnable() {
-            @Override
-            public void run() {
-                Log.d(TAG, "LOW_POWER_MODE from settings: " + mode);
-                Global.putInt(getContentResolver(), Global.LOW_POWER_MODE, mode ? 1 : 0);
-            }
-        });
-    }
-
-    private final class H extends Handler {
-        private static final int SET_MODE = 1;
-
-        public void postSetMode(boolean mode) {
-            removeMessages(SET_MODE);
-            final Message m = obtainMessage(SET_MODE, mode ? 1 : 0, 0);
-            sendMessageDelayed(m, mode ? WAIT_FOR_SWITCH_ANIM : 0);
-        }
-
+    private final Runnable mStartMode = new Runnable() {
         @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == SET_MODE) {
-                handleSetMode(msg.arg1 != 0);
-            }
+        public void run() {
+            AsyncTask.execute(new Runnable() {
+                @Override
+                public void run() {
+                    Log.d(TAG, "Starting LOW_POWER_MODE from settings");
+                    Global.putInt(mContext.getContentResolver(), Global.LOW_POWER_MODE, 1);
+                }
+            });
         }
-    }
+    };
 
     private final class SettingsObserver extends ContentObserver {
         private final Uri LOW_POWER_MODE_URI = Global.getUriFor(Global.LOW_POWER_MODE);
@@ -154,10 +122,10 @@
         @Override
         public void onChange(boolean selfChange, Uri uri) {
             if (LOW_POWER_MODE_URI.equals(uri)) {
-                updateSwitchBar();
+                mAlwaysOnPref.update(mContext);
             }
             if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) {
-                updateTriggerLevel();
+                mTriggerPref.update(mContext);
             }
         }
 
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index 8794a8d..b10d4b6 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -73,6 +73,16 @@
 
         mSwitchBar = activity.getSwitchBar();
         mSwitch = mSwitchBar.getSwitch();
+        mSwitchBar.addOnSwitchChangeListener(this);
+        mSwitchBar.show();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+
+        mSwitchBar.removeOnSwitchChangeListener(this);
+        mSwitchBar.hide();
     }
 
     @Override
@@ -84,8 +94,6 @@
     public void onResume() {
         super.onResume();
         createPreferenceHierarchy();
-        mSwitchBar.addOnSwitchChangeListener(this);
-        mSwitchBar.show();
         mValidListener = true;
     }
 
@@ -97,8 +105,6 @@
             // Ignore exceptions caused by race condition
         }
         super.onPause();
-        mSwitchBar.removeOnSwitchChangeListener(this);
-        mSwitchBar.hide();
         mValidListener = false;
     }
 
diff --git a/src/com/android/settings/nfc/AndroidBeam.java b/src/com/android/settings/nfc/AndroidBeam.java
index eb3ff9b..add0fa7 100644
--- a/src/com/android/settings/nfc/AndroidBeam.java
+++ b/src/com/android/settings/nfc/AndroidBeam.java
@@ -33,7 +33,6 @@
     private View mView;
     private NfcAdapter mNfcAdapter;
     private SwitchBar mSwitchBar;
-    private Switch mSwitch;
     private CharSequence mOldActivityTitle;
 
     @Override
@@ -63,46 +62,33 @@
         SettingsActivity activity = (SettingsActivity) getActivity();
 
         mSwitchBar = activity.getSwitchBar();
-        mSwitch = mSwitchBar.getSwitch();
-        mSwitch.setChecked(mNfcAdapter.isNdefPushEnabled());
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
+        mSwitchBar.setChecked(mNfcAdapter.isNdefPushEnabled());
         mSwitchBar.addOnSwitchChangeListener(this);
         mSwitchBar.show();
     }
 
     @Override
-    public void onPause() {
-        super.onPause();
-
-        mSwitchBar.removeOnSwitchChangeListener(this);
-        mSwitchBar.hide();
-    }
-
-    @Override
     public void onDestroyView() {
         super.onDestroyView();
         if (mOldActivityTitle != null) {
             getActivity().getActionBar().setTitle(mOldActivityTitle);
         }
+        mSwitchBar.removeOnSwitchChangeListener(this);
+        mSwitchBar.hide();
     }
 
     @Override
     public void onSwitchChanged(Switch switchView, boolean desiredState) {
         boolean success = false;
-        mSwitch.setEnabled(false);
+        mSwitchBar.setEnabled(false);
         if (desiredState) {
             success = mNfcAdapter.enableNdefPush();
         } else {
             success = mNfcAdapter.disableNdefPush();
         }
         if (success) {
-            mSwitch.setChecked(desiredState);
+            mSwitchBar.setChecked(desiredState);
         }
-        mSwitch.setEnabled(true);
+        mSwitchBar.setEnabled(true);
     }
 }
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index e9323d8..40e2c55 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -107,7 +107,6 @@
     private final SettingsObserver mSettingsObserver = new SettingsObserver();
 
     private SwitchBar mSwitchBar;
-    private Switch mSwitch;
     private Context mContext;
     private PackageManager mPM;
     private ZenModeConfig mConfig;
@@ -159,7 +158,8 @@
         if (DEBUG) Log.d(TAG, "Loaded mConfig=" + mConfig);
 
         mSwitchBar = ((SettingsActivity) mContext).getSwitchBar();
-        mSwitch = mSwitchBar.getSwitch();
+        mSwitchBar.addOnSwitchChangeListener(this);
+        mSwitchBar.show();
 
         final PreferenceCategory general = (PreferenceCategory) root.findPreference(KEY_GENERAL);
 
@@ -400,14 +400,17 @@
         updateControls();
         updateZenMode();
         mSettingsObserver.register();
-        mSwitchBar.addOnSwitchChangeListener(this);
-        mSwitchBar.show();
     }
 
     @Override
     public void onPause() {
         super.onPause();
         mSettingsObserver.unregister();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
         mSwitchBar.removeOnSwitchChangeListener(this);
         mSwitchBar.hide();
     }
@@ -415,8 +418,8 @@
     private void updateZenMode() {
         final boolean zenMode = Global.getInt(getContentResolver(),
                 Global.ZEN_MODE, Global.ZEN_MODE_OFF) != Global.ZEN_MODE_OFF;
-        if (mSwitch.isChecked() != zenMode) {
-            mSwitch.setChecked(zenMode);
+        if (mSwitchBar.isChecked() != zenMode) {
+            mSwitchBar.setChecked(zenMode);
             mIgnoreNext = true;
         }
     }
diff --git a/src/com/android/settings/print/PrintServiceSettingsFragment.java b/src/com/android/settings/print/PrintServiceSettingsFragment.java
index 08b1a64..7af6338 100644
--- a/src/com/android/settings/print/PrintServiceSettingsFragment.java
+++ b/src/com/android/settings/print/PrintServiceSettingsFragment.java
@@ -143,16 +143,12 @@
         mSettingsContentObserver.register(getContentResolver());
         updateEmptyView();
         updateUiForServiceState();
-        mSwitchBar.addOnSwitchChangeListener(this);
-        mSwitchBar.show();
     }
 
     @Override
     public void onPause() {
         mSettingsContentObserver.unregister(getContentResolver());
         super.onPause();
-        mSwitchBar.removeOnSwitchChangeListener(this);
-        mSwitchBar.hide();
     }
 
     @Override
@@ -168,6 +164,8 @@
             getActivity().getActionBar().setTitle(mOldActivityTitle);
         }
         super.onDestroyView();
+        mSwitchBar.removeOnSwitchChangeListener(this);
+        mSwitchBar.hide();
     }
 
     private void onPreferenceToggled(String preferenceKey, boolean enabled) {
@@ -292,6 +290,8 @@
         final SettingsActivity activity = (SettingsActivity) getActivity();
 
         mSwitchBar = activity.getSwitchBar();
+        mSwitchBar.addOnSwitchChangeListener(this);
+        mSwitchBar.show();
 
         mToggleSwitch = mSwitchBar.getSwitch();
         mToggleSwitch.setOnBeforeCheckedChangeListener(new ToggleSwitch.OnBeforeCheckedChangeListener() {
diff --git a/src/com/android/settings/tts/TtsEngineSettingsFragment.java b/src/com/android/settings/tts/TtsEngineSettingsFragment.java
index 47493fb..15824cf 100644
--- a/src/com/android/settings/tts/TtsEngineSettingsFragment.java
+++ b/src/com/android/settings/tts/TtsEngineSettingsFragment.java
@@ -233,34 +233,25 @@
             mLocalePreference.setEnabled(false);
             return;
         }
-        String currentLocale = "";
+        Locale currentLocale = null;
         if (!mEnginesHelper.isLocaleSetToDefaultForEngine(getEngineName())) {
             currentLocale = mEnginesHelper.getLocalePrefForEngine(getEngineName());
         }
 
-        ArrayList<Pair<String, String>> entryPairs =
-                new ArrayList<Pair<String, String>>(availableLangs.size());
+        ArrayList<Pair<String, Locale>> entryPairs =
+                new ArrayList<Pair<String, Locale>>(availableLangs.size());
         for (int i = 0; i < availableLangs.size(); i++) {
-            String[] langCountryVariant = availableLangs.get(i).split("-");
-            Locale loc = null;
-            if (langCountryVariant.length == 1){
-                loc = new Locale(langCountryVariant[0]);
-            } else if (langCountryVariant.length == 2){
-                loc = new Locale(langCountryVariant[0], langCountryVariant[1]);
-            } else if (langCountryVariant.length == 3){
-                loc = new Locale(langCountryVariant[0], langCountryVariant[1],
-                                 langCountryVariant[2]);
-            }
-            if (loc != null){
-                entryPairs.add(new Pair<String, String>(
-                        loc.getDisplayName(), availableLangs.get(i)));
+            Locale locale = mEnginesHelper.parseLocaleString(availableLangs.get(i));
+            if (locale != null){
+                entryPairs.add(new Pair<String, Locale>(
+                        locale.getDisplayName(), locale));
             }
         }
 
         // Sort it
-        Collections.sort(entryPairs, new Comparator<Pair<String, String>>() {
+        Collections.sort(entryPairs, new Comparator<Pair<String, Locale>>() {
             @Override
-            public int compare(Pair<String, String> lhs, Pair<String, String> rhs) {
+            public int compare(Pair<String, Locale> lhs, Pair<String, Locale> rhs) {
                 return lhs.first.compareToIgnoreCase(rhs.first);
             }
         });
@@ -274,12 +265,12 @@
         entryValues[0] = "";
 
         int i = 1;
-        for (Pair<String, String> entry : entryPairs) {
-            if (entry.second.equalsIgnoreCase(currentLocale)) {
+        for (Pair<String, Locale> entry : entryPairs) {
+            if (entry.second.equals(currentLocale)) {
                 mSelectedLocaleIndex = i;
             }
             entries[i] = entry.first;
-            entryValues[i++] = entry.second;
+            entryValues[i++] = entry.second.toString();
         }
 
         mLocalePreference.setEntries(entries);
@@ -332,16 +323,19 @@
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (preference == mLocalePreference) {
-            updateLanguageTo((String) newValue);
+            String localeString = (String) newValue;
+            updateLanguageTo((!TextUtils.isEmpty(localeString) ?
+                    mEnginesHelper.parseLocaleString(localeString) : null));
             return true;
         }
         return false;
     }
 
-    private void updateLanguageTo(String locale) {
+    private void updateLanguageTo(Locale locale) {
         int selectedLocaleIndex = -1;
+        String localeString = (locale != null) ? locale.toString() : "";
         for (int i=0; i < mLocalePreference.getEntryValues().length; i++) {
-            if (locale.equalsIgnoreCase(mLocalePreference.getEntryValues()[i].toString())) {
+            if (localeString.equalsIgnoreCase(mLocalePreference.getEntryValues()[i].toString())) {
                 selectedLocaleIndex = i;
                 break;
             }
@@ -357,15 +351,8 @@
         mEnginesHelper.updateLocalePrefForEngine(getEngineName(), locale);
 
         if (getEngineName().equals(mTts.getCurrentEngine())) {
-            if (!locale.isEmpty()) {
-                String[] localeArray = TtsEngines.parseLocalePref(locale);
-                if (localeArray != null) {
-                    mTts.setLanguage(new Locale(localeArray[0], localeArray[1], localeArray[2]));
-                }
-            } else {
-                // Empty locale means "use system default"
-                mTts.setLanguage(Locale.getDefault());
-            }
+            // Null locale means "use system default"
+            mTts.setLanguage((locale != null) ? locale : Locale.getDefault());
         }
     }
 
diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java
index bc06d87..b503cf6 100644
--- a/src/com/android/settings/widget/SwitchBar.java
+++ b/src/com/android/settings/widget/SwitchBar.java
@@ -17,10 +17,11 @@
 package com.android.settings.widget;
 
 import android.content.Context;
+import android.os.Parcel;
+import android.os.Parcelable;
 import android.transition.TransitionManager;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
-import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.CompoundButton;
@@ -72,12 +73,11 @@
         mTextView.setText(R.string.switch_off_text);
 
         mSwitch = (ToggleSwitch) findViewById(R.id.switch_widget);
-        mSwitch.setOnCheckedChangeListener(this);
 
         addOnSwitchChangeListener(new OnSwitchChangeListener() {
             @Override
             public void onSwitchChanged(Switch switchView, boolean isChecked) {
-                mTextView.setText(isChecked ? R.string.switch_on_text : R.string.switch_off_text);
+                setTextViewLabel(isChecked);
             }
         });
 
@@ -90,18 +90,41 @@
         setVisibility(View.GONE);
     }
 
-    public ToggleSwitch getSwitch() {
+    public void setTextViewLabel(boolean isChecked) {
+        mTextView.setText(isChecked ? R.string.switch_on_text : R.string.switch_off_text);
+    }
+
+    public void setChecked(boolean checked) {
+        setTextViewLabel(checked);
+        mSwitch.setChecked(checked);
+    }
+
+    public boolean isChecked() {
+        return mSwitch.isChecked();
+    }
+
+    public void setEnabled(boolean enabled) {
+        super.setEnabled(enabled);
+        mTextView.setEnabled(enabled);
+        mSwitch.setEnabled(false);
+    }
+
+    public final ToggleSwitch getSwitch() {
         return mSwitch;
     }
 
     public void show() {
-        TransitionManager.beginDelayedTransition((ViewGroup) getParent());
-        setVisibility(View.VISIBLE);
+        if (!isShowing()) {
+            setVisibility(View.VISIBLE);
+            mSwitch.setOnCheckedChangeListener(this);
+        }
     }
 
     public void hide() {
-        TransitionManager.beginDelayedTransition((ViewGroup) getParent());
-        setVisibility(View.GONE);
+        if (isShowing()) {
+            setVisibility(View.GONE);
+            mSwitch.setOnCheckedChangeListener(null);
+        }
     }
 
     public boolean isShowing() {
@@ -139,4 +162,69 @@
         }
         mSwitchChangeListeners.remove(listener);
     }
+
+    static class SavedState extends BaseSavedState {
+        boolean checked;
+        boolean visible;
+
+        SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        /**
+         * Constructor called from {@link #CREATOR}
+         */
+        private SavedState(Parcel in) {
+            super(in);
+            checked = (Boolean)in.readValue(null);
+            visible = (Boolean)in.readValue(null);
+        }
+
+        @Override
+        public void writeToParcel(Parcel out, int flags) {
+            super.writeToParcel(out, flags);
+            out.writeValue(checked);
+            out.writeValue(visible);
+        }
+
+        @Override
+        public String toString() {
+            return "SwitchBar.SavedState{"
+                    + Integer.toHexString(System.identityHashCode(this))
+                    + " checked=" + checked
+                    + " visible=" + visible + "}";
+        }
+
+        public static final Parcelable.Creator<SavedState> CREATOR
+                = new Parcelable.Creator<SavedState>() {
+            public SavedState createFromParcel(Parcel in) {
+                return new SavedState(in);
+            }
+
+            public SavedState[] newArray(int size) {
+                return new SavedState[size];
+            }
+        };
+    }
+
+    @Override
+    public Parcelable onSaveInstanceState() {
+        Parcelable superState = super.onSaveInstanceState();
+
+        SavedState ss = new SavedState(superState);
+        ss.checked = mSwitch.isChecked();
+        ss.visible = isShowing();
+        return ss;
+    }
+
+    @Override
+    public void onRestoreInstanceState(Parcelable state) {
+        SavedState ss = (SavedState) state;
+
+        super.onRestoreInstanceState(ss.getSuperState());
+        mSwitch.setChecked(ss.checked);
+        setTextViewLabel(ss.checked);
+        setVisibility(ss.visible ? View.VISIBLE : View.GONE);
+        requestLayout();
+    }
 }
diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java
index b8765bb..cd08565 100644
--- a/src/com/android/settings/wifi/AccessPoint.java
+++ b/src/com/android/settings/wifi/AccessPoint.java
@@ -19,6 +19,7 @@
 import com.android.settings.R;
 
 import android.content.Context;
+import android.graphics.drawable.Drawable;
 import android.net.NetworkInfo.DetailedState;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiConfiguration;
@@ -48,6 +49,8 @@
     };
     private static final int[] STATE_NONE = {};
 
+    private static int[] wifi_signal_attributes = { R.attr.wifi_signal };
+
     /** These values are matched in string arrays -- changes must be kept in sync */
     static final int SECURITY_NONE = 0;
     static final int SECURITY_WEP = 1;
@@ -163,21 +166,18 @@
 
     AccessPoint(Context context, WifiConfiguration config) {
         super(context);
-        setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
         loadConfig(config);
         refresh();
     }
 
     AccessPoint(Context context, ScanResult result) {
         super(context);
-        setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
         loadResult(result);
         refresh();
     }
 
     AccessPoint(Context context, Bundle savedState) {
         super(context);
-        setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
 
         mConfig = savedState.getParcelable(KEY_CONFIG);
         if (mConfig != null) {
@@ -228,18 +228,28 @@
     @Override
     protected void onBindView(View view) {
         super.onBindView(view);
-        ImageView signal = (ImageView) view.findViewById(R.id.signal);
-        if (mRssi == Integer.MAX_VALUE) {
-            signal.setImageDrawable(null);
+        updateIcon(getLevel());
+        notifyChanged();
+    }
+
+    protected void updateIcon(int level) {
+        if (level == -1) {
+            setIcon(null);
         } else {
-            signal.setImageLevel(getLevel());
-            signal.setImageDrawable(getContext().getTheme().obtainStyledAttributes(
-                    new int[] {R.attr.wifi_signal}).getDrawable(0));
-            signal.setImageState((security != SECURITY_NONE) ?
-                    STATE_SECURED : STATE_NONE, true);
+            Drawable drawable = getIcon();
+
+            if (drawable == null) {
+                drawable = getContext().getTheme().obtainStyledAttributes(
+                        wifi_signal_attributes).getDrawable(0);
+                setIcon(drawable);
+            }
+
+            drawable.setLevel(level);
+            drawable.setState((security != SECURITY_NONE) ? STATE_SECURED : STATE_NONE);
         }
     }
 
+
     @Override
     public int compareTo(Preference preference) {
         if (!(preference instanceof AccessPoint)) {
@@ -253,6 +263,7 @@
         // Reachable one goes before unreachable one.
         if (mRssi != Integer.MAX_VALUE && other.mRssi == Integer.MAX_VALUE) return -1;
         if (mRssi == Integer.MAX_VALUE && other.mRssi != Integer.MAX_VALUE) return 1;
+        if (mRssi == Integer.MAX_VALUE && other.mRssi != Integer.MAX_VALUE) return 1;
 
         // Configured one goes before unconfigured one.
         if (networkId != WifiConfiguration.INVALID_NETWORK_ID
@@ -463,6 +474,8 @@
     /** Updates the title and summary; may indirectly call notifyChanged()  */
     private void refresh() {
         setTitle(ssid);
+        updateIcon(getLevel());
+
         StringBuilder summary = new StringBuilder();
 
         Context context = getContext();
@@ -517,6 +530,9 @@
         if (WifiSettings.mVerboseLogging > 0) {
             //add RSSI/band information for this config, what was seen up to 6 seconds ago
             //verbose WiFi Logging is only turned on thru developers settings
+            if (mInfo != null && mState != null) { // This is the active connection
+                summary.append(" (f=" + Integer.toString(mInfo.getFrequency()) + ")");
+            }
             summary.append(" " + getVisibilityStatus());
             if (mConfig != null && mConfig.autoJoinStatus > 0) {
                 summary.append(" (" + mConfig.autoJoinStatus);
diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java
index d190045..dc3974e 100644
--- a/src/com/android/settings/wifi/WifiEnabler.java
+++ b/src/com/android/settings/wifi/WifiEnabler.java
@@ -100,20 +100,27 @@
         // The order matters! We really should not depend on this. :(
         mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
         mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+        setupSwitchBar();
+    }
+
+    public void setupSwitchBar() {
+        mSwitchBar.addOnSwitchChangeListener(this);
+        mSwitchBar.show();
+    }
+
+    public void teardownSwitchBar() {
+        mSwitchBar.removeOnSwitchChangeListener(this);
+        mSwitchBar.hide();
     }
 
     public void resume(Context context) {
         mContext = context;
         // Wi-Fi state is sticky, so just let the receiver update UI
         mContext.registerReceiver(mReceiver, mIntentFilter);
-        mSwitchBar.addOnSwitchChangeListener(this);
-        mSwitchBar.show();
     }
 
     public void pause() {
         mContext.unregisterReceiver(mReceiver);
-        mSwitchBar.removeOnSwitchChangeListener(this);
-        mSwitchBar.hide();
     }
 
     private void handleWifiStateChanged(int state) {
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 3420f36..ec77937 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -136,8 +136,6 @@
     private AccessPoint mDlgAccessPoint;
     private Bundle mAccessPointSavedState;
 
-    private SwitchBar mSwitchBar;
-
     /** verbose logging flag. this flag is set thru developer debugging options
      * and used so as to assist with in-the-field WiFi connectivity debugging  */
     public static int mVerboseLogging = 0;
@@ -233,6 +231,15 @@
     }
 
     @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+
+        if (mWifiEnabler != null) {
+            mWifiEnabler.teardownSwitchBar();
+        }
+    }
+
+    @Override
     public void onStart() {
         super.onStart();