PowerManager.java revision 93cbbb25a56356cd36523809783a277fe92e312e
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.content.Context;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
231244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * This class gives you control of the power state of the device.
241244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown *
251244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * <p>
261244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * <b>Device battery life will be significantly affected by the use of this API.</b>
271244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * Do not acquire {@link WakeLock}s unless you really need them, use the minimum levels
281244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * possible, and be sure to release them as soon as possible.
291244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * </p><p>
301244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * You can obtain an instance of this class by calling
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService(java.lang.String) Context.getSystemService()}.
321244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * </p><p>
331244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * The primary API you'll use is {@link #newWakeLock(int, String) newWakeLock()}.
341244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * This will create a {@link PowerManager.WakeLock} object.  You can then use methods
351244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * on the wake lock object to control the power state of the device.
361244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * </p><p>
371244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * In practice it's quite simple:
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@samplecode
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wl.acquire();
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   ..screen will stay on during this section..
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wl.release();
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }
451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * </p><p>
469630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * The following wake lock levels are defined, with varying effects on system power.
479630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * <i>These levels are mutually exclusive - you may only specify one of them.</i>
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
491244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>Flag Value</th>
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <th>CPU</th> <th>Screen</th> <th>Keyboard</th></tr>
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #PARTIAL_WAKE_LOCK}</th>
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>On*</td> <td>Off</td> <td>Off</td>
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SCREEN_DIM_WAKE_LOCK}</th>
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>On</td> <td>Dim</td> <td>Off</td>
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #SCREEN_BRIGHT_WAKE_LOCK}</th>
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>On</td> <td>Bright</td> <td>Off</td>
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #FULL_WAKE_LOCK}</th>
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>On</td> <td>Bright</td> <td>Bright</td>
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
731244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * </p><p>
741244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * *<i>If you hold a partial wake lock, the CPU will continue to run, regardless of any
751244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * display timeouts or the state of the screen and even after the user presses the power button.
761244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * In all other wake locks, the CPU will run, but the user can still put the device to sleep
771244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * using the power button.</i>
781244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * </p><p>
791244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * In addition, you can add two more flags, which affect behavior of the screen only.
801244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * <i>These flags have no effect when combined with a {@link #PARTIAL_WAKE_LOCK}.</i>
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
821244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>Flag Value</th> <th>Description</th></tr>
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #ACQUIRE_CAUSES_WAKEUP}</th>
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Normal wake locks don't actually turn on the illumination.  Instead, they cause
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         the illumination to remain on once it turns on (e.g. from user activity).  This flag
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         will force the screen and/or keyboard to turn on immediately, when the WakeLock is
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         acquired.  A typical use would be for notifications which are important for the user to
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         see immediately.</td>
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr><th>{@link #ON_AFTER_RELEASE}</th>
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>If this flag is set, the user activity timer will be reset when the WakeLock is
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         released, causing the illumination to remain on a bit longer.  This can be used to
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         reduce flicker if you are cycling between wake lock conditions.</td>
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
1031244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * </p><p>
104d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK}
105d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code &lt;uses-permission&gt;} element of the application's manifest.
1061244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown * </p>
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1081244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brownpublic final class PowerManager {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "PowerManager";
1101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
111155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    /* NOTE: Wake lock levels were previously defined as a bit field, except that only a few
112155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * combinations were actually supported so the bit field was removed.  This explains
113155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * why the numbering scheme is so odd.  If adding a new wake lock level, any unused
114155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * value can be used.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1181244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Wake lock level: Ensures that the CPU is running; the screen and keyboard
1191244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * backlight will be allowed to go off.
120155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * <p>
121155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * If the user presses the power button, then the screen will be turned off
122155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * but the CPU will be kept on until all partial wake locks have been released.
123155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * </p>
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
125155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int PARTIAL_WAKE_LOCK = 0x00000001;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
128155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * Wake lock level: Ensures that the screen is on (but may be dimmed);
129155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * the keyboard backlight will be allowed to go off.
130155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * <p>
131155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * If the user presses the power button, then the {@link #SCREEN_DIM_WAKE_LOCK} will be
132155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * implicitly released by the system, causing both the screen and the CPU to be turned off.
133155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * Contrast with {@link #PARTIAL_WAKE_LOCK}.
134155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * </p>
1359567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn     *
136155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * @deprecated Most applications should use
1371244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
138155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * of this type of wake lock, as it will be correctly managed by the platform
139155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * as the user moves between applications and doesn't require a special permission.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
141155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    @Deprecated
142155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int SCREEN_DIM_WAKE_LOCK = 0x00000006;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Wake lock level: Ensures that the screen is on at full brightness;
1461244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * the keyboard backlight will be allowed to go off.
147155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * <p>
148155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * If the user presses the power button, then the {@link #SCREEN_BRIGHT_WAKE_LOCK} will be
149155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * implicitly released by the system, causing both the screen and the CPU to be turned off.
150155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * Contrast with {@link #PARTIAL_WAKE_LOCK}.
151155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * </p>
1521244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
1539567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn     * @deprecated Most applications should use
1549567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn     * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
1559567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn     * of this type of wake lock, as it will be correctly managed by the platform
1569567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn     * as the user moves between applications and doesn't require a special permission.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1589567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn    @Deprecated
159155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int SCREEN_BRIGHT_WAKE_LOCK = 0x0000000a;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
162155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * Wake lock level: Ensures that the screen and keyboard backlight are on at
163155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * full brightness.
164155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * <p>
165155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * If the user presses the power button, then the {@link #FULL_WAKE_LOCK} will be
166155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * implicitly released by the system, causing both the screen and the CPU to be turned off.
167155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * Contrast with {@link #PARTIAL_WAKE_LOCK}.
168155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * </p>
169155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     *
170155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * @deprecated Most applications should use
171155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
172155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * of this type of wake lock, as it will be correctly managed by the platform
173155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * as the user moves between applications and doesn't require a special permission.
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
175155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    @Deprecated
176155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int FULL_WAKE_LOCK = 0x0000001a;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1791244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Wake lock level: Turns the screen off when the proximity sensor activates.
1801244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
18193cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * If the proximity sensor detects that an object is nearby, the screen turns off
18293cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * immediately.  Shortly after the object moves away, the screen turns on again.
18393cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * </p><p>
18493cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * A proximity wake lock does not prevent the device from falling asleep
18593cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * unlike {@link #FULL_WAKE_LOCK}, {@link #SCREEN_BRIGHT_WAKE_LOCK} and
18693cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * {@link #SCREEN_DIM_WAKE_LOCK}.  If there is no user activity and no other
18793cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * wake locks are held, then the device will fall asleep (and lock) as usual.
18893cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * However, the device will not fall asleep while the screen has been turned off
18993cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * by the proximity sensor because it effectively counts as ongoing user activity.
19093cbbb25a56356cd36523809783a277fe92e312eJeff Brown     * </p><p>
1919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Since not all devices have proximity sensors, use {@link #isWakeLockLevelSupported}
1921244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to determine whether this wake lock level is supported.
1931244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
194bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood     *
195bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood     * {@hide}
196bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood     */
197155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 0x00000020;
198bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood
199bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood    /**
200155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * Mask for the wake lock level component of a combined wake lock level and flags integer.
2010e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood     *
202155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * @hide
2030e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood     */
204155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int WAKE_LOCK_LEVEL_MASK = 0x0000ffff;
2050e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood
2060e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood    /**
2071244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Wake lock flag: Turn the screen on when the wake lock is acquired.
2081244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Normally wake locks don't actually wake the device, they just cause
2101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * the screen to remain on once it's already on.  Think of the video player
2111244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * application as the normal behavior.  Notifications that pop up and want
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the device to be on are the exception; use this flag to be like them.
2131244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
2141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Cannot be used with {@link #PARTIAL_WAKE_LOCK}.
2151244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
217155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int ACQUIRE_CAUSES_WAKEUP = 0x10000000;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2201244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Wake lock flag: When this wake lock is released, poke the user activity timer
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so the screen stays on for a little longer.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2231244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Will not turn the screen on if it is not already on.
2241244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * See {@link #ACQUIRE_CAUSES_WAKEUP} if you want that.
2251244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
2261244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Cannot be used with {@link #PARTIAL_WAKE_LOCK}.
2271244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
229155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int ON_AFTER_RELEASE = 0x20000000;
230155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown
231155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    /**
232155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * Flag for {@link WakeLock#release release(int)} to defer releasing a
233155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * {@link #WAKE_BIT_PROXIMITY_SCREEN_OFF} wake lock until the proximity sensor returns
234155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * a negative value.
235155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     *
236155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * {@hide}
237155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     */
238155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int WAIT_FOR_PROXIMITY_NEGATIVE = 1;
2397304c343821309dd15f769b18f1de2fa43751573Jeff Brown
2407304c343821309dd15f769b18f1de2fa43751573Jeff Brown    /**
2417304c343821309dd15f769b18f1de2fa43751573Jeff Brown     * Brightness value for fully on.
2427304c343821309dd15f769b18f1de2fa43751573Jeff Brown     * @hide
2437304c343821309dd15f769b18f1de2fa43751573Jeff Brown     */
2447304c343821309dd15f769b18f1de2fa43751573Jeff Brown    public static final int BRIGHTNESS_ON = 255;
2457304c343821309dd15f769b18f1de2fa43751573Jeff Brown
2467304c343821309dd15f769b18f1de2fa43751573Jeff Brown    /**
2479630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Brightness value for fully off.
2487304c343821309dd15f769b18f1de2fa43751573Jeff Brown     * @hide
2497304c343821309dd15f769b18f1de2fa43751573Jeff Brown     */
2509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int BRIGHTNESS_OFF = 0;
2517304c343821309dd15f769b18f1de2fa43751573Jeff Brown
252b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    // Note: Be sure to update android.os.BatteryStats and PowerManager.h
253b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    // if adding or modifying user activity event constants.
254b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown
255b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    /**
256b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * User activity event type: Unspecified event type.
257b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * @hide
258b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     */
259b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    public static final int USER_ACTIVITY_EVENT_OTHER = 0;
260b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown
261b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    /**
262b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * User activity event type: Button or key pressed or released.
263b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * @hide
264b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     */
265b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    public static final int USER_ACTIVITY_EVENT_BUTTON = 1;
266b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown
267b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    /**
268b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * User activity event type: Touch down, move or up.
269b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * @hide
270b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     */
271b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    public static final int USER_ACTIVITY_EVENT_TOUCH = 2;
272b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown
2739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
2749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * User activity flag: Do not restart the user activity timeout or brighten
2759630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * the display in response to user activity if it is already dimmed.
2769630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
2779630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
2789630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS = 1 << 0;
2799630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
2819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Go to sleep reason code: Going to sleep due by user request.
2829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
2839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
2849630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int GO_TO_SLEEP_REASON_USER = 0;
2859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2869630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
2879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Go to sleep reason code: Going to sleep due by request of the
2889630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * device administration policy.
2899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
2909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
2919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int GO_TO_SLEEP_REASON_DEVICE_ADMIN = 1;
2929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2939630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
2949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Go to sleep reason code: Going to sleep due to a screen timeout.
2959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
2969630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
2979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int GO_TO_SLEEP_REASON_TIMEOUT = 2;
2989630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2999630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    final Context mContext;
3001244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    final IPowerManager mService;
3011244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    final Handler mHandler;
3021244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
3031244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
3041244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@hide}
3051244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
3069630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public PowerManager(Context context, IPowerManager service, Handler handler) {
3079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mContext = context;
3081244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        mService = service;
3091244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        mHandler = handler;
3101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
3111244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
3121244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
3139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Gets the minimum supported screen brightness setting.
3149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * The screen may be allowed to become dimmer than this value but
3159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * this is the minimum value that can be set by the user.
3169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
3179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
3189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public int getMinimumScreenBrightnessSetting() {
3199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        return mContext.getResources().getInteger(
320f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown                com.android.internal.R.integer.config_screenBrightnessSettingMinimum);
3219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
3229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
3239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
3249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Gets the maximum supported screen brightness setting.
3259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * The screen may be allowed to become dimmer than this value but
3269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * this is the maximum value that can be set by the user.
3279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
3289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
3299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public int getMaximumScreenBrightnessSetting() {
330f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown        return mContext.getResources().getInteger(
331f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown                com.android.internal.R.integer.config_screenBrightnessSettingMaximum);
3329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
3339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
3349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
3359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Gets the default screen brightness setting.
3369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
3379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
3389630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public int getDefaultScreenBrightnessSetting() {
339f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown        return mContext.getResources().getInteger(
340f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown                com.android.internal.R.integer.config_screenBrightnessSettingDefault);
3419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
3429630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
3439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
344631938f26dbc89e7e9530bb85d9f37706dba59f3Jeff Brown     * Returns true if the screen auto-brightness adjustment setting should
345631938f26dbc89e7e9530bb85d9f37706dba59f3Jeff Brown     * be available in the UI.  This setting is experimental and disabled by default.
346631938f26dbc89e7e9530bb85d9f37706dba59f3Jeff Brown     * @hide
347631938f26dbc89e7e9530bb85d9f37706dba59f3Jeff Brown     */
348631938f26dbc89e7e9530bb85d9f37706dba59f3Jeff Brown    public static boolean useScreenAutoBrightnessAdjustmentFeature() {
349631938f26dbc89e7e9530bb85d9f37706dba59f3Jeff Brown        return SystemProperties.getBoolean("persist.power.useautobrightadj", false);
350631938f26dbc89e7e9530bb85d9f37706dba59f3Jeff Brown    }
351631938f26dbc89e7e9530bb85d9f37706dba59f3Jeff Brown
352631938f26dbc89e7e9530bb85d9f37706dba59f3Jeff Brown    /**
353db21284a7fb081065d26137891594bd8495b116fJeff Brown     * Returns true if the twilight service should be used to adjust screen brightness
354db21284a7fb081065d26137891594bd8495b116fJeff Brown     * policy.  This setting is experimental and disabled by default.
355db21284a7fb081065d26137891594bd8495b116fJeff Brown     * @hide
356db21284a7fb081065d26137891594bd8495b116fJeff Brown     */
357db21284a7fb081065d26137891594bd8495b116fJeff Brown    public static boolean useTwilightAdjustmentFeature() {
358db21284a7fb081065d26137891594bd8495b116fJeff Brown        return SystemProperties.getBoolean("persist.power.usetwilightadj", false);
359db21284a7fb081065d26137891594bd8495b116fJeff Brown    }
360db21284a7fb081065d26137891594bd8495b116fJeff Brown
361db21284a7fb081065d26137891594bd8495b116fJeff Brown    /**
3621244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Creates a new wake lock with the specified level and flags.
3631244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
3641244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * The {@code levelAndFlags} parameter specifies a wake lock level and optional flags
3651244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * combined using the logical OR operator.
3661244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3671244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * The wake lock levels are: {@link #PARTIAL_WAKE_LOCK},
3681244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@link #FULL_WAKE_LOCK}, {@link #SCREEN_DIM_WAKE_LOCK}
3691244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * and {@link #SCREEN_BRIGHT_WAKE_LOCK}.  Exactly one wake lock level must be
3701244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * specified as part of the {@code levelAndFlags} parameter.
3711244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3721244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * The wake lock flags are: {@link #ACQUIRE_CAUSES_WAKEUP}
3731244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * and {@link #ON_AFTER_RELEASE}.  Multiple flags can be combined as part of the
3741244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@code levelAndFlags} parameters.
3751244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3761244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Call {@link WakeLock#acquire() acquire()} on the object to acquire the
3771244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * wake lock, and {@link WakeLock#release release()} when you are done.
3781244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3791244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@samplecode
3801244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * PowerManager pm = (PowerManager)mContext.getSystemService(
3811244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *                                          Context.POWER_SERVICE);
3821244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * PowerManager.WakeLock wl = pm.newWakeLock(
3831244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *                                      PowerManager.SCREEN_DIM_WAKE_LOCK
3841244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *                                      | PowerManager.ON_AFTER_RELEASE,
3851244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *                                      TAG);
3861244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * wl.acquire();
3871244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * // ... do work...
3881244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * wl.release();
3891244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * }
3901244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3911244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Although a wake lock can be created without special permissions,
3921244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * the {@link android.Manifest.permission#WAKE_LOCK} permission is
3931244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * required to actually acquire or release the wake lock that is returned.
3941244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p class="note">
3951244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * If using this to keep the screen on, you should strongly consider using
3961244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead.
3971244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * This window flag will be correctly managed by the platform
3981244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * as the user moves between applications and doesn't require a special permission.
3991244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
4001244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
4011244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param levelAndFlags Combination of wake lock level and flag values defining
4021244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * the requested behavior of the WakeLock.
4031244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param tag Your class name (or other tag) for debugging purposes.
4041244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
4051244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see WakeLock#acquire()
4061244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see WakeLock#release()
4071244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #PARTIAL_WAKE_LOCK
4081244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #FULL_WAKE_LOCK
4091244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #SCREEN_DIM_WAKE_LOCK
4101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #SCREEN_BRIGHT_WAKE_LOCK
4111244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #ACQUIRE_CAUSES_WAKEUP
4121244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #ON_AFTER_RELEASE
4131244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
4141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public WakeLock newWakeLock(int levelAndFlags, String tag) {
415155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown        validateWakeLockParameters(levelAndFlags, tag);
416155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown        return new WakeLock(levelAndFlags, tag);
417155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    }
418155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown
419155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    /** @hide */
420155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static void validateWakeLockParameters(int levelAndFlags, String tag) {
421155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown        switch (levelAndFlags & WAKE_LOCK_LEVEL_MASK) {
422155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case PARTIAL_WAKE_LOCK:
423155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case SCREEN_DIM_WAKE_LOCK:
424155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case SCREEN_BRIGHT_WAKE_LOCK:
425155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case FULL_WAKE_LOCK:
426155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case PROXIMITY_SCREEN_OFF_WAKE_LOCK:
427155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown                break;
428155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            default:
429155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown                throw new IllegalArgumentException("Must specify a valid wake lock level.");
4301244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
4311244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        if (tag == null) {
4321244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            throw new IllegalArgumentException("The tag must not be null.");
4331244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
4341244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
4351244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
4361244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
4371244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Notifies the power manager that user activity happened.
4381244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
4399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Resets the auto-off timer and brightens the screen if the device
4409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * is not asleep.  This is what happens normally when a key or the touch
4419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * screen is pressed or when some other user activity occurs.
4429630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * This method does not wake up the device if it has been put to sleep.
4431244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
4441244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
4451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
4461244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
4471244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param when The time of the user activity, in the {@link SystemClock#uptimeMillis()}
44862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * time base.  This timestamp is used to correctly order the user activity request with
4491244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * other power management functions.  It should be set
4501244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to the timestamp of the input event that caused the user activity.
4511244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param noChangeLights If true, does not cause the keyboard backlight to turn on
4521244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * because of this event.  This is set when the power key is pressed.
4531244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * We want the device to stay on while the button is down, but we're about
4541244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to turn off the screen so we don't want the keyboard backlight to turn on again.
4551244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Otherwise the lights flash on and then off and it looks weird.
4569630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     *
4579630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #wakeUp
4589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #goToSleep
4591244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
4601244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public void userActivity(long when, boolean noChangeLights) {
4611244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
4629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mService.userActivity(when, USER_ACTIVITY_EVENT_OTHER,
4639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    noChangeLights ? USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS : 0);
4641244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
4651244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
4661244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
4671244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
4681244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown   /**
4691244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Forces the device to go to sleep.
4701244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
4719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Overrides all the wake locks that are held.
4729630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * This is what happens when the power key is pressed to turn off the screen.
4731244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
4741244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
4751244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
4761244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
4771244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param time The time when the request to go to sleep was issued, in the
4781244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
47962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * order the go to sleep request with other power management functions.  It should be set
4801244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to the timestamp of the input event that caused the request to go to sleep.
4819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     *
4829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #userActivity
4839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #wakeUp
4841244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
4851244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public void goToSleep(long time) {
4861244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
4879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mService.goToSleep(time, GO_TO_SLEEP_REASON_USER);
4889630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        } catch (RemoteException e) {
4899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
4909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
4919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
4929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
4939630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Forces the device to wake up from sleep.
4949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * <p>
4959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * If the device is currently asleep, wakes it up, otherwise does nothing.
4969630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * This is what happens when the power key is pressed to turn on the screen.
4979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * </p><p>
4989630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
4999630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * </p>
5009630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     *
5019630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @param time The time when the request to wake up was issued, in the
5029630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
50362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * order the wake up request with other power management functions.  It should be set
5049630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * to the timestamp of the input event that caused the request to wake up.
5059630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     *
5069630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #userActivity
5079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #goToSleep
5089630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
5099630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public void wakeUp(long time) {
5109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        try {
5119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mService.wakeUp(time);
5121244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
5131244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
5141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
5151244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
5161244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
51762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * Forces the device to start napping.
51862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * <p>
51962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * If the device is currently awake, starts dreaming, otherwise does nothing.
52062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * When the dream ends or if the dream cannot be started, the device will
52162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * either wake up or go to sleep depending on whether there has been recent
52262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * user activity.
52362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * </p><p>
52462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
52562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * </p>
52662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     *
52762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * @param time The time when the request to nap was issued, in the
52862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
52962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * order the nap request with other power management functions.  It should be set
53062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * to the timestamp of the input event that caused the request to nap.
53162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     *
53262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * @see #wakeUp
53362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * @see #goToSleep
53462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     *
53562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     * @hide
53662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown     */
53762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown    public void nap(long time) {
53862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown        try {
53962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown            mService.nap(time);
54062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown        } catch (RemoteException e) {
54162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown        }
54262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown    }
54362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown
54462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown    /**
5451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Sets the brightness of the backlights (screen, keyboard, button).
5461244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
5471244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
5481244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
5491244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
5501244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param brightness The brightness value from 0 to 255.
5511244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
5521244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@hide}
5531244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
5541244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public void setBacklightBrightness(int brightness) {
5551244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
5569630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mService.setTemporaryScreenBrightnessSettingOverride(brightness);
5571244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
5581244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
5591244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
5601244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
5611244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown   /**
5629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Returns true if the specified wake lock level is supported.
5631244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
5649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @param level The wake lock level to check.
5659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @return True if the specified wake lock level is supported.
5661244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
5671244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@hide}
5681244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
5699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public boolean isWakeLockLevelSupported(int level) {
5701244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
5719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            return mService.isWakeLockLevelSupported(level);
5721244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
5739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            return false;
5741244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
5751244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
5761244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
5771244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
5781244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * Returns whether the screen is currently on.
5791244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * <p>
5801244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * Only indicates whether the screen is on.  The screen could be either bright or dim.
5811244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * </p><p>
5821244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * {@samplecode
5831244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
5841244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * boolean isScreenOn = pm.isScreenOn();
5851244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * }
5861244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * </p>
5871244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      *
5881244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * @return whether the screen is on (bright or dim).
5891244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      */
5901244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public boolean isScreenOn() {
5911244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
5921244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            return mService.isScreenOn();
5931244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
5941244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            return false;
5951244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
5961244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
5971244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5991244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Reboot the device.  Will not return if the reboot is successful.
600d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * <p>
6011244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Requires the {@link android.Manifest.permission#REBOOT} permission.
6021244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
6031244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
6041244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param reason code to pass to the kernel (e.g., "recovery") to
6051244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *               request special boot modes, or null.
6061244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
6071244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public void reboot(String reason) {
6081244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
609c428aae6429c3fd5e2037c3793af399d9f6e23bfDianne Hackborn            mService.reboot(false, reason, true);
6101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
6111244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
6121244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
6131244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
6141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
6151244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * A wake lock is a mechanism to indicate that your application needs
6161244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to have the device stay on.
617d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * <p>
618d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK}
619d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * permission in an {@code &lt;uses-permission&gt;} element of the application's manifest.
6201244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Obtain a wake lock by calling {@link PowerManager#newWakeLock(int, String)}.
6211244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
6221244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Call {@link #acquire()} to acquire the wake lock and force the device to stay
6231244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * on at the level that was requested when the wake lock was created.
6241244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
6251244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Call {@link #release()} when you are done and don't need the lock anymore.
6261244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * It is very important to do this as soon as possible to avoid running down the
6271244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * device's battery excessively.
6281244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6301244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public final class WakeLock {
6311244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private final int mFlags;
6321244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private final String mTag;
6331244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private final IBinder mToken;
6341244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private int mCount;
6351244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private boolean mRefCounted = true;
6361244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private boolean mHeld;
6371244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private WorkSource mWorkSource;
6381244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
6391244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private final Runnable mReleaser = new Runnable() {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                release();
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        WakeLock(int flags, String tag) {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFlags = flags;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTag = tag;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mToken = new Binder();
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6511244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        @Override
6521244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        protected void finalize() throws Throwable {
6531244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            synchronized (mToken) {
6541244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                if (mHeld) {
6551244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);
6561244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    try {
6571244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        mService.releaseWakeLock(mToken, 0);
6581244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    } catch (RemoteException e) {
6591244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    }
6601244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                }
6611244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            }
6621244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
6631244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6651244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Sets whether this WakeLock is reference counted.
6661244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * <p>
6671244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Wake locks are reference counted by default.  If a wake lock is
6681244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * reference counted, then each call to {@link #acquire()} must be
6691244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * balanced by an equal number of calls to {@link #release()}.  If a wake
6701244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * lock is not reference counted, then one call to {@link #release()} is
6711244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * sufficient to undo the effect of all previous calls to {@link #acquire()}.
6721244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
6738310b42fbc086b0f05fc8ef45ac34c7e099c485eJoe Onorato         *
6741244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @param value True to make the wake lock reference counted, false to
6751244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * make the wake lock non-reference counted.
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6771244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        public void setReferenceCounted(boolean value) {
6781244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            synchronized (mToken) {
6791244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                mRefCounted = value;
6801244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6841244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Acquires the wake lock.
6851244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * <p>
6861244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Ensures that the device is on at the level requested when
6871244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * the wake lock was created.
6881244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6901244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        public void acquire() {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mToken) {
692d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                acquireLocked();
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
695d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6971244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Acquires the wake lock with a timeout.
6981244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * <p>
6991244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Ensures that the device is on at the level requested when
7001244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * the wake lock was created.  The lock will be released after the given timeout
7011244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * expires.
7021244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
7031244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         *
7041244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @param timeout The timeout after which to release the wake lock, in milliseconds.
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void acquire(long timeout) {
707d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato            synchronized (mToken) {
708d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                acquireLocked();
709d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                mHandler.postDelayed(mReleaser, timeout);
710d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato            }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7121244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
713d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato        private void acquireLocked() {
714d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato            if (!mRefCounted || mCount++ == 0) {
715ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // Do this even if the wake lock is already thought to be held (mHeld == true)
716ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // because non-reference counted wake locks are not always properly released.
717ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // For example, the keyguard's wake lock might be forcibly released by the
718ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // power manager without the keyguard knowing.  A subsequent call to acquire
719ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // should immediately acquire the wake lock once again despite never having
720ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // been explicitly released by the keyguard.
721d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                mHandler.removeCallbacks(mReleaser);
722ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                try {
7239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    mService.acquireWakeLock(mToken, mFlags, mTag, mWorkSource);
724ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                } catch (RemoteException e) {
725d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                }
726ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                mHeld = true;
727d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato            }
728d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato        }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
7311244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Releases the wake lock.
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <p>
7331244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * This method releases your claim to the CPU or screen being on.
7341244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * The screen may turn off shortly after you release the wake lock, or it may
7351244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * not if there are other wake locks still held.
7361244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
738d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato        public void release() {
7390e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood            release(0);
7400e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood        }
7410e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood
7420e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood        /**
7431244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Releases the wake lock with flags to modify the release behavior.
7440e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood         * <p>
7451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * This method releases your claim to the CPU or screen being on.
7461244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * The screen may turn off shortly after you release the wake lock, or it may
7471244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * not if there are other wake locks still held.
7481244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
7491244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         *
7501244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @param flags Combination of flag values to modify the release behavior.
7511244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Currently only {@link #WAIT_FOR_PROXIMITY_NEGATIVE} is supported.
7520e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood         *
7530e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood         * {@hide}
7540e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood         */
755d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato        public void release(int flags) {
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mToken) {
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mRefCounted || --mCount == 0) {
758b5962e73e841455b8e2a4e2d5c0ef0a19d62a803Jake Hamby                    mHandler.removeCallbacks(mReleaser);
7591244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    if (mHeld) {
7601244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        try {
7611244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                            mService.releaseWakeLock(mToken, flags);
7621244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        } catch (RemoteException e) {
7631244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        }
7641244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        mHeld = false;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mCount < 0) {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException("WakeLock under-locked " + mTag);
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7731244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        /**
7741244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Returns true if the wake lock has been acquired but not yet released.
7751244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         *
7761244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @return True if the wake lock is held.
7771244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         */
7781244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        public boolean isHeld() {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mToken) {
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHeld;
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7841244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        /**
7851244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Sets the work source associated with the wake lock.
7861244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * <p>
7871244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * The work source is used to determine on behalf of which application
7881244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * the wake lock is being held.  This is useful in the case where a
7891244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * service is performing work on behalf of an application so that the
7901244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * cost of that work can be accounted to the application.
7911244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
7921244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         *
7931244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @param ws The work source, or null if none.
7941244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         */
7957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        public void setWorkSource(WorkSource ws) {
7967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            synchronized (mToken) {
7977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                if (ws != null && ws.size() == 0) {
7987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    ws = null;
7997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
8001244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
8011244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                final boolean changed;
8027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                if (ws == null) {
8031244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    changed = mWorkSource != null;
8047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    mWorkSource = null;
8057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                } else if (mWorkSource == null) {
8061244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    changed = true;
8077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    mWorkSource = new WorkSource(ws);
8087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                } else {
8097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    changed = mWorkSource.diff(ws);
8107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    if (changed) {
8117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                        mWorkSource.set(ws);
8127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    }
8137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
8141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
8157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                if (changed && mHeld) {
8167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    try {
8177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                        mService.updateWakeLockWorkSource(mToken, mWorkSource);
8187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    } catch (RemoteException e) {
8197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    }
8207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
8217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            }
8227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8241244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        @Override
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mToken) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "WakeLock{"
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Integer.toHexString(System.identityHashCode(this))
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " held=" + mHeld + ", refCount=" + mCount + "}";
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
832322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis    }
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
834