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.annotation.IntDef;
20 import android.annotation.RequiresPermission;
21 import android.annotation.SdkConstant;
22 import android.annotation.SystemApi;
23 import android.annotation.SystemService;
24 import android.annotation.TestApi;
25 import android.content.Context;
26 import android.util.Log;
27 import android.util.proto.ProtoOutputStream;
28 
29 import java.lang.annotation.Retention;
30 import java.lang.annotation.RetentionPolicy;
31 
32 /**
33  * This class gives you control of the power state of the device.
34  *
35  * <p>
36  * <b>Device battery life will be significantly affected by the use of this API.</b>
37  * Do not acquire {@link WakeLock}s unless you really need them, use the minimum levels
38  * possible, and be sure to release them as soon as possible.
39  * </p><p>
40  * The primary API you'll use is {@link #newWakeLock(int, String) newWakeLock()}.
41  * This will create a {@link PowerManager.WakeLock} object.  You can then use methods
42  * on the wake lock object to control the power state of the device.
43  * </p><p>
44  * In practice it's quite simple:
45  * {@samplecode
46  * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
47  * PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
48  * wl.acquire();
49  *   ..screen will stay on during this section..
50  * wl.release();
51  * }
52  * </p><p>
53  * The following wake lock levels are defined, with varying effects on system power.
54  * <i>These levels are mutually exclusive - you may only specify one of them.</i>
55  *
56  * <table>
57  *     <tr><th>Flag Value</th>
58  *     <th>CPU</th> <th>Screen</th> <th>Keyboard</th></tr>
59  *
60  *     <tr><td>{@link #PARTIAL_WAKE_LOCK}</td>
61  *         <td>On*</td> <td>Off</td> <td>Off</td>
62  *     </tr>
63  *
64  *     <tr><td>{@link #SCREEN_DIM_WAKE_LOCK}</td>
65  *         <td>On</td> <td>Dim</td> <td>Off</td>
66  *     </tr>
67  *
68  *     <tr><td>{@link #SCREEN_BRIGHT_WAKE_LOCK}</td>
69  *         <td>On</td> <td>Bright</td> <td>Off</td>
70  *     </tr>
71  *
72  *     <tr><td>{@link #FULL_WAKE_LOCK}</td>
73  *         <td>On</td> <td>Bright</td> <td>Bright</td>
74  *     </tr>
75  * </table>
76  * </p><p>
77  * *<i>If you hold a partial wake lock, the CPU will continue to run, regardless of any
78  * display timeouts or the state of the screen and even after the user presses the power button.
79  * In all other wake locks, the CPU will run, but the user can still put the device to sleep
80  * using the power button.</i>
81  * </p><p>
82  * In addition, you can add two more flags, which affect behavior of the screen only.
83  * <i>These flags have no effect when combined with a {@link #PARTIAL_WAKE_LOCK}.</i></p>
84  *
85  * <table>
86  *     <tr><th>Flag Value</th> <th>Description</th></tr>
87  *
88  *     <tr><td>{@link #ACQUIRE_CAUSES_WAKEUP}</td>
89  *         <td>Normal wake locks don't actually turn on the illumination.  Instead, they cause
90  *         the illumination to remain on once it turns on (e.g. from user activity).  This flag
91  *         will force the screen and/or keyboard to turn on immediately, when the WakeLock is
92  *         acquired.  A typical use would be for notifications which are important for the user to
93  *         see immediately.</td>
94  *     </tr>
95  *
96  *     <tr><td>{@link #ON_AFTER_RELEASE}</td>
97  *         <td>If this flag is set, the user activity timer will be reset when the WakeLock is
98  *         released, causing the illumination to remain on a bit longer.  This can be used to
99  *         reduce flicker if you are cycling between wake lock conditions.</td>
100  *     </tr>
101  * </table>
102  * <p>
103  * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK}
104  * permission in an {@code <uses-permission>} element of the application's manifest.
105  * </p>
106  */
107 @SystemService(Context.POWER_SERVICE)
108 public final class PowerManager {
109     private static final String TAG = "PowerManager";
110 
111     /* NOTE: Wake lock levels were previously defined as a bit field, except that only a few
112      * combinations were actually supported so the bit field was removed.  This explains
113      * why the numbering scheme is so odd.  If adding a new wake lock level, any unused
114      * value (in frameworks/base/core/proto/android/os/enums.proto) can be used.
115      */
116 
117     /**
118      * Wake lock level: Ensures that the CPU is running; the screen and keyboard
119      * backlight will be allowed to go off.
120      * <p>
121      * If the user presses the power button, then the screen will be turned off
122      * but the CPU will be kept on until all partial wake locks have been released.
123      * </p>
124      */
125     public static final int PARTIAL_WAKE_LOCK = OsProtoEnums.PARTIAL_WAKE_LOCK; // 0x00000001
126 
127     /**
128      * Wake lock level: Ensures that the screen is on (but may be dimmed);
129      * the keyboard backlight will be allowed to go off.
130      * <p>
131      * If the user presses the power button, then the {@link #SCREEN_DIM_WAKE_LOCK} will be
132      * implicitly released by the system, causing both the screen and the CPU to be turned off.
133      * Contrast with {@link #PARTIAL_WAKE_LOCK}.
134      * </p>
135      *
136      * @deprecated Most applications should use
137      * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
138      * of this type of wake lock, as it will be correctly managed by the platform
139      * as the user moves between applications and doesn't require a special permission.
140      */
141     @Deprecated
142     public static final int SCREEN_DIM_WAKE_LOCK = OsProtoEnums.SCREEN_DIM_WAKE_LOCK; // 0x00000006
143 
144     /**
145      * Wake lock level: Ensures that the screen is on at full brightness;
146      * the keyboard backlight will be allowed to go off.
147      * <p>
148      * If the user presses the power button, then the {@link #SCREEN_BRIGHT_WAKE_LOCK} will be
149      * implicitly released by the system, causing both the screen and the CPU to be turned off.
150      * Contrast with {@link #PARTIAL_WAKE_LOCK}.
151      * </p>
152      *
153      * @deprecated Most applications should use
154      * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
155      * of this type of wake lock, as it will be correctly managed by the platform
156      * as the user moves between applications and doesn't require a special permission.
157      */
158     @Deprecated
159     public static final int SCREEN_BRIGHT_WAKE_LOCK =
160             OsProtoEnums.SCREEN_BRIGHT_WAKE_LOCK; // 0x0000000a
161 
162     /**
163      * Wake lock level: Ensures that the screen and keyboard backlight are on at
164      * full brightness.
165      * <p>
166      * If the user presses the power button, then the {@link #FULL_WAKE_LOCK} will be
167      * implicitly released by the system, causing both the screen and the CPU to be turned off.
168      * Contrast with {@link #PARTIAL_WAKE_LOCK}.
169      * </p>
170      *
171      * @deprecated Most applications should use
172      * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
173      * of this type of wake lock, as it will be correctly managed by the platform
174      * as the user moves between applications and doesn't require a special permission.
175      */
176     @Deprecated
177     public static final int FULL_WAKE_LOCK = OsProtoEnums.FULL_WAKE_LOCK; // 0x0000001a
178 
179     /**
180      * Wake lock level: Turns the screen off when the proximity sensor activates.
181      * <p>
182      * If the proximity sensor detects that an object is nearby, the screen turns off
183      * immediately.  Shortly after the object moves away, the screen turns on again.
184      * </p><p>
185      * A proximity wake lock does not prevent the device from falling asleep
186      * unlike {@link #FULL_WAKE_LOCK}, {@link #SCREEN_BRIGHT_WAKE_LOCK} and
187      * {@link #SCREEN_DIM_WAKE_LOCK}.  If there is no user activity and no other
188      * wake locks are held, then the device will fall asleep (and lock) as usual.
189      * However, the device will not fall asleep while the screen has been turned off
190      * by the proximity sensor because it effectively counts as ongoing user activity.
191      * </p><p>
192      * Since not all devices have proximity sensors, use {@link #isWakeLockLevelSupported}
193      * to determine whether this wake lock level is supported.
194      * </p><p>
195      * Cannot be used with {@link #ACQUIRE_CAUSES_WAKEUP}.
196      * </p>
197      */
198     public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK =
199             OsProtoEnums.PROXIMITY_SCREEN_OFF_WAKE_LOCK; // 0x00000020
200 
201     /**
202      * Wake lock level: Put the screen in a low power state and allow the CPU to suspend
203      * if no other wake locks are held.
204      * <p>
205      * This is used by the dream manager to implement doze mode.  It currently
206      * has no effect unless the power manager is in the dozing state.
207      * </p><p>
208      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
209      * </p>
210      *
211      * {@hide}
212      */
213     public static final int DOZE_WAKE_LOCK = OsProtoEnums.DOZE_WAKE_LOCK; // 0x00000040
214 
215     /**
216      * Wake lock level: Keep the device awake enough to allow drawing to occur.
217      * <p>
218      * This is used by the window manager to allow applications to draw while the
219      * system is dozing.  It currently has no effect unless the power manager is in
220      * the dozing state.
221      * </p><p>
222      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
223      * </p>
224      *
225      * {@hide}
226      */
227     public static final int DRAW_WAKE_LOCK = OsProtoEnums.DRAW_WAKE_LOCK; // 0x00000080
228 
229     /**
230      * Mask for the wake lock level component of a combined wake lock level and flags integer.
231      *
232      * @hide
233      */
234     public static final int WAKE_LOCK_LEVEL_MASK = 0x0000ffff;
235 
236     /**
237      * Wake lock flag: Turn the screen on when the wake lock is acquired.
238      * <p>
239      * Normally wake locks don't actually wake the device, they just cause
240      * the screen to remain on once it's already on.  Think of the video player
241      * application as the normal behavior.  Notifications that pop up and want
242      * the device to be on are the exception; use this flag to be like them.
243      * </p><p>
244      * Cannot be used with {@link #PARTIAL_WAKE_LOCK}.
245      * </p>
246      */
247     public static final int ACQUIRE_CAUSES_WAKEUP = 0x10000000;
248 
249     /**
250      * Wake lock flag: When this wake lock is released, poke the user activity timer
251      * so the screen stays on for a little longer.
252      * <p>
253      * Will not turn the screen on if it is not already on.
254      * See {@link #ACQUIRE_CAUSES_WAKEUP} if you want that.
255      * </p><p>
256      * Cannot be used with {@link #PARTIAL_WAKE_LOCK}.
257      * </p>
258      */
259     public static final int ON_AFTER_RELEASE = 0x20000000;
260 
261     /**
262      * Wake lock flag: This wake lock is not important for logging events.  If a later
263      * wake lock is acquired that is important, it will be considered the one to log.
264      * @hide
265      */
266     public static final int UNIMPORTANT_FOR_LOGGING = 0x40000000;
267 
268     /**
269      * Flag for {@link WakeLock#release WakeLock.release(int)}: Defer releasing a
270      * {@link #PROXIMITY_SCREEN_OFF_WAKE_LOCK} wake lock until the proximity sensor
271      * indicates that an object is not in close proximity.
272      */
273     public static final int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY = 1 << 0;
274 
275     /**
276      * Flag for {@link WakeLock#release(int)} when called due to timeout.
277      * @hide
278      */
279     public static final int RELEASE_FLAG_TIMEOUT = 1 << 16;
280 
281     /**
282      * Brightness value for fully on.
283      * @hide
284      */
285     public static final int BRIGHTNESS_ON = 255;
286 
287     /**
288      * Brightness value for fully off.
289      * @hide
290      */
291     public static final int BRIGHTNESS_OFF = 0;
292 
293     /**
294      * Brightness value for default policy handling by the system.
295      * @hide
296      */
297     public static final int BRIGHTNESS_DEFAULT = -1;
298 
299     // Note: Be sure to update android.os.BatteryStats and PowerManager.h
300     // if adding or modifying user activity event constants.
301 
302     /**
303      * User activity event type: Unspecified event type.
304      * @hide
305      */
306     @SystemApi
307     public static final int USER_ACTIVITY_EVENT_OTHER = 0;
308 
309     /**
310      * User activity event type: Button or key pressed or released.
311      * @hide
312      */
313     @SystemApi
314     public static final int USER_ACTIVITY_EVENT_BUTTON = 1;
315 
316     /**
317      * User activity event type: Touch down, move or up.
318      * @hide
319      */
320     @SystemApi
321     public static final int USER_ACTIVITY_EVENT_TOUCH = 2;
322 
323     /**
324      * User activity event type: Accessibility taking action on behalf of user.
325      * @hide
326      */
327     @SystemApi
328     public static final int USER_ACTIVITY_EVENT_ACCESSIBILITY = 3;
329 
330     /**
331      * User activity flag: If already dimmed, extend the dim timeout
332      * but do not brighten.  This flag is useful for keeping the screen on
333      * a little longer without causing a visible change such as when
334      * the power key is pressed.
335      * @hide
336      */
337     @SystemApi
338     public static final int USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS = 1 << 0;
339 
340     /**
341      * User activity flag: Note the user activity as usual but do not
342      * reset the user activity timeout.  This flag is useful for applying
343      * user activity power hints when interacting with the device indirectly
344      * on a secondary screen while allowing the primary screen to go to sleep.
345      * @hide
346      */
347     @SystemApi
348     public static final int USER_ACTIVITY_FLAG_INDIRECT = 1 << 1;
349 
350     /**
351      * Go to sleep reason code: Going to sleep due by application request.
352      * @hide
353      */
354     public static final int GO_TO_SLEEP_REASON_APPLICATION = 0;
355 
356     /**
357      * Go to sleep reason code: Going to sleep due by request of the
358      * device administration policy.
359      * @hide
360      */
361     public static final int GO_TO_SLEEP_REASON_DEVICE_ADMIN = 1;
362 
363     /**
364      * Go to sleep reason code: Going to sleep due to a screen timeout.
365      * @hide
366      */
367     public static final int GO_TO_SLEEP_REASON_TIMEOUT = 2;
368 
369     /**
370      * Go to sleep reason code: Going to sleep due to the lid switch being closed.
371      * @hide
372      */
373     public static final int GO_TO_SLEEP_REASON_LID_SWITCH = 3;
374 
375     /**
376      * Go to sleep reason code: Going to sleep due to the power button being pressed.
377      * @hide
378      */
379     public static final int GO_TO_SLEEP_REASON_POWER_BUTTON = 4;
380 
381     /**
382      * Go to sleep reason code: Going to sleep due to HDMI.
383      * @hide
384      */
385     public static final int GO_TO_SLEEP_REASON_HDMI = 5;
386 
387     /**
388      * Go to sleep reason code: Going to sleep due to the sleep button being pressed.
389      * @hide
390      */
391     public static final int GO_TO_SLEEP_REASON_SLEEP_BUTTON = 6;
392 
393     /**
394      * Go to sleep reason code: Going to sleep by request of an accessibility service
395      * @hide
396      */
397     public static final int GO_TO_SLEEP_REASON_ACCESSIBILITY = 7;
398 
399     /**
400      * Go to sleep flag: Skip dozing state and directly go to full sleep.
401      * @hide
402      */
403     public static final int GO_TO_SLEEP_FLAG_NO_DOZE = 1 << 0;
404 
405     /**
406      * The value to pass as the 'reason' argument to reboot() to reboot into
407      * recovery mode for tasks other than applying system updates, such as
408      * doing factory resets.
409      * <p>
410      * Requires the {@link android.Manifest.permission#RECOVERY}
411      * permission (in addition to
412      * {@link android.Manifest.permission#REBOOT}).
413      * </p>
414      * @hide
415      */
416     public static final String REBOOT_RECOVERY = "recovery";
417 
418     /**
419      * The value to pass as the 'reason' argument to reboot() to reboot into
420      * recovery mode for applying system updates.
421      * <p>
422      * Requires the {@link android.Manifest.permission#RECOVERY}
423      * permission (in addition to
424      * {@link android.Manifest.permission#REBOOT}).
425      * </p>
426      * @hide
427      */
428     public static final String REBOOT_RECOVERY_UPDATE = "recovery-update";
429 
430     /**
431      * The value to pass as the 'reason' argument to reboot() when device owner requests a reboot on
432      * the device.
433      * @hide
434      */
435     public static final String REBOOT_REQUESTED_BY_DEVICE_OWNER = "deviceowner";
436 
437     /**
438      * The 'reason' value used when rebooting in safe mode
439      * @hide
440      */
441     public static final String REBOOT_SAFE_MODE = "safemode";
442 
443     /**
444      * The 'reason' value used when rebooting the device without turning on the screen.
445      * @hide
446      */
447     public static final String REBOOT_QUIESCENT = "quiescent";
448 
449     /**
450      * The value to pass as the 'reason' argument to android_reboot().
451      * @hide
452      */
453     public static final String SHUTDOWN_USER_REQUESTED = "userrequested";
454 
455     /**
456      * The value to pass as the 'reason' argument to android_reboot() when battery temperature
457      * is too high.
458      * @hide
459      */
460     public static final String SHUTDOWN_BATTERY_THERMAL_STATE = "thermal,battery";
461 
462     /**
463      * The value to pass as the 'reason' argument to android_reboot() when device is running
464      * critically low on battery.
465      * @hide
466      */
467     public static final String SHUTDOWN_LOW_BATTERY = "battery";
468 
469     /**
470      * @hide
471      */
472     @Retention(RetentionPolicy.SOURCE)
473     @IntDef(prefix = { "SHUTDOWN_REASON_" }, value = {
474             SHUTDOWN_REASON_UNKNOWN,
475             SHUTDOWN_REASON_SHUTDOWN,
476             SHUTDOWN_REASON_REBOOT,
477             SHUTDOWN_REASON_USER_REQUESTED,
478             SHUTDOWN_REASON_THERMAL_SHUTDOWN,
479             SHUTDOWN_REASON_LOW_BATTERY,
480             SHUTDOWN_REASON_BATTERY_THERMAL
481     })
482     public @interface ShutdownReason {}
483 
484     /**
485      * constant for shutdown reason being unknown.
486      * @hide
487      */
488     public static final int SHUTDOWN_REASON_UNKNOWN = 0;
489 
490     /**
491      * constant for shutdown reason being normal shutdown.
492      * @hide
493      */
494     public static final int SHUTDOWN_REASON_SHUTDOWN = 1;
495 
496     /**
497      * constant for shutdown reason being reboot.
498      * @hide
499      */
500     public static final int SHUTDOWN_REASON_REBOOT = 2;
501 
502     /**
503      * constant for shutdown reason being user requested.
504      * @hide
505      */
506     public static final int SHUTDOWN_REASON_USER_REQUESTED = 3;
507 
508     /**
509      * constant for shutdown reason being overheating.
510      * @hide
511      */
512     public static final int SHUTDOWN_REASON_THERMAL_SHUTDOWN = 4;
513 
514     /**
515      * constant for shutdown reason being low battery.
516      * @hide
517      */
518     public static final int SHUTDOWN_REASON_LOW_BATTERY = 5;
519 
520     /**
521      * constant for shutdown reason being critical battery thermal state.
522      * @hide
523      */
524     public static final int SHUTDOWN_REASON_BATTERY_THERMAL = 6;
525 
526     /**
527      * @hide
528      */
529     @Retention(RetentionPolicy.SOURCE)
530     @IntDef({ServiceType.GPS,
531             ServiceType.VIBRATION,
532             ServiceType.ANIMATION,
533             ServiceType.FULL_BACKUP,
534             ServiceType.KEYVALUE_BACKUP,
535             ServiceType.NETWORK_FIREWALL,
536             ServiceType.SCREEN_BRIGHTNESS,
537             ServiceType.SOUND,
538             ServiceType.BATTERY_STATS,
539             ServiceType.DATA_SAVER,
540             ServiceType.FORCE_ALL_APPS_STANDBY,
541             ServiceType.OPTIONAL_SENSORS,
542             ServiceType.AOD,
543     })
544     public @interface ServiceType {
545         int NULL = 0;
546         int GPS = 1;
547         int VIBRATION = 2;
548         int ANIMATION = 3;
549         int FULL_BACKUP = 4;
550         int KEYVALUE_BACKUP = 5;
551         int NETWORK_FIREWALL = 6;
552         int SCREEN_BRIGHTNESS = 7;
553         int SOUND = 8;
554         int BATTERY_STATS = 9;
555         int DATA_SAVER = 10;
556         int AOD = 14;
557 
558         /**
559          * Whether to enable force-app-standby on all apps or not.
560          */
561         int FORCE_ALL_APPS_STANDBY = 11;
562 
563         /**
564          * Whether to enable background check on all apps or not.
565          */
566         int FORCE_BACKGROUND_CHECK = 12;
567 
568         /**
569          * Whether to disable non-essential sensors. (e.g. edge sensors.)
570          */
571         int OPTIONAL_SENSORS = 13;
572     }
573 
574     /**
575      * Either the location providers shouldn't be affected by battery saver,
576      * or battery saver is off.
577      */
578     public static final int LOCATION_MODE_NO_CHANGE = 0;
579 
580     /**
581      * In this mode, the GPS based location provider should be disabled when battery saver is on and
582      * the device is non-interactive.
583      */
584     public static final int LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF = 1;
585 
586     /**
587      * All location providers should be disabled when battery saver is on and
588      * the device is non-interactive.
589      */
590     public static final int LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF = 2;
591 
592     /**
593      * In this mode, all the location providers will be kept available, but location fixes
594      * should only be provided to foreground apps.
595      */
596     public static final int LOCATION_MODE_FOREGROUND_ONLY = 3;
597 
598     /**
599      * @hide
600      */
601     @Retention(RetentionPolicy.SOURCE)
602     @IntDef(prefix = {"LOCATION_MODE_"}, value = {
603             LOCATION_MODE_NO_CHANGE,
604             LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF,
605             LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF,
606             LOCATION_MODE_FOREGROUND_ONLY,
607     })
608     public @interface LocationPowerSaveMode {}
609 
610     final Context mContext;
611     final IPowerManager mService;
612     final Handler mHandler;
613 
614     IDeviceIdleController mIDeviceIdleController;
615 
616     /**
617      * {@hide}
618      */
PowerManager(Context context, IPowerManager service, Handler handler)619     public PowerManager(Context context, IPowerManager service, Handler handler) {
620         mContext = context;
621         mService = service;
622         mHandler = handler;
623     }
624 
625     /**
626      * Gets the minimum supported screen brightness setting.
627      * The screen may be allowed to become dimmer than this value but
628      * this is the minimum value that can be set by the user.
629      * @hide
630      */
getMinimumScreenBrightnessSetting()631     public int getMinimumScreenBrightnessSetting() {
632         return mContext.getResources().getInteger(
633                 com.android.internal.R.integer.config_screenBrightnessSettingMinimum);
634     }
635 
636     /**
637      * Gets the maximum supported screen brightness setting.
638      * The screen may be allowed to become dimmer than this value but
639      * this is the maximum value that can be set by the user.
640      * @hide
641      */
getMaximumScreenBrightnessSetting()642     public int getMaximumScreenBrightnessSetting() {
643         return mContext.getResources().getInteger(
644                 com.android.internal.R.integer.config_screenBrightnessSettingMaximum);
645     }
646 
647     /**
648      * Gets the default screen brightness setting.
649      * @hide
650      */
getDefaultScreenBrightnessSetting()651     public int getDefaultScreenBrightnessSetting() {
652         return mContext.getResources().getInteger(
653                 com.android.internal.R.integer.config_screenBrightnessSettingDefault);
654     }
655 
656     /**
657      * Gets the minimum supported screen brightness setting for VR Mode.
658      * @hide
659      */
getMinimumScreenBrightnessForVrSetting()660     public int getMinimumScreenBrightnessForVrSetting() {
661         return mContext.getResources().getInteger(
662                 com.android.internal.R.integer.config_screenBrightnessForVrSettingMinimum);
663     }
664 
665     /**
666      * Gets the maximum supported screen brightness setting for VR Mode.
667      * The screen may be allowed to become dimmer than this value but
668      * this is the maximum value that can be set by the user.
669      * @hide
670      */
getMaximumScreenBrightnessForVrSetting()671     public int getMaximumScreenBrightnessForVrSetting() {
672         return mContext.getResources().getInteger(
673                 com.android.internal.R.integer.config_screenBrightnessForVrSettingMaximum);
674     }
675 
676     /**
677      * Gets the default screen brightness for VR setting.
678      * @hide
679      */
getDefaultScreenBrightnessForVrSetting()680     public int getDefaultScreenBrightnessForVrSetting() {
681         return mContext.getResources().getInteger(
682                 com.android.internal.R.integer.config_screenBrightnessForVrSettingDefault);
683     }
684 
685     /**
686      * Creates a new wake lock with the specified level and flags.
687      * <p>
688      * The {@code levelAndFlags} parameter specifies a wake lock level and optional flags
689      * combined using the logical OR operator.
690      * </p><p>
691      * The wake lock levels are: {@link #PARTIAL_WAKE_LOCK},
692      * {@link #FULL_WAKE_LOCK}, {@link #SCREEN_DIM_WAKE_LOCK}
693      * and {@link #SCREEN_BRIGHT_WAKE_LOCK}.  Exactly one wake lock level must be
694      * specified as part of the {@code levelAndFlags} parameter.
695      * </p><p>
696      * The wake lock flags are: {@link #ACQUIRE_CAUSES_WAKEUP}
697      * and {@link #ON_AFTER_RELEASE}.  Multiple flags can be combined as part of the
698      * {@code levelAndFlags} parameters.
699      * </p><p>
700      * Call {@link WakeLock#acquire() acquire()} on the object to acquire the
701      * wake lock, and {@link WakeLock#release release()} when you are done.
702      * </p><p>
703      * {@samplecode
704      * PowerManager pm = (PowerManager)mContext.getSystemService(
705      *                                          Context.POWER_SERVICE);
706      * PowerManager.WakeLock wl = pm.newWakeLock(
707      *                                      PowerManager.SCREEN_DIM_WAKE_LOCK
708      *                                      | PowerManager.ON_AFTER_RELEASE,
709      *                                      TAG);
710      * wl.acquire();
711      * // ... do work...
712      * wl.release();
713      * }
714      * </p><p>
715      * Although a wake lock can be created without special permissions,
716      * the {@link android.Manifest.permission#WAKE_LOCK} permission is
717      * required to actually acquire or release the wake lock that is returned.
718      * </p><p class="note">
719      * If using this to keep the screen on, you should strongly consider using
720      * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead.
721      * This window flag will be correctly managed by the platform
722      * as the user moves between applications and doesn't require a special permission.
723      * </p>
724      *
725      * <p>
726      * Recommended naming conventions for tags to make debugging easier:
727      * <ul>
728      * <li>use a unique prefix delimited by a colon for your app/library (e.g.
729      * gmail:mytag) to make it easier to understand where the wake locks comes
730      * from. This namespace will also avoid collision for tags inside your app
731      * coming from different libraries which will make debugging easier.
732      * <li>use constants (e.g. do not include timestamps in the tag) to make it
733      * easier for tools to aggregate similar wake locks. When collecting
734      * debugging data, the platform only monitors a finite number of tags,
735      * using constants will help tools to provide better debugging data.
736      * <li>avoid using Class#getName() or similar method since this class name
737      * can be transformed by java optimizer and obfuscator tools.
738      * <li>avoid wrapping the tag or a prefix to avoid collision with wake lock
739      * tags from the platform (e.g. *alarm*).
740      * <li>never include personnally identifiable information for privacy
741      * reasons.
742      * </ul>
743      * </p>
744      *
745      * @param levelAndFlags Combination of wake lock level and flag values defining
746      * the requested behavior of the WakeLock.
747      * @param tag Your class name (or other tag) for debugging purposes.
748      *
749      * @see WakeLock#acquire()
750      * @see WakeLock#release()
751      * @see #PARTIAL_WAKE_LOCK
752      * @see #FULL_WAKE_LOCK
753      * @see #SCREEN_DIM_WAKE_LOCK
754      * @see #SCREEN_BRIGHT_WAKE_LOCK
755      * @see #PROXIMITY_SCREEN_OFF_WAKE_LOCK
756      * @see #ACQUIRE_CAUSES_WAKEUP
757      * @see #ON_AFTER_RELEASE
758      */
newWakeLock(int levelAndFlags, String tag)759     public WakeLock newWakeLock(int levelAndFlags, String tag) {
760         validateWakeLockParameters(levelAndFlags, tag);
761         return new WakeLock(levelAndFlags, tag, mContext.getOpPackageName());
762     }
763 
764     /** @hide */
validateWakeLockParameters(int levelAndFlags, String tag)765     public static void validateWakeLockParameters(int levelAndFlags, String tag) {
766         switch (levelAndFlags & WAKE_LOCK_LEVEL_MASK) {
767             case PARTIAL_WAKE_LOCK:
768             case SCREEN_DIM_WAKE_LOCK:
769             case SCREEN_BRIGHT_WAKE_LOCK:
770             case FULL_WAKE_LOCK:
771             case PROXIMITY_SCREEN_OFF_WAKE_LOCK:
772             case DOZE_WAKE_LOCK:
773             case DRAW_WAKE_LOCK:
774                 break;
775             default:
776                 throw new IllegalArgumentException("Must specify a valid wake lock level.");
777         }
778         if (tag == null) {
779             throw new IllegalArgumentException("The tag must not be null.");
780         }
781     }
782 
783     /**
784      * Notifies the power manager that user activity happened.
785      * <p>
786      * Resets the auto-off timer and brightens the screen if the device
787      * is not asleep.  This is what happens normally when a key or the touch
788      * screen is pressed or when some other user activity occurs.
789      * This method does not wake up the device if it has been put to sleep.
790      * </p><p>
791      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
792      * </p>
793      *
794      * @param when The time of the user activity, in the {@link SystemClock#uptimeMillis()}
795      * time base.  This timestamp is used to correctly order the user activity request with
796      * other power management functions.  It should be set
797      * to the timestamp of the input event that caused the user activity.
798      * @param noChangeLights If true, does not cause the keyboard backlight to turn on
799      * because of this event.  This is set when the power key is pressed.
800      * We want the device to stay on while the button is down, but we're about
801      * to turn off the screen so we don't want the keyboard backlight to turn on again.
802      * Otherwise the lights flash on and then off and it looks weird.
803      *
804      * @see #wakeUp
805      * @see #goToSleep
806      *
807      * @removed Requires signature or system permission.
808      * @deprecated Use {@link #userActivity(long, int, int)}.
809      */
810     @Deprecated
userActivity(long when, boolean noChangeLights)811     public void userActivity(long when, boolean noChangeLights) {
812         userActivity(when, USER_ACTIVITY_EVENT_OTHER,
813                 noChangeLights ? USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS : 0);
814     }
815 
816     /**
817      * Notifies the power manager that user activity happened.
818      * <p>
819      * Resets the auto-off timer and brightens the screen if the device
820      * is not asleep.  This is what happens normally when a key or the touch
821      * screen is pressed or when some other user activity occurs.
822      * This method does not wake up the device if it has been put to sleep.
823      * </p><p>
824      * Requires the {@link android.Manifest.permission#DEVICE_POWER} or
825      * {@link android.Manifest.permission#USER_ACTIVITY} permission.
826      * </p>
827      *
828      * @param when The time of the user activity, in the {@link SystemClock#uptimeMillis()}
829      * time base.  This timestamp is used to correctly order the user activity request with
830      * other power management functions.  It should be set
831      * to the timestamp of the input event that caused the user activity.
832      * @param event The user activity event.
833      * @param flags Optional user activity flags.
834      *
835      * @see #wakeUp
836      * @see #goToSleep
837      *
838      * @hide Requires signature or system permission.
839      */
840     @SystemApi
841     @RequiresPermission(anyOf = {
842             android.Manifest.permission.DEVICE_POWER,
843             android.Manifest.permission.USER_ACTIVITY
844     })
userActivity(long when, int event, int flags)845     public void userActivity(long when, int event, int flags) {
846         try {
847             mService.userActivity(when, event, flags);
848         } catch (RemoteException e) {
849             throw e.rethrowFromSystemServer();
850         }
851     }
852 
853    /**
854      * Forces the device to go to sleep.
855      * <p>
856      * Overrides all the wake locks that are held.
857      * This is what happens when the power key is pressed to turn off the screen.
858      * </p><p>
859      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
860      * </p>
861      *
862      * @param time The time when the request to go to sleep was issued, in the
863      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
864      * order the go to sleep request with other power management functions.  It should be set
865      * to the timestamp of the input event that caused the request to go to sleep.
866      *
867      * @see #userActivity
868      * @see #wakeUp
869      *
870      * @removed Requires signature permission.
871      */
goToSleep(long time)872     public void goToSleep(long time) {
873         goToSleep(time, GO_TO_SLEEP_REASON_APPLICATION, 0);
874     }
875 
876     /**
877      * Forces the device to go to sleep.
878      * <p>
879      * Overrides all the wake locks that are held.
880      * This is what happens when the power key is pressed to turn off the screen.
881      * </p><p>
882      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
883      * </p>
884      *
885      * @param time The time when the request to go to sleep was issued, in the
886      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
887      * order the go to sleep request with other power management functions.  It should be set
888      * to the timestamp of the input event that caused the request to go to sleep.
889      * @param reason The reason the device is going to sleep.
890      * @param flags Optional flags to apply when going to sleep.
891      *
892      * @see #userActivity
893      * @see #wakeUp
894      *
895      * @hide Requires signature permission.
896      */
goToSleep(long time, int reason, int flags)897     public void goToSleep(long time, int reason, int flags) {
898         try {
899             mService.goToSleep(time, reason, flags);
900         } catch (RemoteException e) {
901             throw e.rethrowFromSystemServer();
902         }
903     }
904 
905     /**
906      * Forces the device to wake up from sleep.
907      * <p>
908      * If the device is currently asleep, wakes it up, otherwise does nothing.
909      * This is what happens when the power key is pressed to turn on the screen.
910      * </p><p>
911      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
912      * </p>
913      *
914      * @param time The time when the request to wake up was issued, in the
915      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
916      * order the wake up request with other power management functions.  It should be set
917      * to the timestamp of the input event that caused the request to wake up.
918      *
919      * @see #userActivity
920      * @see #goToSleep
921      *
922      * @removed Requires signature permission.
923      */
wakeUp(long time)924     public void wakeUp(long time) {
925         try {
926             mService.wakeUp(time, "wakeUp", mContext.getOpPackageName());
927         } catch (RemoteException e) {
928             throw e.rethrowFromSystemServer();
929         }
930     }
931 
932     /**
933      * @hide
934      */
wakeUp(long time, String reason)935     public void wakeUp(long time, String reason) {
936         try {
937             mService.wakeUp(time, reason, mContext.getOpPackageName());
938         } catch (RemoteException e) {
939             throw e.rethrowFromSystemServer();
940         }
941     }
942 
943     /**
944      * Forces the device to start napping.
945      * <p>
946      * If the device is currently awake, starts dreaming, otherwise does nothing.
947      * When the dream ends or if the dream cannot be started, the device will
948      * either wake up or go to sleep depending on whether there has been recent
949      * user activity.
950      * </p><p>
951      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
952      * </p>
953      *
954      * @param time The time when the request to nap was issued, in the
955      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
956      * order the nap request with other power management functions.  It should be set
957      * to the timestamp of the input event that caused the request to nap.
958      *
959      * @see #wakeUp
960      * @see #goToSleep
961      *
962      * @hide Requires signature permission.
963      */
964     @TestApi
nap(long time)965     public void nap(long time) {
966         try {
967             mService.nap(time);
968         } catch (RemoteException e) {
969             throw e.rethrowFromSystemServer();
970         }
971     }
972 
973     /**
974      * Boosts the brightness of the screen to maximum for a predetermined
975      * period of time.  This is used to make the screen more readable in bright
976      * daylight for a short duration.
977      * <p>
978      * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
979      * </p>
980      *
981      * @param time The time when the request to boost was issued, in the
982      * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
983      * order the boost request with other power management functions.  It should be set
984      * to the timestamp of the input event that caused the request to boost.
985      *
986      * @hide Requires signature permission.
987      */
boostScreenBrightness(long time)988     public void boostScreenBrightness(long time) {
989         try {
990             mService.boostScreenBrightness(time);
991         } catch (RemoteException e) {
992             throw e.rethrowFromSystemServer();
993         }
994     }
995 
996     /**
997      * Returns whether the screen brightness is currently boosted to maximum, caused by a call
998      * to {@link #boostScreenBrightness(long)}.
999      * @return {@code True} if the screen brightness is currently boosted. {@code False} otherwise.
1000      *
1001      * @deprecated This call is rarely used and will be phased out soon.
1002      * @hide
1003      * @removed
1004      */
1005     @SystemApi @Deprecated
isScreenBrightnessBoosted()1006     public boolean isScreenBrightnessBoosted() {
1007         return false;
1008     }
1009 
1010    /**
1011      * Returns true if the specified wake lock level is supported.
1012      *
1013      * @param level The wake lock level to check.
1014      * @return True if the specified wake lock level is supported.
1015      */
isWakeLockLevelSupported(int level)1016     public boolean isWakeLockLevelSupported(int level) {
1017         try {
1018             return mService.isWakeLockLevelSupported(level);
1019         } catch (RemoteException e) {
1020             throw e.rethrowFromSystemServer();
1021         }
1022     }
1023 
1024     /**
1025       * Returns true if the device is in an interactive state.
1026       * <p>
1027       * For historical reasons, the name of this method refers to the power state of
1028       * the screen but it actually describes the overall interactive state of
1029       * the device.  This method has been replaced by {@link #isInteractive}.
1030       * </p><p>
1031       * The value returned by this method only indicates whether the device is
1032       * in an interactive state which may have nothing to do with the screen being
1033       * on or off.  To determine the actual state of the screen,
1034       * use {@link android.view.Display#getState}.
1035       * </p>
1036       *
1037       * @return True if the device is in an interactive state.
1038       *
1039       * @deprecated Use {@link #isInteractive} instead.
1040       */
1041     @Deprecated
isScreenOn()1042     public boolean isScreenOn() {
1043         return isInteractive();
1044     }
1045 
1046     /**
1047      * Returns true if the device is in an interactive state.
1048      * <p>
1049      * When this method returns true, the device is awake and ready to interact
1050      * with the user (although this is not a guarantee that the user is actively
1051      * interacting with the device just this moment).  The main screen is usually
1052      * turned on while in this state.  Certain features, such as the proximity
1053      * sensor, may temporarily turn off the screen while still leaving the device in an
1054      * interactive state.  Note in particular that the device is still considered
1055      * to be interactive while dreaming (since dreams can be interactive) but not
1056      * when it is dozing or asleep.
1057      * </p><p>
1058      * When this method returns false, the device is dozing or asleep and must
1059      * be awoken before it will become ready to interact with the user again.  The
1060      * main screen is usually turned off while in this state.  Certain features,
1061      * such as "ambient mode" may cause the main screen to remain on (albeit in a
1062      * low power state) to display system-provided content while the device dozes.
1063      * </p><p>
1064      * The system will send a {@link android.content.Intent#ACTION_SCREEN_ON screen on}
1065      * or {@link android.content.Intent#ACTION_SCREEN_OFF screen off} broadcast
1066      * whenever the interactive state of the device changes.  For historical reasons,
1067      * the names of these broadcasts refer to the power state of the screen
1068      * but they are actually sent in response to changes in the overall interactive
1069      * state of the device, as described by this method.
1070      * </p><p>
1071      * Services may use the non-interactive state as a hint to conserve power
1072      * since the user is not present.
1073      * </p>
1074      *
1075      * @return True if the device is in an interactive state.
1076      *
1077      * @see android.content.Intent#ACTION_SCREEN_ON
1078      * @see android.content.Intent#ACTION_SCREEN_OFF
1079      */
isInteractive()1080     public boolean isInteractive() {
1081         try {
1082             return mService.isInteractive();
1083         } catch (RemoteException e) {
1084             throw e.rethrowFromSystemServer();
1085         }
1086     }
1087 
1088     /**
1089      * Reboot the device.  Will not return if the reboot is successful.
1090      * <p>
1091      * Requires the {@link android.Manifest.permission#REBOOT} permission.
1092      * </p>
1093      *
1094      * @param reason code to pass to the kernel (e.g., "recovery") to
1095      *               request special boot modes, or null.
1096      */
reboot(String reason)1097     public void reboot(String reason) {
1098         try {
1099             mService.reboot(false, reason, true);
1100         } catch (RemoteException e) {
1101             throw e.rethrowFromSystemServer();
1102         }
1103     }
1104 
1105     /**
1106      * Reboot the device. Will not return if the reboot is successful.
1107      * <p>
1108      * Requires the {@link android.Manifest.permission#REBOOT} permission.
1109      * </p>
1110      * @hide
1111      */
rebootSafeMode()1112     public void rebootSafeMode() {
1113         try {
1114             mService.rebootSafeMode(false, true);
1115         } catch (RemoteException e) {
1116             throw e.rethrowFromSystemServer();
1117         }
1118     }
1119 
1120     /**
1121      * Returns true if the device is currently in power save mode.  When in this mode,
1122      * applications should reduce their functionality in order to conserve battery as
1123      * much as possible.  You can monitor for changes to this state with
1124      * {@link #ACTION_POWER_SAVE_MODE_CHANGED}.
1125      *
1126      * @return Returns true if currently in low power mode, else false.
1127      */
isPowerSaveMode()1128     public boolean isPowerSaveMode() {
1129         try {
1130             return mService.isPowerSaveMode();
1131         } catch (RemoteException e) {
1132             throw e.rethrowFromSystemServer();
1133         }
1134     }
1135 
1136     /**
1137      * Set the current power save mode.
1138      *
1139      * @return True if the set was allowed.
1140      *
1141      * @see #isPowerSaveMode()
1142      *
1143      * @hide
1144      */
setPowerSaveMode(boolean mode)1145     public boolean setPowerSaveMode(boolean mode) {
1146         try {
1147             return mService.setPowerSaveMode(mode);
1148         } catch (RemoteException e) {
1149             throw e.rethrowFromSystemServer();
1150         }
1151     }
1152 
1153     /**
1154      * Get data about the battery saver mode for a specific service
1155      * @param serviceType unique key for the service, one of {@link ServiceType}
1156      * @return Battery saver state data.
1157      *
1158      * @hide
1159      * @see com.android.server.power.BatterySaverPolicy
1160      * @see PowerSaveState
1161      */
getPowerSaveState(@erviceType int serviceType)1162     public PowerSaveState getPowerSaveState(@ServiceType int serviceType) {
1163         try {
1164             return mService.getPowerSaveState(serviceType);
1165         } catch (RemoteException e) {
1166             throw e.rethrowFromSystemServer();
1167         }
1168     }
1169 
1170     /**
1171      * Returns how location features should behave when battery saver is on. When battery saver
1172      * is off, this will always return {@link #LOCATION_MODE_NO_CHANGE}.
1173      *
1174      * <p>This API is normally only useful for components that provide location features.
1175      *
1176      * @see #isPowerSaveMode()
1177      * @see #ACTION_POWER_SAVE_MODE_CHANGED
1178      */
1179     @LocationPowerSaveMode
getLocationPowerSaveMode()1180     public int getLocationPowerSaveMode() {
1181         final PowerSaveState powerSaveState = getPowerSaveState(ServiceType.GPS);
1182         if (!powerSaveState.globalBatterySaverEnabled) {
1183             return LOCATION_MODE_NO_CHANGE;
1184         }
1185         return powerSaveState.gpsMode;
1186     }
1187 
1188     /**
1189      * Returns true if the device is currently in idle mode.  This happens when a device
1190      * has been sitting unused and unmoving for a sufficiently long period of time, so that
1191      * it decides to go into a lower power-use state.  This may involve things like turning
1192      * off network access to apps.  You can monitor for changes to this state with
1193      * {@link #ACTION_DEVICE_IDLE_MODE_CHANGED}.
1194      *
1195      * @return Returns true if currently in active device idle mode, else false.  This is
1196      * when idle mode restrictions are being actively applied; it will return false if the
1197      * device is in a long-term idle mode but currently running a maintenance window where
1198      * restrictions have been lifted.
1199      */
isDeviceIdleMode()1200     public boolean isDeviceIdleMode() {
1201         try {
1202             return mService.isDeviceIdleMode();
1203         } catch (RemoteException e) {
1204             throw e.rethrowFromSystemServer();
1205         }
1206     }
1207 
1208     /**
1209      * Returns true if the device is currently in light idle mode.  This happens when a device
1210      * has had its screen off for a short time, switching it into a batching mode where we
1211      * execute jobs, syncs, networking on a batching schedule.  You can monitor for changes to
1212      * this state with {@link #ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED}.
1213      *
1214      * @return Returns true if currently in active light device idle mode, else false.  This is
1215      * when light idle mode restrictions are being actively applied; it will return false if the
1216      * device is in a long-term idle mode but currently running a maintenance window where
1217      * restrictions have been lifted.
1218      * @hide
1219      */
isLightDeviceIdleMode()1220     public boolean isLightDeviceIdleMode() {
1221         try {
1222             return mService.isLightDeviceIdleMode();
1223         } catch (RemoteException e) {
1224             throw e.rethrowFromSystemServer();
1225         }
1226     }
1227 
1228     /**
1229      * Return whether the given application package name is on the device's power whitelist.
1230      * Apps can be placed on the whitelist through the settings UI invoked by
1231      * {@link android.provider.Settings#ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}.
1232      */
isIgnoringBatteryOptimizations(String packageName)1233     public boolean isIgnoringBatteryOptimizations(String packageName) {
1234         synchronized (this) {
1235             if (mIDeviceIdleController == null) {
1236                 mIDeviceIdleController = IDeviceIdleController.Stub.asInterface(
1237                         ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
1238             }
1239         }
1240         try {
1241             return mIDeviceIdleController.isPowerSaveWhitelistApp(packageName);
1242         } catch (RemoteException e) {
1243             throw e.rethrowFromSystemServer();
1244         }
1245     }
1246 
1247     /**
1248      * Turn off the device.
1249      *
1250      * @param confirm If true, shows a shutdown confirmation dialog.
1251      * @param reason code to pass to android_reboot() (e.g. "userrequested"), or null.
1252      * @param wait If true, this call waits for the shutdown to complete and does not return.
1253      *
1254      * @hide
1255      */
shutdown(boolean confirm, String reason, boolean wait)1256     public void shutdown(boolean confirm, String reason, boolean wait) {
1257         try {
1258             mService.shutdown(confirm, reason, wait);
1259         } catch (RemoteException e) {
1260             throw e.rethrowFromSystemServer();
1261         }
1262     }
1263 
1264     /**
1265      * This function checks if the device has implemented Sustained Performance
1266      * Mode. This needs to be checked only once and is constant for a particular
1267      * device/release.
1268      *
1269      * Sustained Performance Mode is intended to provide a consistent level of
1270      * performance for prolonged amount of time.
1271      *
1272      * Applications should check if the device supports this mode, before using
1273      * {@link android.view.Window#setSustainedPerformanceMode}.
1274      *
1275      * @return Returns True if the device supports it, false otherwise.
1276      *
1277      * @see android.view.Window#setSustainedPerformanceMode
1278      */
isSustainedPerformanceModeSupported()1279     public boolean isSustainedPerformanceModeSupported() {
1280         return mContext.getResources().getBoolean(
1281                 com.android.internal.R.bool.config_sustainedPerformanceModeSupported);
1282     }
1283 
1284     /**
1285      * If true, the doze component is not started until after the screen has been
1286      * turned off and the screen off animation has been performed.
1287      * @hide
1288      */
setDozeAfterScreenOff(boolean dozeAfterScreenOf)1289     public void setDozeAfterScreenOff(boolean dozeAfterScreenOf) {
1290         try {
1291             mService.setDozeAfterScreenOff(dozeAfterScreenOf);
1292         } catch (RemoteException e) {
1293             throw e.rethrowFromSystemServer();
1294         }
1295     }
1296 
1297     /**
1298      * Returns the reason the phone was last shutdown. Calling app must have the
1299      * {@link android.Manifest.permission#DEVICE_POWER} permission to request this information.
1300      * @return Reason for shutdown as an int, {@link #SHUTDOWN_REASON_UNKNOWN} if the file could
1301      * not be accessed.
1302      * @hide
1303      */
1304     @ShutdownReason
getLastShutdownReason()1305     public int getLastShutdownReason() {
1306         try {
1307             return mService.getLastShutdownReason();
1308         } catch (RemoteException e) {
1309             throw e.rethrowFromSystemServer();
1310         }
1311     }
1312 
1313     /**
1314      * Intent that is broadcast when the state of {@link #isPowerSaveMode()} changes.
1315      * This broadcast is only sent to registered receivers.
1316      */
1317     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1318     public static final String ACTION_POWER_SAVE_MODE_CHANGED
1319             = "android.os.action.POWER_SAVE_MODE_CHANGED";
1320 
1321     /**
1322      * Intent that is broadcast when the state of {@link #isPowerSaveMode()} changes.
1323      * @hide
1324      */
1325     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1326     public static final String ACTION_POWER_SAVE_MODE_CHANGED_INTERNAL
1327             = "android.os.action.POWER_SAVE_MODE_CHANGED_INTERNAL";
1328 
1329     /**
1330      * Intent that is broadcast when the state of {@link #isDeviceIdleMode()} changes.
1331      * This broadcast is only sent to registered receivers.
1332      */
1333     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1334     public static final String ACTION_DEVICE_IDLE_MODE_CHANGED
1335             = "android.os.action.DEVICE_IDLE_MODE_CHANGED";
1336 
1337     /**
1338      * Intent that is broadcast when the state of {@link #isLightDeviceIdleMode()} changes.
1339      * This broadcast is only sent to registered receivers.
1340      * @hide
1341      */
1342     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1343     public static final String ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED
1344             = "android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED";
1345 
1346     /**
1347      * @hide Intent that is broadcast when the set of power save whitelist apps has changed.
1348      * This broadcast is only sent to registered receivers.
1349      */
1350     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1351     public static final String ACTION_POWER_SAVE_WHITELIST_CHANGED
1352             = "android.os.action.POWER_SAVE_WHITELIST_CHANGED";
1353 
1354     /**
1355      * @hide Intent that is broadcast when the set of temporarily whitelisted apps has changed.
1356      * This broadcast is only sent to registered receivers.
1357      */
1358     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1359     public static final String ACTION_POWER_SAVE_TEMP_WHITELIST_CHANGED
1360             = "android.os.action.POWER_SAVE_TEMP_WHITELIST_CHANGED";
1361 
1362     /**
1363      * Intent that is broadcast when the state of {@link #isPowerSaveMode()} is about to change.
1364      * This broadcast is only sent to registered receivers.
1365      *
1366      * @hide
1367      */
1368     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
1369     public static final String ACTION_POWER_SAVE_MODE_CHANGING
1370             = "android.os.action.POWER_SAVE_MODE_CHANGING";
1371 
1372     /** @hide */
1373     public static final String EXTRA_POWER_SAVE_MODE = "mode";
1374 
1375     /**
1376      * Intent that is broadcast when the state of {@link #isScreenBrightnessBoosted()} has changed.
1377      * This broadcast is only sent to registered receivers.
1378      *
1379      * @deprecated This intent is rarely used and will be phased out soon.
1380      * @hide
1381      * @removed
1382      **/
1383     @SystemApi @Deprecated
1384     public static final String ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED
1385             = "android.os.action.SCREEN_BRIGHTNESS_BOOST_CHANGED";
1386 
1387     /**
1388      * A wake lock is a mechanism to indicate that your application needs
1389      * to have the device stay on.
1390      * <p>
1391      * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK}
1392      * permission in an {@code <uses-permission>} element of the application's manifest.
1393      * Obtain a wake lock by calling {@link PowerManager#newWakeLock(int, String)}.
1394      * </p><p>
1395      * Call {@link #acquire()} to acquire the wake lock and force the device to stay
1396      * on at the level that was requested when the wake lock was created.
1397      * </p><p>
1398      * Call {@link #release()} when you are done and don't need the lock anymore.
1399      * It is very important to do this as soon as possible to avoid running down the
1400      * device's battery excessively.
1401      * </p>
1402      */
1403     public final class WakeLock {
1404         private int mFlags;
1405         private String mTag;
1406         private final String mPackageName;
1407         private final IBinder mToken;
1408         private int mInternalCount;
1409         private int mExternalCount;
1410         private boolean mRefCounted = true;
1411         private boolean mHeld;
1412         private WorkSource mWorkSource;
1413         private String mHistoryTag;
1414         private final String mTraceName;
1415 
1416         private final Runnable mReleaser = new Runnable() {
1417             public void run() {
1418                 release(RELEASE_FLAG_TIMEOUT);
1419             }
1420         };
1421 
WakeLock(int flags, String tag, String packageName)1422         WakeLock(int flags, String tag, String packageName) {
1423             mFlags = flags;
1424             mTag = tag;
1425             mPackageName = packageName;
1426             mToken = new Binder();
1427             mTraceName = "WakeLock (" + mTag + ")";
1428         }
1429 
1430         @Override
finalize()1431         protected void finalize() throws Throwable {
1432             synchronized (mToken) {
1433                 if (mHeld) {
1434                     Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);
1435                     Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
1436                     try {
1437                         mService.releaseWakeLock(mToken, 0);
1438                     } catch (RemoteException e) {
1439                         throw e.rethrowFromSystemServer();
1440                     }
1441                 }
1442             }
1443         }
1444 
1445         /**
1446          * Sets whether this WakeLock is reference counted.
1447          * <p>
1448          * Wake locks are reference counted by default.  If a wake lock is
1449          * reference counted, then each call to {@link #acquire()} must be
1450          * balanced by an equal number of calls to {@link #release()}.  If a wake
1451          * lock is not reference counted, then one call to {@link #release()} is
1452          * sufficient to undo the effect of all previous calls to {@link #acquire()}.
1453          * </p>
1454          *
1455          * @param value True to make the wake lock reference counted, false to
1456          * make the wake lock non-reference counted.
1457          */
setReferenceCounted(boolean value)1458         public void setReferenceCounted(boolean value) {
1459             synchronized (mToken) {
1460                 mRefCounted = value;
1461             }
1462         }
1463 
1464         /**
1465          * Acquires the wake lock.
1466          * <p>
1467          * Ensures that the device is on at the level requested when
1468          * the wake lock was created.
1469          * </p>
1470          */
acquire()1471         public void acquire() {
1472             synchronized (mToken) {
1473                 acquireLocked();
1474             }
1475         }
1476 
1477         /**
1478          * Acquires the wake lock with a timeout.
1479          * <p>
1480          * Ensures that the device is on at the level requested when
1481          * the wake lock was created.  The lock will be released after the given timeout
1482          * expires.
1483          * </p>
1484          *
1485          * @param timeout The timeout after which to release the wake lock, in milliseconds.
1486          */
acquire(long timeout)1487         public void acquire(long timeout) {
1488             synchronized (mToken) {
1489                 acquireLocked();
1490                 mHandler.postDelayed(mReleaser, timeout);
1491             }
1492         }
1493 
acquireLocked()1494         private void acquireLocked() {
1495             mInternalCount++;
1496             mExternalCount++;
1497             if (!mRefCounted || mInternalCount == 1) {
1498                 // Do this even if the wake lock is already thought to be held (mHeld == true)
1499                 // because non-reference counted wake locks are not always properly released.
1500                 // For example, the keyguard's wake lock might be forcibly released by the
1501                 // power manager without the keyguard knowing.  A subsequent call to acquire
1502                 // should immediately acquire the wake lock once again despite never having
1503                 // been explicitly released by the keyguard.
1504                 mHandler.removeCallbacks(mReleaser);
1505                 Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, mTraceName, 0);
1506                 try {
1507                     mService.acquireWakeLock(mToken, mFlags, mTag, mPackageName, mWorkSource,
1508                             mHistoryTag);
1509                 } catch (RemoteException e) {
1510                     throw e.rethrowFromSystemServer();
1511                 }
1512                 mHeld = true;
1513             }
1514         }
1515 
1516         /**
1517          * Releases the wake lock.
1518          * <p>
1519          * This method releases your claim to the CPU or screen being on.
1520          * The screen may turn off shortly after you release the wake lock, or it may
1521          * not if there are other wake locks still held.
1522          * </p>
1523          */
release()1524         public void release() {
1525             release(0);
1526         }
1527 
1528         /**
1529          * Releases the wake lock with flags to modify the release behavior.
1530          * <p>
1531          * This method releases your claim to the CPU or screen being on.
1532          * The screen may turn off shortly after you release the wake lock, or it may
1533          * not if there are other wake locks still held.
1534          * </p>
1535          *
1536          * @param flags Combination of flag values to modify the release behavior.
1537          * Currently only {@link #RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY} is supported.
1538          * Passing 0 is equivalent to calling {@link #release()}.
1539          */
release(int flags)1540         public void release(int flags) {
1541             synchronized (mToken) {
1542                 if (mInternalCount > 0) {
1543                     // internal count must only be decreased if it is > 0 or state of
1544                     // the WakeLock object is broken.
1545                     mInternalCount--;
1546                 }
1547                 if ((flags & RELEASE_FLAG_TIMEOUT) == 0) {
1548                     mExternalCount--;
1549                 }
1550                 if (!mRefCounted || mInternalCount == 0) {
1551                     mHandler.removeCallbacks(mReleaser);
1552                     if (mHeld) {
1553                         Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
1554                         try {
1555                             mService.releaseWakeLock(mToken, flags);
1556                         } catch (RemoteException e) {
1557                             throw e.rethrowFromSystemServer();
1558                         }
1559                         mHeld = false;
1560                     }
1561                 }
1562                 if (mRefCounted && mExternalCount < 0) {
1563                     throw new RuntimeException("WakeLock under-locked " + mTag);
1564                 }
1565             }
1566         }
1567 
1568         /**
1569          * Returns true if the wake lock has been acquired but not yet released.
1570          *
1571          * @return True if the wake lock is held.
1572          */
isHeld()1573         public boolean isHeld() {
1574             synchronized (mToken) {
1575                 return mHeld;
1576             }
1577         }
1578 
1579         /**
1580          * Sets the work source associated with the wake lock.
1581          * <p>
1582          * The work source is used to determine on behalf of which application
1583          * the wake lock is being held.  This is useful in the case where a
1584          * service is performing work on behalf of an application so that the
1585          * cost of that work can be accounted to the application.
1586          * </p>
1587          *
1588          * <p>
1589          * Make sure to follow the tag naming convention when using WorkSource
1590          * to make it easier for app developers to understand wake locks
1591          * attributed to them. See {@link PowerManager#newWakeLock(int, String)}
1592          * documentation.
1593          * </p>
1594          *
1595          * @param ws The work source, or null if none.
1596          */
setWorkSource(WorkSource ws)1597         public void setWorkSource(WorkSource ws) {
1598             synchronized (mToken) {
1599                 if (ws != null && ws.isEmpty()) {
1600                     ws = null;
1601                 }
1602 
1603                 final boolean changed;
1604                 if (ws == null) {
1605                     changed = mWorkSource != null;
1606                     mWorkSource = null;
1607                 } else if (mWorkSource == null) {
1608                     changed = true;
1609                     mWorkSource = new WorkSource(ws);
1610                 } else {
1611                     changed = !mWorkSource.equals(ws);
1612                     if (changed) {
1613                         mWorkSource.set(ws);
1614                     }
1615                 }
1616 
1617                 if (changed && mHeld) {
1618                     try {
1619                         mService.updateWakeLockWorkSource(mToken, mWorkSource, mHistoryTag);
1620                     } catch (RemoteException e) {
1621                         throw e.rethrowFromSystemServer();
1622                     }
1623                 }
1624             }
1625         }
1626 
1627         /** @hide */
setTag(String tag)1628         public void setTag(String tag) {
1629             mTag = tag;
1630         }
1631 
1632         /** @hide */
getTag()1633         public String getTag() {
1634             return mTag;
1635         }
1636 
1637         /** @hide */
setHistoryTag(String tag)1638         public void setHistoryTag(String tag) {
1639             mHistoryTag = tag;
1640         }
1641 
1642         /** @hide */
setUnimportantForLogging(boolean state)1643         public void setUnimportantForLogging(boolean state) {
1644             if (state) mFlags |= UNIMPORTANT_FOR_LOGGING;
1645             else mFlags &= ~UNIMPORTANT_FOR_LOGGING;
1646         }
1647 
1648         @Override
toString()1649         public String toString() {
1650             synchronized (mToken) {
1651                 return "WakeLock{"
1652                     + Integer.toHexString(System.identityHashCode(this))
1653                     + " held=" + mHeld + ", refCount=" + mInternalCount + "}";
1654             }
1655         }
1656 
1657         /** @hide */
writeToProto(ProtoOutputStream proto, long fieldId)1658         public void writeToProto(ProtoOutputStream proto, long fieldId) {
1659             synchronized (mToken) {
1660                 final long token = proto.start(fieldId);
1661                 proto.write(PowerManagerProto.WakeLock.TAG, mTag);
1662                 proto.write(PowerManagerProto.WakeLock.PACKAGE_NAME, mPackageName);
1663                 proto.write(PowerManagerProto.WakeLock.HELD, mHeld);
1664                 proto.write(PowerManagerProto.WakeLock.INTERNAL_COUNT, mInternalCount);
1665                 if (mWorkSource != null) {
1666                     mWorkSource.writeToProto(proto, PowerManagerProto.WakeLock.WORK_SOURCE);
1667                 }
1668                 proto.end(token);
1669             }
1670         }
1671 
1672         /**
1673          * Wraps a Runnable such that this method immediately acquires the wake lock and then
1674          * once the Runnable is done the wake lock is released.
1675          *
1676          * <p>Example:
1677          *
1678          * <pre>
1679          * mHandler.post(mWakeLock.wrap(() -> {
1680          *     // do things on handler, lock is held while we're waiting for this
1681          *     // to get scheduled and until the runnable is done executing.
1682          * });
1683          * </pre>
1684          *
1685          * <p>Note: you must make sure that the Runnable eventually gets executed, otherwise you'll
1686          *    leak the wakelock!
1687          *
1688          * @hide
1689          */
wrap(Runnable r)1690         public Runnable wrap(Runnable r) {
1691             acquire();
1692             return () -> {
1693                 try {
1694                     r.run();
1695                 } finally {
1696                     release();
1697                 }
1698             };
1699         }
1700     }
1701 }
1702