Settings: Battery saver settings sub-page.

New battery saver settings page, accessed via
the power usage settings overflow menu.

The settings page has a master switch to toggle
battery saver mode, feature disclosure text,
and a preference to configure the automatic
trigger level.

Remove developer checkbox now that this option
has a real home.

NO_SQ: multi project change
Bug:13329308
Change-Id: Iac54238f3406439711b44a3c17f220ac5e370a37
This commit is contained in:
John Spurlock
2014-06-04 19:11:22 -04:00
parent 2eae7a4022
commit c7f8e8ce69
14 changed files with 301 additions and 33 deletions

View File

@@ -122,7 +122,6 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
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 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
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 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
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 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
updateShowTouchesOptions();
updateFlingerOptions();
updateCpuUsageOptions();
updateLowPowerModeOptions();
updateHardwareUiOptions();
updateMsaaOptions();
updateTrackFrameTimeOptions();
@@ -1040,22 +1036,11 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
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(),
@@ -1332,8 +1317,6 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
writeShowUpdatesOption();
} else if (preference == mDisableOverlays) {
writeDisableOverlaysOption();
} else if (preference == mLowPowerMode) {
writeLowPowerModeOptions();
} else if (preference == mShowCpuUsage) {
writeCpuUsageOptions();
} else if (preference == mImmediatelyDestroyActivities) {

View File

@@ -66,6 +66,7 @@ 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 AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }

View File

@@ -63,8 +63,8 @@ import android.view.View;
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.NoHomeDialogFragment;
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.widget.SwitchBar;
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 @@ public class SettingsActivity extends Activity
NotificationSettings.class.getName(),
ChooseLockPassword.ChooseLockPasswordFragment.class.getName(),
ChooseLockPattern.ChooseLockPatternFragment.class.getName(),
InstalledAppDetails.class.getName()
InstalledAppDetails.class.getName(),
BatterySaverSettings.class.getName(),
};
private SharedPreferences mDevelopmentPreferences;

View File

@@ -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);
}
}
}
}

View File

@@ -60,7 +60,8 @@ public class PowerUsageSummary extends PreferenceFragment {
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 @@ public class PowerUsageSummary extends PreferenceFragment {
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 @@ public class PowerUsageSummary extends PreferenceFragment {
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;
}

View File

@@ -97,8 +97,12 @@ public class DropDownPreference extends Preference {
}
}
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);
}

View File

@@ -21,6 +21,7 @@ import static com.android.settings.notification.SettingPref.TYPE_SYSTEM;
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 @@ public class OtherSoundSettings extends SettingsPreferenceFragment implements In
}
@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 @@ public class OtherSoundSettings extends SettingsPreferenceFragment implements In
}
@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();
}
}
};

View File

@@ -18,6 +18,7 @@ package com.android.settings.notification;
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 @@ public class SettingPref {
return true;
}
protected int getResId(Context context, int value) {
protected String getCaption(Resources res, int value) {
throw new UnsupportedOperationException();
}
@@ -71,7 +72,7 @@ public class SettingPref {
} 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);

View File

@@ -30,6 +30,7 @@ import com.android.settings.WirelessSettings;
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 @@ public final class Ranking {
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);

View File

@@ -33,6 +33,7 @@ import com.android.settings.WirelessSettings;
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 @@ 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(UserSettings.class.getName(),
new SearchIndexableResource(
Ranking.getRankForClassName(UserSettings.class.getName()),