Merge "Update Settings redlines per UX request" into lmp-preview-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d4579ce..97d0d05 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1461,6 +1461,22 @@
                 android:resource="@id/battery_settings" />
         </activity-alias>
 
+        <activity android:name="Settings$BatterySaverSettingsActivity"
+                android:label="@string/battery_saver"
+                android:taskAffinity=""
+                android:excludeFromRecents="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.settings.BATTERY_SAVER_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="com.android.settings.SHORTCUT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.fuelgauge.BatterySaverSettings" />
+            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
+                android:resource="@id/battery_settings" />
+        </activity>
+
         <activity android:name="Settings$AccountSyncSettingsActivity"
             android:label="@string/account_sync_settings_title"
             android:taskAffinity=""
diff --git a/res/drawable/dashboard_tile_background.xml b/res/drawable/dashboard_tile_background.xml
index f66ff23..2629cda 100644
--- a/res/drawable/dashboard_tile_background.xml
+++ b/res/drawable/dashboard_tile_background.xml
@@ -15,9 +15,7 @@
 -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-                android:tint="?android:attr/colorControlHighlight">
-    <item>
-        <color android:color="@android:color/white" />
-    </item>
+    android:color="?android:attr/colorControlHighlight">
+    <item android:drawable="@android:color/white" />
 </ripple>
 
diff --git a/res/drawable/preference_highlight.xml b/res/drawable/preference_highlight.xml
index bbffe62..20c1a0f 100644
--- a/res/drawable/preference_highlight.xml
+++ b/res/drawable/preference_highlight.xml
@@ -15,8 +15,7 @@
 -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-                android:tint="?android:attr/colorControlHighlight"
-                android:pinned="true">
+    android:color="?android:attr/colorControlHighlight">
     <item android:id="@android:id/mask"
           android:drawable="@android:color/white" />
 </ripple>
diff --git a/res/drawable/switchbar_background.xml b/res/drawable/switchbar_background.xml
index d329b6b..ac340be 100644
--- a/res/drawable/switchbar_background.xml
+++ b/res/drawable/switchbar_background.xml
@@ -15,9 +15,7 @@
 -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-                android:tint="?android:attr/colorControlHighlight">
-    <item>
-        <color android:color="@color/switchbar_background_color" />
-    </item>
+    android:color="?android:attr/colorControlHighlight">
+    <item android:drawable="@color/switchbar_background_color" />
 </ripple>
 
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index c960c88..200bacf 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1218,4 +1218,13 @@
         <item>1</item>
         <item>2</item>
     </string-array>
+
+    <!-- Battery saver mode: allowable trigger threshold levels. -->
+    <integer-array name="battery_saver_trigger_values" translatable="false" >
+        <item>0</item>
+        <item>5</item>
+        <item>10</item>
+        <item>15</item>
+        <item>20</item>
+    </integer-array>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fd25212..6b148f8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3732,6 +3732,21 @@
     <!-- Label for mediaserver process -->
     <string name="process_mediaserver_label">Mediaserver</string>
 
