diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 2f1d679744c4a..93bd4ec3bcf70 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4753,5 +4753,8 @@ Couldn\u2019t restore shortcut - Battery saver activated.\n\nSee go/extreme-battery-saver.\n\nThis contains aggressive experimental changes for P and may affect background app behavior.\n + \"Extreme\" battery saver activated.\n\nSee the details at: go/extreme-battery-saver\n\nEBS aggressively throttles background apps and changes screen-off behavior.\n + + + Extreme battery saver diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a1158162ee730..dc6f01d904ac2 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3158,4 +3158,6 @@ + + diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto index 52f721b0c2b09..75d080d704232 100644 --- a/proto/src/system_messages.proto +++ b/proto/src/system_messages.proto @@ -223,6 +223,9 @@ message SystemMessage { // Package: com.android.systemui NOTE_TV_PIP = 1100; + // Extreme battery saver notifiaction. + NOTE_BATTERY_SAVER_WARNING = 1200; + // Notify the user that open Wi-Fi networks are available. // Package: android NOTE_NETWORK_AVAILABLE = 17303299; diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java index 80bc935959a2c..1b19c33848cdd 100644 --- a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java +++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java @@ -16,12 +16,18 @@ package com.android.server.power.batterysaver; import android.Manifest; +import android.app.ActivityManager; import android.app.ActivityManagerInternal; +import android.app.Notification; +import android.app.Notification.BigTextStyle; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.hardware.power.V1_0.PowerHint; +import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -32,9 +38,11 @@ import android.os.PowerSaveState; import android.os.UserHandle; import android.util.ArrayMap; import android.util.Slog; -import android.widget.Toast; +import com.android.internal.R; import com.android.internal.annotations.GuardedBy; +import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; +import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.util.ArrayUtils; import com.android.internal.util.Preconditions; import com.android.server.LocalServices; @@ -61,6 +69,8 @@ public class BatterySaverController implements BatterySaverPolicyListener { private final BatterySaverPolicy mBatterySaverPolicy; + private static final String WARNING_LINK_URL = "http://goto.google.com/extreme-battery-saver"; + @GuardedBy("mLock") private final ArrayList mListeners = new ArrayList<>(); @@ -230,9 +240,9 @@ public class BatterySaverController implements BatterySaverPolicyListener { if (sendBroadcast) { if (enabled) { // STOPSHIP Remove the toast. - Toast.makeText(mContext, - com.android.internal.R.string.battery_saver_warning, - Toast.LENGTH_LONG).show(); + postWarningNotification(); + } else { + cancelWarningNotification(); } if (DEBUG) { @@ -265,4 +275,51 @@ public class BatterySaverController implements BatterySaverPolicyListener { } } } + + private void postWarningNotification() { + final UserHandle foregroundUser = UserHandle.of(ActivityManager.getCurrentUser()); + + final PendingIntent pendingIntent = PendingIntent + .getActivityAsUser(mContext, 0, + new Intent(Intent.ACTION_VIEW, Uri.parse(WARNING_LINK_URL)), + PendingIntent.FLAG_CANCEL_CURRENT, null, + foregroundUser); + + final CharSequence title = mContext.getString + (com.android.internal.R.string.battery_saver_warning_title); + final CharSequence text = mContext.getString + (com.android.internal.R.string.battery_saver_warning); + + final Notification notification = + new Notification.Builder(mContext, SystemNotificationChannels.ALERTS) + .setSmallIcon(R.drawable.stat_notify_error) + .setTicker(title) + .setWhen(System.currentTimeMillis()) + .setContentTitle(title) + .setContentText(text) + .setContentIntent(pendingIntent) + .setStyle(new BigTextStyle().bigText(text)) + .build(); + + final NotificationManager nm = mContext.getSystemService(NotificationManager.class); + + if (nm != null) { + nm.notifyAsUser(title.toString(), + SystemMessage.NOTE_BATTERY_SAVER_WARNING, + notification, + foregroundUser); + } + } + + private void cancelWarningNotification() { + final UserHandle foregroundUser = UserHandle.of(ActivityManager.getCurrentUser()); + final CharSequence title = mContext.getString + (com.android.internal.R.string.battery_saver_warning_title); + + final NotificationManager nm = mContext.getSystemService(NotificationManager.class); + if (nm != null) { + nm.cancelAsUser(title.toString(), SystemMessage.NOTE_BATTERY_SAVER_WARNING, + foregroundUser); + } + } }