diff --git a/packages/apps/Settings/res/drawable-hdpi/ic_settings_battery_power_save.png b/packages/apps/Settings/res/drawable-hdpi/ic_settings_battery_power_save.png
new file mode 100644
index 0000000000..75a2af9967
Binary files /dev/null and b/packages/apps/Settings/res/drawable-hdpi/ic_settings_battery_power_save.png differ
diff --git a/packages/apps/Settings/res/drawable-mdpi/ic_settings_battery_power_save.png b/packages/apps/Settings/res/drawable-mdpi/ic_settings_battery_power_save.png
new file mode 100644
index 0000000000..7a001fc878
Binary files /dev/null and b/packages/apps/Settings/res/drawable-mdpi/ic_settings_battery_power_save.png differ
diff --git a/packages/apps/Settings/res/drawable-xhdpi/ic_settings_battery_power_save.png b/packages/apps/Settings/res/drawable-xhdpi/ic_settings_battery_power_save.png
new file mode 100644
index 0000000000..6825b7147d
Binary files /dev/null and b/packages/apps/Settings/res/drawable-xhdpi/ic_settings_battery_power_save.png differ
diff --git a/packages/apps/Settings/res/drawable-xxhdpi/ic_settings_battery_power_save.png b/packages/apps/Settings/res/drawable-xxhdpi/ic_settings_battery_power_save.png
new file mode 100644
index 0000000000..1648ee44dc
Binary files /dev/null and b/packages/apps/Settings/res/drawable-xxhdpi/ic_settings_battery_power_save.png differ
diff --git a/packages/apps/Settings/res/drawable-xxxhdpi/ic_settings_power_save.png b/packages/apps/Settings/res/drawable-xxxhdpi/ic_settings_power_save.png
new file mode 100644
index 0000000000..d45c6ef905
Binary files /dev/null and b/packages/apps/Settings/res/drawable-xxxhdpi/ic_settings_power_save.png differ
diff --git a/packages/apps/Settings/res/values-zh-rCN/strings_intel.xml b/packages/apps/Settings/res/values-zh-rCN/strings_intel.xml
index 996a8c0851..6229d9386a 100644
--- a/packages/apps/Settings/res/values-zh-rCN/strings_intel.xml
+++ b/packages/apps/Settings/res/values-zh-rCN/strings_intel.xml
@@ -19,4 +19,23 @@
自动确定语言
根据SIM卡国家码自动确定系统语言
根据SIM卡国家码自动确定系统语言
+
+
+ 基本设置
+ 显示省电模式
+ 省电模式启动后在状态栏显示省电模式
+ 电池电量低时启动省电模式
+ 不管省电模式是否开启,当电池电量低于15%时自动启动省电模式
+ 功能设置
+ 限制CPU性能
+ 限制CPU最高频率
+ 降低屏幕亮度
+ 降低屏幕亮度省电
+ 限制定位服务
+ GPS定位服务不能使用
+ 限制网络访问
+ 大部分后台应用不能使用网络
+ 限制窗口动画效果
+ 不显示窗口切换的动画效果
+ 提示
diff --git a/packages/apps/Settings/res/values-zh-rTW/strings_intel.xml b/packages/apps/Settings/res/values-zh-rTW/strings_intel.xml
index c3be6abb35..75b26f5d14 100644
--- a/packages/apps/Settings/res/values-zh-rTW/strings_intel.xml
+++ b/packages/apps/Settings/res/values-zh-rTW/strings_intel.xml
@@ -19,4 +19,23 @@
自動確定語言
根據SIM卡國家碼自動確定系統語言
根據SIM卡國家碼自動確定系統語言
+
+
+ 基本設置
+ 顯示省電模式
+ 省電模式啟動後在狀態列顯示省電模式
+ 電池計量低時啟動省電模式
+ 不管省電模式是否開啟,當電池計量低於15%時自動啟動省電模式
+ 功能設置
+ 限制CPU性能
+ 限制CPU最高頻率
+ 降低螢幕亮度
+ 降低螢幕亮度省電
+ 限制定位服務
+ GPS定位服務不能使用
+ 限制網路訪問
+ 大部分後臺應用不能使用網路
+ 限制視窗動畫效果
+ 不顯示視窗切換的動畫效果
+ 提示
diff --git a/packages/apps/Settings/res/values/strings_intel.xml b/packages/apps/Settings/res/values/strings_intel.xml
index d40c5b06ef..f7e419aab5 100644
--- a/packages/apps/Settings/res/values/strings_intel.xml
+++ b/packages/apps/Settings/res/values/strings_intel.xml
@@ -19,4 +19,23 @@
Automatic Language
Auto set language according to SIM card country code info
Auto set language according to SIM card country code info
+
+
+ Basic controls
+ Show indicator
+ Show power save mode enabled indicator on status bar
+ Turn on power save mode automatically
+ When battery is less than 15%, turn on power save mode
+ Feature controls
+ Limit CPU performance
+ Limit CPU maximum frequency
+ Reduce backlight brightness
+ Reduce brightness of backlight to save power
+ Disable location services
+ GPS location services will be disabled
+ Restrict network access
+ Most background data will be disabled
+ No animation transaction
+ Window animation transaction will be disabled
+ Tips
diff --git a/packages/apps/Settings/res/xml/battery_saver_settings.xml b/packages/apps/Settings/res/xml/battery_saver_settings.xml
index cb923c8bd9..8c6debd9e5 100644
--- a/packages/apps/Settings/res/xml/battery_saver_settings.xml
+++ b/packages/apps/Settings/res/xml/battery_saver_settings.xml
@@ -18,17 +18,53 @@
android:title="@string/battery_saver"
android:key="battery_saver">
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/packages/apps/Settings/res/xml/dashboard_categories.xml b/packages/apps/Settings/res/xml/dashboard_categories.xml
index 20538efeed..4cd437ed57 100755
--- a/packages/apps/Settings/res/xml/dashboard_categories.xml
+++ b/packages/apps/Settings/res/xml/dashboard_categories.xml
@@ -124,6 +124,14 @@
android:icon="@drawable/ic_settings_battery"
/>
+
+
+
0 && value < 100) {
- return res.getString(R.string.battery_saver_turn_on_automatically_pct,
- Utils.formatPercentage(value));
- }
- return res.getString(R.string.battery_saver_turn_on_automatically_never);
- }
- };
- mTriggerPref.init(this);
-
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+
+ mShowIndicatorPref = (SwitchPreference) findPreference(KEY_SHOW_INDICATOR);
+ mShowIndicatorPref.setOnPreferenceChangeListener(this);
+ mEnableWhenLowBatteryPref = (SwitchPreference) findPreference(KEY_TURN_ON_AUTOMATICALLY);
+ mEnableWhenLowBatteryPref.setOnPreferenceChangeListener(this);
+ mLimitCPU = (SwitchPreference) findPreference(KEY_LIMIT_CPU);
+ mLimitCPU.setOnPreferenceChangeListener(this);
+ if (!SystemProperties.getBoolean(PROPERTY_THERMAL_ENABLED, false)) {
+ final PreferenceCategory parent = (PreferenceCategory) findPreference(KEY_SUB_ITEMS);
+ parent.removePreference(mLimitCPU);
+ mLimitCPU = null;
+ }
+ mLimitBrightness = (SwitchPreference) findPreference(KEY_LIMIT_BRIGHTNESS);
+ mLimitBrightness.setOnPreferenceChangeListener(this);
+ mLimitLocation = (SwitchPreference) findPreference(KEY_LIMIT_LOCATION);
+ mLimitLocation.setOnPreferenceChangeListener(this);
+ mLimitNetwork = (SwitchPreference) findPreference(KEY_LIMIT_NETWORK);
+ mLimitNetwork.setOnPreferenceChangeListener(this);
+ mLimitAnimation = (SwitchPreference) findPreference(KEY_LIMIT_ANIMATION);
+ mLimitAnimation.setOnPreferenceChangeListener(this);
}
@Override
@@ -109,6 +136,35 @@ public class BatterySaverSettings extends SettingsPreferenceFragment
mValidListener = true;
}
updateSwitch();
+ updateBasicItems();
+ updateSubItems();
+ }
+
+ private void updateBasicItems() {
+ if (mShowIndicatorPref != null) {
+ mShowIndicatorPref.setChecked(isShowPowerSaveModeIndicator());
+ }
+ if (mEnableWhenLowBatteryPref != null) {
+ mEnableWhenLowBatteryPref.setChecked(getLowPowerModeTriggerLevel() > 0);
+ }
+ }
+
+ private void updateSubItems() {
+ if (mLimitCPU != null) {
+ mLimitCPU.setChecked(getLimitOnPowerSaveMode(KEY_LIMIT_CPU));
+ }
+ if (mLimitBrightness != null) {
+ mLimitBrightness.setChecked(getLimitOnPowerSaveMode(KEY_LIMIT_BRIGHTNESS));
+ }
+ if (mLimitLocation != null) {
+ mLimitLocation.setChecked(getLimitOnPowerSaveMode(KEY_LIMIT_LOCATION));
+ }
+ if (mLimitNetwork != null) {
+ mLimitNetwork.setChecked(getLimitOnPowerSaveMode(KEY_LIMIT_NETWORK));
+ }
+ if (mLimitAnimation != null) {
+ mLimitAnimation.setChecked(getLimitOnPowerSaveMode(KEY_LIMIT_ANIMATION));
+ }
}
@Override
@@ -121,6 +177,42 @@ public class BatterySaverSettings extends SettingsPreferenceFragment
mValidListener = false;
}
}
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object objValue) {
+ final String key = preference.getKey();
+
+ if (KEY_SHOW_INDICATOR.equals(key)) {
+ boolean show = (Boolean) objValue;
+ showPowerSaveModeIndicator(show);
+ } else if (KEY_TURN_ON_AUTOMATICALLY.equals(key)) {
+ boolean auto = (Boolean) objValue;
+ setLowPowerModeTriggerLevel(auto ? 15 : 0);
+
+ if (auto) {
+ if (isAllSubItemDisabled()) {
+ enableAllSubItem();
+ mHandler.post(mUpdateSubItems);
+ }
+ }
+ } else if (KEY_LIMIT_CPU.equals(key)
+ || KEY_LIMIT_BRIGHTNESS.equals(key)
+ || KEY_LIMIT_LOCATION.equals(key)
+ || KEY_LIMIT_NETWORK.equals(key)
+ || KEY_LIMIT_ANIMATION.equals(key)) {
+ boolean limit = (Boolean) objValue;
+ setLimitOnPowerSaveMode(key, limit);
+
+ if (isAllSubItemDisabled()) {
+ onSwitchChanged(mSwitch, false);
+ setLowPowerModeTriggerLevel(0);
+ if (mEnableWhenLowBatteryPref != null) {
+ mEnableWhenLowBatteryPref.setChecked(false);
+ }
+ }
+ }
+
+ return true;
+ }
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
@@ -137,6 +229,13 @@ public class BatterySaverSettings extends SettingsPreferenceFragment
if (!mPowerManager.setPowerSaveMode(mode)) {
if (DEBUG) Log.d(TAG, "Setting mode failed, fallback to current value");
mHandler.post(mUpdateSwitch);
+ } else {
+ if (mode) {
+ if (isAllSubItemDisabled()) {
+ enableAllSubItem();
+ mHandler.post(mUpdateSubItems);
+ }
+ }
}
}
@@ -206,7 +305,8 @@ public class BatterySaverSettings extends SettingsPreferenceFragment
@Override
public void onChange(boolean selfChange, Uri uri) {
if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) {
- mTriggerPref.update(mContext);
+ int level = getLowPowerModeTriggerLevel();
+ mEnableWhenLowBatteryPref.setChecked(level > 0);
}
}
@@ -219,4 +319,113 @@ public class BatterySaverSettings extends SettingsPreferenceFragment
}
}
}
+
+ private boolean isShowPowerSaveModeIndicator() {
+ final ContentResolver cr = getContentResolver();
+ final boolean val = Global.getInt(cr, Global.SHOW_LOW_POWER_MODE_INDICATOR, 1) != 0;
+ return val;
+ }
+
+ private void showPowerSaveModeIndicator(boolean show) {
+ final ContentResolver cr = getContentResolver();
+ Settings.Global.putInt(cr, Global.SHOW_LOW_POWER_MODE_INDICATOR, show ? 1 : 0);
+ }
+
+ private int getLowPowerModeTriggerLevel() {
+ final ContentResolver cr = getContentResolver();
+ final int val = Global.getInt(cr, Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ return val;
+ }
+
+ private void setLowPowerModeTriggerLevel(int val) {
+ final ContentResolver cr = getContentResolver();
+ Settings.Global.putInt(cr, Global.LOW_POWER_MODE_TRIGGER_LEVEL, val);
+ }
+
+ private boolean getLimitOnPowerSaveMode(String key) {
+ final ContentResolver cr = getContentResolver();
+ final boolean val;
+ switch (key) {
+ case KEY_LIMIT_CPU:
+ val = Settings.Global.getInt(cr, Settings.Global.LOW_POWER_MODE_LIMIT_CPU, 1) != 0;
+ break;
+ case KEY_LIMIT_BRIGHTNESS:
+ val = Settings.Global.getInt(cr, Settings.Global.LOW_POWER_MODE_LIMIT_BRIGHTNESS, 1) != 0;
+ break;
+ case KEY_LIMIT_LOCATION:
+ val = Settings.Secure.getInt(cr, Settings.Secure.LOW_POWER_MODE_LIMIT_LOCATION, 1) != 0;
+ break;
+ case KEY_LIMIT_NETWORK:
+ val = Settings.Global.getInt(cr, Settings.Global.LOW_POWER_MODE_LIMIT_NETWORK, 1) != 0;
+ break;
+ case KEY_LIMIT_ANIMATION:
+ val = Settings.Global.getInt(cr, Settings.Global.LOW_POWER_MODE_LIMIT_ANIMATION, 1) != 0;
+ break;
+ default:
+ Log.e(TAG, "Not found settings for " + key);
+ val = false;
+ break;
+ }
+ return val;
+ }
+
+ private void setLimitOnPowerSaveMode(String key, boolean limit) {
+ final ContentResolver cr = getContentResolver();
+ switch (key) {
+ case KEY_LIMIT_CPU:
+ Settings.Global.putInt(cr, Settings.Global.LOW_POWER_MODE_LIMIT_CPU, limit ? 1 : 0);
+ break;
+ case KEY_LIMIT_BRIGHTNESS:
+ Settings.Global.putInt(cr, Settings.Global.LOW_POWER_MODE_LIMIT_BRIGHTNESS, limit ? 1 : 0);
+ break;
+ case KEY_LIMIT_LOCATION:
+ Settings.Secure.putInt(cr, Settings.Secure.LOW_POWER_MODE_LIMIT_LOCATION, limit ? 1 : 0);
+ break;
+ case KEY_LIMIT_NETWORK:
+ Settings.Global.putInt(cr, Settings.Global.LOW_POWER_MODE_LIMIT_NETWORK, limit ? 1 : 0);
+ break;
+ case KEY_LIMIT_ANIMATION:
+ Settings.Global.putInt(cr, Settings.Global.LOW_POWER_MODE_LIMIT_ANIMATION, limit ? 1 : 0);
+ break;
+ default:
+ Log.e(TAG, "Not found settings for " + key);
+ break;
+ }
+ }
+
+ private boolean isAllSubItemDisabled() {
+ if ((mLimitCPU == null || !getLimitOnPowerSaveMode(KEY_LIMIT_CPU))
+ && !getLimitOnPowerSaveMode(KEY_LIMIT_BRIGHTNESS)
+ && !getLimitOnPowerSaveMode(KEY_LIMIT_LOCATION)
+ && !getLimitOnPowerSaveMode(KEY_LIMIT_NETWORK)
+ && !getLimitOnPowerSaveMode(KEY_LIMIT_ANIMATION)) {
+ return true;
+ }
+ return false;
+ }
+
+ private void enableAllSubItem() {
+ if (mLimitCPU != null) {
+ setLimitOnPowerSaveMode(KEY_LIMIT_CPU, true);
+ }
+ if (mLimitBrightness != null) {
+ setLimitOnPowerSaveMode(KEY_LIMIT_BRIGHTNESS, true);
+ }
+ if (mLimitLocation != null) {
+ setLimitOnPowerSaveMode(KEY_LIMIT_LOCATION, true);
+ }
+ if (mLimitNetwork != null) {
+ setLimitOnPowerSaveMode(KEY_LIMIT_NETWORK, true);
+ }
+ if (mLimitAnimation != null) {
+ setLimitOnPowerSaveMode(KEY_LIMIT_ANIMATION, true);
+ }
+ }
+
+ private final Runnable mUpdateSubItems = new Runnable() {
+ @Override
+ public void run() {
+ updateSubItems();
+ }
+ };
}