• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 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 
17 package android.os;
18 
19 import android.Manifest.permission;
20 import android.annotation.CallbackExecutor;
21 import android.annotation.IntDef;
22 import android.annotation.NonNull;
23 import android.annotation.RequiresPermission;
24 import android.annotation.SdkConstant;
25 import android.annotation.SystemApi;
26 import android.annotation.SystemService;
27 import android.annotation.TestApi;
28 import android.annotation.UnsupportedAppUsage;
29 import android.content.Context;
30 import android.service.dreams.Sandman;
31 import android.util.ArrayMap;
32 import android.util.Log;
33 import android.util.proto.ProtoOutputStream;
34 
35 import com.android.internal.util.Preconditions;
36 
37 import java.lang.annotation.Retention;
38 import java.lang.annotation.RetentionPolicy;
39 import java.util.concurrent.Executor;
40 
41 /**
42  * This class gives you control of the power state of the device.
43  *
44  * <p>
45  * <b>Device battery life will be significantly affected by the use of this API.</b>
46  * Do not acquire {@link WakeLock}s unless you really need them, use the minimum levels
47  * possible, and be sure to release them as soon as possible.
48  * </p><p>
49  * The primary API you'll use is {@link #newWakeLock(int, String) newWakeLock()}.
50  * This will create a {@link PowerManager.WakeLock} object.  You can then use methods
51  * on the wake lock object to control the power state of the device.
52  * </p><p>
53  * In practice it's quite simple:
54  * {@samplecode
55  * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
56  * PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
57  * wl.acquire();
58  *   ..screen will stay on during this section..
59  * wl.release();
60  * }
61  * </p><p>
62  * The following wake lock levels are defined, with varying effects on system power.
63  * <i>These levels are mutually exclusive - you may only specify one of them.</i>
64  *
65  * <table>
66  *     <tr><th>Flag Value</th>
67  *     <th>CPU</th> <th>Screen</th> <th>Keyboard</th></tr>
68  *
69  *     <tr><td>{@link #PARTIAL_WAKE_LOCK}</td>
70  *         <td>On*</td> <td>Off</td> <td>Off</td>
71  *     </tr>
72  *
73  *     <tr><td>{@link #SCREEN_DIM_WAKE_LOCK}</td>
74  *         <td>On</td> <td>Dim</td> <td>Off</td>
75  *     </tr>
76  *
77  *     <tr><td>{@link #SCREEN_BRIGHT_WAKE_LOCK}</td>
78  *         <td>On</td> <td>Bright</td> <td>Off</td>
79  *     </tr>
80  *
81  *     <tr><td>{@link #FULL_WAKE_LOCK}</td>
82  *         <td>On</td> <td>Bright</td> <td>Bright</td>
83  *     </tr>
84  * </table>
85  * </p><p>
86  * *<i>If you hold a partial wake lock, the CPU will continue to run, regardless of any
87  * display timeouts or the state of the screen and even after the user presses the power button.
88  * In all other wake locks, the CPU will run, but the user can still put the device to sleep
89  * using the power button.</i>
90  * </p><p>
91  * In addition, you can add two more flags, which affect behavior of the screen only.
92  * <i>These flags have no effect when combined with a {@link #PARTIAL_WAKE_LOCK}.</i></p>
93  *
94  * <table>
95  *     <tr><th>Flag Value</th> <th>Description</th></tr>
96  *
97  *     <tr><td>{@link #ACQUIRE_CAUSES_WAKEUP}</td>
98  *         <td>Normal wake locks don't actually turn on the illumination.  Instead, they cause
99  *         the illumination to remain on once it turns on (e.g. from user activity).  This flag
100  *         will force the screen and/or keyboard to turn on immediately, when the WakeLock is
101  *         acquired.  A typical use would be for notifications which are important for the user to
102  *         see immediately.</td>
103  *     </tr>
104  *
105  *     <tr><td>{@link #ON_AFTER_RELEASE}</td>
106  *         <td>If this flag is set, the user activity timer will be reset when the WakeLock is
107  *         released, causing the illumination to remain on a bit longer.  This can be used to
108  *         reduce flicker if you are cycling between wake lock conditions.</td>
109  *     </tr>
110  * </table>
111  * <p>
112  * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK}
113  * permission in an {@code <uses-permission>} element of the application's manifest.
114  * </p>
115  */
116 @SystemService(Context.POWER_SERVICE)
117 public final class PowerManager {
118     private static final String TAG = "PowerManager";
119 
120     /* NOTE: Wake lock levels were previously defined as a bit field, except that only a few
121      * combinations were actually supported so the bit field was removed.  This explains
122      * why the numbering scheme is so odd.  If adding a new wake lock level, any unused
123      * value (in frameworks/base/core/proto/android/os/enums.proto) can be used.
124      */
125 
126     /**
127      * Wake lock level: Ensures that the CPU is running; the screen and keyboard
128      * backlight will be allowed to go off.
129      * <p>
130      * If the user presses the power button, then the screen will be turned off
131      * but the CPU will be kept on until all partial wake locks have been released.
132      * </p>
133      */
134     public static final int PARTIAL_WAKE_LOCK = OsProtoEnums.PARTIAL_WAKE_LOCK; // 0x00000001
135 
136     /**
137      * Wake lock level: Ensures that the screen is on (but may be dimmed);
138      * the keyboard backlight will be allowed to go off.
139      * <p>
140      * If the user presses the power button, then the {@link #SCREEN_DIM_WAKE_LOCK} will be
141      * implicitly released by the system, causing both the screen and the CPU to be turned off.
142      * Contrast with {@link #PARTIAL_WAKE_LOCK}.
143      * </p>
144      *
145      * @deprecated Most applications should use
146      * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
147      * of this type of wake lock, as it will be correctly managed by the platform
148      * as the user moves between applications and doesn't require a special permission.
149      */
150     @Deprecated
151     public static final int SCREEN_DIM_WAKE_LOCK = OsProtoEnums.SCREEN_DIM_WAKE_LOCK; // 0x00000006
152 
153     /**
154      * Wake lock level: Ensures that the screen is on at full brightness;
155      * the keyboard backlight will be allowed to go off.
156      * <p>
157      * If the user presses the power button, then the {@link #SCREEN_BRIGHT_WAKE_LOCK} will be
158      * implicitly released by the system, causing both the screen and the CPU to be turned off.
159      * Contrast with {@link #PARTIAL_WAKE_LOCK}.
160      * </p>
161      *
162      * @deprecated Most applications should use
163      * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
164      * of this type of wake lock, as it will be correctly managed by the platform
165      * as the user moves between applications and doesn't require a special permission.
166      */
167     @Deprecated
168     public static final int SCREEN_BRIGHT_WAKE_LOCK =
169             OsProtoEnums.SCREEN_BRIGHT_WAKE_LOCK; // 0x0000000a
170 
171     /**
172      * Wake lock level: Ensures that the screen and keyboard backlight are on at
173      * full brightness.
174      * <p>
175      * If the user presses the power button, then the {@link #FULL_WAKE_LOCK} will be
176      * implicitly released by the system, causing both the screen and the CPU to be turned off.
177      * Contrast with {@link #PARTIAL_WAKE_LOCK}.
178      * </p>
179      *
180      * @deprecated Most applications should use
181      * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
182      * of this type of wake lock, as it will be correctly managed by the platform
183      * as the user moves between applications and doesn't require a special permission.
184      */
185     @Deprecated
186     public static final int FULL_WAKE_LOCK = OsProtoEnums.FULL_WAKE_LOCK; // 0x0000001a
187 
188     /**
189      * Wake lock level: Turns the screen off when the proximity sensor activates.
190      * <p>
191      * If the proximity sensor detects that an object is nearby, the screen turns off
192      * immediately.  Shortly after the object moves away, the screen turns on again.
193      * </p><p>
194      * A proximity wake lock does not prevent the device from falling asleep
195      * unlike {@link #FULL_WAKE_LOCK}, {@link #SCREEN_BRIGHT_WAKE_LOCK} and
196      * {@link #SCREEN_DIM_WAKE_LOCK}.  If there is no user activity and no other
197      * wake locks are held, then the device will fall asleep (and lock) as usual.
198      * However, the device will not fall asleep while the screen has been turned off
199      * by the proximity sensor because it effectively counts as ongoing user activity.
200      * </p><p>
201      * Since not all devices have proximity sensors, use {@link #isWakeLockLevelSupported}
202      * to determine whether this wake lock level is supported.
203      * </p><p>
204      * Cannot be used with {@link #ACQUIRE_CAUSES_WAKEUP}.
205      * </p>
206      */
207     public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK =
208             OsProtoEnums.PROXIMITY_SCREEN_OFF_WAKE_LOCK; // 0x00000020
209 
210     /**
211      * Wake lock level: Put the screen in a low power state and allow the CPU to suspend
212      * if no other wake locks are held.
213      * <p>
214      * This is used by the dream manager to implement doze mode.  It currently
215      * has no effect unless the power manager is in the dozing state.
216      * </p><p>
217      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
218      * </p>
219      *
220      * {@hide}
221      */
222     public static final int DOZE_WAKE_LOCK = OsProtoEnums.DOZE_WAKE_LOCK; // 0x00000040
223 
224     /**
225      * Wake lock level: Keep the device awake enough to allow drawing to occur.
226      * <p>
227      * This is used by the window manager to allow applications to draw while the
228      * system is dozing.  It currently has no effect unless the power manager is in
229      * the dozing state.
230      * </p><p>
231      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
232      * </p>
233      *
234      * {@hide}
235      */
236     public static final int DRAW_WAKE_LOCK = OsProtoEnums.DRAW_WAKE_LOCK; // 0x00000080
237 
238     /**
239      * Mask for the wake lock level component of a combined wake lock level and flags integer.
240      *
241      * @hide
242      */
243     public static final int WAKE_LOCK_LEVEL_MASK = 0x0000ffff;
244 
245     /**
246      * Wake lock flag: Turn the screen on when the wake lock is acquired.
247      * <p>
248      * Normally wake locks don't actually wake the device, they just cause
249      * the screen to remain on once it's already on.  Think of the video player
250      * application as the normal behavior.  Notifications that pop up and want
251      * the device to be on are the exception; use this flag to be like them.
252      * </p><p>
253      * Cannot be used with {@link #PARTIAL_WAKE_LOCK}.
254      * </p>
255      */
256     public static final int ACQUIRE_CAUSES_WAKEUP = 0x10000000;
257 
258     /**
259      * Wake lock flag: When this wake lock is released, poke the user activity timer
260      * so the screen stays on for a little longer.
261      * <p>
262      * Will not turn the screen on if it is not already on.
263      * See {@link #ACQUIRE_CAUSES_WAKEUP} if you want that.
264      * </p><p>
265      * Cannot be used with {@link #PARTIAL_WAKE_LOCK}.
266      * </p>
267      */
268     public static final int ON_AFTER_RELEASE = 0x20000000;
269 
270     /**
271      * Wake lock flag: This wake lock is not important for logging events.  If a later
272      * wake lock is acquired that is important, it will be considered the one to log.
273      * @hide
274      */
275     public static final int UNIMPORTANT_FOR_LOGGING = 0x40000000;
276 
277     /**
278      * Flag for {@link WakeLock#release WakeLock.release(int)}: Defer releasing a
279      * {@link #PROXIMITY_SCREEN_OFF_WAKE_LOCK} wake lock until the proximity sensor
280      * indicates that an object is not in close proximity.
281      */
282     public static final int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY = 1 << 0;
283 
284     /**
285      * Flag for {@link WakeLock#release(int)} when called due to timeout.
286      * @hide
287      */
288     public static final int RELEASE_FLAG_TIMEOUT = 1 << 16;
289 
290     /**
291      * Brightness value for fully on.
292      * @hide
293      */
294     @UnsupportedAppUsage
295     public static final int BRIGHTNESS_ON = 255;
296 
297     /**
298      * Brightness value for fully off.
299      * @hide
300      */
301     public static final int BRIGHTNESS_OFF = 0;
302 
303     /**
304      * Brightness value for default policy handling by the system.
305      * @hide
306      */
307     public static final int BRIGHTNESS_DEFAULT = -1;
308 
309     // Note: Be sure to update android.os.BatteryStats and PowerManager.h
310     // if adding or modifying user activity event constants.
311 
312     /**
313      * User activity event type: Unspecified event type.
314      * @hide
315      */
316     @SystemApi
317     public static final int USER_ACTIVITY_EVENT_OTHER = 0;
318 
319     /**
320      * User activity event type: Button or key pressed or released.
321      * @hide
322      */
323     @SystemApi
324     public static final int USER_ACTIVITY_EVENT_BUTTON = 1;
325 
326     /**
327      * User activity event type: Touch down, move or up.
328      * @hide
329      */
330     @SystemApi
331     public static final int USER_ACTIVITY_EVENT_TOUCH = 2;
332 
333     /**
334      * User activity event type: Accessibility taking action on behalf of user.
335      * @hide
336      */
337     @SystemApi
338     public static final int USER_ACTIVITY_EVENT_ACCESSIBILITY = 3;
339 
340     /**
341      * User activity event type: {@link android.service.attention.AttentionService} taking action
342      * on behalf of user.
343      * @hide
344      */
345     public static final int USER_ACTIVITY_EVENT_ATTENTION = 4;
346 
347     /**
348      * User activity flag: If already dimmed, extend the dim timeout
349      * but do not brighten.  This flag is useful for keeping the screen on
350      * a little longer without causing a visible change such as when
351      * the power key is pressed.
352      * @hide
353      */
354     @SystemApi
355     public static final int USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS = 1 << 0;
356 
357     /**
358      * User activity flag: Note the user activity as usual but do not
359      * reset the user activity timeout.  This flag is useful for applying
360      * user activity power hints when interacting with the device indirectly
361      * on a secondary screen while allowing the primary screen to go to sleep.
362      * @hide
363      */
364     @SystemApi
365     public static final int USER_ACTIVITY_FLAG_INDIRECT = 1 << 1;
366 
367     /**
368      * @hide
369      */
370     public static final int GO_TO_SLEEP_REASON_MIN = 0;
371 
372     /**
373      * Go to sleep reason code: Going to sleep due by application request.
374      * @hide
375      */
376     public static final int GO_TO_SLEEP_REASON_APPLICATION = GO_TO_SLEEP_REASON_MIN;
377 
378     /**
379      * Go to sleep reason code: Going to sleep due by request of the
380      * device administration policy.
381      * @hide
382      */
383     public static final int GO_TO_SLEEP_REASON_DEVICE_ADMIN = 1;
384 
385     /**
386      * Go to sleep reason code: Going to sleep due to a screen timeout.
387      * @hide
388      */
389     @UnsupportedAppUsage
390     public static final int GO_TO_SLEEP_REASON_TIMEOUT = 2;
391 
392     /**
393      * Go to sleep reason code: Going to sleep due to the lid switch being closed.
394      * @hide
395      */
396     public static final int GO_TO_SLEEP_REASON_LID_SWITCH = 3;
397 
398     /**
399      * Go to sleep reason code: Going to sleep due to the power button being pressed.
400      * @hide
401      */
402     public static final int GO_TO_SLEEP_REASON_POWER_BUTTON = 4;
403 
404     /**
405      * Go to sleep reason code: Going to sleep due to HDMI.
406      * @hide
407      */
408     public static final int GO_TO_SLEEP_REASON_HDMI = 5;
409 
410     /**
411      * Go to sleep reason code: Going to sleep due to the sleep button being pressed.
412      * @hide
413      */
414     public static final int GO_TO_SLEEP_REASON_SLEEP_BUTTON = 6;
415 
416     /**
417      * Go to sleep reason code: Going to sleep by request of an accessibility service
418      * @hide
419      */
420     public static final int GO_TO_SLEEP_REASON_ACCESSIBILITY = 7;
421 
422     /**
423      * Go to sleep reason code: Going to sleep due to force-suspend.
424      * @hide
425      */
426     public static final int GO_TO_SLEEP_REASON_FORCE_SUSPEND = 8;
427 
428     /**
429      * @hide
430      */
431     public static final int GO_TO_SLEEP_REASON_MAX = GO_TO_SLEEP_REASON_FORCE_SUSPEND;
432 
433     /**
434      * @hide
435      */
sleepReasonToString(int sleepReason)436     public static String sleepReasonToString(int sleepReason) {
437         switch (sleepReason) {
438             case GO_TO_SLEEP_REASON_APPLICATION: return "application";
439             case GO_TO_SLEEP_REASON_DEVICE_ADMIN: return "device_admin";
440             case GO_TO_SLEEP_REASON_TIMEOUT: return "timeout";
441             case GO_TO_SLEEP_REASON_LID_SWITCH: return "lid_switch";
442             case GO_TO_SLEEP_REASON_POWER_BUTTON: return "power_button";
443             case GO_TO_SLEEP_REASON_HDMI: return "hdmi";
444             case GO_TO_SLEEP_REASON_SLEEP_BUTTON: return "sleep_button";
445             case GO_TO_SLEEP_REASON_ACCESSIBILITY: return "accessibility";
446             case GO_TO_SLEEP_REASON_FORCE_SUSPEND: return "force_suspend";
447             default: return Integer.toString(sleepReason);
448         }
449     }
450 
451     /**
452      * Go to sleep flag: Skip dozing state and directly go to full sleep.
453      * @hide
454      */
455     public static final int GO_TO_SLEEP_FLAG_NO_DOZE = 1 << 0;
456 
457     /**
458      * @hide
459      */
460     @IntDef(prefix = { "WAKE_REASON_" }, value = {
461             WAKE_REASON_UNKNOWN,
462             WAKE_REASON_POWER_BUTTON,
463             WAKE_REASON_APPLICATION,
464             WAKE_REASON_PLUGGED_IN,
465             WAKE_REASON_GESTURE,
466             WAKE_REASON_CAMERA_LAUNCH,
467             WAKE_REASON_WAKE_KEY,
468             WAKE_REASON_WAKE_MOTION,
469             WAKE_REASON_HDMI,
470     })
471     @Retention(RetentionPolicy.SOURCE)
472     public @interface WakeReason{}
473 
474     /**
475      * Wake up reason code: Waking for an unknown reason.
476      * @hide
477      */
478     public static final int WAKE_REASON_UNKNOWN = 0;
479 
480     /**
481      * Wake up reason code: Waking up due to power button press.
482      * @hide
483      */
484     public static final int WAKE_REASON_POWER_BUTTON = 1;
485 
486     /**
487      * Wake up reason code: Waking up because an application requested it.
488      * @hide
489      */
490     public static final int WAKE_REASON_APPLICATION = 2;
491 
492     /**
493      * Wake up reason code: Waking up due to being plugged in or docked on a wireless charger.
494      * @hide
495      */
496     public static final int WAKE_REASON_PLUGGED_IN = 3;
497 
498     /**
499      * Wake up reason code: Waking up due to a user performed gesture (e.g. douple tapping on the
500      * screen).
501      * @hide
502      */
503     public static final int WAKE_REASON_GESTURE = 4;
504 
505     /**
506      * Wake up reason code: Waking up due to the camera being launched.
507      * @hide
508      */
509     public static final int WAKE_REASON_CAMERA_LAUNCH = 5;
510 
511     /**
512      * Wake up reason code: Waking up because a wake key other than power was pressed.
513      * @hide
514      */
515     public static final int WAKE_REASON_WAKE_KEY = 6;
516 
517     /**
518      * Wake up reason code: Waking up because a wake motion was performed.
519      *
520      * For example, a trackball that was set to wake the device up was spun.
521      * @hide
522      */
523     public static final int WAKE_REASON_WAKE_MOTION = 7;
524 
525     /**
526      * Wake up reason code: Waking due to HDMI.
527      * @hide
528      */
529     public static final int WAKE_REASON_HDMI = 8;
530 
531     /**
532      * Wake up reason code: Waking due to the lid being opened.
533      * @hide
534      */
535     public static final int WAKE_REASON_LID = 9;
536 
537     /**
538      * Convert the wake reason to a string for debugging purposes.
539      * @hide
540      */
wakeReasonToString(@akeReason int wakeReason)541     public static String wakeReasonToString(@WakeReason int wakeReason) {
542         switch (wakeReason) {
543             case WAKE_REASON_UNKNOWN: return "WAKE_REASON_UNKNOWN";
544             case WAKE_REASON_POWER_BUTTON: return "WAKE_REASON_POWER_BUTTON";
545             case WAKE_REASON_APPLICATION: return "WAKE_REASON_APPLICATION";
546             case WAKE_REASON_PLUGGED_IN: return "WAKE_REASON_PLUGGED_IN";
547             case WAKE_REASON_GESTURE: return "WAKE_REASON_GESTURE";
548             case WAKE_REASON_CAMERA_LAUNCH: return "WAKE_REASON_CAMERA_LAUNCH";
549             case WAKE_REASON_WAKE_KEY: return "WAKE_REASON_WAKE_KEY";
550             case WAKE_REASON_WAKE_MOTION: return "WAKE_REASON_WAKE_MOTION";
551             case WAKE_REASON_HDMI: return "WAKE_REASON_HDMI";
552             case WAKE_REASON_LID: return "WAKE_REASON_LID";
553             default: return Integer.toString(wakeReason);
554         }
555     }
556 
557     /**
558      * @hide
559      */
560     public static class WakeData {
WakeData(long wakeTime, @WakeReason int wakeReason)561         public WakeData(long wakeTime, @WakeReason int wakeReason) {
562             this.wakeTime = wakeTime;
563             this.wakeReason = wakeReason;
564         }
565         public long wakeTime;
566         public @WakeReason int wakeReason;
567     }
568 
569     /**
570      * The value to pass as the 'reason' argument to reboot() to reboot into
571      * recovery mode for tasks other than applying system updates, such as
572      * doing factory resets.
573      * <p>
574      * Requires the {@link android.Manifest.permission#RECOVERY}
575      * permission (in addition to
576      * {@link android.Manifest.permission#REBOOT}).
577      * </p>
578      * @hide
579      */
580     public static final String REBOOT_RECOVERY = "recovery";
581 
582     /**
583      * The value to pass as the 'reason' argument to reboot() to reboot into
584      * recovery mode for applying system updates.
585      * <p>
586      * Requires the {@link android.Manifest.permission#RECOVERY}
587      * permission (in addition to
588      * {@link android.Manifest.permission#REBOOT}).
589      * </p>
590      * @hide
591      */
592     public static final String REBOOT_RECOVERY_UPDATE = "recovery-update";
593 
594     /**
595      * The value to pass as the 'reason' argument to reboot() when device owner requests a reboot on
596      * the device.
597      * @hide
598      */
599     public static final String REBOOT_REQUESTED_BY_DEVICE_OWNER = "deviceowner";
600 
601     /**
602      * The 'reason' value used when rebooting in safe mode
603      * @hide
604      */
605     public static final String REBOOT_SAFE_MODE = "safemode";
606 
607     /**
608      * The 'reason' value used when rebooting the device without turning on the screen.
609      * @hide
610      */
611     public static final String REBOOT_QUIESCENT = "quiescent";
612 
613     /**
614      * The value to pass as the 'reason' argument to android_reboot().
615      * @hide
616      */
617     public static final String SHUTDOWN_USER_REQUESTED = "userrequested";
618 
619     /**
620      * The value to pass as the 'reason' argument to android_reboot() when battery temperature
621      * is too high.
622      * @hide
623      */
624     public static final String SHUTDOWN_BATTERY_THERMAL_STATE = "thermal,battery";
625 
626     /**
627      * The value to pass as the 'reason' argument to android_reboot() when device temperature
628      * is too high.
629      * @hide
630      */
631     public static final String SHUTDOWN_THERMAL_STATE = "thermal";
632 
633     /**
634      * The value to pass as the 'reason' argument to android_reboot() when device is running
635      * critically low on battery.
636      * @hide
637      */
638     public static final String SHUTDOWN_LOW_BATTERY = "battery";
639 
640     /**
641      * @hide
642      */
643     @Retention(RetentionPolicy.SOURCE)
644     @IntDef(prefix = { "SHUTDOWN_REASON_" }, value = {
645             SHUTDOWN_REASON_UNKNOWN,
646             SHUTDOWN_REASON_SHUTDOWN,
647             SHUTDOWN_REASON_REBOOT,
648             SHUTDOWN_REASON_USER_REQUESTED,
649             SHUTDOWN_REASON_THERMAL_SHUTDOWN,
650             SHUTDOWN_REASON_LOW_BATTERY,
651             SHUTDOWN_REASON_BATTERY_THERMAL
652     })
653     public @interface ShutdownReason {}
654 
655     /**
656      * constant for shutdown reason being unknown.
657      * @hide
658      */
659     public static final int SHUTDOWN_REASON_UNKNOWN = 0;
660 
661     /**
662      * constant for shutdown reason being normal shutdown.
663      * @hide
664      */
665     public static final int SHUTDOWN_REASON_SHUTDOWN = 1;
666 
667     /**
668      * constant for shutdown reason being reboot.
669      * @hide
670      */
671     public static final int SHUTDOWN_REASON_REBOOT = 2;
672 
673     /**
674      * constant for shutdown reason being user requested.
675      * @hide
676      */
677     public static final int SHUTDOWN_REASON_USER_REQUESTED = 3;
678 
679     /**
680      * constant for shutdown reason being overheating.
681      * @hide
682      */
683     public static final int SHUTDOWN_REASON_THERMAL_SHUTDOWN = 4;
684 
685     /**
686      * constant for shutdown reason being low battery.
687      * @hide
688      */
689     public static final int SHUTDOWN_REASON_LOW_BATTERY = 5;
690 
691     /**
692      * constant for shutdown reason being critical battery thermal state.
693      * @hide
694      */
695     public static final int SHUTDOWN_REASON_BATTERY_THERMAL = 6;
696 
697     /**
698      * @hide
699      */
700     @Retention(RetentionPolicy.SOURCE)
701     @IntDef({ServiceType.LOCATION,
702             ServiceType.VIBRATION,
703             ServiceType.ANIMATION,
704             ServiceType.FULL_BACKUP,
705             ServiceType.KEYVALUE_BACKUP,
706             ServiceType.NETWORK_FIREWALL,
707             ServiceType.SCREEN_BRIGHTNESS,
708             ServiceType.SOUND,
709             ServiceType.BATTERY_STATS,
710             ServiceType.DATA_SAVER,
711             ServiceType.FORCE_ALL_APPS_STANDBY,
712             ServiceType.FORCE_BACKGROUND_CHECK,
713             ServiceType.OPTIONAL_SENSORS,
714             ServiceType.AOD,
715             ServiceType.QUICK_DOZE,
716             ServiceType.NIGHT_MODE,
717     })
718     public @interface ServiceType {
719         int NULL = 0;
720         int LOCATION = 1;
721         int VIBRATION = 2;
722         int ANIMATION = 3;
723         int FULL_BACKUP = 4;
724         int KEYVALUE_BACKUP = 5;
725         int NETWORK_FIREWALL = 6;
726         int SCREEN_BRIGHTNESS = 7;
727         int SOUND = 8;
728         int BATTERY_STATS = 9;
729         int DATA_SAVER = 10;
730         int AOD = 14;
731 
732         /**
733          * Whether to enable force-app-standby on all apps or not.
734          */
735         int FORCE_ALL_APPS_STANDBY = 11;
736 
737         /**
738          * Whether to enable background check on all apps or not.
739          */
740         int FORCE_BACKGROUND_CHECK = 12;
741 
742         /**
743          * Whether to disable non-essential sensors. (e.g. edge sensors.)
744          */
745         int OPTIONAL_SENSORS = 13;
746 
747         /**
748          * Whether to go into Deep Doze as soon as the screen turns off or not.
749          */
750         int QUICK_DOZE = 15;
751 
752         /**
753          * Whether to enable night mode when battery saver is enabled.
754          */
755         int NIGHT_MODE = 16;
756     }
757 
758     /**
759      * Either the location providers shouldn't be affected by battery saver,
760      * or battery saver is off.
761      */
762     public static final int LOCATION_MODE_NO_CHANGE = 0;
763 
764     /**
765      * In this mode, the GPS based location provider should be disabled when battery saver is on and
766      * the device is non-interactive.
767      */
768     public static final int LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF = 1;
769 
770     /**
771      * All location providers should be disabled when battery saver is on and
772      * the device is non-interactive.
773      */
774     public static final int LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF = 2;
775 
776     /**
777      * In this mode, all the location providers will be kept available, but location fixes
778      * should only be provided to foreground apps.
779      */
780     public static final int LOCATION_MODE_FOREGROUND_ONLY = 3;
781 
782     /**
783      * In this mode, location will not be turned off, but LocationManager will throttle all
784      * requests to providers when the device is non-interactive.
785      */
786     public static final int LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF = 4;
787 
788     /** @hide */
789     public static final int MIN_LOCATION_MODE = LOCATION_MODE_NO_CHANGE;
790     /** @hide */
791     public static final int MAX_LOCATION_MODE = LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF;
792 
793     /**
794      * @hide
795      */
796     @Retention(RetentionPolicy.SOURCE)
797     @IntDef(prefix = {"LOCATION_MODE_"}, value = {
798             LOCATION_MODE_NO_CHANGE,
799             LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF,
800             LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF,
801             LOCATION_MODE_FOREGROUND_ONLY,
802             LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF,
803     })
804     public @interface LocationPowerSaveMode {}
805 
806     /** @hide */
locationPowerSaveModeToString(@ocationPowerSaveMode int mode)807     public static String locationPowerSaveModeToString(@LocationPowerSaveMode int mode) {
808         switch (mode) {
809             case LOCATION_MODE_NO_CHANGE:
810                 return "NO_CHANGE";
811             case LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF:
812                 return "GPS_DISABLED_WHEN_SCREEN_OFF";
813             case LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF:
814                 return "ALL_DISABLED_WHEN_SCREEN_OFF";
815             case LOCATION_MODE_FOREGROUND_ONLY:
816                 return "FOREGROUND_ONLY";
817             case LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF:
818                 return "THROTTLE_REQUESTS_WHEN_SCREEN_OFF";
819             default:
820                 return Integer.toString(mode);
821         }
822     }
823 
824     final Context mContext;
825     @UnsupportedAppUsage
826     final IPowerManager mService;
827     final Handler mHandler;
828 
829     IThermalService mThermalService;
830     private final ArrayMap<OnThermalStatusChangedListener, IThermalStatusListener>
831             mListenerMap = new ArrayMap<>();
832 
833     IDeviceIdleController mIDeviceIdleController;
834 
835     /**
836      * {@hide}
837      */
PowerManager(Context context, IPowerManager service, Handler handler)838     public PowerManager(Context context, IPowerManager service, Handler handler) {
839         mContext = context;
840         mService = service;
841         mHandler = handler;
842     }
843 
844     /**
845      * Gets the minimum supported screen brightness setting.
846      * The screen may be allowed to become dimmer than this value but
847      * this is the minimum value that can be set by the user.
848      * @hide
849      */
850     @UnsupportedAppUsage
getMinimumScreenBrightnessSetting()851     public int getMinimumScreenBrightnessSetting() {
852         return mContext.getResources().getInteger(
853                 com.android.internal.R.integer.config_screenBrightnessSettingMinimum);
854     }
855 
856     /**
857      * Gets the maximum supported screen brightness setting.
858      * The screen may be allowed to become dimmer than this value but
859      * this is the maximum value that can be set by the user.
860      * @hide
861      */
862     @UnsupportedAppUsage
getMaximumScreenBrightnessSetting()863     public int getMaximumScreenBrightnessSetting() {
864         return mContext.getResources().getInteger(
865                 com.android.internal.R.integer.config_screenBrightnessSettingMaximum);
866     }
867 
868     /**
869      * Gets the default screen brightness setting.
870      * @hide
871      */
872     @UnsupportedAppUsage
getDefaultScreenBrightnessSetting()873     public int getDefaultScreenBrightnessSetting() {
874         return mContext.getResources().getInteger(
875                 com.android.internal.R.integer.config_screenBrightnessSettingDefault);
876     }
877 
878     /**
879      * Gets the minimum supported screen brightness setting for VR Mode.
880      * @hide
881      */
getMinimumScreenBrightnessForVrSetting()882     public int getMinimumScreenBrightnessForVrSetting() {
883         return mContext.getResources().getInteger(
884                 com.android.internal.R.integer.config_screenBrightnessForVrSettingMinimum);
885     }
886 
887     /**
888      * Gets the maximum supported screen brightness setting for VR Mode.
889      * The screen may be allowed to become dimmer than this value but
890      * this is the maximum value that can be set by the user.
891      * @hide
892      */
getMaximumScreenBrightnessForVrSetting()893     public int getMaximumScreenBrightnessForVrSetting() {
894         return mContext.getResources().getInteger(
895                 com.android.internal.R.integer.config_screenBrightnessForVrSettingMaximum);
896     }
897 
898     /**
899      * Gets the default screen brightness for VR setting.
900      * @hide
901      */
getDefaultScreenBrightnessForVrSetting()902     public int getDefaultScreenBrightnessForVrSetting() {
903         return mContext.getResources().getInteger(
904                 com.android.internal.R.integer.config_screenBrightnessForVrSettingDefault);
905     }
906 
907     /**
908      * Creates a new wake lock with the specified level and flags.
909      * <p>
910      * The {@code levelAndFlags} parameter specifies a wake lock level and optional flags
911      * combined using the logical OR operator.
912      * </p><p>
913      * The wake lock levels are: {@link #PARTIAL_WAKE_LOCK},
914      * {@link #FULL_WAKE_LOCK}, {@link #SCREEN_DIM_WAKE_LOCK}
915      * and {@link #SCREEN_BRIGHT_WAKE_LOCK}.  Exactly one wake lock level must be
916      * specified as part of the {@code levelAndFlags} parameter.
917      * </p><p>
918      * The wake lock flags are: {@link #ACQUIRE_CAUSES_WAKEUP}
919      * and {@link #ON_AFTER_RELEASE}.  Multiple flags can be combined as part of the
920      * {@code levelAndFlags} parameters.
921      * </p><p>
922      * Call {@link WakeLock#acquire() acquire()} on the object to acquire the
923      * wake lock, and {@link WakeLock#release release()} when you are done.
924      * </p><p>
925      * {@samplecode
926      * PowerManager pm = (PowerManager)mContext.getSystemService(
927      *                                          Context.POWER_SERVICE);
928      * PowerManager.WakeLock wl = pm.newWakeLock(
929      *                                      PowerManager.SCREEN_DIM_WAKE_LOCK
930      *                                      | PowerManager.ON_AFTER_RELEASE,
931      *                                      TAG);
932      * wl.acquire();
933      * // ... do work...
934      * wl.release();
935      * }
936      * </p><p>
937      * Although a wake lock can be created without special permissions,
938      * the {@link android.Manifest.permission#WAKE_LOCK} permission is
939      * required to actually acquire or release the wake lock that is returned.
940      * </p><p class="note">
941      * If using this to keep the screen on, you should strongly consider using
942      * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead.
943      * This window flag will be correctly managed by the platform
944      * as the user moves between applications and doesn't require a special permission.
945      * </p>
946      *
947      * <p>
948      * Recommended naming conventions for tags to make debugging easier:
949      * <ul>
950      * <li>use a unique prefix delimited by a colon for your app/library (e.g.
951      * gmail:mytag) to make it easier to understand where the wake locks comes
952      * from. This namespace will also avoid collision for tags inside your app
953      * coming from different libraries which will make debugging easier.
954      * <li>use constants (e.g. do not include timestamps in the tag) to make it
955      * easier for tools to aggregate similar wake locks. When collecting
956      * debugging data, the platform only monitors a finite number of tags,
957      * using constants will help tools to provide better debugging data.
958      * <li>avoid using Class#getName() or similar method since this class name
959      * can be transformed by java optimizer and obfuscator tools.
960      * <li>avoid wrapping the tag or a prefix to avoid collision with wake lock
961      * tags from the platform (e.g. *alarm*).
962      * <li>never include personnally identifiable information for privacy
963      * reasons.
964      * </ul>
965      * </p>
966      *
967      * @param levelAndFlags Combination of wake lock level and flag values defining
968      * the requested behavior of the WakeLock.
969      * @param tag Your class name (or other tag) for debugging purposes.
970      *
971      * @see WakeLock#acquire()
972      * @see WakeLock#release()
973      * @see #PARTIAL_WAKE_LOCK
974      * @see #FULL_WAKE_LOCK
975      * @see #SCREEN_DIM_WAKE_LOCK
976      * @see #SCREEN_BRIGHT_WAKE_LOCK
977      * @see #PROXIMITY_SCREEN_OFF_WAKE_LOCK
978      * @see #ACQUIRE_CAUSES_WAKEUP
979      * @see #ON_AFTER_RELEASE
980      */
newWakeLock(int levelAndFlags, String tag)981     public WakeLock newWakeLock(int levelAndFlags, String tag) {
982         validateWakeLockParameters(levelAndFlags, tag);
983         return new WakeLock(levelAndFlags, tag, mContext.getOpPackageName());
984     }
985 
986     /** @hide */
987     @UnsupportedAppUsage
validateWakeLockParameters(int levelAndFlags, String tag)988     public static void validateWakeLockParameters(int levelAndFlags, String tag) {
989         switch (levelAndFlags & WAKE_LOCK_LEVEL_MASK) {
990             case PARTIAL_WAKE_LOCK:
991             case SCREEN_DIM_WAKE_LOCK:
992             case SCREEN_BRIGHT_WAKE_LOCK:
993             case FULL_WAKE_LOCK:
994             case PROXIMITY_SCREEN_OFF_WAKE_LOCK:
995             case DOZE_WAKE_LOCK:
996             case DRAW_WAKE_LOCK:
997                 break;
998             default:
999                 throw new IllegalArgumentException("Must specify a valid wake lock level.");
1000         }
1001         if (tag == null) {
1002             throw new IllegalArgumentException("The tag must not be null.");
1003         }
1004     }
1005 
1006     /**
1007      * Notifies the power manager that user activity happened.
1008      * <p>
1009      * Resets the auto-off timer and brightens the screen if the device
1010      * is not asleep.  This is what happens normally when a key or the touch
1011      * screen is pressed or when some other user activity occurs.
1012      * This method does not wake up the device if it has been put to sleep.
1013      * </p><p>
1014      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
1015      * </p>
1016      *
1017      * @param when The time of the user activity, in the {@link SystemClock#uptimeMillis()}
1018      * time base.  This timestamp is used to correctly order the user activity request with
1019      * other power management functions.  It should be set
1020      * to the timestamp of the input event that caused the user activity.
1021      * @param noChangeLights If true, does not cause the keyboard backlight to turn on
1022      * because of this event.  This is set when the power key is pressed.
1023      * We want the device to stay on while the button is down, but we're about
1024      * to turn off the screen so we don't want the keyboard backlight to turn on again.
1025      * Otherwise the lights flash on and then off and it looks weird.
1026      *
1027      * @see #wakeUp
1028      * @see #goToSleep
1029      *
1030      * @removed Requires signature or system permission.
1031      * @deprecated Use {@link #userActivity(long, int, int)}.
1032      */
1033     @Deprecated
userActivity(long when, boolean noChangeLights)1034     public void userActivity(long when, boolean noChangeLights) {
1035         userActivity(when, USER_ACTIVITY_EVENT_OTHER,
1036                 noChangeLights ? USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS : 0);
1037     }
1038 
1039     /**
1040      * Notifies the power manager that user activity happened.
1041      * <p>
1042      * Resets the auto-off timer and brightens the screen if the device
1043      * is not asleep.  This is what happens normally when a key or the touch
1044      * screen is pressed or when some other user activity occurs.
1045      * This method does not wake up the device if it has been put to sleep.
1046      * </p><p>
1047      * Requires the {@link android.Manifest.permission#DEVICE_POWER} or
1048      * {@link android.Manifest.permission#USER_ACTIVITY} permission.
1049      * </p>
1050      *
1051      * @param when The time of the user activity, in the {@link SystemClock#uptimeMillis()}
1052      * time base.  This timestamp is used to correctly order the user activity request with
1053      * other power management functions.  It should be set
1054      * to the timestamp of the input event that caused the user activity.
1055      * @param event The user activity event.
1056      * @param flags Optional user activity flags.
1057      *
1058      * @see #wakeUp
1059      * @see #goToSleep
1060      *
1061      * @hide Requires signature or system permission.
1062      */
1063     @SystemApi
1064     @RequiresPermission(anyOf = {
1065             android.Manifest.permission.DEVICE_POWER,
1066             android.Manifest.permission.USER_ACTIVITY
1067     })
userActivity(long when, int event, int flags)1068     public void userActivity(long when, int event, int flags) {
1069         try {
1070             mService.userActivity(when, event, flags);
1071         } catch (RemoteException e) {
1072             throw e.rethrowFromSystemServer();
1073         }
1074     }
1075 
1076    /**
1077      * Forces the device to go to sleep.
1078      * <p>
1079      * Overrides all the wake locks that are held.
1080      * This is what happens when the power key is pressed to turn off the screen.
1081      * </p><p>
1082      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
1083      * </p>
1084      *
1085      * @param time The time when the request to go to sleep was issued, in the
1086      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
1087      * order the go to sleep request with other power management functions.  It should be set
1088      * to the timestamp of the input event that caused the request to go to sleep.
1089      *
1090      * @see #userActivity
1091      * @see #wakeUp
1092      *
1093      * @removed Requires signature permission.
1094      */
goToSleep(long time)1095     public void goToSleep(long time) {
1096         goToSleep(time, GO_TO_SLEEP_REASON_APPLICATION, 0);
1097     }
1098 
1099     /**
1100      * Forces the device to go to sleep.
1101      * <p>
1102      * Overrides all the wake locks that are held.
1103      * This is what happens when the power key is pressed to turn off the screen.
1104      * </p><p>
1105      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
1106      * </p>
1107      *
1108      * @param time The time when the request to go to sleep was issued, in the
1109      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
1110      * order the go to sleep request with other power management functions.  It should be set
1111      * to the timestamp of the input event that caused the request to go to sleep.
1112      * @param reason The reason the device is going to sleep.
1113      * @param flags Optional flags to apply when going to sleep.
1114      *
1115      * @see #userActivity
1116      * @see #wakeUp
1117      *
1118      * @hide Requires signature permission.
1119      */
1120     @UnsupportedAppUsage
goToSleep(long time, int reason, int flags)1121     public void goToSleep(long time, int reason, int flags) {
1122         try {
1123             mService.goToSleep(time, reason, flags);
1124         } catch (RemoteException e) {
1125             throw e.rethrowFromSystemServer();
1126         }
1127     }
1128 
1129     /**
1130      * Forces the device to wake up from sleep.
1131      * <p>
1132      * If the device is currently asleep, wakes it up, otherwise does nothing.
1133      * This is what happens when the power key is pressed to turn on the screen.
1134      * </p><p>
1135      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
1136      * </p>
1137      *
1138      * @param time The time when the request to wake up was issued, in the
1139      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
1140      * order the wake up request with other power management functions.  It should be set
1141      * to the timestamp of the input event that caused the request to wake up.
1142      *
1143      * @see #userActivity
1144      * @see #goToSleep
1145      *
1146      * @deprecated Use {@link #wakeUp(long, int, String)} instead.
1147      * @removed Requires signature permission.
1148      */
1149     @Deprecated
wakeUp(long time)1150     public void wakeUp(long time) {
1151         wakeUp(time, WAKE_REASON_UNKNOWN, "wakeUp");
1152     }
1153 
1154     /**
1155      * Forces the device to wake up from sleep.
1156      * <p>
1157      * If the device is currently asleep, wakes it up, otherwise does nothing.
1158      * This is what happens when the power key is pressed to turn on the screen.
1159      * </p><p>
1160      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
1161      * </p>
1162      *
1163      * @param time The time when the request to wake up was issued, in the
1164      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
1165      * order the wake up request with other power management functions.  It should be set
1166      * to the timestamp of the input event that caused the request to wake up.
1167      *
1168      * @param details A free form string to explain the specific details behind the wake up for
1169      *                debugging purposes.
1170      *
1171      * @see #userActivity
1172      * @see #goToSleep
1173      *
1174      * @deprecated Use {@link #wakeUp(long, int, String)} instead.
1175      * @hide
1176      */
1177     @UnsupportedAppUsage
1178     @Deprecated
wakeUp(long time, String details)1179     public void wakeUp(long time, String details) {
1180         wakeUp(time, WAKE_REASON_UNKNOWN, details);
1181     }
1182 
1183     /**
1184      * Forces the device to wake up from sleep.
1185      * <p>
1186      * If the device is currently asleep, wakes it up, otherwise does nothing.
1187      * This is what happens when the power key is pressed to turn on the screen.
1188      * </p><p>
1189      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
1190      * </p>
1191      *
1192      * @param time The time when the request to wake up was issued, in the
1193      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
1194      * order the wake up request with other power management functions.  It should be set
1195      * to the timestamp of the input event that caused the request to wake up.
1196      *
1197      * @param reason The reason for the wake up.
1198      *
1199      * @param details A free form string to explain the specific details behind the wake up for
1200      *                debugging purposes.
1201      *
1202      * @see #userActivity
1203      * @see #goToSleep
1204      * @hide
1205      */
wakeUp(long time, @WakeReason int reason, String details)1206     public void wakeUp(long time, @WakeReason int reason, String details) {
1207         try {
1208             mService.wakeUp(time, reason, details, mContext.getOpPackageName());
1209         } catch (RemoteException e) {
1210             throw e.rethrowFromSystemServer();
1211         }
1212     }
1213 
1214     /**
1215      * Forces the device to start napping.
1216      * <p>
1217      * If the device is currently awake, starts dreaming, otherwise does nothing.
1218      * When the dream ends or if the dream cannot be started, the device will
1219      * either wake up or go to sleep depending on whether there has been recent
1220      * user activity.
1221      * </p><p>
1222      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
1223      * </p>
1224      *
1225      * @param time The time when the request to nap was issued, in the
1226      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
1227      * order the nap request with other power management functions.  It should be set
1228      * to the timestamp of the input event that caused the request to nap.
1229      *
1230      * @see #wakeUp
1231      * @see #goToSleep
1232      *
1233      * @hide Requires signature permission.
1234      */
nap(long time)1235     public void nap(long time) {
1236         try {
1237             mService.nap(time);
1238         } catch (RemoteException e) {
1239             throw e.rethrowFromSystemServer();
1240         }
1241     }
1242 
1243     /**
1244      * Requests the device to start dreaming.
1245      * <p>
1246      * If dream can not be started, for example if another {@link PowerManager} transition is in
1247      * progress, does nothing. Unlike {@link #nap(long)}, this does not put device to sleep when
1248      * dream ends.
1249      * </p><p>
1250      * Requires the {@link android.Manifest.permission#READ_DREAM_STATE} and
1251      * {@link android.Manifest.permission#WRITE_DREAM_STATE} permissions.
1252      * </p>
1253      *
1254      * @param time The time when the request to nap was issued, in the
1255      * {@link SystemClock#uptimeMillis()} time base.  This timestamp may be used to correctly
1256      * order the dream request with other power management functions.  It should be set
1257      * to the timestamp of the input event that caused the request to dream.
1258      *
1259      * @hide
1260      */
1261     @SystemApi
1262     @RequiresPermission(allOf = {
1263             android.Manifest.permission.READ_DREAM_STATE,
1264             android.Manifest.permission.WRITE_DREAM_STATE })
dream(long time)1265     public void dream(long time) {
1266         Sandman.startDreamByUserRequest(mContext);
1267     }
1268 
1269     /**
1270      * Boosts the brightness of the screen to maximum for a predetermined
1271      * period of time.  This is used to make the screen more readable in bright
1272      * daylight for a short duration.
1273      * <p>
1274      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
1275      * </p>
1276      *
1277      * @param time The time when the request to boost was issued, in the
1278      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
1279      * order the boost request with other power management functions.  It should be set
1280      * to the timestamp of the input event that caused the request to boost.
1281      *
1282      * @hide Requires signature permission.
1283      */
boostScreenBrightness(long time)1284     public void boostScreenBrightness(long time) {
1285         try {
1286             mService.boostScreenBrightness(time);
1287         } catch (RemoteException e) {
1288             throw e.rethrowFromSystemServer();
1289         }
1290     }
1291 
1292     /**
1293      * Returns whether the screen brightness is currently boosted to maximum, caused by a call
1294      * to {@link #boostScreenBrightness(long)}.
1295      * @return {@code True} if the screen brightness is currently boosted. {@code False} otherwise.
1296      *
1297      * @deprecated This call is rarely used and will be phased out soon.
1298      * @hide
1299      * @removed
1300      */
1301     @SystemApi @Deprecated
isScreenBrightnessBoosted()1302     public boolean isScreenBrightnessBoosted() {
1303         return false;
1304     }
1305 
1306    /**
1307      * Returns true if the specified wake lock level is supported.
1308      *
1309      * @param level The wake lock level to check.
1310      * @return True if the specified wake lock level is supported.
1311      */
isWakeLockLevelSupported(int level)1312     public boolean isWakeLockLevelSupported(int level) {
1313         try {
1314             return mService.isWakeLockLevelSupported(level);
1315         } catch (RemoteException e) {
1316             throw e.rethrowFromSystemServer();
1317         }
1318     }
1319 
1320     /**
1321       * Returns true if the device is in an interactive state.
1322       * <p>
1323       * For historical reasons, the name of this method refers to the power state of
1324       * the screen but it actually describes the overall interactive state of
1325       * the device.  This method has been replaced by {@link #isInteractive}.
1326       * </p><p>
1327       * The value returned by this method only indicates whether the device is
1328       * in an interactive state which may have nothing to do with the screen being
1329       * on or off.  To determine the actual state of the screen,
1330       * use {@link android.view.Display#getState}.
1331       * </p>
1332       *
1333       * @return True if the device is in an interactive state.
1334       *
1335       * @deprecated Use {@link #isInteractive} instead.
1336       */
1337     @Deprecated
isScreenOn()1338     public boolean isScreenOn() {
1339         return isInteractive();
1340     }
1341 
1342     /**
1343      * Returns true if the device is in an interactive state.
1344      * <p>
1345      * When this method returns true, the device is awake and ready to interact
1346      * with the user (although this is not a guarantee that the user is actively
1347      * interacting with the device just this moment).  The main screen is usually
1348      * turned on while in this state.  Certain features, such as the proximity
1349      * sensor, may temporarily turn off the screen while still leaving the device in an
1350      * interactive state.  Note in particular that the device is still considered
1351      * to be interactive while dreaming (since dreams can be interactive) but not
1352      * when it is dozing or asleep.
1353      * </p><p>
1354      * When this method returns false, the device is dozing or asleep and must
1355      * be awoken before it will become ready to interact with the user again.  The
1356      * main screen is usually turned off while in this state.  Certain features,
1357      * such as "ambient mode" may cause the main screen to remain on (albeit in a
1358      * low power state) to display system-provided content while the device dozes.
1359      * </p><p>
1360      * The system will send a {@link android.content.Intent#ACTION_SCREEN_ON screen on}
1361      * or {@link android.content.Intent#ACTION_SCREEN_OFF screen off} broadcast
1362      * whenever the interactive state of the device changes.  For historical reasons,
1363      * the names of these broadcasts refer to the power state of the screen
1364      * but they are actually sent in response to changes in the overall interactive
1365      * state of the device, as described by this method.
1366      * </p><p>
1367      * Services may use the non-interactive state as a hint to conserve power
1368      * since the user is not present.
1369      * </p>
1370      *
1371      * @return True if the device is in an interactive state.
1372      *
1373      * @see android.content.Intent#ACTION_SCREEN_ON
1374      * @see android.content.Intent#ACTION_SCREEN_OFF
1375      */
isInteractive()1376     public boolean isInteractive() {
1377         try {
1378             return mService.isInteractive();
1379         } catch (RemoteException e) {
1380             throw e.rethrowFromSystemServer();
1381         }
1382     }
1383 
1384     /**
1385      * Reboot the device.  Will not return if the reboot is successful.
1386      * <p>
1387      * Requires the {@link android.Manifest.permission#REBOOT} permission.
1388      * </p>
1389      *
1390      * @param reason code to pass to the kernel (e.g., "recovery") to
1391      *               request special boot modes, or null.
1392      */
reboot(String reason)1393     public void reboot(String reason) {
1394         try {
1395             mService.reboot(false, reason, true);
1396         } catch (RemoteException e) {
1397             throw e.rethrowFromSystemServer();
1398         }
1399     }
1400 
1401     /**
1402      * Reboot the device. Will not return if the reboot is successful.
1403      * <p>
1404      * Requires the {@link android.Manifest.permission#REBOOT} permission.
1405      * </p>
1406      * @hide
1407      */
rebootSafeMode()1408     public void rebootSafeMode() {
1409         try {
1410             mService.rebootSafeMode(false, true);
1411         } catch (RemoteException e) {
1412             throw e.rethrowFromSystemServer();
1413         }
1414     }
1415 
1416     /**
1417      * Returns true if the device is currently in power save mode.  When in this mode,
1418      * applications should reduce their functionality in order to conserve battery as
1419      * much as possible.  You can monitor for changes to this state with
1420      * {@link #ACTION_POWER_SAVE_MODE_CHANGED}.
1421      *
1422      * @return Returns true if currently in low power mode, else false.
1423      */
isPowerSaveMode()1424     public boolean isPowerSaveMode() {
1425         try {
1426             return mService.isPowerSaveMode();
1427         } catch (RemoteException e) {
1428             throw e.rethrowFromSystemServer();
1429         }
1430     }
1431 
1432     /**
1433      * Set the current power save mode.
1434      *
1435      * @return True if the set was allowed.
1436      *
1437      * @hide
1438      * @see #isPowerSaveMode()
1439      */
1440     @SystemApi
1441     @TestApi
1442     @RequiresPermission(anyOf = {
1443             android.Manifest.permission.DEVICE_POWER,
1444             android.Manifest.permission.POWER_SAVER
1445     })
setPowerSaveModeEnabled(boolean mode)1446     public boolean setPowerSaveModeEnabled(boolean mode) {
1447         try {
1448             return mService.setPowerSaveModeEnabled(mode);
1449         } catch (RemoteException e) {
1450             throw e.rethrowFromSystemServer();
1451         }
1452     }
1453 
1454     /**
1455      * Updates the current state of dynamic power savings and disable threshold. This is
1456      * a signal to the system which an app can update to serve as an indicator that
1457      * the user will be in a battery critical situation before being able to plug in.
1458      * Only apps with the {@link android.Manifest.permission#POWER_SAVER} permission may do this.
1459      * This is a device global state, not a per user setting.
1460      *
1461      * <p>When enabled, the system may enact various measures for reducing power consumption in
1462      * order to help ensure that the user will make it to their next charging point. The most
1463      * visible of these will be the automatic enabling of battery saver if the user has set
1464      * their battery saver mode to "automatic". Note
1465      * that this is NOT simply an on/off switch for features, but rather a hint for the
1466      * system to consider enacting these power saving features, some of which have additional
1467      * logic around when to activate based on this signal.
1468      *
1469      * <p>The provided threshold is the percentage the system should consider itself safe at given
1470      * the current state of the device. The value is an integer representing a battery level.
1471      *
1472      * <p>The threshold is meant to set an explicit stopping point for dynamic power savings
1473      * functionality so that the dynamic power savings itself remains a signal rather than becoming
1474      * an on/off switch for a subset of features.
1475      * @hide
1476      *
1477      * @param powerSaveHint A signal indicating to the system if it believes the
1478      * dynamic power savings behaviors should be activated.
1479      * @param disableThreshold When the suggesting app believes it would be safe to disable dynamic
1480      * power savings behaviors.
1481      * @return True if the update was allowed and succeeded.
1482      *
1483      * @hide
1484      */
1485     @SystemApi
1486     @TestApi
1487     @RequiresPermission(permission.POWER_SAVER)
setDynamicPowerSaveHint(boolean powerSaveHint, int disableThreshold)1488     public boolean setDynamicPowerSaveHint(boolean powerSaveHint, int disableThreshold) {
1489         try {
1490             return mService.setDynamicPowerSaveHint(powerSaveHint, disableThreshold);
1491         } catch (RemoteException e) {
1492             throw e.rethrowFromSystemServer();
1493         }
1494     }
1495 
1496     /**
1497      * Sets the policy for adaptive power save.
1498      *
1499      * @return true if there was an effectual change. If full battery saver is enabled or the
1500      * adaptive policy is not enabled, then this will return false.
1501      *
1502      * @hide
1503      */
1504     @SystemApi
1505     @RequiresPermission(anyOf = {
1506             android.Manifest.permission.DEVICE_POWER,
1507             android.Manifest.permission.POWER_SAVER
1508     })
setAdaptivePowerSavePolicy(@onNull BatterySaverPolicyConfig config)1509     public boolean setAdaptivePowerSavePolicy(@NonNull BatterySaverPolicyConfig config) {
1510         try {
1511             return mService.setAdaptivePowerSavePolicy(config);
1512         } catch (RemoteException e) {
1513             throw e.rethrowFromSystemServer();
1514         }
1515     }
1516 
1517     /**
1518      * Enables or disables adaptive power save.
1519      *
1520      * @return true if there was an effectual change. If full battery saver is enabled, then this
1521      * will return false.
1522      *
1523      * @hide
1524      */
1525     @SystemApi
1526     @RequiresPermission(anyOf = {
1527             android.Manifest.permission.DEVICE_POWER,
1528             android.Manifest.permission.POWER_SAVER
1529     })
setAdaptivePowerSaveEnabled(boolean enabled)1530     public boolean setAdaptivePowerSaveEnabled(boolean enabled) {
1531         try {
1532             return mService.setAdaptivePowerSaveEnabled(enabled);
1533         } catch (RemoteException e) {
1534             throw e.rethrowFromSystemServer();
1535         }
1536     }
1537 
1538     /**
1539      * Indicates automatic battery saver toggling by the system will be based on percentage.
1540      *
1541      * @see PowerManager#getPowerSaveModeTrigger()
1542      *
1543      *  @hide
1544      */
1545     @SystemApi
1546     @TestApi
1547     public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0;
1548 
1549     /**
1550      * Indicates automatic battery saver toggling by the system will be based on the state
1551      * of the dynamic power savings signal.
1552      *
1553      * @see PowerManager#setDynamicPowerSaveHint(boolean, int)
1554      * @see PowerManager#getPowerSaveModeTrigger()
1555      *
1556      *  @hide
1557      */
1558     @SystemApi
1559     @TestApi
1560     public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1;
1561 
1562     /** @hide */
1563     @Retention(RetentionPolicy.SOURCE)
1564     @IntDef(value = {
1565         POWER_SAVE_MODE_TRIGGER_PERCENTAGE,
1566         POWER_SAVE_MODE_TRIGGER_DYNAMIC
1567 
1568     })
1569     public @interface AutoPowerSaveModeTriggers {}
1570 
1571 
1572     /**
1573      * Returns the current battery saver control mode. Values it may return are defined in
1574      * AutoPowerSaveModeTriggers. Note that this is a global device state, not a per user setting.
1575      *
1576      * @return The current value power saver mode for the system.
1577      *
1578      * @see AutoPowerSaveModeTriggers
1579      * @see PowerManager#getPowerSaveModeTrigger()
1580      * @hide
1581      */
1582     @AutoPowerSaveModeTriggers
1583     @SystemApi
1584     @TestApi
1585     @RequiresPermission(android.Manifest.permission.POWER_SAVER)
getPowerSaveModeTrigger()1586     public int getPowerSaveModeTrigger() {
1587         try {
1588             return mService.getPowerSaveModeTrigger();
1589         } catch (RemoteException e) {
1590             throw e.rethrowFromSystemServer();
1591         }
1592     }
1593 
1594     /**
1595      * Get data about the battery saver mode for a specific service
1596      * @param serviceType unique key for the service, one of {@link ServiceType}
1597      * @return Battery saver state data.
1598      *
1599      * @hide
1600      * @see com.android.server.power.batterysaver.BatterySaverPolicy
1601      * @see PowerSaveState
1602      */
getPowerSaveState(@erviceType int serviceType)1603     public PowerSaveState getPowerSaveState(@ServiceType int serviceType) {
1604         try {
1605             return mService.getPowerSaveState(serviceType);
1606         } catch (RemoteException e) {
1607             throw e.rethrowFromSystemServer();
1608         }
1609     }
1610 
1611     /**
1612      * Returns how location features should behave when battery saver is on. When battery saver
1613      * is off, this will always return {@link #LOCATION_MODE_NO_CHANGE}.
1614      *
1615      * <p>This API is normally only useful for components that provide location features.
1616      *
1617      * @see #isPowerSaveMode()
1618      * @see #ACTION_POWER_SAVE_MODE_CHANGED
1619      */
1620     @LocationPowerSaveMode
getLocationPowerSaveMode()1621     public int getLocationPowerSaveMode() {
1622         final PowerSaveState powerSaveState = getPowerSaveState(ServiceType.LOCATION);
1623         if (!powerSaveState.batterySaverEnabled) {
1624             return LOCATION_MODE_NO_CHANGE;
1625         }
1626         return powerSaveState.locationMode;
1627     }
1628 
1629     /**
1630      * Returns true if the device is currently in idle mode.  This happens when a device
1631      * has been sitting unused and unmoving for a sufficiently long period of time, so that
1632      * it decides to go into a lower power-use state.  This may involve things like turning
1633      * off network access to apps.  You can monitor for changes to this state with
1634      * {@link #ACTION_DEVICE_IDLE_MODE_CHANGED}.
1635      *
1636      * @return Returns true if currently in active device idle mode, else false.  This is
1637      * when idle mode restrictions are being actively applied; it will return false if the
1638      * device is in a long-term idle mode but currently running a maintenance window where
1639      * restrictions have been lifted.
1640      */
isDeviceIdleMode()1641     public boolean isDeviceIdleMode() {
1642         try {
1643             return mService.isDeviceIdleMode();
1644         } catch (RemoteException e) {
1645             throw e.rethrowFromSystemServer();
1646         }
1647     }
1648 
1649     /**
1650      * Returns true if the device is currently in light idle mode.  This happens when a device
1651      * has had its screen off for a short time, switching it into a batching mode where we
1652      * execute jobs, syncs, networking on a batching schedule.  You can monitor for changes to
1653      * this state with {@link #ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED}.
1654      *
1655      * @return Returns true if currently in active light device idle mode, else false.  This is
1656      * when light idle mode restrictions are being actively applied; it will return false if the
1657      * device is in a long-term idle mode but currently running a maintenance window where
1658      * restrictions have been lifted.
1659      * @hide
1660      */
1661     @UnsupportedAppUsage
isLightDeviceIdleMode()1662     public boolean isLightDeviceIdleMode() {
1663         try {
1664             return mService.isLightDeviceIdleMode();
1665         } catch (RemoteException e) {
1666             throw e.rethrowFromSystemServer();
1667         }
1668     }
1669 
1670     /**
1671      * Return whether the given application package name is on the device's power whitelist.
1672      * Apps can be placed on the whitelist through the settings UI invoked by
1673      * {@link android.provider.Settings#ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}.
1674      */
isIgnoringBatteryOptimizations(String packageName)1675     public boolean isIgnoringBatteryOptimizations(String packageName) {
1676         synchronized (this) {
1677             if (mIDeviceIdleController == null) {
1678                 mIDeviceIdleController = IDeviceIdleController.Stub.asInterface(
1679                         ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
1680             }
1681         }
1682         try {
1683             return mIDeviceIdleController.isPowerSaveWhitelistApp(packageName);
1684         } catch (RemoteException e) {
1685             throw e.rethrowFromSystemServer();
1686         }
1687     }
1688 
1689     /**
1690      * Turn off the device.
1691      *
1692      * @param confirm If true, shows a shutdown confirmation dialog.
1693      * @param reason code to pass to android_reboot() (e.g. "userrequested"), or null.
1694      * @param wait If true, this call waits for the shutdown to complete and does not return.
1695      *
1696      * @hide
1697      */
shutdown(boolean confirm, String reason, boolean wait)1698     public void shutdown(boolean confirm, String reason, boolean wait) {
1699         try {
1700             mService.shutdown(confirm, reason, wait);
1701         } catch (RemoteException e) {
1702             throw e.rethrowFromSystemServer();
1703         }
1704     }
1705 
1706     /**
1707      * This function checks if the device has implemented Sustained Performance
1708      * Mode. This needs to be checked only once and is constant for a particular
1709      * device/release.
1710      *
1711      * Sustained Performance Mode is intended to provide a consistent level of
1712      * performance for prolonged amount of time.
1713      *
1714      * Applications should check if the device supports this mode, before using
1715      * {@link android.view.Window#setSustainedPerformanceMode}.
1716      *
1717      * @return Returns True if the device supports it, false otherwise.
1718      *
1719      * @see android.view.Window#setSustainedPerformanceMode
1720      */
isSustainedPerformanceModeSupported()1721     public boolean isSustainedPerformanceModeSupported() {
1722         return mContext.getResources().getBoolean(
1723                 com.android.internal.R.bool.config_sustainedPerformanceModeSupported);
1724     }
1725 
1726     /**
1727      * Thermal status code: Not under throttling.
1728      */
1729     public static final int THERMAL_STATUS_NONE = Temperature.THROTTLING_NONE;
1730 
1731     /**
1732      * Thermal status code: Light throttling where UX is not impacted.
1733      */
1734     public static final int THERMAL_STATUS_LIGHT = Temperature.THROTTLING_LIGHT;
1735 
1736     /**
1737      * Thermal status code: Moderate throttling where UX is not largely impacted.
1738      */
1739     public static final int THERMAL_STATUS_MODERATE = Temperature.THROTTLING_MODERATE;
1740 
1741     /**
1742      * Thermal status code: Severe throttling where UX is largely impacted.
1743      */
1744     public static final int THERMAL_STATUS_SEVERE = Temperature.THROTTLING_SEVERE;
1745 
1746     /**
1747      * Thermal status code: Platform has done everything to reduce power.
1748      */
1749     public static final int THERMAL_STATUS_CRITICAL = Temperature.THROTTLING_CRITICAL;
1750 
1751     /**
1752      * Thermal status code: Key components in platform are shutting down due to thermal condition.
1753      * Device functionalities will be limited.
1754      */
1755     public static final int THERMAL_STATUS_EMERGENCY = Temperature.THROTTLING_EMERGENCY;
1756 
1757     /**
1758      * Thermal status code: Need shutdown immediately.
1759      */
1760     public static final int THERMAL_STATUS_SHUTDOWN = Temperature.THROTTLING_SHUTDOWN;
1761 
1762     /** @hide */
1763     @IntDef(prefix = { "THERMAL_STATUS_" }, value = {
1764             THERMAL_STATUS_NONE,
1765             THERMAL_STATUS_LIGHT,
1766             THERMAL_STATUS_MODERATE,
1767             THERMAL_STATUS_SEVERE,
1768             THERMAL_STATUS_CRITICAL,
1769             THERMAL_STATUS_EMERGENCY,
1770             THERMAL_STATUS_SHUTDOWN,
1771     })
1772     @Retention(RetentionPolicy.SOURCE)
1773     public @interface ThermalStatus {}
1774 
1775     /**
1776      * This function returns the current thermal status of the device.
1777      *
1778      * @return thermal status as int, {@link #THERMAL_STATUS_NONE} if device in not under
1779      * thermal throttling.
1780      */
getCurrentThermalStatus()1781     public @ThermalStatus int getCurrentThermalStatus() {
1782         synchronized (this) {
1783             if (mThermalService == null) {
1784                 mThermalService = IThermalService.Stub.asInterface(
1785                         ServiceManager.getService(Context.THERMAL_SERVICE));
1786             }
1787             try {
1788                 return mThermalService.getCurrentThermalStatus();
1789             } catch (RemoteException e) {
1790                 throw e.rethrowFromSystemServer();
1791             }
1792         }
1793 
1794     }
1795 
1796     /**
1797      * Listener passed to
1798      * {@link PowerManager#addThermalStatusListener} and
1799      * {@link PowerManager#removeThermalStatusListener}
1800      * to notify caller of thermal status has changed.
1801      */
1802     public interface OnThermalStatusChangedListener {
1803 
1804         /**
1805          * Called when overall thermal throttling status changed.
1806          * @param status defined in {@link android.os.Temperature}.
1807          */
onThermalStatusChanged(@hermalStatus int status)1808         void onThermalStatusChanged(@ThermalStatus int status);
1809     }
1810 
1811 
1812     /**
1813      * This function adds a listener for thermal status change, listen call back will be
1814      * enqueued tasks on the main thread
1815      *
1816      * @param listener listener to be added,
1817      */
addThermalStatusListener(@onNull OnThermalStatusChangedListener listener)1818     public void addThermalStatusListener(@NonNull OnThermalStatusChangedListener listener) {
1819         Preconditions.checkNotNull(listener, "listener cannot be null");
1820         synchronized (this) {
1821             if (mThermalService == null) {
1822                 mThermalService = IThermalService.Stub.asInterface(
1823                         ServiceManager.getService(Context.THERMAL_SERVICE));
1824             }
1825             this.addThermalStatusListener(mContext.getMainExecutor(), listener);
1826         }
1827     }
1828 
1829     /**
1830      * This function adds a listener for thermal status change.
1831      *
1832      * @param executor {@link Executor} to handle listener callback.
1833      * @param listener listener to be added.
1834      */
addThermalStatusListener(@onNull @allbackExecutor Executor executor, @NonNull OnThermalStatusChangedListener listener)1835     public void addThermalStatusListener(@NonNull @CallbackExecutor Executor executor,
1836             @NonNull OnThermalStatusChangedListener listener) {
1837         Preconditions.checkNotNull(listener, "listener cannot be null");
1838         Preconditions.checkNotNull(executor, "executor cannot be null");
1839         synchronized (this) {
1840             if (mThermalService == null) {
1841                 mThermalService = IThermalService.Stub.asInterface(
1842                         ServiceManager.getService(Context.THERMAL_SERVICE));
1843             }
1844             Preconditions.checkArgument(!mListenerMap.containsKey(listener),
1845                     "Listener already registered: " + listener);
1846             IThermalStatusListener internalListener = new IThermalStatusListener.Stub() {
1847                 @Override
1848                 public void onStatusChange(int status) {
1849                     final long token = Binder.clearCallingIdentity();
1850                     try {
1851                         executor.execute(() -> {
1852                             listener.onThermalStatusChanged(status);
1853                         });
1854                     } finally {
1855                         Binder.restoreCallingIdentity(token);
1856                     }
1857                 }
1858             };
1859             try {
1860                 if (mThermalService.registerThermalStatusListener(internalListener)) {
1861                     mListenerMap.put(listener, internalListener);
1862                 } else {
1863                     throw new RuntimeException("Listener failed to set");
1864                 }
1865             } catch (RemoteException e) {
1866                 throw e.rethrowFromSystemServer();
1867             }
1868         }
1869     }
1870 
1871     /**
1872      * This function removes a listener for thermal status change
1873      *
1874      * @param listener listener to be removed
1875      */
removeThermalStatusListener(@onNull OnThermalStatusChangedListener listener)1876     public void removeThermalStatusListener(@NonNull OnThermalStatusChangedListener listener) {
1877         Preconditions.checkNotNull(listener, "listener cannot be null");
1878         synchronized (this) {
1879             if (mThermalService == null) {
1880                 mThermalService = IThermalService.Stub.asInterface(
1881                         ServiceManager.getService(Context.THERMAL_SERVICE));
1882             }
1883             IThermalStatusListener internalListener = mListenerMap.get(listener);
1884             Preconditions.checkArgument(internalListener != null, "Listener was not added");
1885             try {
1886                 if (mThermalService.unregisterThermalStatusListener(internalListener)) {
1887                     mListenerMap.remove(listener);
1888                 } else {
1889                     throw new RuntimeException("Listener failed to remove");
1890                 }
1891             } catch (RemoteException e) {
1892                 throw e.rethrowFromSystemServer();
1893             }
1894         }
1895     }
1896 
1897     /**
1898      * If true, the doze component is not started until after the screen has been
1899      * turned off and the screen off animation has been performed.
1900      * @hide
1901      */
setDozeAfterScreenOff(boolean dozeAfterScreenOf)1902     public void setDozeAfterScreenOff(boolean dozeAfterScreenOf) {
1903         try {
1904             mService.setDozeAfterScreenOff(dozeAfterScreenOf);
1905         } catch (RemoteException e) {
1906             throw e.rethrowFromSystemServer();
1907         }
1908     }
1909 
1910     /**
1911      * Returns the reason the phone was last shutdown. Calling app must have the
1912      * {@link android.Manifest.permission#DEVICE_POWER} permission to request this information.
1913      * @return Reason for shutdown as an int, {@link #SHUTDOWN_REASON_UNKNOWN} if the file could
1914      * not be accessed.
1915      * @hide
1916      */
1917     @ShutdownReason
getLastShutdownReason()1918     public int getLastShutdownReason() {
1919         try {
1920             return mService.getLastShutdownReason();
1921         } catch (RemoteException e) {
1922             throw e.rethrowFromSystemServer();
1923         }
1924     }
1925 
1926     /**
1927      * Returns the reason the device last went to sleep (i.e. the last value of
1928      * the second argument of {@link #goToSleep(long, int, int) goToSleep}).
1929      *
1930      * @return One of the {@code GO_TO_SLEEP_REASON_*} constants.
1931      *
1932      * @hide
1933      */
getLastSleepReason()1934     public int getLastSleepReason() {
1935         try {
1936             return mService.getLastSleepReason();
1937         } catch (RemoteException e) {
1938             throw e.rethrowFromSystemServer();
1939         }
1940     }
1941 
1942     /**
1943      * Forces the device to go to suspend, even if there are currently wakelocks being held.
1944      * <b>Caution</b>
1945      * This is a very dangerous command as it puts the device to sleep immediately. Apps and parts
1946      * of the system will not be notified and will not have an opportunity to save state prior to
1947      * the device going to suspend.
1948      * This method should only be used in very rare circumstances where the device is intended
1949      * to appear as completely off to the user and they have a well understood, reliable way of
1950      * re-enabling it.
1951      * </p><p>
1952      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
1953      * </p>
1954      *
1955      * @return true on success, false otherwise.
1956      * @hide
1957      */
1958     @SystemApi
1959     @RequiresPermission(android.Manifest.permission.DEVICE_POWER)
forceSuspend()1960     public boolean forceSuspend() {
1961         try {
1962             return mService.forceSuspend();
1963         } catch (RemoteException e) {
1964             throw e.rethrowFromSystemServer();
1965         }
1966     }
1967 
1968     /**
1969      * Intent that is broadcast when the state of {@link #isPowerSaveMode()} changes.
1970      * This broadcast is only sent to registered receivers.
1971      */
1972     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1973     public static final String ACTION_POWER_SAVE_MODE_CHANGED
1974             = "android.os.action.POWER_SAVE_MODE_CHANGED";
1975 
1976     /**
1977      * Intent that is broadcast when the state of {@link #isPowerSaveMode()} changes.
1978      * @hide
1979      */
1980     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1981     public static final String ACTION_POWER_SAVE_MODE_CHANGED_INTERNAL
1982             = "android.os.action.POWER_SAVE_MODE_CHANGED_INTERNAL";
1983 
1984     /**
1985      * Intent that is broadcast when the state of {@link #isDeviceIdleMode()} changes.
1986      * This broadcast is only sent to registered receivers.
1987      */
1988     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1989     public static final String ACTION_DEVICE_IDLE_MODE_CHANGED
1990             = "android.os.action.DEVICE_IDLE_MODE_CHANGED";
1991 
1992     /**
1993      * Intent that is broadcast when the state of {@link #isLightDeviceIdleMode()} changes.
1994      * This broadcast is only sent to registered receivers.
1995      * @hide
1996      */
1997     @UnsupportedAppUsage
1998     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1999     public static final String ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED
2000             = "android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED";
2001 
2002     /**
2003      * @hide Intent that is broadcast when the set of power save whitelist apps has changed.
2004      * This broadcast is only sent to registered receivers.
2005      */
2006     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
2007     public static final String ACTION_POWER_SAVE_WHITELIST_CHANGED
2008             = "android.os.action.POWER_SAVE_WHITELIST_CHANGED";
2009 
2010     /**
2011      * @hide Intent that is broadcast when the set of temporarily whitelisted apps has changed.
2012      * This broadcast is only sent to registered receivers.
2013      */
2014     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
2015     public static final String ACTION_POWER_SAVE_TEMP_WHITELIST_CHANGED
2016             = "android.os.action.POWER_SAVE_TEMP_WHITELIST_CHANGED";
2017 
2018     /**
2019      * Intent that is broadcast when the state of {@link #isPowerSaveMode()} is about to change.
2020      * This broadcast is only sent to registered receivers.
2021      *
2022      * @hide
2023      */
2024     @UnsupportedAppUsage
2025     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
2026     public static final String ACTION_POWER_SAVE_MODE_CHANGING
2027             = "android.os.action.POWER_SAVE_MODE_CHANGING";
2028 
2029     /** @hide */
2030     @UnsupportedAppUsage
2031     public static final String EXTRA_POWER_SAVE_MODE = "mode";
2032 
2033     /**
2034      * Intent that is broadcast when the state of {@link #isScreenBrightnessBoosted()} has changed.
2035      * This broadcast is only sent to registered receivers.
2036      *
2037      * @deprecated This intent is rarely used and will be phased out soon.
2038      * @hide
2039      * @removed
2040      **/
2041     @SystemApi @Deprecated
2042     public static final String ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED
2043             = "android.os.action.SCREEN_BRIGHTNESS_BOOST_CHANGED";
2044 
2045     /**
2046      * Constant for PreIdleTimeout normal mode (default mode, not short nor extend timeout) .
2047      * @hide
2048      */
2049     public static final int PRE_IDLE_TIMEOUT_MODE_NORMAL = 0;
2050 
2051     /**
2052      * Constant for PreIdleTimeout long mode (extend timeout to keep in inactive mode
2053      * longer).
2054      * @hide
2055      */
2056     public static final int PRE_IDLE_TIMEOUT_MODE_LONG = 1;
2057 
2058     /**
2059      * Constant for PreIdleTimeout short mode (short timeout to go to doze mode quickly)
2060      * @hide
2061      */
2062     public static final int PRE_IDLE_TIMEOUT_MODE_SHORT = 2;
2063 
2064     /**
2065      * A wake lock is a mechanism to indicate that your application needs
2066      * to have the device stay on.
2067      * <p>
2068      * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK}
2069      * permission in an {@code <uses-permission>} element of the application's manifest.
2070      * Obtain a wake lock by calling {@link PowerManager#newWakeLock(int, String)}.
2071      * </p><p>
2072      * Call {@link #acquire()} to acquire the wake lock and force the device to stay
2073      * on at the level that was requested when the wake lock was created.
2074      * </p><p>
2075      * Call {@link #release()} when you are done and don't need the lock anymore.
2076      * It is very important to do this as soon as possible to avoid running down the
2077      * device's battery excessively.
2078      * </p>
2079      */
2080     public final class WakeLock {
2081         @UnsupportedAppUsage
2082         private int mFlags;
2083         @UnsupportedAppUsage
2084         private String mTag;
2085         private final String mPackageName;
2086         private final IBinder mToken;
2087         private int mInternalCount;
2088         private int mExternalCount;
2089         private boolean mRefCounted = true;
2090         private boolean mHeld;
2091         private WorkSource mWorkSource;
2092         private String mHistoryTag;
2093         private final String mTraceName;
2094 
2095         private final Runnable mReleaser = new Runnable() {
2096             public void run() {
2097                 release(RELEASE_FLAG_TIMEOUT);
2098             }
2099         };
2100 
WakeLock(int flags, String tag, String packageName)2101         WakeLock(int flags, String tag, String packageName) {
2102             mFlags = flags;
2103             mTag = tag;
2104             mPackageName = packageName;
2105             mToken = new Binder();
2106             mTraceName = "WakeLock (" + mTag + ")";
2107         }
2108 
2109         @Override
finalize()2110         protected void finalize() throws Throwable {
2111             synchronized (mToken) {
2112                 if (mHeld) {
2113                     Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);
2114                     Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
2115                     try {
2116                         mService.releaseWakeLock(mToken, 0);
2117                     } catch (RemoteException e) {
2118                         throw e.rethrowFromSystemServer();
2119                     }
2120                 }
2121             }
2122         }
2123 
2124         /**
2125          * Sets whether this WakeLock is reference counted.
2126          * <p>
2127          * Wake locks are reference counted by default.  If a wake lock is
2128          * reference counted, then each call to {@link #acquire()} must be
2129          * balanced by an equal number of calls to {@link #release()}.  If a wake
2130          * lock is not reference counted, then one call to {@link #release()} is
2131          * sufficient to undo the effect of all previous calls to {@link #acquire()}.
2132          * </p>
2133          *
2134          * @param value True to make the wake lock reference counted, false to
2135          * make the wake lock non-reference counted.
2136          */
setReferenceCounted(boolean value)2137         public void setReferenceCounted(boolean value) {
2138             synchronized (mToken) {
2139                 mRefCounted = value;
2140             }
2141         }
2142 
2143         /**
2144          * Acquires the wake lock.
2145          * <p>
2146          * Ensures that the device is on at the level requested when
2147          * the wake lock was created.
2148          * </p>
2149          */
acquire()2150         public void acquire() {
2151             synchronized (mToken) {
2152                 acquireLocked();
2153             }
2154         }
2155 
2156         /**
2157          * Acquires the wake lock with a timeout.
2158          * <p>
2159          * Ensures that the device is on at the level requested when
2160          * the wake lock was created.  The lock will be released after the given timeout
2161          * expires.
2162          * </p>
2163          *
2164          * @param timeout The timeout after which to release the wake lock, in milliseconds.
2165          */
acquire(long timeout)2166         public void acquire(long timeout) {
2167             synchronized (mToken) {
2168                 acquireLocked();
2169                 mHandler.postDelayed(mReleaser, timeout);
2170             }
2171         }
2172 
acquireLocked()2173         private void acquireLocked() {
2174             mInternalCount++;
2175             mExternalCount++;
2176             if (!mRefCounted || mInternalCount == 1) {
2177                 // Do this even if the wake lock is already thought to be held (mHeld == true)
2178                 // because non-reference counted wake locks are not always properly released.
2179                 // For example, the keyguard's wake lock might be forcibly released by the
2180                 // power manager without the keyguard knowing.  A subsequent call to acquire
2181                 // should immediately acquire the wake lock once again despite never having
2182                 // been explicitly released by the keyguard.
2183                 mHandler.removeCallbacks(mReleaser);
2184                 Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, mTraceName, 0);
2185                 try {
2186                     mService.acquireWakeLock(mToken, mFlags, mTag, mPackageName, mWorkSource,
2187                             mHistoryTag);
2188                 } catch (RemoteException e) {
2189                     throw e.rethrowFromSystemServer();
2190                 }
2191                 mHeld = true;
2192             }
2193         }
2194 
2195         /**
2196          * Releases the wake lock.
2197          * <p>
2198          * This method releases your claim to the CPU or screen being on.
2199          * The screen may turn off shortly after you release the wake lock, or it may
2200          * not if there are other wake locks still held.
2201          * </p>
2202          */
release()2203         public void release() {
2204             release(0);
2205         }
2206 
2207         /**
2208          * Releases the wake lock with flags to modify the release behavior.
2209          * <p>
2210          * This method releases your claim to the CPU or screen being on.
2211          * The screen may turn off shortly after you release the wake lock, or it may
2212          * not if there are other wake locks still held.
2213          * </p>
2214          *
2215          * @param flags Combination of flag values to modify the release behavior.
2216          * Currently only {@link #RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY} is supported.
2217          * Passing 0 is equivalent to calling {@link #release()}.
2218          */
release(int flags)2219         public void release(int flags) {
2220             synchronized (mToken) {
2221                 if (mInternalCount > 0) {
2222                     // internal count must only be decreased if it is > 0 or state of
2223                     // the WakeLock object is broken.
2224                     mInternalCount--;
2225                 }
2226                 if ((flags & RELEASE_FLAG_TIMEOUT) == 0) {
2227                     mExternalCount--;
2228                 }
2229                 if (!mRefCounted || mInternalCount == 0) {
2230                     mHandler.removeCallbacks(mReleaser);
2231                     if (mHeld) {
2232                         Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
2233                         try {
2234                             mService.releaseWakeLock(mToken, flags);
2235                         } catch (RemoteException e) {
2236                             throw e.rethrowFromSystemServer();
2237                         }
2238                         mHeld = false;
2239                     }
2240                 }
2241                 if (mRefCounted && mExternalCount < 0) {
2242                     throw new RuntimeException("WakeLock under-locked " + mTag);
2243                 }
2244             }
2245         }
2246 
2247         /**
2248          * Returns true if the wake lock has been acquired but not yet released.
2249          *
2250          * @return True if the wake lock is held.
2251          */
isHeld()2252         public boolean isHeld() {
2253             synchronized (mToken) {
2254                 return mHeld;
2255             }
2256         }
2257 
2258         /**
2259          * Sets the work source associated with the wake lock.
2260          * <p>
2261          * The work source is used to determine on behalf of which application
2262          * the wake lock is being held.  This is useful in the case where a
2263          * service is performing work on behalf of an application so that the
2264          * cost of that work can be accounted to the application.
2265          * </p>
2266          *
2267          * <p>
2268          * Make sure to follow the tag naming convention when using WorkSource
2269          * to make it easier for app developers to understand wake locks
2270          * attributed to them. See {@link PowerManager#newWakeLock(int, String)}
2271          * documentation.
2272          * </p>
2273          *
2274          * @param ws The work source, or null if none.
2275          */
setWorkSource(WorkSource ws)2276         public void setWorkSource(WorkSource ws) {
2277             synchronized (mToken) {
2278                 if (ws != null && ws.isEmpty()) {
2279                     ws = null;
2280                 }
2281 
2282                 final boolean changed;
2283                 if (ws == null) {
2284                     changed = mWorkSource != null;
2285                     mWorkSource = null;
2286                 } else if (mWorkSource == null) {
2287                     changed = true;
2288                     mWorkSource = new WorkSource(ws);
2289                 } else {
2290                     changed = !mWorkSource.equals(ws);
2291                     if (changed) {
2292                         mWorkSource.set(ws);
2293                     }
2294                 }
2295 
2296                 if (changed && mHeld) {
2297                     try {
2298                         mService.updateWakeLockWorkSource(mToken, mWorkSource, mHistoryTag);
2299                     } catch (RemoteException e) {
2300                         throw e.rethrowFromSystemServer();
2301                     }
2302                 }
2303             }
2304         }
2305 
2306         /** @hide */
setTag(String tag)2307         public void setTag(String tag) {
2308             mTag = tag;
2309         }
2310 
2311         /** @hide */
getTag()2312         public String getTag() {
2313             return mTag;
2314         }
2315 
2316         /** @hide */
setHistoryTag(String tag)2317         public void setHistoryTag(String tag) {
2318             mHistoryTag = tag;
2319         }
2320 
2321         /** @hide */
setUnimportantForLogging(boolean state)2322         public void setUnimportantForLogging(boolean state) {
2323             if (state) mFlags |= UNIMPORTANT_FOR_LOGGING;
2324             else mFlags &= ~UNIMPORTANT_FOR_LOGGING;
2325         }
2326 
2327         @Override
toString()2328         public String toString() {
2329             synchronized (mToken) {
2330                 return "WakeLock{"
2331                     + Integer.toHexString(System.identityHashCode(this))
2332                     + " held=" + mHeld + ", refCount=" + mInternalCount + "}";
2333             }
2334         }
2335 
2336         /** @hide */
writeToProto(ProtoOutputStream proto, long fieldId)2337         public void writeToProto(ProtoOutputStream proto, long fieldId) {
2338             synchronized (mToken) {
2339                 final long token = proto.start(fieldId);
2340                 proto.write(PowerManagerProto.WakeLock.TAG, mTag);
2341                 proto.write(PowerManagerProto.WakeLock.PACKAGE_NAME, mPackageName);
2342                 proto.write(PowerManagerProto.WakeLock.HELD, mHeld);
2343                 proto.write(PowerManagerProto.WakeLock.INTERNAL_COUNT, mInternalCount);
2344                 if (mWorkSource != null) {
2345                     mWorkSource.writeToProto(proto, PowerManagerProto.WakeLock.WORK_SOURCE);
2346                 }
2347                 proto.end(token);
2348             }
2349         }
2350 
2351         /**
2352          * Wraps a Runnable such that this method immediately acquires the wake lock and then
2353          * once the Runnable is done the wake lock is released.
2354          *
2355          * <p>Example:
2356          *
2357          * <pre>
2358          * mHandler.post(mWakeLock.wrap(() -> {
2359          *     // do things on handler, lock is held while we're waiting for this
2360          *     // to get scheduled and until the runnable is done executing.
2361          * });
2362          * </pre>
2363          *
2364          * <p>Note: you must make sure that the Runnable eventually gets executed, otherwise you'll
2365          *    leak the wakelock!
2366          *
2367          * @hide
2368          */
wrap(Runnable r)2369         public Runnable wrap(Runnable r) {
2370             acquire();
2371             return () -> {
2372                 try {
2373                     r.run();
2374                 } finally {
2375                     release();
2376                 }
2377             };
2378         }
2379     }
2380 }
2381