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(); + } + }; }