blob: 283d5e56dd973caaed0b65e59072476d7b7e219f [file] [log] [blame]
John Spurlock3332ba52014-03-10 17:44:07 -04001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.power;
18
Bill Lin32ed3d62018-10-02 18:10:09 +080019import static android.content.DialogInterface.BUTTON_NEGATIVE;
20import static android.content.DialogInterface.BUTTON_POSITIVE;
21
22import android.app.KeyguardManager;
John Spurlock3332ba52014-03-10 17:44:07 -040023import android.app.Notification;
24import android.app.NotificationManager;
25import android.app.PendingIntent;
Makoto Onuki778ce662018-04-20 14:04:50 -070026import android.content.ActivityNotFoundException;
John Spurlock3332ba52014-03-10 17:44:07 -040027import android.content.BroadcastReceiver;
John Spurlock3332ba52014-03-10 17:44:07 -040028import android.content.Context;
John Spurlock3332ba52014-03-10 17:44:07 -040029import android.content.Intent;
30import android.content.IntentFilter;
John Spurlock1bb480a2014-08-02 17:12:43 -040031import android.media.AudioAttributes;
Makoto Onuki778ce662018-04-20 14:04:50 -070032import android.net.Uri;
John Spurlock3332ba52014-03-10 17:44:07 -040033import android.os.Handler;
Geoffrey Pitsch4a7931d2016-09-15 13:11:47 -040034import android.os.Looper;
John Spurlock8d4e6cb2014-09-14 11:10:22 -040035import android.os.PowerManager;
John Spurlock3332ba52014-03-10 17:44:07 -040036import android.os.UserHandle;
Aurimas Liutikasd3667712018-04-17 09:50:46 -070037import androidx.annotation.VisibleForTesting;
Makoto Onuki778ce662018-04-20 14:04:50 -070038import android.text.Annotation;
39import android.text.Layout;
40import android.text.SpannableString;
41import android.text.SpannableStringBuilder;
42import android.text.TextPaint;
43import android.text.TextUtils;
44import android.text.method.LinkMovementMethod;
45import android.text.style.URLSpan;
46import android.util.Log;
John Spurlock3332ba52014-03-10 17:44:07 -040047import android.util.Slog;
Makoto Onuki778ce662018-04-20 14:04:50 -070048import android.view.View;
John Spurlock3332ba52014-03-10 17:44:07 -040049
Chris Wren5e6c0ff2017-01-05 12:57:06 -050050import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
Jason Monk58be7a62017-02-01 20:17:51 -050051import com.android.settingslib.Utils;
Makoto Onuki16a0dd22018-03-20 10:40:37 -070052import com.android.settingslib.fuelgauge.BatterySaverUtils;
Salvador Martinezeb9ab292018-01-19 17:50:24 -080053import com.android.settingslib.utils.PowerUtil;
Bill Lin32ed3d62018-10-02 18:10:09 +080054import com.android.systemui.Dependency;
John Spurlock3332ba52014-03-10 17:44:07 -040055import com.android.systemui.R;
Adrian Roose25c18d2016-06-17 15:59:49 -070056import com.android.systemui.SystemUI;
Bill Lin32ed3d62018-10-02 18:10:09 +080057import com.android.systemui.plugins.ActivityStarter;
John Spurlock1bb480a2014-08-02 17:12:43 -040058import com.android.systemui.statusbar.phone.SystemUIDialog;
Dan Sandler8e032e12017-01-25 13:41:38 -050059import com.android.systemui.util.NotificationChannels;
Bill Lin32ed3d62018-10-02 18:10:09 +080060import com.android.systemui.volume.Events;
John Spurlock3332ba52014-03-10 17:44:07 -040061
62import java.io.PrintWriter;
Elliott Hughes88d25512014-10-03 12:06:17 -070063import java.text.NumberFormat;
Makoto Onuki778ce662018-04-20 14:04:50 -070064import java.util.Locale;
65import java.util.Objects;
John Spurlock3332ba52014-03-10 17:44:07 -040066
67public class PowerNotificationWarnings implements PowerUI.WarningsUI {
68 private static final String TAG = PowerUI.TAG + ".Notification";
69 private static final boolean DEBUG = PowerUI.DEBUG;
70
Chris Wren5e6c0ff2017-01-05 12:57:06 -050071 private static final String TAG_BATTERY = "low_battery";
72 private static final String TAG_TEMPERATURE = "high_temp";
Makoto Onuki52c62952018-03-22 10:43:03 -070073 private static final String TAG_AUTO_SAVER = "auto_saver";
John Spurlock3332ba52014-03-10 17:44:07 -040074
75 private static final int SHOWING_NOTHING = 0;
76 private static final int SHOWING_WARNING = 1;
John Spurlock3332ba52014-03-10 17:44:07 -040077 private static final int SHOWING_INVALID_CHARGER = 3;
Makoto Onuki52c62952018-03-22 10:43:03 -070078 private static final int SHOWING_AUTO_SAVER_SUGGESTION = 4;
John Spurlock3332ba52014-03-10 17:44:07 -040079 private static final String[] SHOWING_STRINGS = {
80 "SHOWING_NOTHING",
81 "SHOWING_WARNING",
82 "SHOWING_SAVER",
83 "SHOWING_INVALID_CHARGER",
Makoto Onuki52c62952018-03-22 10:43:03 -070084 "SHOWING_AUTO_SAVER_SUGGESTION",
John Spurlock3332ba52014-03-10 17:44:07 -040085 };
86
John Spurlock3332ba52014-03-10 17:44:07 -040087 private static final String ACTION_SHOW_BATTERY_SETTINGS = "PNW.batterySettings";
88 private static final String ACTION_START_SAVER = "PNW.startSaver";
John Spurlock42bfc9a2014-10-29 11:13:01 -040089 private static final String ACTION_DISMISSED_WARNING = "PNW.dismissedWarning";
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -080090 private static final String ACTION_CLICKED_TEMP_WARNING = "PNW.clickedTempWarning";
91 private static final String ACTION_DISMISSED_TEMP_WARNING = "PNW.dismissedTempWarning";
Salvador Martineza6f7b252017-04-10 10:46:15 -070092 private static final String ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING =
93 "PNW.clickedThermalShutdownWarning";
94 private static final String ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING =
95 "PNW.dismissedThermalShutdownWarning";
Makoto Onuki16a0dd22018-03-20 10:40:37 -070096 private static final String ACTION_SHOW_START_SAVER_CONFIRMATION =
97 BatterySaverUtils.ACTION_SHOW_START_SAVER_CONFIRMATION;
Makoto Onuki52c62952018-03-22 10:43:03 -070098 private static final String ACTION_SHOW_AUTO_SAVER_SUGGESTION =
99 BatterySaverUtils.ACTION_SHOW_AUTO_SAVER_SUGGESTION;
100 private static final String ACTION_DISMISS_AUTO_SAVER_SUGGESTION =
101 "PNW.dismissAutoSaverSuggestion";
102
103 private static final String ACTION_ENABLE_AUTO_SAVER =
104 "PNW.enableAutoSaver";
105 private static final String ACTION_AUTO_SAVER_NO_THANKS =
106 "PNW.autoSaverNoThanks";
107
108 private static final String SETTINGS_ACTION_OPEN_BATTERY_SAVER_SETTING =
109 "android.settings.BATTERY_SAVER_SETTINGS";
John Spurlock1bb480a2014-08-02 17:12:43 -0400110
Makoto Onuki778ce662018-04-20 14:04:50 -0700111 private static final String BATTERY_SAVER_DESCRIPTION_URL_KEY = "url";
112
John Spurlock1bb480a2014-08-02 17:12:43 -0400113 private static final AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder()
114 .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
115 .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
116 .build();
John Spurlock3332ba52014-03-10 17:44:07 -0400117
118 private final Context mContext;
John Spurlock3332ba52014-03-10 17:44:07 -0400119 private final NotificationManager mNoMan;
John Spurlock8d4e6cb2014-09-14 11:10:22 -0400120 private final PowerManager mPowerMan;
Bill Lin32ed3d62018-10-02 18:10:09 +0800121 private final KeyguardManager mKeyguard;
Geoffrey Pitsch4a7931d2016-09-15 13:11:47 -0400122 private final Handler mHandler = new Handler(Looper.getMainLooper());
John Spurlock3332ba52014-03-10 17:44:07 -0400123 private final Receiver mReceiver = new Receiver();
124 private final Intent mOpenBatterySettings = settings(Intent.ACTION_POWER_USAGE_SUMMARY);
John Spurlock3332ba52014-03-10 17:44:07 -0400125
126 private int mBatteryLevel;
127 private int mBucket;
128 private long mScreenOffTime;
129 private int mShowing;
130
Salvador Martinezf9e47502018-01-04 13:45:48 -0800131 private long mWarningTriggerTimeMs;
Christoph Studer65fa0a92014-06-26 16:50:09 +0200132
Salvador Martinezf9e47502018-01-04 13:45:48 -0800133 private Estimate mEstimate;
Salvador Martinezbb902fc2018-01-22 19:46:55 -0800134 private long mLowWarningThreshold;
135 private long mSevereWarningThreshold;
John Spurlock3332ba52014-03-10 17:44:07 -0400136 private boolean mWarning;
Makoto Onuki52c62952018-03-22 10:43:03 -0700137 private boolean mShowAutoSaverSuggestion;
John Spurlock3332ba52014-03-10 17:44:07 -0400138 private boolean mPlaySound;
139 private boolean mInvalidCharger;
John Spurlock1bb480a2014-08-02 17:12:43 -0400140 private SystemUIDialog mSaverConfirmation;
Makoto Onuki52c62952018-03-22 10:43:03 -0700141 private SystemUIDialog mSaverEnabledConfirmation;
Salvador Martineza6f7b252017-04-10 10:46:15 -0700142 private boolean mHighTempWarning;
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800143 private SystemUIDialog mHighTempDialog;
Salvador Martineza6f7b252017-04-10 10:46:15 -0700144 private SystemUIDialog mThermalShutdownDialog;
Bill Lin32ed3d62018-10-02 18:10:09 +0800145 @VisibleForTesting
146 protected OverheatAlarmDialog mOverheatAlarmDialog;
John Spurlock3332ba52014-03-10 17:44:07 -0400147
Jason Monkd819c312017-08-11 12:53:36 -0400148 public PowerNotificationWarnings(Context context) {
John Spurlock3332ba52014-03-10 17:44:07 -0400149 mContext = context;
Jason Monkd819c312017-08-11 12:53:36 -0400150 mNoMan = mContext.getSystemService(NotificationManager.class);
John Spurlock8d4e6cb2014-09-14 11:10:22 -0400151 mPowerMan = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
Bill Lin32ed3d62018-10-02 18:10:09 +0800152 mKeyguard = mContext.getSystemService(KeyguardManager.class);
John Spurlock3332ba52014-03-10 17:44:07 -0400153 mReceiver.init();
154 }
155
156 @Override
157 public void dump(PrintWriter pw) {
Bill Lin32ed3d62018-10-02 18:10:09 +0800158 pw.print("mWarning=");
159 pw.println(mWarning);
160 pw.print("mPlaySound=");
161 pw.println(mPlaySound);
162 pw.print("mInvalidCharger=");
163 pw.println(mInvalidCharger);
164 pw.print("mShowing=");
165 pw.println(SHOWING_STRINGS[mShowing]);
166 pw.print("mSaverConfirmation=");
167 pw.println(mSaverConfirmation != null ? "not null" : null);
Makoto Onuki52c62952018-03-22 10:43:03 -0700168 pw.print("mSaverEnabledConfirmation=");
169 pw.println(mSaverEnabledConfirmation != null ? "not null" : null);
Bill Lin32ed3d62018-10-02 18:10:09 +0800170 pw.print("mHighTempWarning=");
171 pw.println(mHighTempWarning);
172 pw.print("mHighTempDialog=");
173 pw.println(mHighTempDialog != null ? "not null" : null);
174 pw.print("mOverheatAlarmDialog=");
175 pw.println(mOverheatAlarmDialog != null ? "not null" : null);
Salvador Martineza6f7b252017-04-10 10:46:15 -0700176 pw.print("mThermalShutdownDialog=");
177 pw.println(mThermalShutdownDialog != null ? "not null" : null);
John Spurlock3332ba52014-03-10 17:44:07 -0400178 }
179
Makoto Onuki52c62952018-03-22 10:43:03 -0700180 private int getLowBatteryAutoTriggerDefaultLevel() {
181 return mContext.getResources().getInteger(
182 com.android.internal.R.integer.config_lowBatteryAutoTriggerDefaultLevel);
183 }
184
John Spurlock3332ba52014-03-10 17:44:07 -0400185 @Override
186 public void update(int batteryLevel, int bucket, long screenOffTime) {
187 mBatteryLevel = batteryLevel;
Christoph Studer65fa0a92014-06-26 16:50:09 +0200188 if (bucket >= 0) {
Salvador Martinezf9e47502018-01-04 13:45:48 -0800189 mWarningTriggerTimeMs = 0;
Christoph Studer65fa0a92014-06-26 16:50:09 +0200190 } else if (bucket < mBucket) {
Salvador Martinezf9e47502018-01-04 13:45:48 -0800191 mWarningTriggerTimeMs = System.currentTimeMillis();
Christoph Studer65fa0a92014-06-26 16:50:09 +0200192 }
John Spurlock3332ba52014-03-10 17:44:07 -0400193 mBucket = bucket;
194 mScreenOffTime = screenOffTime;
John Spurlock3332ba52014-03-10 17:44:07 -0400195 }
196
Salvador Martinezf9e47502018-01-04 13:45:48 -0800197 @Override
198 public void updateEstimate(Estimate estimate) {
199 mEstimate = estimate;
Salvador Martinezbb902fc2018-01-22 19:46:55 -0800200 if (estimate.estimateMillis <= mLowWarningThreshold) {
Salvador Martinezf9e47502018-01-04 13:45:48 -0800201 mWarningTriggerTimeMs = System.currentTimeMillis();
202 }
203 }
204
Salvador Martinezbb902fc2018-01-22 19:46:55 -0800205 @Override
206 public void updateThresholds(long lowThreshold, long severeThreshold) {
207 mLowWarningThreshold = lowThreshold;
208 mSevereWarningThreshold = severeThreshold;
209 }
210
John Spurlock3332ba52014-03-10 17:44:07 -0400211 private void updateNotification() {
John Spurlock86c3de82014-08-19 13:37:44 -0400212 if (DEBUG) Slog.d(TAG, "updateNotification mWarning=" + mWarning + " mPlaySound="
Jason Monkc06fbb12016-01-08 14:12:18 -0500213 + mPlaySound + " mInvalidCharger=" + mInvalidCharger);
John Spurlock3332ba52014-03-10 17:44:07 -0400214 if (mInvalidCharger) {
John Spurlock3332ba52014-03-10 17:44:07 -0400215 showInvalidChargerNotification();
216 mShowing = SHOWING_INVALID_CHARGER;
217 } else if (mWarning) {
John Spurlock3332ba52014-03-10 17:44:07 -0400218 showWarningNotification();
219 mShowing = SHOWING_WARNING;
Makoto Onuki52c62952018-03-22 10:43:03 -0700220 } else if (mShowAutoSaverSuggestion) {
Makoto Onuki60b8f182018-05-07 13:56:40 -0700221 // Once we showed the notification, don't show it again until it goes SHOWING_NOTHING.
222 // This shouldn't be needed, because we have a delete intent on this notification
223 // so when it's dismissed we should notice it and clear mShowAutoSaverSuggestion,
224 // However we double check here just in case the dismiss intent broadcast is delayed.
225 if (mShowing != SHOWING_AUTO_SAVER_SUGGESTION) {
226 showAutoSaverSuggestionNotification();
227 }
Makoto Onuki52c62952018-03-22 10:43:03 -0700228 mShowing = SHOWING_AUTO_SAVER_SUGGESTION;
John Spurlock3332ba52014-03-10 17:44:07 -0400229 } else {
Chris Wren5e6c0ff2017-01-05 12:57:06 -0500230 mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_BAD_CHARGER, UserHandle.ALL);
231 mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_POWER_LOW, UserHandle.ALL);
Makoto Onuki52c62952018-03-22 10:43:03 -0700232 mNoMan.cancelAsUser(TAG_AUTO_SAVER,
233 SystemMessage.NOTE_AUTO_SAVER_SUGGESTION, UserHandle.ALL);
John Spurlock3332ba52014-03-10 17:44:07 -0400234 mShowing = SHOWING_NOTHING;
235 }
236 }
237
238 private void showInvalidChargerNotification() {
Geoffrey Pitsch1dc93bc2017-01-31 16:38:11 -0500239 final Notification.Builder nb =
240 new Notification.Builder(mContext, NotificationChannels.ALERTS)
241 .setSmallIcon(R.drawable.ic_power_low)
242 .setWhen(0)
243 .setShowWhen(false)
244 .setOngoing(true)
245 .setContentTitle(mContext.getString(R.string.invalid_charger_title))
246 .setContentText(mContext.getString(R.string.invalid_charger_text))
247 .setColor(mContext.getColor(
248 com.android.internal.R.color.system_notification_accent_color));
Julia Reynolds037d8082018-03-18 15:25:19 -0400249 SystemUI.overrideNotificationAppName(mContext, nb, false);
John Spurlock3332ba52014-03-10 17:44:07 -0400250 final Notification n = nb.build();
Chris Wren5e6c0ff2017-01-05 12:57:06 -0500251 mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_POWER_LOW, UserHandle.ALL);
252 mNoMan.notifyAsUser(TAG_BATTERY, SystemMessage.NOTE_BAD_CHARGER, n, UserHandle.ALL);
John Spurlock3332ba52014-03-10 17:44:07 -0400253 }
254
Salvador Martinezf9e47502018-01-04 13:45:48 -0800255 protected void showWarningNotification() {
Salvador Martinezbb902fc2018-01-22 19:46:55 -0800256 final String percentage = NumberFormat.getPercentInstance()
257 .format((double) mBatteryLevel / 100.0);
Beverly334bc5f2017-07-31 10:37:17 -0400258
Salvador Martinezf9e47502018-01-04 13:45:48 -0800259 // get standard notification copy
260 String title = mContext.getString(R.string.battery_low_title);
261 String contentText = mContext.getString(R.string.battery_low_percent_format, percentage);
262
263 // override notification copy if hybrid notification enabled
264 if (mEstimate != null) {
Salvador Martinezeb9ab292018-01-19 17:50:24 -0800265 contentText = getHybridContentString(percentage);
Salvador Martinezf9e47502018-01-04 13:45:48 -0800266 }
267
Geoffrey Pitsch1dc93bc2017-01-31 16:38:11 -0500268 final Notification.Builder nb =
Beverly334bc5f2017-07-31 10:37:17 -0400269 new Notification.Builder(mContext, NotificationChannels.BATTERY)
Geoffrey Pitsch1dc93bc2017-01-31 16:38:11 -0500270 .setSmallIcon(R.drawable.ic_power_low)
271 // Bump the notification when the bucket dropped.
Salvador Martinezf9e47502018-01-04 13:45:48 -0800272 .setWhen(mWarningTriggerTimeMs)
Geoffrey Pitsch1dc93bc2017-01-31 16:38:11 -0500273 .setShowWhen(false)
Salvador Martinezf9e47502018-01-04 13:45:48 -0800274 .setContentText(contentText)
Salvador Martinez086ab742018-04-03 13:05:39 -0700275 .setContentTitle(title)
Geoffrey Pitsch1dc93bc2017-01-31 16:38:11 -0500276 .setOnlyAlertOnce(true)
277 .setDeleteIntent(pendingBroadcast(ACTION_DISMISSED_WARNING))
Salvador Martinez086ab742018-04-03 13:05:39 -0700278 .setStyle(new Notification.BigTextStyle().bigText(contentText))
Salvador Martinezf9e47502018-01-04 13:45:48 -0800279 .setVisibility(Notification.VISIBILITY_PUBLIC);
John Spurlock3332ba52014-03-10 17:44:07 -0400280 if (hasBatterySettings()) {
281 nb.setContentIntent(pendingBroadcast(ACTION_SHOW_BATTERY_SETTINGS));
282 }
Salvador Martinezf9e47502018-01-04 13:45:48 -0800283 // Make the notification red if the percentage goes below a certain amount or the time
284 // remaining estimate is disabled
Salvador Martinezbb902fc2018-01-22 19:46:55 -0800285 if (mEstimate == null || mBucket < 0
286 || mEstimate.estimateMillis < mSevereWarningThreshold) {
Salvador Martinezf9e47502018-01-04 13:45:48 -0800287 nb.setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
288 }
Salvador Martinezc50a9bd2018-08-03 14:07:44 -0700289
290 if (!mPowerMan.isPowerSaveMode()) {
291 nb.addAction(0,
292 mContext.getString(R.string.battery_saver_start_action),
293 pendingBroadcast(ACTION_START_SAVER));
294 }
Beverly334bc5f2017-07-31 10:37:17 -0400295 nb.setOnlyAlertOnce(!mPlaySound);
296 mPlaySound = false;
Julia Reynolds037d8082018-03-18 15:25:19 -0400297 SystemUI.overrideNotificationAppName(mContext, nb, false);
Chris Wren5e6c0ff2017-01-05 12:57:06 -0500298 final Notification n = nb.build();
299 mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_BAD_CHARGER, UserHandle.ALL);
300 mNoMan.notifyAsUser(TAG_BATTERY, SystemMessage.NOTE_POWER_LOW, n, UserHandle.ALL);
John Spurlock3332ba52014-03-10 17:44:07 -0400301 }
302
Makoto Onuki52c62952018-03-22 10:43:03 -0700303 private void showAutoSaverSuggestionNotification() {
304 final Notification.Builder nb =
305 new Notification.Builder(mContext, NotificationChannels.HINTS)
306 .setSmallIcon(R.drawable.ic_power_saver)
307 .setWhen(0)
308 .setShowWhen(false)
309 .setContentTitle(mContext.getString(R.string.auto_saver_title))
310 .setContentText(mContext.getString(R.string.auto_saver_text,
311 getLowBatteryAutoTriggerDefaultLevel()));
312 nb.setContentIntent(pendingBroadcast(ACTION_ENABLE_AUTO_SAVER));
313 nb.setDeleteIntent(pendingBroadcast(ACTION_DISMISS_AUTO_SAVER_SUGGESTION));
314 nb.addAction(0,
315 mContext.getString(R.string.no_auto_saver_action),
316 pendingBroadcast(ACTION_AUTO_SAVER_NO_THANKS));
317
318 SystemUI.overrideNotificationAppName(mContext, nb, false);
319
320 final Notification n = nb.build();
321 mNoMan.notifyAsUser(
322 TAG_AUTO_SAVER, SystemMessage.NOTE_AUTO_SAVER_SUGGESTION, n, UserHandle.ALL);
323 }
324
Salvador Martinezeb9ab292018-01-19 17:50:24 -0800325 private String getHybridContentString(String percentage) {
326 return PowerUtil.getBatteryRemainingStringFormatted(
327 mContext,
328 mEstimate.estimateMillis,
329 percentage,
330 mEstimate.isBasedOnUsage);
Salvador Martinezf9e47502018-01-04 13:45:48 -0800331 }
332
John Spurlock3332ba52014-03-10 17:44:07 -0400333 private PendingIntent pendingBroadcast(String action) {
Makoto Onuki52c62952018-03-22 10:43:03 -0700334 return PendingIntent.getBroadcastAsUser(mContext, 0,
Makoto Onuki60b8f182018-05-07 13:56:40 -0700335 new Intent(action).setPackage(mContext.getPackageName())
336 .setFlags(Intent.FLAG_RECEIVER_FOREGROUND),
337 0, UserHandle.CURRENT);
John Spurlock3332ba52014-03-10 17:44:07 -0400338 }
339
340 private static Intent settings(String action) {
341 return new Intent(action).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
342 | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
343 | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
344 | Intent.FLAG_ACTIVITY_NO_HISTORY
345 | Intent.FLAG_ACTIVITY_CLEAR_TOP);
346 }
347
348 @Override
349 public boolean isInvalidChargerWarningShowing() {
350 return mInvalidCharger;
351 }
352
353 @Override
Salvador Martineza6f7b252017-04-10 10:46:15 -0700354 public void dismissHighTemperatureWarning() {
355 if (!mHighTempWarning) {
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800356 return;
357 }
Salvador Martineza6f7b252017-04-10 10:46:15 -0700358 mHighTempWarning = false;
359 dismissHighTemperatureWarningInternal();
Andrew Sapperstein97bfa0f2017-01-24 16:38:50 -0800360 }
361
362 /**
Salvador Martineza6f7b252017-04-10 10:46:15 -0700363 * Internal only version of {@link #dismissHighTemperatureWarning()} that simply dismisses
Andrew Sapperstein97bfa0f2017-01-24 16:38:50 -0800364 * the notification. As such, the notification will not show again until
Salvador Martineza6f7b252017-04-10 10:46:15 -0700365 * {@link #dismissHighTemperatureWarning()} is called.
Andrew Sapperstein97bfa0f2017-01-24 16:38:50 -0800366 */
Salvador Martineza6f7b252017-04-10 10:46:15 -0700367 private void dismissHighTemperatureWarningInternal() {
Andrew Sapperstein97bfa0f2017-01-24 16:38:50 -0800368 mNoMan.cancelAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_HIGH_TEMP, UserHandle.ALL);
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800369 }
370
371 @Override
Salvador Martineza6f7b252017-04-10 10:46:15 -0700372 public void showHighTemperatureWarning() {
373 if (mHighTempWarning) {
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800374 return;
375 }
Salvador Martineza6f7b252017-04-10 10:46:15 -0700376 mHighTempWarning = true;
Geoffrey Pitsch1dc93bc2017-01-31 16:38:11 -0500377 final Notification.Builder nb =
378 new Notification.Builder(mContext, NotificationChannels.ALERTS)
379 .setSmallIcon(R.drawable.ic_device_thermostat_24)
380 .setWhen(0)
381 .setShowWhen(false)
382 .setContentTitle(mContext.getString(R.string.high_temp_title))
383 .setContentText(mContext.getString(R.string.high_temp_notif_message))
384 .setVisibility(Notification.VISIBILITY_PUBLIC)
385 .setContentIntent(pendingBroadcast(ACTION_CLICKED_TEMP_WARNING))
386 .setDeleteIntent(pendingBroadcast(ACTION_DISMISSED_TEMP_WARNING))
Jason Monk58be7a62017-02-01 20:17:51 -0500387 .setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
Julia Reynolds037d8082018-03-18 15:25:19 -0400388 SystemUI.overrideNotificationAppName(mContext, nb, false);
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800389 final Notification n = nb.build();
Chris Wren5e6c0ff2017-01-05 12:57:06 -0500390 mNoMan.notifyAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_HIGH_TEMP, n, UserHandle.ALL);
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800391 }
392
Bill Lin32ed3d62018-10-02 18:10:09 +0800393 /**
394 * PowerUI detect thermal overheat, notify to popup alarm dialog.
395 * Alarm with beep sound, showing overheat alarm dialog until user click OK or link of help.
396 * Do not auto dismiss even temperature drop.
397 *
398 * @param overheat true if device overheat, temperature >= threshold.
399 * false if device temperature <= threshold tolerance after overheat
400 * alarmed.
401 * @param shouldBeepSound true alarm beep sound until user interactive with device
402 * false showing alarm dialog only
403 */
404 @Override
405 public void notifyHighTemperatureAlarm(boolean overheat, boolean shouldBeepSound) {
406 // Overheat and non-null dialog are XOR(exclusive or) relationship
407 if (overheat ^ (mOverheatAlarmDialog != null)) {
408 // b/120188825 Since notifyHighTemperatureAlarm() could be triggered by
409 // non-ui thread such as ThermalEventListener.notifyThrottling()
410 mHandler.post(() -> setOverheatAlarmDialogShowing(overheat));
411 setAlarmShouldSound(shouldBeepSound);
412 }
413 }
414
415 /**
416 * Showing overheat alarm dialog until user click OK button or link of help to dismiss
417 *
418 * @param shouldShow whether to show overheat alarm dialog.
419 */
420 protected void setOverheatAlarmDialogShowing(boolean shouldShow) {
421 if (shouldShow && mOverheatAlarmDialog == null) {
422 OverheatAlarmDialog d = new OverheatAlarmDialog(mContext);
423 d.setCancelable(false);
424 d.setButton(BUTTON_NEGATIVE,
425 mContext.getString(R.string.high_temp_alarm_help_care_steps),
426 (dialogInterface, i) -> {
427 final String contextString = mContext.getString(
428 R.string.high_temp_alarm_help_url);
429 final Intent helpIntent = new Intent();
430 helpIntent.setClassName("com.android.settings",
431 "com.android.settings.HelpTrampoline");
432 helpIntent.putExtra(Intent.EXTRA_TEXT, contextString);
433 Dependency.get(ActivityStarter.class).startActivity(helpIntent,
434 true /* dismissShade */, resultCode -> {
435 mOverheatAlarmDialog = null;
436 });
437 });
438 d.setButton(BUTTON_POSITIVE, mContext.getString(com.android.internal.R.string.ok),
439 (dialogInterface, i) -> mOverheatAlarmDialog = null);
440 d.setOnDismissListener(dialogInterface -> {
441 mOverheatAlarmDialog = null;
442 Events.writeEvent(mContext, Events.EVENT_DISMISS_OVERHEAT_ALARM,
443 Events.DISMISS_REASON_DONE_CLICKED,
444 mKeyguard.isKeyguardLocked());
445 });
446 d.show();
447 Events.writeEvent(mContext, Events.EVENT_SHOW_OVERHEAT_ALARM,
448 Events.SHOW_REASON_OVERHEAD_ALARM_CHANGED,
449 mKeyguard.isKeyguardLocked());
450 mOverheatAlarmDialog = d;
451 }
452 }
453
454 /**
455 * Whether to alarm beep sound when overheat dialog showing.
456 *
457 * @param shouldSound whether to alarm beep sound.
458 */
459 protected void setAlarmShouldSound(boolean shouldSound) {
460 Log.d(TAG, "setAlarmShouldSound, " + shouldSound);
461 if (shouldSound) {
462 OverheatAlarmController.getInstance(mContext).startAlarm(mContext);
463 } else {
464 OverheatAlarmController.getInstance(mContext).stopAlarm();
465 }
466 }
467
Salvador Martineza6f7b252017-04-10 10:46:15 -0700468 private void showHighTemperatureDialog() {
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800469 if (mHighTempDialog != null) return;
470 final SystemUIDialog d = new SystemUIDialog(mContext);
Andrew Sappersteine26dc3d2017-01-04 11:25:20 -0800471 d.setIconAttribute(android.R.attr.alertDialogIcon);
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800472 d.setTitle(R.string.high_temp_title);
473 d.setMessage(R.string.high_temp_dialog_message);
474 d.setPositiveButton(com.android.internal.R.string.ok, null);
475 d.setShowForAllUsers(true);
476 d.setOnDismissListener(dialog -> mHighTempDialog = null);
477 d.show();
478 mHighTempDialog = d;
479 }
480
Salvador Martineza6f7b252017-04-10 10:46:15 -0700481 @VisibleForTesting
482 void dismissThermalShutdownWarning() {
483 mNoMan.cancelAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_THERMAL_SHUTDOWN, UserHandle.ALL);
484 }
485
486 private void showThermalShutdownDialog() {
487 if (mThermalShutdownDialog != null) return;
488 final SystemUIDialog d = new SystemUIDialog(mContext);
489 d.setIconAttribute(android.R.attr.alertDialogIcon);
490 d.setTitle(R.string.thermal_shutdown_title);
491 d.setMessage(R.string.thermal_shutdown_dialog_message);
492 d.setPositiveButton(com.android.internal.R.string.ok, null);
493 d.setShowForAllUsers(true);
494 d.setOnDismissListener(dialog -> mThermalShutdownDialog = null);
495 d.show();
496 mThermalShutdownDialog = d;
497 }
498
499 @Override
500 public void showThermalShutdownWarning() {
501 final Notification.Builder nb =
502 new Notification.Builder(mContext, NotificationChannels.ALERTS)
503 .setSmallIcon(R.drawable.ic_device_thermostat_24)
504 .setWhen(0)
505 .setShowWhen(false)
506 .setContentTitle(mContext.getString(R.string.thermal_shutdown_title))
507 .setContentText(mContext.getString(R.string.thermal_shutdown_message))
508 .setVisibility(Notification.VISIBILITY_PUBLIC)
509 .setContentIntent(pendingBroadcast(ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING))
510 .setDeleteIntent(
511 pendingBroadcast(ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING))
512 .setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
Julia Reynolds037d8082018-03-18 15:25:19 -0400513 SystemUI.overrideNotificationAppName(mContext, nb, false);
Salvador Martineza6f7b252017-04-10 10:46:15 -0700514 final Notification n = nb.build();
515 mNoMan.notifyAsUser(
516 TAG_TEMPERATURE, SystemMessage.NOTE_THERMAL_SHUTDOWN, n, UserHandle.ALL);
517 }
518
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800519 @Override
John Spurlock3332ba52014-03-10 17:44:07 -0400520 public void updateLowBatteryWarning() {
521 updateNotification();
John Spurlock3332ba52014-03-10 17:44:07 -0400522 }
523
524 @Override
525 public void dismissLowBatteryWarning() {
John Spurlock3ff2de62014-06-16 13:32:48 -0400526 if (DEBUG) Slog.d(TAG, "dismissing low battery warning: level=" + mBatteryLevel);
John Spurlock3332ba52014-03-10 17:44:07 -0400527 dismissLowBatteryNotification();
John Spurlock3332ba52014-03-10 17:44:07 -0400528 }
529
530 private void dismissLowBatteryNotification() {
John Spurlock3ff2de62014-06-16 13:32:48 -0400531 if (mWarning) Slog.i(TAG, "dismissing low battery notification");
John Spurlock3332ba52014-03-10 17:44:07 -0400532 mWarning = false;
533 updateNotification();
534 }
535
536 private boolean hasBatterySettings() {
537 return mOpenBatterySettings.resolveActivity(mContext.getPackageManager()) != null;
538 }
539
John Spurlock3332ba52014-03-10 17:44:07 -0400540 @Override
541 public void showLowBatteryWarning(boolean playSound) {
542 Slog.i(TAG,
543 "show low battery warning: level=" + mBatteryLevel
Beverly334bc5f2017-07-31 10:37:17 -0400544 + " [" + mBucket + "] playSound=" + playSound);
John Spurlock3332ba52014-03-10 17:44:07 -0400545 mPlaySound = playSound;
546 mWarning = true;
547 updateNotification();
John Spurlock3332ba52014-03-10 17:44:07 -0400548 }
549
John Spurlock3332ba52014-03-10 17:44:07 -0400550 @Override
551 public void dismissInvalidChargerWarning() {
John Spurlockeb44a7d2014-06-12 13:00:55 -0400552 dismissInvalidChargerNotification();
John Spurlockeb44a7d2014-06-12 13:00:55 -0400553 }
554
555 private void dismissInvalidChargerNotification() {
John Spurlock3ff2de62014-06-16 13:32:48 -0400556 if (mInvalidCharger) Slog.i(TAG, "dismissing invalid charger notification");
John Spurlock3332ba52014-03-10 17:44:07 -0400557 mInvalidCharger = false;
558 updateNotification();
559 }
560
561 @Override
562 public void showInvalidChargerWarning() {
563 mInvalidCharger = true;
564 updateNotification();
565 }
566
Makoto Onuki52c62952018-03-22 10:43:03 -0700567 private void showAutoSaverSuggestion() {
568 mShowAutoSaverSuggestion = true;
569 updateNotification();
570 }
571
572 private void dismissAutoSaverSuggestion() {
573 mShowAutoSaverSuggestion = false;
574 updateNotification();
575 }
576
John Spurlockecbc5e82014-10-22 09:05:51 -0400577 @Override
578 public void userSwitched() {
579 updateNotification();
580 }
581
John Spurlock3332ba52014-03-10 17:44:07 -0400582 private void showStartSaverConfirmation() {
John Spurlock1bb480a2014-08-02 17:12:43 -0400583 if (mSaverConfirmation != null) return;
584 final SystemUIDialog d = new SystemUIDialog(mContext);
585 d.setTitle(R.string.battery_saver_confirmation_title);
Makoto Onuki778ce662018-04-20 14:04:50 -0700586 d.setMessage(getBatterySaverDescription());
587
588 // Sad hack for http://b/78261259 and http://b/78298335. Otherwise "Battery" may be split
589 // into "Bat-tery".
590 if (isEnglishLocale()) {
591 d.setMessageHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
592 }
593 // We need to set LinkMovementMethod to make the link clickable.
594 d.setMessageMovementMethod(LinkMovementMethod.getInstance());
595
John Spurlock1bb480a2014-08-02 17:12:43 -0400596 d.setNegativeButton(android.R.string.cancel, null);
Makoto Onuki52c62952018-03-22 10:43:03 -0700597 d.setPositiveButton(R.string.battery_saver_confirmation_ok,
598 (dialog, which) -> setSaverMode(true, false));
John Spurlock1bb480a2014-08-02 17:12:43 -0400599 d.setShowForAllUsers(true);
Makoto Onuki52c62952018-03-22 10:43:03 -0700600 d.setOnDismissListener((dialog) -> mSaverConfirmation = null);
John Spurlock3332ba52014-03-10 17:44:07 -0400601 d.show();
John Spurlock1bb480a2014-08-02 17:12:43 -0400602 mSaverConfirmation = d;
John Spurlock3332ba52014-03-10 17:44:07 -0400603 }
604
Makoto Onuki778ce662018-04-20 14:04:50 -0700605 private boolean isEnglishLocale() {
606 return Objects.equals(Locale.getDefault().getLanguage(),
607 Locale.ENGLISH.getLanguage());
608 }
609
610 /**
611 * Generates the message for the "want to start battery saver?" dialog with a "learn more" link.
612 */
613 private CharSequence getBatterySaverDescription() {
614 final String learnMoreUrl = mContext.getText(
615 R.string.help_uri_battery_saver_learn_more_link_target).toString();
616
617 // If there's no link, use the string with no "learn more".
618 if (TextUtils.isEmpty(learnMoreUrl)) {
619 return mContext.getText(
620 com.android.internal.R.string.battery_saver_description);
621 }
622
623 // If we have a link, use the string with the "learn more" link.
624 final CharSequence rawText = mContext.getText(
625 com.android.internal.R.string.battery_saver_description_with_learn_more);
626 final SpannableString message = new SpannableString(rawText);
627 final SpannableStringBuilder builder = new SpannableStringBuilder(message);
628
629 // Look for the "learn more" part of the string, and set a URL span on it.
630 // We use a customized URLSpan to add FLAG_RECEIVER_FOREGROUND to the intent, and
631 // also to close the dialog.
632 for (Annotation annotation : message.getSpans(0, message.length(), Annotation.class)) {
633 final String key = annotation.getValue();
634
635 if (!BATTERY_SAVER_DESCRIPTION_URL_KEY.equals(key)) {
636 continue;
637 }
638 final int start = message.getSpanStart(annotation);
639 final int end = message.getSpanEnd(annotation);
640
641 // Replace the "learn more" with a custom URL span, with
642 // - No underline.
643 // - When clicked, close the dialog and the notification shade.
644 final URLSpan urlSpan = new URLSpan(learnMoreUrl) {
645 @Override
646 public void updateDrawState(TextPaint ds) {
647 super.updateDrawState(ds);
648 ds.setUnderlineText(false);
649 }
650
651 @Override
652 public void onClick(View widget) {
653 // Close the parent dialog.
654 if (mSaverConfirmation != null) {
655 mSaverConfirmation.dismiss();
656 }
657 // Also close the notification shade, if it's open.
658 mContext.sendBroadcast(
659 new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
660 .setFlags(Intent.FLAG_RECEIVER_FOREGROUND));
661
662 final Uri uri = Uri.parse(getURL());
663 Context context = widget.getContext();
664 Intent intent = new Intent(Intent.ACTION_VIEW, uri)
665 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
666 try {
667 context.startActivity(intent);
668 } catch (ActivityNotFoundException e) {
669 Log.w(TAG, "Activity was not found for intent, " + intent.toString());
670 }
671 }
672 };
673 builder.setSpan(urlSpan, start, end, message.getSpanFlags(urlSpan));
674 }
675 return builder;
676 }
677
Makoto Onuki52c62952018-03-22 10:43:03 -0700678 private void showAutoSaverEnabledConfirmation() {
679 if (mSaverEnabledConfirmation != null) return;
680
681 // Open the Battery Saver setting page.
682 final Intent actionBatterySaverSetting =
683 new Intent(SETTINGS_ACTION_OPEN_BATTERY_SAVER_SETTING)
684 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
685
686 final SystemUIDialog d = new SystemUIDialog(mContext);
687 d.setTitle(R.string.auto_saver_enabled_title);
688 d.setMessage(mContext.getString(R.string.auto_saver_enabled_text,
689 getLowBatteryAutoTriggerDefaultLevel()));
690
Makoto Onuki41d5ccf2018-04-03 11:46:02 -0700691 // "Got it". Just close the dialog. Automatic battery has been enabled already.
692 d.setPositiveButton(R.string.auto_saver_okay_action,
693 (dialog, which) -> onAutoSaverEnabledConfirmationClosed());
694
695 // "Settings" -> Opens the battery saver settings activity.
696 d.setNeutralButton(R.string.open_saver_setting_action, (dialog, which) -> {
697 mContext.startActivity(actionBatterySaverSetting);
698 onAutoSaverEnabledConfirmationClosed();
699 });
Makoto Onuki52c62952018-03-22 10:43:03 -0700700 d.setShowForAllUsers(true);
Makoto Onuki41d5ccf2018-04-03 11:46:02 -0700701 d.setOnDismissListener((dialog) -> onAutoSaverEnabledConfirmationClosed());
Makoto Onuki52c62952018-03-22 10:43:03 -0700702 d.show();
703 mSaverEnabledConfirmation = d;
704 }
705
Makoto Onuki41d5ccf2018-04-03 11:46:02 -0700706 private void onAutoSaverEnabledConfirmationClosed() {
707 mSaverEnabledConfirmation = null;
708 }
Makoto Onuki52c62952018-03-22 10:43:03 -0700709
Makoto Onuki16a0dd22018-03-20 10:40:37 -0700710 private void setSaverMode(boolean mode, boolean needFirstTimeWarning) {
711 BatterySaverUtils.setPowerSaveMode(mContext, mode, needFirstTimeWarning);
John Spurlock3332ba52014-03-10 17:44:07 -0400712 }
713
Makoto Onuki52c62952018-03-22 10:43:03 -0700714 private void scheduleAutoBatterySaver() {
715 int autoTriggerThreshold = mContext.getResources().getInteger(
716 com.android.internal.R.integer.config_lowBatteryWarningLevel);
717 if (autoTriggerThreshold == 0) {
718 autoTriggerThreshold = 15;
719 }
720
Makoto Onuki59727732018-04-04 12:44:05 -0700721 BatterySaverUtils.ensureAutoBatterySaver(mContext, autoTriggerThreshold);
Makoto Onuki52c62952018-03-22 10:43:03 -0700722 showAutoSaverEnabledConfirmation();
723 }
724
John Spurlock3332ba52014-03-10 17:44:07 -0400725 private final class Receiver extends BroadcastReceiver {
726
727 public void init() {
728 IntentFilter filter = new IntentFilter();
John Spurlock3332ba52014-03-10 17:44:07 -0400729 filter.addAction(ACTION_SHOW_BATTERY_SETTINGS);
730 filter.addAction(ACTION_START_SAVER);
John Spurlock42bfc9a2014-10-29 11:13:01 -0400731 filter.addAction(ACTION_DISMISSED_WARNING);
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800732 filter.addAction(ACTION_CLICKED_TEMP_WARNING);
733 filter.addAction(ACTION_DISMISSED_TEMP_WARNING);
Salvador Martineza6f7b252017-04-10 10:46:15 -0700734 filter.addAction(ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING);
735 filter.addAction(ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING);
Makoto Onuki16a0dd22018-03-20 10:40:37 -0700736 filter.addAction(ACTION_SHOW_START_SAVER_CONFIRMATION);
Makoto Onuki52c62952018-03-22 10:43:03 -0700737 filter.addAction(ACTION_SHOW_AUTO_SAVER_SUGGESTION);
738 filter.addAction(ACTION_ENABLE_AUTO_SAVER);
739 filter.addAction(ACTION_AUTO_SAVER_NO_THANKS);
Makoto Onuki5ac8d5e2018-04-13 15:53:57 -0700740 filter.addAction(ACTION_DISMISS_AUTO_SAVER_SUGGESTION);
Bill Lin32ed3d62018-10-02 18:10:09 +0800741 filter.addAction(Intent.ACTION_ALARM_CHANGED);
John Spurlock05e07052015-06-01 10:56:42 -0400742 mContext.registerReceiverAsUser(this, UserHandle.ALL, filter,
Makoto Onuki16a0dd22018-03-20 10:40:37 -0700743 android.Manifest.permission.DEVICE_POWER, mHandler);
John Spurlock3332ba52014-03-10 17:44:07 -0400744 }
745
746 @Override
747 public void onReceive(Context context, Intent intent) {
748 final String action = intent.getAction();
John Spurlockeb44a7d2014-06-12 13:00:55 -0400749 Slog.i(TAG, "Received " + action);
John Spurlock86c3de82014-08-19 13:37:44 -0400750 if (action.equals(ACTION_SHOW_BATTERY_SETTINGS)) {
John Spurlock3332ba52014-03-10 17:44:07 -0400751 dismissLowBatteryNotification();
752 mContext.startActivityAsUser(mOpenBatterySettings, UserHandle.CURRENT);
753 } else if (action.equals(ACTION_START_SAVER)) {
Makoto Onuki16a0dd22018-03-20 10:40:37 -0700754 setSaverMode(true, true);
755 dismissLowBatteryNotification();
756 } else if (action.equals(ACTION_SHOW_START_SAVER_CONFIRMATION)) {
John Spurlock3332ba52014-03-10 17:44:07 -0400757 dismissLowBatteryNotification();
758 showStartSaverConfirmation();
John Spurlock42bfc9a2014-10-29 11:13:01 -0400759 } else if (action.equals(ACTION_DISMISSED_WARNING)) {
760 dismissLowBatteryWarning();
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800761 } else if (ACTION_CLICKED_TEMP_WARNING.equals(action)) {
Salvador Martineza6f7b252017-04-10 10:46:15 -0700762 dismissHighTemperatureWarningInternal();
763 showHighTemperatureDialog();
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800764 } else if (ACTION_DISMISSED_TEMP_WARNING.equals(action)) {
Salvador Martineza6f7b252017-04-10 10:46:15 -0700765 dismissHighTemperatureWarningInternal();
766 } else if (ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING.equals(action)) {
767 dismissThermalShutdownWarning();
768 showThermalShutdownDialog();
769 } else if (ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING.equals(action)) {
770 dismissThermalShutdownWarning();
Makoto Onuki52c62952018-03-22 10:43:03 -0700771 } else if (ACTION_SHOW_AUTO_SAVER_SUGGESTION.equals(action)) {
772 showAutoSaverSuggestion();
773 } else if (ACTION_DISMISS_AUTO_SAVER_SUGGESTION.equals(action)) {
774 dismissAutoSaverSuggestion();
775 } else if (ACTION_ENABLE_AUTO_SAVER.equals(action)) {
776 dismissAutoSaverSuggestion();
777 scheduleAutoBatterySaver();
778 } else if (ACTION_AUTO_SAVER_NO_THANKS.equals(action)) {
779 dismissAutoSaverSuggestion();
780 BatterySaverUtils.suppressAutoBatterySaver(context);
Bill Lin32ed3d62018-10-02 18:10:09 +0800781 } else if (Intent.ACTION_ALARM_CHANGED.equals(action)) {
782 setAlarmShouldSound(false /* mHasUserInteracted */);
John Spurlock3332ba52014-03-10 17:44:07 -0400783 }
784 }
785 }
John Spurlock3332ba52014-03-10 17:44:07 -0400786}