summaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
authorJohn Spurlock <jspurlock@google.com>2014-08-02 17:12:43 -0400
committerJohn Spurlock <jspurlock@google.com>2014-08-02 17:12:43 -0400
commit1bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4 (patch)
tree9a564cf3b25fca29227947cc41de0d678f450d21 /packages
parentbc53cb41f44adf8440761796a0ef4a4aea6ef7ff (diff)
downloadframeworks_base-1bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4.zip
frameworks_base-1bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4.tar.gz
frameworks_base-1bb480a3a4ce2ce63c5d09fa7f5cc38ec160ebf4.tar.bz2
Battery saver: new policy changes + SystemUI tweaks.
- Service policy changes: allow the user to turn off (snooze) saver mode below the auto-trigger level. Plugging in the device always exits saver mode. - Default trigger level is now 0 (never) instead of 15. - SystemUI now also listens to a new POWER_SAVE_MODE_CHANGING, since waiting for _CHANGED can take seconds. - Move shared feature description text into the framework so it can be shared. - Tweak dialog title + action strings. - Remove trigger-level from SystemUI, it no longer needs it. - Add the ability to turn off saver mode directly from the notification. - Migrate saver confirmation dialog to common system UI dialog helper, and add a few convenience methods. - Fix bug where the status bar area would be orange over the keyguard in SHADE_LOCKED mode. Bug:16214395 Change-Id: I3d1ded1eec9e63e7d97469486f6a320e1bebbccd
Diffstat (limited to 'packages')
-rw-r--r--packages/SystemUI/res/values/strings.xml13
-rw-r--r--packages/SystemUI/src/com/android/systemui/power/PowerDialogWarnings.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java83
-rw-r--r--packages/SystemUI/src/com/android/systemui/power/PowerUI.java39
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java8
7 files changed, 96 insertions, 81 deletions
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 085d2f9..296cdad 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -86,16 +86,13 @@
<string name="battery_low_why">Settings</string>
<!-- Battery saver confirmation dialog title [CHAR LIMIT=NONE]-->
- <string name="battery_saver_confirmation_title">Start battery saver?</string>
+ <string name="battery_saver_confirmation_title">Turn on battery saver?</string>
<!-- Battery saver confirmation dialog ok text [CHAR LIMIT=40]-->
- <string name="battery_saver_confirmation_ok">Start</string>
+ <string name="battery_saver_confirmation_ok">Turn on</string>
<!-- Battery saver notification action [CHAR LIMIT=NONE]-->
- <string name="battery_saver_start_action">Start battery saver</string>
-
- <!-- Battery saver confirmation dialog text [CHAR LIMIT=NONE]-->
- <string name="battery_saver_confirmation_text">To help improve battery life, Battery saver will reduce your device’s performance.\n\nBattery saver will be disabled when your device is plugged in.</string>
+ <string name="battery_saver_start_action">Turn on battery saver</string>
<!-- Name of the button that links to the Settings app. [CHAR LIMIT=NONE] -->
<string name="status_bar_settings_settings_button">Settings</string>
@@ -719,10 +716,10 @@
<string name="battery_saver_notification_title">Battery saver is on</string>
<!-- Battery saver notification text. [CHAR LIMIT=60] -->
- <string name="battery_saver_notification_text">Device performance is reduced.</string>
+ <string name="battery_saver_notification_text">Reduces performance and background data</string>
<!-- Battery saver notification action text. [CHAR LIMIT=60] -->
- <string name="battery_saver_notification_action_text">Open battery saver settings</string>
+ <string name="battery_saver_notification_action_text">Turn off battery saver</string>
<!-- Battery level for expanded quick settings [CHAR LIMIT=2] -->
<string name="battery_level_template"><xliff:g id="level" example="45">%d</xliff:g>%%</string>
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerDialogWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerDialogWarnings.java
index 2943494..79fadbd 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerDialogWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerDialogWarnings.java
@@ -48,7 +48,6 @@ public class PowerDialogWarnings implements PowerUI.WarningsUI {
private int mBucket;
private long mScreenOffTime;
private boolean mSaver;
- private int mSaverTriggerLevel;
private AlertDialog mInvalidChargerDialog;
private AlertDialog mLowBatteryDialog;
@@ -222,9 +221,4 @@ public class PowerDialogWarnings implements PowerUI.WarningsUI {
public void showSaverMode(boolean mode) {
mSaver = mode;
}
-
- @Override
- public void setSaverTrigger(int level) {
- mSaverTriggerLevel = level;
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index 186b570..9ffe0ef 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -16,7 +16,6 @@
package com.android.systemui.power;
-import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -25,9 +24,10 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
+import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.IntentFilter;
-import android.media.AudioManager;
+import android.media.AudioAttributes;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Handler;
@@ -35,11 +35,10 @@ import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Slog;
-import android.view.ContextThemeWrapper;
import android.view.View;
-import android.view.WindowManager;
import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
import java.io.PrintWriter;
@@ -66,9 +65,14 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
private static final String ACTION_SHOW_FALLBACK_CHARGER = "PNW.chargerFallback";
private static final String ACTION_SHOW_BATTERY_SETTINGS = "PNW.batterySettings";
private static final String ACTION_START_SAVER = "PNW.startSaver";
+ private static final String ACTION_STOP_SAVER = "PNW.stopSaver";
+
+ private static final AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
+ .build();
private final Context mContext;
- private final Context mLightContext;
private final NotificationManager mNoMan;
private final Handler mHandler = new Handler();
private final PowerDialogWarnings mFallbackDialogs;
@@ -84,15 +88,13 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
private long mBucketDroppedNegativeTimeMs;
private boolean mSaver;
- private int mSaverTriggerLevel;
private boolean mWarning;
private boolean mPlaySound;
private boolean mInvalidCharger;
+ private SystemUIDialog mSaverConfirmation;
public PowerNotificationWarnings(Context context) {
mContext = context;
- mLightContext = new ContextThemeWrapper(mContext,
- android.R.style.Theme_DeviceDefault_Light);
mNoMan = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mFallbackDialogs = new PowerDialogWarnings(context);
mReceiver.init();
@@ -105,6 +107,7 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
pw.print("mPlaySound="); pw.println(mPlaySound);
pw.print("mInvalidCharger="); pw.println(mInvalidCharger);
pw.print("mShowing="); pw.println(SHOWING_STRINGS[mShowing]);
+ pw.print("mSaverConfirmation="); pw.println(mSaverConfirmation != null ? "not null" : null);
}
@Override
@@ -123,12 +126,9 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
@Override
public void showSaverMode(boolean mode) {
mSaver = mode;
- updateNotification();
- }
-
- @Override
- public void setSaverTrigger(int level) {
- mSaverTriggerLevel = level;
+ if (mSaver && mSaverConfirmation != null) {
+ mSaverConfirmation.dismiss();
+ }
updateNotification();
}
@@ -180,6 +180,7 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
.setContentTitle(mContext.getString(R.string.battery_low_title))
.setContentText(mContext.getString(textRes, mBatteryLevel))
.setOngoing(true)
+ .setOnlyAlertOnce(true)
.setPriority(Notification.PRIORITY_MAX)
.setCategory(Notification.CATEGORY_SYSTEM)
.setVisibility(Notification.VISIBILITY_PUBLIC)
@@ -187,10 +188,12 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
if (hasBatterySettings()) {
nb.setContentIntent(pendingBroadcast(ACTION_SHOW_BATTERY_SETTINGS));
}
- if (!mSaver && mSaverTriggerLevel <= 0) {
+ if (!mSaver) {
nb.addAction(R.drawable.ic_power_saver,
mContext.getString(R.string.battery_saver_start_action),
pendingBroadcast(ACTION_START_SAVER));
+ } else {
+ addStopSaverAction(nb);
}
if (mPlaySound) {
attachLowBatterySound(nb);
@@ -208,19 +211,28 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
.setContentTitle(mContext.getString(R.string.battery_saver_notification_title))
.setContentText(mContext.getString(R.string.battery_saver_notification_text))
.setOngoing(true)
- .setWhen(0)
.setShowWhen(false)
.setCategory(Notification.CATEGORY_SYSTEM)
.setVisibility(Notification.VISIBILITY_PUBLIC);
+ addStopSaverAction(nb);
if (hasSaverSettings()) {
- nb.addAction(0,
- mContext.getString(R.string.battery_saver_notification_action_text),
- pendingActivity(mOpenSaverSettings));
nb.setContentIntent(pendingActivity(mOpenSaverSettings));
}
mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, nb.build(), UserHandle.CURRENT);
}
+ private void addStopSaverAction(Notification.Builder nb) {
+ nb.addAction(R.drawable.ic_power_saver,
+ mContext.getString(R.string.battery_saver_notification_action_text),
+ pendingBroadcast(ACTION_STOP_SAVER));
+ }
+
+ private void dismissSaverNotification() {
+ if (mSaver) Slog.i(TAG, "dismissing saver notification");
+ mSaver = false;
+ updateNotification();
+ }
+
private PendingIntent pendingActivity(Intent intent) {
return PendingIntent.getActivityAsUser(mContext,
0, intent, 0, null, UserHandle.CURRENT);
@@ -307,8 +319,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
if (soundPath != null) {
final Uri soundUri = Uri.parse("file://" + soundPath);
if (soundUri != null) {
- b.setSound(soundUri, AudioManager.STREAM_SYSTEM);
- Slog.d(TAG, "playing sound " + soundUri);
+ b.setSound(soundUri, AUDIO_ATTRIBUTES);
+ if (DEBUG) Slog.d(TAG, "playing sound " + soundUri);
}
}
}
@@ -333,17 +345,21 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
}
private void showStartSaverConfirmation() {
- final AlertDialog d = new AlertDialog.Builder(mLightContext)
- .setTitle(R.string.battery_saver_confirmation_title)
- .setMessage(R.string.battery_saver_confirmation_text)
- .setNegativeButton(android.R.string.cancel, null)
- .setPositiveButton(R.string.battery_saver_confirmation_ok, mStartSaverMode)
- .create();
-
- d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
- d.getWindow().getAttributes().privateFlags |=
- WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ if (mSaverConfirmation != null) return;
+ final SystemUIDialog d = new SystemUIDialog(mContext);
+ d.setTitle(R.string.battery_saver_confirmation_title);
+ d.setMessage(com.android.internal.R.string.battery_saver_description);
+ d.setNegativeButton(android.R.string.cancel, null);
+ d.setPositiveButton(R.string.battery_saver_confirmation_ok, mStartSaverMode);
+ d.setShowForAllUsers(true);
+ d.setOnDismissListener(new OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ mSaverConfirmation = null;
+ }
+ });
d.show();
+ mSaverConfirmation = d;
}
private void setSaverSetting(boolean mode) {
@@ -359,6 +375,7 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
filter.addAction(ACTION_SHOW_FALLBACK_CHARGER);
filter.addAction(ACTION_SHOW_BATTERY_SETTINGS);
filter.addAction(ACTION_START_SAVER);
+ filter.addAction(ACTION_STOP_SAVER);
mContext.registerReceiver(this, filter, null, mHandler);
}
@@ -378,6 +395,10 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
} else if (action.equals(ACTION_START_SAVER)) {
dismissLowBatteryNotification();
showStartSaverConfirmation();
+ } else if (action.equals(ACTION_STOP_SAVER)) {
+ dismissSaverNotification();
+ dismissLowBatteryNotification();
+ setSaverSetting(false);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index 1bb7edb..ccef8eb 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -22,13 +22,13 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
-import android.net.Uri;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
+import android.util.Log;
import android.util.Slog;
import com.android.systemui.SystemUI;
@@ -39,11 +39,9 @@ import java.util.Arrays;
public class PowerUI extends SystemUI {
static final String TAG = "PowerUI";
- static final boolean DEBUG = false;
-
+ static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private final Handler mHandler = new Handler();
- private final SettingsObserver mObserver = new SettingsObserver(mHandler);
private final Receiver mReceiver = new Receiver();
private PowerManager mPowerManager;
@@ -75,17 +73,12 @@ public class PowerUI extends SystemUI {
false, obs, UserHandle.USER_ALL);
updateBatteryWarningLevels();
mReceiver.init();
- mObserver.init();
}
private void setSaverMode(boolean mode) {
mWarnings.showSaverMode(mode);
}
- private void setSaverTrigger(int level) {
- mWarnings.setSaverTrigger(level);
- }
-
void updateBatteryWarningLevels() {
int critLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel);
@@ -143,6 +136,7 @@ public class PowerUI extends SystemUI {
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
+ filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
mContext.registerReceiver(this, filter, null, mHandler);
updateSaverMode();
@@ -214,6 +208,8 @@ public class PowerUI extends SystemUI {
mScreenOffTime = -1;
} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
updateSaverMode();
+ } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
+ setSaverMode(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));
} else {
Slog.w(TAG, "unknown intent: " + intent);
}
@@ -251,7 +247,6 @@ public class PowerUI extends SystemUI {
public interface WarningsUI {
void update(int batteryLevel, int bucket, long screenOffTime);
- void setSaverTrigger(int level);
void showSaverMode(boolean mode);
void dismissLowBatteryWarning();
void showLowBatteryWarning(boolean playSound);
@@ -261,29 +256,5 @@ public class PowerUI extends SystemUI {
boolean isInvalidChargerWarningShowing();
void dump(PrintWriter pw);
}
-
- private final class SettingsObserver extends ContentObserver {
- private final Uri LOW_POWER_MODE_TRIGGER_LEVEL_URI =
- Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL);
-
- public SettingsObserver(Handler handler) {
- super(handler);
- }
-
- public void init() {
- onChange(true, LOW_POWER_MODE_TRIGGER_LEVEL_URI);
- final ContentResolver cr = mContext.getContentResolver();
- cr.registerContentObserver(LOW_POWER_MODE_TRIGGER_LEVEL_URI, false, this);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) {
- final int level = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
- setSaverTrigger(level);
- }
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 06c7be2..2be3d5a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -2436,7 +2436,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
final boolean powerSave = mBatteryController.isPowerSave();
final boolean anim = (mScreenOn == null || mScreenOn) && windowState != WINDOW_STATE_HIDDEN
&& !powerSave;
- if (powerSave && getBarState() != StatusBarState.KEYGUARD) {
+ if (powerSave && getBarState() == StatusBarState.SHADE) {
mode = MODE_WARNING;
}
transitions.transitionTo(mode, anim);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
index 86a6622..d701b3c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -27,8 +27,12 @@ import android.view.WindowManager;
*/
public class SystemUIDialog extends AlertDialog {
+ private final Context mContext;
+
public SystemUIDialog(Context context) {
super(context, R.style.Theme_SystemUI_Dialog);
+ mContext = context;
+
getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
@@ -36,4 +40,26 @@ public class SystemUIDialog extends AlertDialog {
attrs.setTitle(getClass().getSimpleName());
getWindow().setAttributes(attrs);
}
+
+ public void setShowForAllUsers(boolean show) {
+ if (show) {
+ getWindow().getAttributes().privateFlags |=
+ WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ } else {
+ getWindow().getAttributes().privateFlags &=
+ ~WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ }
+ }
+
+ public void setMessage(int resId) {
+ setMessage(mContext.getString(resId));
+ }
+
+ public void setPositiveButton(int resId, OnClickListener onClick) {
+ setButton(BUTTON_POSITIVE, mContext.getString(resId), onClick);
+ }
+
+ public void setNegativeButton(int resId, OnClickListener onClick) {
+ setButton(BUTTON_NEGATIVE, mContext.getString(resId), onClick);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
index 1e65543..d1b69ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -47,6 +47,7 @@ public class BatteryController extends BroadcastReceiver {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
+ filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
context.registerReceiver(this, filter);
updatePowerSave();
@@ -86,6 +87,8 @@ public class BatteryController extends BroadcastReceiver {
fireBatteryLevelChanged();
} else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) {
updatePowerSave();
+ } else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)) {
+ setPowerSave(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));
}
}
@@ -94,7 +97,10 @@ public class BatteryController extends BroadcastReceiver {
}
private void updatePowerSave() {
- final boolean powerSave = mPowerManager.isPowerSaveMode();
+ setPowerSave(mPowerManager.isPowerSaveMode());
+ }
+
+ private void setPowerSave(boolean powerSave) {
if (powerSave == mPowerSave) return;
mPowerSave = powerSave;
if (DEBUG) Log.d(TAG, "Power save is " + (mPowerSave ? "on" : "off"));