+    <!-- [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 automatic entry option -->
+    <string name="battery_saver_turn_on_automatically_title">Turn on automatically</string>
+
+    <!-- [CHAR_LIMIT=40] Battery saver: Value for automatic entry option: Never -->
+    <string name="battery_saver_turn_on_automatically_never">Never</string>
+
+    <!-- [CHAR_LIMIT=40] Battery saver: Value for automatic entry option: pct% battery -->
+    <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>
+
     <!-- Process Stats strings -->
     <skip />
 
diff --git a/res/xml/battery_saver_settings.xml b/res/xml/battery_saver_settings.xml
new file mode 100644
index 0000000..a3729c5
--- /dev/null
+++ b/res/xml/battery_saver_settings.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+        android:title="@string/battery_saver"
+        android:key="battery_saver">
+
+    <!-- Turn on automatically -->
+    <com.android.settings.notification.DropDownPreference
+            android:key="turn_on_automatically"
+            android:title="@string/battery_saver_turn_on_automatically_title"
+            android:persistent="false" />
+
+    <!-- Feature description text -->
+    <Preference
+            android:key="description"
+            android:summary="@string/battery_saver_description"
+            android:persistent="false"
+            android:selectable="false" />
+
+</PreferenceScreen>
diff --git a/res/xml/security_settings_nfc_unlock.xml b/res/xml/security_settings_nfc_unlock.xml
deleted file mode 100644
index 63e5a74..0000000
--- a/res/xml/security_settings_nfc_unlock.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <PreferenceCategory
-            android:key="security_category"
-            android:title="@string/lock_settings_nfc_title">
-
-    <CheckBoxPreference
-            android:key="nfc_unlock_enabled"
-            android:title="@string/nfc_unlock_enabled"
-            android:persistent="false" />
-
-    <Preference
-            android:key="nfc_pairing"
-            android:title="@string/start_nfc_pairing"
-            android:persistent="false"
-            android:dependency="nfc_unlock_enabled" >
-            <intent android:action="android.settings.PAIR_NFC_DEVICE"/>
-    </Preference>
-
-    </PreferenceCategory>
-
-        <PreferenceCategory
-            android:key="nfc_unlock_tags_category"
-            android:title="@string/nfc_unlock_paired_tags_title">
-        </PreferenceCategory>
-
-</PreferenceScreen>
diff --git a/src/com/android/settings/CredentialStorage.java b/src/com/android/settings/CredentialStorage.java
index fcf208a..44e966c 100644
--- a/src/com/android/settings/CredentialStorage.java
+++ b/src/com/android/settings/CredentialStorage.java
@@ -270,7 +270,6 @@
         private ResetDialog() {
             AlertDialog dialog = new AlertDialog.Builder(CredentialStorage.this)
                     .setTitle(android.R.string.dialog_alert_title)
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(R.string.credentials_reset_hint)
                     .setPositiveButton(android.R.string.ok, this)
                     .setNegativeButton(android.R.string.cancel, this)
@@ -340,7 +339,6 @@
         private ConfigureKeyGuardDialog() {
             AlertDialog dialog = new AlertDialog.Builder(CredentialStorage.this)
                     .setTitle(android.R.string.dialog_alert_title)
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(R.string.credentials_configure_lock_screen_hint)
                     .setPositiveButton(android.R.string.ok, this)
                     .setNegativeButton(android.R.string.cancel, this)
diff --git a/src/com/android/settings/CryptKeeperSettings.java b/src/com/android/settings/CryptKeeperSettings.java
index 1846580..7f7a675 100644
--- a/src/com/android/settings/CryptKeeperSettings.java
+++ b/src/com/android/settings/CryptKeeperSettings.java
@@ -87,7 +87,6 @@
                 // TODO replace (or follow) this dialog with an explicit launch into password UI
                 new AlertDialog.Builder(getActivity())
                     .setTitle(R.string.crypt_keeper_dialog_need_password_title)
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(R.string.crypt_keeper_dialog_need_password_message)
                     .setPositiveButton(android.R.string.ok, null)
                     .create()
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index fe7a217..ce44907 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -122,7 +122,6 @@
     private static final String USE_NUPLAYER_KEY = "use_nuplayer";
     private static final String USE_NUPLAYER_PROPERTY = "persist.sys.media.use-nuplayer";
     private static final String SHOW_CPU_USAGE_KEY = "show_cpu_usage";
-    private static final String LOW_POWER_MODE_KEY = "low_power_mode";
     private static final String FORCE_HARDWARE_UI_KEY = "force_hw_ui";
     private static final String FORCE_MSAA_KEY = "force_msaa";
     private static final String TRACK_FRAME_TIME_KEY = "track_frame_time";
@@ -196,7 +195,6 @@
     private CheckBoxPreference mShowScreenUpdates;
     private CheckBoxPreference mDisableOverlays;
     private CheckBoxPreference mShowCpuUsage;
-    private CheckBoxPreference mLowPowerMode;
     private CheckBoxPreference mForceHardwareUi;
     private CheckBoxPreference mForceMsaa;
     private CheckBoxPreference mShowHwScreenUpdates;
@@ -308,7 +306,6 @@
         mShowScreenUpdates = findAndInitCheckboxPref(SHOW_SCREEN_UPDATES_KEY);
         mDisableOverlays = findAndInitCheckboxPref(DISABLE_OVERLAYS_KEY);
         mShowCpuUsage = findAndInitCheckboxPref(SHOW_CPU_USAGE_KEY);
-        mLowPowerMode = findAndInitCheckboxPref(LOW_POWER_MODE_KEY);
         mForceHardwareUi = findAndInitCheckboxPref(FORCE_HARDWARE_UI_KEY);
         mForceMsaa = findAndInitCheckboxPref(FORCE_MSAA_KEY);
         mTrackFrameTime = addListPreference(TRACK_FRAME_TIME_KEY);
@@ -504,7 +501,6 @@
         updateShowTouchesOptions();
         updateFlingerOptions();
         updateCpuUsageOptions();
-        updateLowPowerModeOptions();
         updateHardwareUiOptions();
         updateMsaaOptions();
         updateTrackFrameTimeOptions();
@@ -1040,22 +1036,11 @@
         mWifiManager.enableVerboseLogging(mWifiVerboseLogging.isChecked() ? 1 : 0);
     }
 
-    private void updateLowPowerModeOptions() {
-        updateCheckBox(mLowPowerMode, Settings.Global.getInt(getActivity().getContentResolver(),
-                Settings.Global.LOW_POWER_MODE, 0) != 0);
-    }
-
     private void updateCpuUsageOptions() {
         updateCheckBox(mShowCpuUsage, Settings.Global.getInt(getActivity().getContentResolver(),
                 Settings.Global.SHOW_PROCESSES, 0) != 0);
     }
 
-    private void writeLowPowerModeOptions() {
-        boolean value = mLowPowerMode.isChecked();
-        Settings.Global.putInt(getActivity().getContentResolver(),
-                Settings.Global.LOW_POWER_MODE, value ? 1 : 0);
-    }
-
     private void writeCpuUsageOptions() {
         boolean value = mShowCpuUsage.isChecked();
         Settings.Global.putInt(getActivity().getContentResolver(),
@@ -1236,7 +1221,6 @@
                         getActivity().getResources().getString(
                                 R.string.dev_settings_warning_message))
                         .setTitle(R.string.dev_settings_warning_title)
-                        .setIconAttribute(android.R.attr.alertDialogIcon)
                         .setPositiveButton(android.R.string.yes, this)
                         .setNegativeButton(android.R.string.no, this)
                         .show();
@@ -1277,7 +1261,6 @@
                 mAdbDialog = new AlertDialog.Builder(getActivity()).setMessage(
                         getActivity().getResources().getString(R.string.adb_warning_message))
                         .setTitle(R.string.adb_warning_title)
-                        .setIconAttribute(android.R.attr.alertDialogIcon)
                         .setPositiveButton(android.R.string.yes, this)
                         .setNegativeButton(android.R.string.no, this)
                         .show();
@@ -1332,8 +1315,6 @@
             writeShowUpdatesOption();
         } else if (preference == mDisableOverlays) {
             writeDisableOverlaysOption();
-        } else if (preference == mLowPowerMode) {
-            writeLowPowerModeOptions();
         } else if (preference == mShowCpuUsage) {
             writeCpuUsageOptions();
         } else if (preference == mImmediatelyDestroyActivities) {
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index d936f46..7f699c5 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -119,7 +119,6 @@
         // TODO: DialogFragment?
         mConfirmDialog = new AlertDialog.Builder(getActivity()).setMessage(msg)
                 .setTitle(R.string.backup_erase_dialog_title)
-                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setPositiveButton(android.R.string.ok, this)
                 .setNegativeButton(android.R.string.cancel, this)
                 .show();
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 22ae719..7ef33ae 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -66,6 +66,7 @@
     public static class RunningServicesActivity extends SettingsActivity { /* empty */ }
     public static class ManageAccountsSettingsActivity extends SettingsActivity { /* empty */ }
     public static class PowerUsageSummaryActivity extends SettingsActivity { /* empty */ }
+    public static class BatterySaverSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
     public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index c5204d7..9cce9a1 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -63,8 +63,8 @@
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.Button;
-
 import android.widget.SearchView;
+
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.XmlUtils;
 import com.android.settings.accessibility.AccessibilitySettings;
@@ -83,6 +83,7 @@
 import com.android.settings.dashboard.SearchResultsSummary;
 import com.android.settings.deviceinfo.Memory;
 import com.android.settings.deviceinfo.UsbSettings;
+import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.search.DynamicIndexableContentMonitor;
 import com.android.settings.search.Index;
@@ -108,6 +109,7 @@
 import com.android.settings.wifi.AdvancedWifiSettings;
 import com.android.settings.wifi.WifiSettings;
 import com.android.settings.wifi.p2p.WifiP2pSettings;
+
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -276,7 +278,8 @@
             NotificationSettings.class.getName(),
             ChooseLockPassword.ChooseLockPasswordFragment.class.getName(),
             ChooseLockPattern.ChooseLockPatternFragment.class.getName(),
-            InstalledAppDetails.class.getName()
+            InstalledAppDetails.class.getName(),
+            BatterySaverSettings.class.getName(),
     };
 
     private SharedPreferences mDevelopmentPreferences;
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index a446f49..cb7699e 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -163,7 +163,6 @@
                 AlertDialog ad = new AlertDialog.Builder(getActivity())
                         .setTitle(getString(R.string.enable_service_title,
                                 info.getResolveInfo().loadLabel(getPackageManager())))
-                        .setIconAttribute(android.R.attr.alertDialogIcon)
                         .setView(createEnableDialogContentView(info))
                         .setCancelable(true)
                         .setPositiveButton(android.R.string.ok, this)
@@ -182,7 +181,6 @@
                 return new AlertDialog.Builder(getActivity())
                         .setTitle(getString(R.string.disable_service_title,
                                 info.getResolveInfo().loadLabel(getPackageManager())))
-                        .setIconAttribute(android.R.attr.alertDialogIcon)
                         .setMessage(getString(R.string.disable_service_message,
                                 info.getResolveInfo().loadLabel(getPackageManager())))
                         .setCancelable(true)
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index ef27e2e..6ed517f 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -1109,7 +1109,6 @@
                 case DLG_CLEAR_DATA:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                             new DialogInterface.OnClickListener() {
@@ -1123,7 +1122,6 @@
                 case DLG_FACTORY_RESET:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                             new DialogInterface.OnClickListener() {
@@ -1138,7 +1136,6 @@
                 case DLG_APP_NOT_FOUND:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
                     .setNeutralButton(getActivity().getText(R.string.dlg_ok),
                             new DialogInterface.OnClickListener() {
@@ -1151,7 +1148,6 @@
                 case DLG_CANNOT_CLEAR_DATA:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
                     .setNeutralButton(R.string.dlg_ok,
                             new DialogInterface.OnClickListener() {
@@ -1165,7 +1161,6 @@
                 case DLG_FORCE_STOP:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                         new DialogInterface.OnClickListener() {
@@ -1181,14 +1176,12 @@
                             getOwner().getMoveErrMsg(moveErrorCode));
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(msg)
                     .setNeutralButton(R.string.dlg_ok, null)
                     .create();
                 case DLG_DISABLE:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.app_disable_dlg_title))
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.app_disable_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                         new DialogInterface.OnClickListener() {
@@ -1204,7 +1197,6 @@
                 case DLG_DISABLE_NOTIFICATIONS:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title))
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                         new DialogInterface.OnClickListener() {
@@ -1224,7 +1216,6 @@
                 case DLG_SPECIAL_DISABLE:
                     return new AlertDialog.Builder(getActivity())
                     .setTitle(getActivity().getText(R.string.app_special_disable_dlg_title))
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setMessage(getActivity().getText(R.string.app_special_disable_dlg_text))
                     .setPositiveButton(R.string.dlg_ok,
                             new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/applications/RunningServiceDetails.java b/src/com/android/settings/applications/RunningServiceDetails.java
index 73547f1..45cad3d 100644
--- a/src/com/android/settings/applications/RunningServiceDetails.java
+++ b/src/com/android/settings/applications/RunningServiceDetails.java
@@ -583,7 +583,6 @@
                     
                     return new AlertDialog.Builder(getActivity())
                             .setTitle(getActivity().getString(R.string.runningservicedetails_stop_dlg_title))
-                            .setIconAttribute(android.R.attr.alertDialogIcon)
                             .setMessage(getActivity().getString(R.string.runningservicedetails_stop_dlg_text))
                             .setPositiveButton(R.string.dlg_ok,
                                     new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index fb44d5a..1970400 100755
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -93,7 +93,6 @@
         Context activity = manager.getForegroundActivity();
         if(manager.isForegroundActivity()) {
             new AlertDialog.Builder(activity)
-                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setTitle(R.string.bluetooth_error_title)
                 .setMessage(message)
                 .setPositiveButton(android.R.string.ok, null)
diff --git a/src/com/android/settings/fuelgauge/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
new file mode 100644
index 0000000..1a7e892
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.net.Uri;
+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 {
+    private static final String TAG = "BatterySaverSettings";
+    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 SettingsObserver mSettingsObserver = new SettingsObserver(mHandler);
+
+    private Context mContext;
+    private SwitchBar mSwitchBar;
+    private boolean mSwitchBarListenerAdded;
+    private SettingPref mTriggerPref;
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        addPreferencesFromResource(R.xml.battery_saver_settings);
+
+        mContext = getActivity();
+        mSwitchBar = ((SettingsActivity) mContext).getSwitchBar();
+        updateSwitchBar();
+        mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY,
+                Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0,
+                getResources().getIntArray(R.array.battery_saver_trigger_values)) {
+            @Override
+            protected String getCaption(Resources res, int value) {
+                if (value > 0 && value < 100) {
+                    return res.getString(R.string.battery_saver_turn_on_automatically_pct, value);
+                }
+                return res.getString(R.string.battery_saver_turn_on_automatically_never);
+            }
+        };
+        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);
+        }
+        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);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            if (msg.what == SET_MODE) {
+                handleSetMode(msg.arg1 != 0);
+            }
+        }
+    }
+
+    private final class SettingsObserver extends ContentObserver {
+        private final Uri LOW_POWER_MODE_URI = Global.getUriFor(Global.LOW_POWER_MODE);
+        private final Uri LOW_POWER_MODE_TRIGGER_LEVEL_URI
+                = Global.getUriFor(Global.LOW_POWER_MODE_TRIGGER_LEVEL);
+
+        public SettingsObserver(Handler handler) {
+            super(handler);
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            if (LOW_POWER_MODE_URI.equals(uri)) {
+                updateSwitchBar();
+            }
+            if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) {
+                updateTriggerLevel();
+            }
+        }
+
+        public void setListening(boolean listening) {
+            final ContentResolver cr = getContentResolver();
+            if (listening) {
+                cr.registerContentObserver(LOW_POWER_MODE_URI, false, this);
+                cr.registerContentObserver(LOW_POWER_MODE_TRIGGER_LEVEL_URI, false, this);
+            } else {
+                cr.unregisterContentObserver(this);
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index e4e2b0a..1159a2c 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -60,7 +60,8 @@
 
     private static final int MENU_STATS_TYPE = Menu.FIRST;
     private static final int MENU_STATS_REFRESH = Menu.FIRST + 1;
-    private static final int MENU_HELP = Menu.FIRST + 2;
+    private static final int MENU_BATTERY_SAVER = Menu.FIRST + 2;
+    private static final int MENU_HELP = Menu.FIRST + 3;
 
     private UserManager mUm;
 
@@ -180,6 +181,9 @@
         refresh.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |
                 MenuItem.SHOW_AS_ACTION_WITH_TEXT);
 
+        MenuItem batterySaver = menu.add(0, MENU_BATTERY_SAVER, 0, R.string.battery_saver);
+        batterySaver.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+
         String helpUrl;
         if (!TextUtils.isEmpty(helpUrl = getResources().getString(R.string.help_url_battery))) {
             final MenuItem help = menu.add(0, MENU_HELP, 0, R.string.help_label);
@@ -203,6 +207,11 @@
                 refreshStats();
                 mHandler.removeMessages(MSG_REFRESH_STATS);
                 return true;
+            case MENU_BATTERY_SAVER:
+                final SettingsActivity sa = (SettingsActivity) getActivity();
+                sa.startPreferencePanel(BatterySaverSettings.class.getName(), null,
+                        R.string.battery_saver, null, null, 0);
+                return true;
             default:
                 return false;
         }
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
index 419a877..3351e63 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
@@ -166,7 +166,6 @@
                 if (mDialog == null) {
                     mDialog = (new AlertDialog.Builder(getActivity()))
                             .setTitle(android.R.string.dialog_alert_title)
-                            .setIconAttribute(android.R.attr.alertDialogIcon)
                             .setCancelable(true)
                             .setPositiveButton(android.R.string.ok,
                                     new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/inputmethod/InputMethodPreference.java b/src/com/android/settings/inputmethod/InputMethodPreference.java
index 1d920de..e04f2c7 100644
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -265,7 +265,6 @@
         }
         mDialog = (new AlertDialog.Builder(mFragment.getActivity()))
                 .setTitle(android.R.string.dialog_alert_title)
-                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setCancelable(true)
                 .setPositiveButton(android.R.string.ok,
                         new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/inputmethod/SpellCheckersSettings.java b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
index 8b1b867..03867c7 100644
--- a/src/com/android/settings/inputmethod/SpellCheckersSettings.java
+++ b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
@@ -122,7 +122,6 @@
         }
         mDialog = (new AlertDialog.Builder(getActivity()))
                 .setTitle(android.R.string.dialog_alert_title)
-                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setCancelable(true)
                 .setPositiveButton(android.R.string.ok,
                         new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/notification/DropDownPreference.java b/src/com/android/settings/notification/DropDownPreference.java
index 36ecf95..45c83a5 100644
--- a/src/com/android/settings/notification/DropDownPreference.java
+++ b/src/com/android/settings/notification/DropDownPreference.java
@@ -97,8 +97,12 @@
         }
     }
 
-    public void addItem(int resId, Object value) {
-        mAdapter.add(mContext.getResources().getString(resId));
+    public void addItem(int captionResid, Object value) {
+        addItem(mContext.getResources().getString(captionResid), value);
+    }
+
+    public void addItem(String caption, Object value) {
+        mAdapter.add(caption);
         mValues.add(value);
     }
 
diff --git a/src/com/android/settings/notification/ManagedServiceSettings.java b/src/com/android/settings/notification/ManagedServiceSettings.java
index 1144cb9..880ecde 100644
--- a/src/com/android/settings/notification/ManagedServiceSettings.java
+++ b/src/com/android/settings/notification/ManagedServiceSettings.java
@@ -106,7 +106,6 @@
             return new AlertDialog.Builder(getActivity())
                     .setMessage(summary)
                     .setTitle(title)
-                    .setIconAttribute(android.R.attr.alertDialogIcon)
                     .setCancelable(true)
                     .setPositiveButton(android.R.string.ok,
                             new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/notification/OtherSoundSettings.java b/src/com/android/settings/notification/OtherSoundSettings.java
index de5c917..8528ec7 100644
--- a/src/com/android/settings/notification/OtherSoundSettings.java
+++ b/src/com/android/settings/notification/OtherSoundSettings.java
@@ -21,6 +21,7 @@
 
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.media.AudioManager;
 import android.net.Uri;
@@ -114,10 +115,15 @@
         }
 
         @Override
-        protected int getResId(Context context, int value) {
-            if (value == DOCK_AUDIO_MEDIA_DISABLED) return R.string.dock_audio_media_disabled;
-            if (value == DOCK_AUDIO_MEDIA_ENABLED) return R.string.dock_audio_media_enabled;
-            throw new IllegalArgumentException();
+        protected String getCaption(Resources res, int value) {
+            switch(value) {
+                case DOCK_AUDIO_MEDIA_DISABLED:
+                    return res.getString(R.string.dock_audio_media_disabled);
+                case DOCK_AUDIO_MEDIA_ENABLED:
+                    return res.getString(R.string.dock_audio_media_enabled);
+                default:
+                    throw new IllegalArgumentException();
+            }
         }
     };
 
@@ -131,11 +137,17 @@
         }
 
         @Override
-        protected int getResId(Context context, int value) {
-            if (value == EMERGENCY_TONE_SILENT) return R.string.emergency_tone_silent;
-            if (value == EMERGENCY_TONE_ALERT) return R.string.emergency_tone_alert;
-            if (value == EMERGENCY_TONE_VIBRATE) return R.string.emergency_tone_vibrate;
-            throw new IllegalArgumentException();
+        protected String getCaption(Resources res, int value) {
+            switch(value) {
+                case EMERGENCY_TONE_SILENT:
+                    return res.getString(R.string.emergency_tone_silent);
+                case EMERGENCY_TONE_ALERT:
+                    return res.getString(R.string.emergency_tone_alert);
+                case EMERGENCY_TONE_VIBRATE:
+                    return res.getString(R.string.emergency_tone_vibrate);
+                default:
+                    throw new IllegalArgumentException();
+            }
         }
     };
 
diff --git a/src/com/android/settings/notification/SettingPref.java b/src/com/android/settings/notification/SettingPref.java
index 1e50e2b..7fd89d8 100644
--- a/src/com/android/settings/notification/SettingPref.java
+++ b/src/com/android/settings/notification/SettingPref.java
@@ -18,6 +18,7 @@
 
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.res.Resources;
 import android.net.Uri;
 import android.preference.Preference;
 import android.preference.TwoStatePreference;
@@ -55,7 +56,7 @@
         return true;
     }
 
-    protected int getResId(Context context, int value) {
+    protected String getCaption(Resources res, int value) {
         throw new UnsupportedOperationException();
     }
 
@@ -71,7 +72,7 @@
         } else if (p instanceof DropDownPreference) {
             mDropDown = (DropDownPreference) p;
             for (int value : mValues) {
-                mDropDown.addItem(getResId(context, value), value);
+                mDropDown.addItem(getCaption(context.getResources(), value), value);
             }
         }
         update(context);
diff --git a/src/com/android/settings/print/PrintServiceSettingsFragment.java b/src/com/android/settings/print/PrintServiceSettingsFragment.java
index f104a06..872f7b8 100644
--- a/src/com/android/settings/print/PrintServiceSettingsFragment.java
+++ b/src/com/android/settings/print/PrintServiceSettingsFragment.java
@@ -195,7 +195,6 @@
         }
         return new AlertDialog.Builder(getActivity())
                 .setTitle(title)
-                .setIconAttribute(android.R.attr.alertDialogIcon)
                 .setMessage(message)
                 .setCancelable(true)
                 .setPositiveButton(android.R.string.ok, this)
diff --git a/src/com/android/settings/quicklaunch/QuickLaunchSettings.java b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
index 0081a1e..a7ddc07 100644
--- a/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
+++ b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
@@ -153,7 +153,6 @@
                 // Create the dialog for clearing a shortcut
                 return new AlertDialog.Builder(getActivity())
                         .setTitle(getString(R.string.quick_launch_clear_dialog_title))
-                        .setIconAttribute(android.R.attr.alertDialogIcon)
                         .setMessage(getString(R.string.quick_launch_clear_dialog_message,
                                 mClearDialogShortcut, mClearDialogBookmarkTitle))
                         .setPositiveButton(R.string.quick_launch_clear_ok_button, this)
diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java
index 074a8d7..80ea83a 100644
--- a/src/com/android/settings/search/Ranking.java
+++ b/src/com/android/settings/search/Ranking.java
@@ -30,6 +30,7 @@
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.deviceinfo.Memory;
+import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.location.LocationSettings;
@@ -103,6 +104,7 @@
         sRankMap.put(Memory.class.getName(), RANK_MEMORY);
 
         sRankMap.put(PowerUsageSummary.class.getName(), RANK_POWER_USAGE);
+        sRankMap.put(BatterySaverSettings.class.getName(), RANK_POWER_USAGE);
 
         sRankMap.put(UserSettings.class.getName(), RANK_USERS);
 
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index 7c96a4a..086ebfc 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -33,6 +33,7 @@
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.deviceinfo.Memory;
+import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.location.LocationSettings;
@@ -154,6 +155,13 @@
                         PowerUsageSummary.class.getName(),
                         R.drawable.ic_settings_battery));
 
+        sResMap.put(BatterySaverSettings.class.getName(),
+                new SearchIndexableResource(
+                        Ranking.getRankForClassName(BatterySaverSettings.class.getName()),
+                        R.xml.battery_saver_settings,
+                        BatterySaverSettings.class.getName(),
+                        R.drawable.ic_settings_battery));
+
         sResMap.put(UserSettings.class.getName(),
                 new SearchIndexableResource(
                         Ranking.getRankForClassName(UserSettings.class.getName()),
diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java
index 1d4fe71..009b3b7 100644
--- a/src/com/android/settings/tts/TextToSpeechSettings.java
+++ b/src/com/android/settings/tts/TextToSpeechSettings.java
@@ -478,11 +478,10 @@
 
     private void displayNetworkAlert() {
         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-        builder.setTitle(android.R.string.dialog_alert_title);
-        builder.setIconAttribute(android.R.attr.alertDialogIcon);
-        builder.setMessage(getActivity().getString(R.string.tts_engine_network_required));
-        builder.setCancelable(false);
-        builder.setPositiveButton(android.R.string.ok, null);
+        builder.setTitle(android.R.string.dialog_alert_title)
+                .setMessage(getActivity().getString(R.string.tts_engine_network_required))
+                .setCancelable(false)
+                .setPositiveButton(android.R.string.ok, null);
 
         AlertDialog dialog = builder.create();
         dialog.show();
diff --git a/src/com/android/settings/tts/TtsEnginePreference.java b/src/com/android/settings/tts/TtsEnginePreference.java
index 7e50c47..ae921f8 100644
--- a/src/com/android/settings/tts/TtsEnginePreference.java
+++ b/src/com/android/settings/tts/TtsEnginePreference.java
@@ -198,13 +198,12 @@
         Log.i(TAG, "Displaying data alert for :" + mEngineInfo.name);
 
         AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
-        builder.setTitle(android.R.string.dialog_alert_title);
-        builder.setIconAttribute(android.R.attr.alertDialogIcon);
-        builder.setMessage(getContext().getString(
-                R.string.tts_engine_security_warning, mEngineInfo.label));
-        builder.setCancelable(true);
-        builder.setPositiveButton(android.R.string.ok, positiveOnClickListener);
-        builder.setNegativeButton(android.R.string.cancel, negativeOnClickListener);
+        builder.setTitle(android.R.string.dialog_alert_title)
+                .setMessage(getContext().getString(
+                        R.string.tts_engine_security_warning, mEngineInfo.label))
+                .setCancelable(true)
+                .setPositiveButton(android.R.string.ok, positiveOnClickListener)
+                .setNegativeButton(android.R.string.cancel, negativeOnClickListener);
 
         AlertDialog dialog = builder.create();
         dialog.show();
diff --git a/src/com/android/settings/users/RestrictedProfileSettings.java b/src/com/android/settings/users/RestrictedProfileSettings.java
index c293536..535e196 100644
--- a/src/com/android/settings/users/RestrictedProfileSettings.java
+++ b/src/com/android/settings/users/RestrictedProfileSettings.java
@@ -202,7 +202,6 @@
 
             mEditUserInfoDialog = new AlertDialog.Builder(getActivity())
                 .setTitle(R.string.profile_info_settings_title)
-                .setIconAttribute(R.drawable.ic_settings_multiuser)
                 .setView(content)
                 .setCancelable(true)
                 .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {