diff options
author | Michael Bestas <mikeioannina@gmail.com> | 2015-02-28 21:30:04 +0200 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-11-03 18:52:03 -0800 |
commit | 821fd62d952e380a260fc6edae8919284785796a (patch) | |
tree | 17882ad31e02f1690d65292214bb418857ec3ec4 /src | |
parent | b0b82ba44ec037fab81f47353c17e85c794f8051 (diff) | |
download | packages_apps_Settings-821fd62d952e380a260fc6edae8919284785796a.zip packages_apps_Settings-821fd62d952e380a260fc6edae8919284785796a.tar.gz packages_apps_Settings-821fd62d952e380a260fc6edae8919284785796a.tar.bz2 |
Settings: Cleanup battery saver settings
* Add back auto battery saver
* Add back support for battery saver on devices without perf profiles
Change-Id: I562420a81592fde54a96dca88a71ed9137bb59a9
Diffstat (limited to 'src')
7 files changed, 146 insertions, 249 deletions
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 727c446..101219b 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -75,7 +75,6 @@ public class Settings extends SettingsActivity { 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 AccountSettingsActivity extends SettingsActivity { /* empty */ } public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ } diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index bb289a2..70694c8 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -89,7 +89,6 @@ import com.android.settings.deviceinfo.PrivateVolumeForget; import com.android.settings.deviceinfo.PrivateVolumeSettings; import com.android.settings.deviceinfo.PublicVolumeSettings; import com.android.settings.deviceinfo.StorageSettings; -import com.android.settings.fuelgauge.BatterySaverSettings; import com.android.settings.fuelgauge.PowerUsageDetail; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.livedisplay.LiveDisplay; @@ -349,7 +348,6 @@ public class SettingsActivity extends Activity ChooseLockPassword.ChooseLockPasswordFragment.class.getName(), ChooseLockPattern.ChooseLockPatternFragment.class.getName(), InstalledAppDetails.class.getName(), - BatterySaverSettings.class.getName(), AppNotificationSettings.class.getName(), OtherSoundSettings.class.getName(), ApnSettings.class.getName(), diff --git a/src/com/android/settings/cyanogenmod/GlobalSettingSwitchPreference.java b/src/com/android/settings/cyanogenmod/GlobalSettingSwitchPreference.java new file mode 100644 index 0000000..88e0a0e --- /dev/null +++ b/src/com/android/settings/cyanogenmod/GlobalSettingSwitchPreference.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2015 The CyanogenMod 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.cyanogenmod; + +import android.content.Context; +import android.preference.SwitchPreference; +import android.provider.Settings; +import android.util.AttributeSet; + +public class GlobalSettingSwitchPreference extends SwitchPreference { + public GlobalSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public GlobalSettingSwitchPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public GlobalSettingSwitchPreference(Context context) { + super(context, null); + } + + @Override + protected boolean persistBoolean(boolean value) { + if (shouldPersist()) { + if (value == getPersistedBoolean(!value)) { + // It's already there, so the same as persisting + return true; + } + Settings.Global.putInt(getContext().getContentResolver(), getKey(), value ? 1 : 0); + return true; + } + return false; + } + + @Override + protected boolean getPersistedBoolean(boolean defaultReturnValue) { + if (!shouldPersist()) { + return defaultReturnValue; + } + return Settings.Global.getInt(getContext().getContentResolver(), + getKey(), defaultReturnValue ? 1 : 0) != 0; + } + + @Override + protected boolean isPersisted() { + // Using getString instead of getInt so we can simply check for null + // instead of catching an exception. (All values are stored as strings.) + return Settings.Global.getString(getContext().getContentResolver(), getKey()) != null; + } +} diff --git a/src/com/android/settings/fuelgauge/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/BatterySaverSettings.java deleted file mode 100644 index d8a9ca0..0000000 --- a/src/com/android/settings/fuelgauge/BatterySaverSettings.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * 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 static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGING; - -import android.content.BroadcastReceiver; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -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.PowerManager; -import android.provider.Settings.Global; -import android.util.Log; -import android.widget.Switch; - -import com.android.internal.logging.MetricsLogger; -import com.android.settings.R; -import com.android.settings.SettingsActivity; -import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.Utils; -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 boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private static final String KEY_TURN_ON_AUTOMATICALLY = "turn_on_automatically"; - private static final long WAIT_FOR_SWITCH_ANIM = 500; - - private final Handler mHandler = new Handler(); - private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler); - private final Receiver mReceiver = new Receiver(); - - private Context mContext; - private boolean mCreated; - private SettingPref mTriggerPref; - private SwitchBar mSwitchBar; - private Switch mSwitch; - private boolean mValidListener; - private PowerManager mPowerManager; - - @Override - protected int getMetricsCategory() { - return MetricsLogger.FUELGAUGE_BATTERY_SAVER; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - if (mCreated) { - mSwitchBar.show(); - return; - } - mCreated = true; - addPreferencesFromResource(R.xml.battery_saver_settings); - - mContext = getActivity(); - mSwitchBar = ((SettingsActivity) mContext).getSwitchBar(); - mSwitch = mSwitchBar.getSwitch(); - mSwitchBar.show(); - - mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY, - Global.LOW_POWER_MODE_TRIGGER_LEVEL, - 0, /*default*/ - 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, - Utils.formatPercentage(value)); - } - return res.getString(R.string.battery_saver_turn_on_automatically_never); - } - }; - mTriggerPref.init(this); - - mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - mSwitchBar.hide(); - } - - @Override - public void onResume() { - super.onResume(); - mSettingsObserver.setListening(true); - mReceiver.setListening(true); - if (!mValidListener) { - mSwitchBar.addOnSwitchChangeListener(this); - mValidListener = true; - } - updateSwitch(); - } - - @Override - public void onPause() { - super.onPause(); - mSettingsObserver.setListening(false); - mReceiver.setListening(false); - if (mValidListener) { - mSwitchBar.removeOnSwitchChangeListener(this); - mValidListener = false; - } - } - - @Override - public void onSwitchChanged(Switch switchView, boolean isChecked) { - mHandler.removeCallbacks(mStartMode); - if (isChecked) { - mHandler.postDelayed(mStartMode, WAIT_FOR_SWITCH_ANIM); - } else { - if (DEBUG) Log.d(TAG, "Stopping low power mode from settings"); - trySetPowerSaveMode(false); - } - } - - private void trySetPowerSaveMode(boolean mode) { - if (!mPowerManager.setPowerSaveMode(mode)) { - if (DEBUG) Log.d(TAG, "Setting mode failed, fallback to current value"); - mHandler.post(mUpdateSwitch); - } - } - - private void updateSwitch() { - final boolean mode = mPowerManager.isPowerSaveMode(); - if (DEBUG) Log.d(TAG, "updateSwitch: isChecked=" + mSwitch.isChecked() + " mode=" + mode); - if (mode == mSwitch.isChecked()) return; - - // set listener to null so that that code below doesn't trigger onCheckedChanged() - if (mValidListener) { - mSwitchBar.removeOnSwitchChangeListener(this); - } - mSwitch.setChecked(mode); - if (mValidListener) { - mSwitchBar.addOnSwitchChangeListener(this); - } - } - - private final Runnable mUpdateSwitch = new Runnable() { - @Override - public void run() { - updateSwitch(); - } - }; - - private final Runnable mStartMode = new Runnable() { - @Override - public void run() { - AsyncTask.execute(new Runnable() { - @Override - public void run() { - if (DEBUG) Log.d(TAG, "Starting low power mode from settings"); - trySetPowerSaveMode(true); - } - }); - } - }; - - private final class Receiver extends BroadcastReceiver { - private boolean mRegistered; - - @Override - public void onReceive(Context context, Intent intent) { - if (DEBUG) Log.d(TAG, "Received " + intent.getAction()); - mHandler.post(mUpdateSwitch); - } - - public void setListening(boolean listening) { - if (listening && !mRegistered) { - mContext.registerReceiver(this, new IntentFilter(ACTION_POWER_SAVE_MODE_CHANGING)); - mRegistered = true; - } else if (!listening && mRegistered) { - mContext.unregisterReceiver(this); - mRegistered = false; - } - } - } - - private final class SettingsObserver extends ContentObserver { - 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_TRIGGER_LEVEL_URI.equals(uri)) { - mTriggerPref.update(mContext); - } - } - - public void setListening(boolean listening) { - final ContentResolver cr = getContentResolver(); - if (listening) { - 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 445896d..8f20bce 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -18,16 +18,25 @@ package com.android.settings.fuelgauge; import android.app.Activity; import android.graphics.drawable.Drawable; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.Resources; +import android.os.BatteryManager; import android.os.BatteryStats; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.os.PowerManager; import android.os.Process; import android.os.UserHandle; import android.preference.Preference; import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; +import android.preference.SwitchPreference; +import android.provider.Settings; import android.text.TextUtils; import android.util.SparseArray; import android.util.TypedValue; @@ -63,8 +72,11 @@ public class PowerUsageSummary extends PowerUsageBase { static final String TAG = "PowerUsageSummary"; private static final String KEY_APP_LIST = "app_list"; + private static final String KEY_BATTERY_HISTORY = "battery_history"; + private static final String KEY_BATTERY_SAVER = "low_power"; + private static final int MENU_STATS_TYPE = Menu.FIRST; private static final int MENU_BATTERY_SAVER = Menu.FIRST + 2; private static final int MENU_HIGH_POWER_APPS = Menu.FIRST + 3; @@ -73,6 +85,8 @@ public class PowerUsageSummary extends PowerUsageBase { private BatteryHistoryPreference mHistPref; private PreferenceGroup mAppListGroup; + private boolean mBatteryPluggedIn; + private int mStatsType = BatteryStats.STATS_SINCE_CHARGED; private static final int MIN_POWER_THRESHOLD_MILLI_AMP = 5; @@ -80,6 +94,10 @@ public class PowerUsageSummary extends PowerUsageBase { private static final int MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP = 10; private static final int SECONDS_IN_HOUR = 60 * 60; + private SwitchPreference mBatterySaverPref; + + private PowerManager mPowerManager; + @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -87,6 +105,9 @@ public class PowerUsageSummary extends PowerUsageBase { addPreferencesFromResource(R.xml.power_usage_summary); mHistPref = (BatteryHistoryPreference) findPreference(KEY_BATTERY_HISTORY); mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST); + mBatterySaverPref = (SwitchPreference) findPreference(KEY_BATTERY_SAVER); + + mPowerManager = (PowerManager)getSystemService(Context.POWER_SERVICE); } @Override @@ -98,6 +119,10 @@ public class PowerUsageSummary extends PowerUsageBase { public void onResume() { super.onResume(); refreshStats(); + + if (mBatterySaverPref != null) { + refreshBatterySaverOptions(); + } } @Override @@ -118,7 +143,7 @@ public class PowerUsageSummary extends PowerUsageBase { @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (!(preference instanceof PowerGaugePreference)) { - return false; + return super.onPreferenceTreeClick(preferenceScreen, preference); } PowerGaugePreference pgp = (PowerGaugePreference) preference; BatteryEntry entry = pgp.getInfo(); @@ -143,11 +168,6 @@ public class PowerUsageSummary extends PowerUsageBase { } @Override - protected int getHelpResource() { - return R.string.help_url_battery; - } - - @Override public boolean onOptionsItemSelected(MenuItem item) { final SettingsActivity sa = (SettingsActivity) getActivity(); switch (item.getItemId()) { @@ -160,8 +180,44 @@ public class PowerUsageSummary extends PowerUsageBase { refreshStats(); return true; case MENU_BATTERY_SAVER: - sa.startPreferencePanel(BatterySaverSettings.class.getName(), null, - R.string.battery_saver, null, null, 0); + Resources res = getResources(); + + final int defWarnLevel = res.getInteger( + com.android.internal.R.integer.config_lowBatteryWarningLevel); + final int value = Settings.Global.getInt(getContentResolver(), + Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, defWarnLevel); + + int selectedIndex = -1; + final int[] intVals = res.getIntArray(R.array.battery_saver_trigger_values); + String[] strVals = new String[intVals.length]; + for (int i = 0; i < intVals.length; i++) { + if (intVals[i] == value) { + selectedIndex = i; + } + if (intVals[i] > 0 && intVals[i] < 100) { + strVals[i] = res.getString(R.string.battery_saver_turn_on_automatically_pct, + intVals[i]); + } else { + strVals[i] = + res.getString(R.string.battery_saver_turn_on_automatically_never); + } + } + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) + .setTitle(R.string.battery_saver_turn_on_automatically_title) + .setSingleChoiceItems(strVals, + selectedIndex, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Settings.Global.putInt(getContentResolver(), + Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, + intVals[which]); + } + }) + .setPositiveButton(R.string.okay, null); + builder.create().show(); + return true; case MENU_HIGH_POWER_APPS: Bundle args = new Bundle(); @@ -181,6 +237,16 @@ public class PowerUsageSummary extends PowerUsageBase { mAppListGroup.addPreference(notAvailable); } + private void refreshBatterySaverOptions() { + if (mBatterySaverPref != null) { + mBatterySaverPref.setEnabled(!mBatteryPluggedIn); + mBatterySaverPref.setChecked(!mBatteryPluggedIn && mPowerManager.isPowerSaveMode()); + mBatterySaverPref.setSummary(mBatteryPluggedIn + ? R.string.battery_saver_summary_unavailable + : R.string.battery_saver_summary); + } + } + private static boolean isSharedGid(int uid) { return UserHandle.getAppIdFromSharedAppGid(uid) > 0; } @@ -189,6 +255,13 @@ public class PowerUsageSummary extends PowerUsageBase { return uid >= Process.SYSTEM_UID && uid < Process.FIRST_APPLICATION_UID; } + private boolean isBatteryPluggedIn(Intent intent) { + int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, + BatteryManager.BATTERY_STATUS_UNKNOWN); + return status == BatteryManager.BATTERY_STATUS_CHARGING + || status == BatteryManager.BATTERY_STATUS_FULL; + } + /** * We want to coalesce some UIDs. For example, dex2oat runs under a shared gid that * exists for all users of the same app. We detect this case and merge the power use diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java index 3edfee7..591fb67 100644 --- a/src/com/android/settings/search/Ranking.java +++ b/src/com/android/settings/search/Ranking.java @@ -35,7 +35,6 @@ import com.android.settings.applications.AdvancedAppSettings; import com.android.settings.applications.ManageDefaultApps; import com.android.settings.bluetooth.BluetoothSettings; import com.android.settings.deviceinfo.StorageSettings; -import com.android.settings.fuelgauge.BatterySaverSettings; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.inputmethod.InputMethodAndLanguageSettings; import com.android.settings.location.LocationSettings; @@ -133,7 +132,6 @@ public final class Ranking { // Battery sRankMap.put(PowerUsageSummary.class.getName(), RANK_POWER_USAGE); - sRankMap.put(BatterySaverSettings.class.getName(), RANK_POWER_USAGE); // Advanced app settings sRankMap.put(AdvancedAppSettings.class.getName(), RANK_APPS); diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java index f3c0b42..2f67383 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/search/SearchIndexableResources.java @@ -37,7 +37,6 @@ import com.android.settings.applications.AdvancedAppSettings; import com.android.settings.applications.ManageDefaultApps; import com.android.settings.bluetooth.BluetoothSettings; import com.android.settings.deviceinfo.StorageSettings; -import com.android.settings.fuelgauge.BatterySaverSettings; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.inputmethod.InputMethodAndLanguageSettings; import com.android.settings.location.LocationSettings; @@ -184,13 +183,6 @@ public final class SearchIndexableResources { 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(AdvancedAppSettings.class.getName(), new SearchIndexableResource( Ranking.getRankForClassName(AdvancedAppSettings.class.getName()), |