PowerManager.java revision f9bba13692c10ff99a52f79d6d0f04c96117ff57
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>
1819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Since not all devices have proximity sensors, use {@link #isWakeLockLevelSupported}
1821244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to determine whether this wake lock level is supported.
1831244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
184bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood     *
185bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood     * {@hide}
186bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood     */
187155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 0x00000020;
188bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood
189bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood    /**
190155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * Mask for the wake lock level component of a combined wake lock level and flags integer.
1910e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood     *
192155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * @hide
1930e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood     */
194155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int WAKE_LOCK_LEVEL_MASK = 0x0000ffff;
1950e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood
1960e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood    /**
1971244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Wake lock flag: Turn the screen on when the wake lock is acquired.
1981244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Normally wake locks don't actually wake the device, they just cause
2001244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * the screen to remain on once it's already on.  Think of the video player
2011244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * application as the normal behavior.  Notifications that pop up and want
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the device to be on are the exception; use this flag to be like them.
2031244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
2041244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Cannot be used with {@link #PARTIAL_WAKE_LOCK}.
2051244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
207155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int ACQUIRE_CAUSES_WAKEUP = 0x10000000;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Wake lock flag: When this wake lock is released, poke the user activity timer
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so the screen stays on for a little longer.
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2131244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Will not turn the screen on if it is not already on.
2141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * See {@link #ACQUIRE_CAUSES_WAKEUP} if you want that.
2151244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
2161244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Cannot be used with {@link #PARTIAL_WAKE_LOCK}.
2171244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
219155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int ON_AFTER_RELEASE = 0x20000000;
220155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown
221155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    /**
222155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * Flag for {@link WakeLock#release release(int)} to defer releasing a
223155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * {@link #WAKE_BIT_PROXIMITY_SCREEN_OFF} wake lock until the proximity sensor returns
224155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * a negative value.
225155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     *
226155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     * {@hide}
227155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown     */
228155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static final int WAIT_FOR_PROXIMITY_NEGATIVE = 1;
2297304c343821309dd15f769b18f1de2fa43751573Jeff Brown
2307304c343821309dd15f769b18f1de2fa43751573Jeff Brown    /**
2317304c343821309dd15f769b18f1de2fa43751573Jeff Brown     * Brightness value for fully on.
2327304c343821309dd15f769b18f1de2fa43751573Jeff Brown     * @hide
2337304c343821309dd15f769b18f1de2fa43751573Jeff Brown     */
2347304c343821309dd15f769b18f1de2fa43751573Jeff Brown    public static final int BRIGHTNESS_ON = 255;
2357304c343821309dd15f769b18f1de2fa43751573Jeff Brown
2367304c343821309dd15f769b18f1de2fa43751573Jeff Brown    /**
2379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Brightness value for fully off.
2387304c343821309dd15f769b18f1de2fa43751573Jeff Brown     * @hide
2397304c343821309dd15f769b18f1de2fa43751573Jeff Brown     */
2409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int BRIGHTNESS_OFF = 0;
2417304c343821309dd15f769b18f1de2fa43751573Jeff Brown
242b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    // Note: Be sure to update android.os.BatteryStats and PowerManager.h
243b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    // if adding or modifying user activity event constants.
244b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown
245b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    /**
246b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * User activity event type: Unspecified event type.
247b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * @hide
248b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     */
249b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    public static final int USER_ACTIVITY_EVENT_OTHER = 0;
250b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown
251b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    /**
252b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * User activity event type: Button or key pressed or released.
253b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * @hide
254b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     */
255b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    public static final int USER_ACTIVITY_EVENT_BUTTON = 1;
256b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown
257b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    /**
258b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * User activity event type: Touch down, move or up.
259b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     * @hide
260b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown     */
261b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown    public static final int USER_ACTIVITY_EVENT_TOUCH = 2;
262b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown
2639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
2649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * User activity flag: Do not restart the user activity timeout or brighten
2659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * the display in response to user activity if it is already dimmed.
2669630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
2679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
2689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS = 1 << 0;
2699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2709630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
2719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Special wake lock tag used for the wake lock in the Window Manager that handles the
2729630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} flag.
2739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
2749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
2759630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final String KEEP_SCREEN_ON_FLAG_TAG = "KEEP_SCREEN_ON_FLAG";
2769630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2779630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
2789630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Go to sleep reason code: Going to sleep due by user request.
2799630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
2809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
2819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int GO_TO_SLEEP_REASON_USER = 0;
2829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
2849630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Go to sleep reason code: Going to sleep due by request of the
2859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * device administration policy.
2869630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
2879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
2889630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int GO_TO_SLEEP_REASON_DEVICE_ADMIN = 1;
2899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
2919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Go to sleep reason code: Going to sleep due to a screen timeout.
2929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
2939630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
2949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public static final int GO_TO_SLEEP_REASON_TIMEOUT = 2;
2959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2969630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    final Context mContext;
2971244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    final IPowerManager mService;
2981244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    final Handler mHandler;
2991244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
3001244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
3011244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@hide}
3021244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
3039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public PowerManager(Context context, IPowerManager service, Handler handler) {
3049630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mContext = context;
3051244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        mService = service;
3061244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        mHandler = handler;
3071244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
3081244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
3091244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
3109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Gets the minimum supported screen brightness setting.
3119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * The screen may be allowed to become dimmer than this value but
3129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * this is the minimum value that can be set by the user.
3139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
3149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
3159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public int getMinimumScreenBrightnessSetting() {
3169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        return mContext.getResources().getInteger(
317f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown                com.android.internal.R.integer.config_screenBrightnessSettingMinimum);
3189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
3199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
3209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
3219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Gets the maximum supported screen brightness setting.
3229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * The screen may be allowed to become dimmer than this value but
3239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * this is the maximum value that can be set by the user.
3249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
3259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
3269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public int getMaximumScreenBrightnessSetting() {
327f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown        return mContext.getResources().getInteger(
328f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown                com.android.internal.R.integer.config_screenBrightnessSettingMaximum);
3299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
3309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
3319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
3329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Gets the default screen brightness setting.
3339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @hide
3349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
3359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public int getDefaultScreenBrightnessSetting() {
336f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown        return mContext.getResources().getInteger(
337f9bba13692c10ff99a52f79d6d0f04c96117ff57Jeff Brown                com.android.internal.R.integer.config_screenBrightnessSettingDefault);
3389630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
3399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
3409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
3411244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Creates a new wake lock with the specified level and flags.
3421244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
3431244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * The {@code levelAndFlags} parameter specifies a wake lock level and optional flags
3441244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * combined using the logical OR operator.
3451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3461244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * The wake lock levels are: {@link #PARTIAL_WAKE_LOCK},
3471244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@link #FULL_WAKE_LOCK}, {@link #SCREEN_DIM_WAKE_LOCK}
3481244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * and {@link #SCREEN_BRIGHT_WAKE_LOCK}.  Exactly one wake lock level must be
3491244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * specified as part of the {@code levelAndFlags} parameter.
3501244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3511244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * The wake lock flags are: {@link #ACQUIRE_CAUSES_WAKEUP}
3521244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * and {@link #ON_AFTER_RELEASE}.  Multiple flags can be combined as part of the
3531244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@code levelAndFlags} parameters.
3541244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3551244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Call {@link WakeLock#acquire() acquire()} on the object to acquire the
3561244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * wake lock, and {@link WakeLock#release release()} when you are done.
3571244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3581244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@samplecode
3591244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * PowerManager pm = (PowerManager)mContext.getSystemService(
3601244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *                                          Context.POWER_SERVICE);
3611244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * PowerManager.WakeLock wl = pm.newWakeLock(
3621244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *                                      PowerManager.SCREEN_DIM_WAKE_LOCK
3631244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *                                      | PowerManager.ON_AFTER_RELEASE,
3641244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *                                      TAG);
3651244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * wl.acquire();
3661244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * // ... do work...
3671244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * wl.release();
3681244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * }
3691244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
3701244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Although a wake lock can be created without special permissions,
3711244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * the {@link android.Manifest.permission#WAKE_LOCK} permission is
3721244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * required to actually acquire or release the wake lock that is returned.
3731244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p class="note">
3741244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * If using this to keep the screen on, you should strongly consider using
3751244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead.
3761244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * This window flag will be correctly managed by the platform
3771244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * as the user moves between applications and doesn't require a special permission.
3781244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
3791244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
3801244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param levelAndFlags Combination of wake lock level and flag values defining
3811244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * the requested behavior of the WakeLock.
3821244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param tag Your class name (or other tag) for debugging purposes.
3831244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
3841244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see WakeLock#acquire()
3851244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see WakeLock#release()
3861244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #PARTIAL_WAKE_LOCK
3871244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #FULL_WAKE_LOCK
3881244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #SCREEN_DIM_WAKE_LOCK
3891244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #SCREEN_BRIGHT_WAKE_LOCK
3901244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #ACQUIRE_CAUSES_WAKEUP
3911244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @see #ON_AFTER_RELEASE
3921244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
3931244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public WakeLock newWakeLock(int levelAndFlags, String tag) {
394155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown        validateWakeLockParameters(levelAndFlags, tag);
395155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown        return new WakeLock(levelAndFlags, tag);
396155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    }
397155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown
398155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    /** @hide */
399155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown    public static void validateWakeLockParameters(int levelAndFlags, String tag) {
400155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown        switch (levelAndFlags & WAKE_LOCK_LEVEL_MASK) {
401155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case PARTIAL_WAKE_LOCK:
402155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case SCREEN_DIM_WAKE_LOCK:
403155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case SCREEN_BRIGHT_WAKE_LOCK:
404155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case FULL_WAKE_LOCK:
405155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            case PROXIMITY_SCREEN_OFF_WAKE_LOCK:
406155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown                break;
407155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown            default:
408155fc70252fd9ccee1f05da4e6966a99ec86d499Jeff Brown                throw new IllegalArgumentException("Must specify a valid wake lock level.");
4091244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
4101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        if (tag == null) {
4111244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            throw new IllegalArgumentException("The tag must not be null.");
4121244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
4131244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
4141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
4151244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
4161244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Notifies the power manager that user activity happened.
4171244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
4189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Resets the auto-off timer and brightens the screen if the device
4199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * is not asleep.  This is what happens normally when a key or the touch
4209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * screen is pressed or when some other user activity occurs.
4219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * This method does not wake up the device if it has been put to sleep.
4221244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
4231244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
4241244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
4251244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
4261244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param when The time of the user activity, in the {@link SystemClock#uptimeMillis()}
4271244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * time base.  This timestamp is used to correctly order the user activity with
4281244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * other power management functions.  It should be set
4291244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to the timestamp of the input event that caused the user activity.
4301244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param noChangeLights If true, does not cause the keyboard backlight to turn on
4311244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * because of this event.  This is set when the power key is pressed.
4321244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * We want the device to stay on while the button is down, but we're about
4331244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to turn off the screen so we don't want the keyboard backlight to turn on again.
4341244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Otherwise the lights flash on and then off and it looks weird.
4359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     *
4369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #wakeUp
4379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #goToSleep
4381244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
4391244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public void userActivity(long when, boolean noChangeLights) {
4401244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
4419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mService.userActivity(when, USER_ACTIVITY_EVENT_OTHER,
4429630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    noChangeLights ? USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS : 0);
4431244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
4441244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
4451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
4461244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
4471244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown   /**
4481244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Forces the device to go to sleep.
4491244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
4509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Overrides all the wake locks that are held.
4519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * This is what happens when the power key is pressed to turn off the screen.
4521244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
4531244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
4541244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
4551244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
4561244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param time The time when the request to go to sleep was issued, in the
4571244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
4581244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * order the user activity with other power management functions.  It should be set
4591244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to the timestamp of the input event that caused the request to go to sleep.
4609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     *
4619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #userActivity
4629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #wakeUp
4631244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
4641244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public void goToSleep(long time) {
4651244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
4669630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mService.goToSleep(time, GO_TO_SLEEP_REASON_USER);
4679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        } catch (RemoteException e) {
4689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
4699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
4709630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
4719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
4729630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Forces the device to wake up from sleep.
4739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * <p>
4749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * If the device is currently asleep, wakes it up, otherwise does nothing.
4759630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * This is what happens when the power key is pressed to turn on the screen.
4769630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * </p><p>
4779630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
4789630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * </p>
4799630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     *
4809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @param time The time when the request to wake up was issued, in the
4819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * {@link SystemClock#uptimeMillis()} time base.  This timestamp is used to correctly
4829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * order the user activity with other power management functions.  It should be set
4839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * to the timestamp of the input event that caused the request to wake up.
4849630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     *
4859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #userActivity
4869630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @see #goToSleep
4879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
4889630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public void wakeUp(long time) {
4899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        try {
4909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mService.wakeUp(time);
4911244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
4921244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
4931244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
4941244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
4951244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
4961244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Sets the brightness of the backlights (screen, keyboard, button).
4971244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * <p>
4981244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
4991244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
5001244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
5011244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param brightness The brightness value from 0 to 255.
5021244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
5031244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@hide}
5041244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
5051244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public void setBacklightBrightness(int brightness) {
5061244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
5079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mService.setTemporaryScreenBrightnessSettingOverride(brightness);
5081244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
5091244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
5101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
5111244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
5121244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown   /**
5139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Returns true if the specified wake lock level is supported.
5141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
5159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @param level The wake lock level to check.
5169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * @return True if the specified wake lock level is supported.
5171244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
5181244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * {@hide}
5191244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
5209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public boolean isWakeLockLevelSupported(int level) {
5211244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
5229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            return mService.isWakeLockLevelSupported(level);
5231244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
5249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            return false;
5251244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
5261244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
5271244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
5281244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
5291244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * Returns whether the screen is currently on.
5301244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * <p>
5311244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * Only indicates whether the screen is on.  The screen could be either bright or dim.
5321244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * </p><p>
5331244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * {@samplecode
5341244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
5351244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * boolean isScreenOn = pm.isScreenOn();
5361244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * }
5371244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * </p>
5381244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      *
5391244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      * @return whether the screen is on (bright or dim).
5401244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown      */
5411244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public boolean isScreenOn() {
5421244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
5431244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            return mService.isScreenOn();
5441244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
5451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            return false;
5461244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
5471244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
5481244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5501244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Reboot the device.  Will not return if the reboot is successful.
551d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * <p>
5521244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Requires the {@link android.Manifest.permission#REBOOT} permission.
5531244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
5541244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *
5551244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * @param reason code to pass to the kernel (e.g., "recovery") to
5561244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     *               request special boot modes, or null.
5571244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     */
5581244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public void reboot(String reason) {
5591244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        try {
5601244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            mService.reboot(reason);
5611244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        } catch (RemoteException e) {
5621244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
5631244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    }
5641244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
5651244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    /**
5661244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * A wake lock is a mechanism to indicate that your application needs
5671244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * to have the device stay on.
568d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * <p>
569d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK}
570d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * permission in an {@code &lt;uses-permission&gt;} element of the application's manifest.
5711244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Obtain a wake lock by calling {@link PowerManager#newWakeLock(int, String)}.
5721244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
5731244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Call {@link #acquire()} to acquire the wake lock and force the device to stay
5741244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * on at the level that was requested when the wake lock was created.
5751244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p><p>
5761244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * Call {@link #release()} when you are done and don't need the lock anymore.
5771244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * It is very important to do this as soon as possible to avoid running down the
5781244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * device's battery excessively.
5791244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown     * </p>
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5811244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown    public final class WakeLock {
5821244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private final int mFlags;
5831244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private final String mTag;
5841244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private final IBinder mToken;
5851244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private int mCount;
5861244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private boolean mRefCounted = true;
5871244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private boolean mHeld;
5881244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private WorkSource mWorkSource;
5891244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
5901244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        private final Runnable mReleaser = new Runnable() {
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                release();
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5961244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        WakeLock(int flags, String tag) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFlags = flags;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTag = tag;
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mToken = new Binder();
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6021244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        @Override
6031244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        protected void finalize() throws Throwable {
6041244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            synchronized (mToken) {
6051244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                if (mHeld) {
6061244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);
6071244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    try {
6081244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        mService.releaseWakeLock(mToken, 0);
6091244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    } catch (RemoteException e) {
6101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    }
6111244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                }
6121244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            }
6131244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        }
6141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6161244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Sets whether this WakeLock is reference counted.
6171244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * <p>
6181244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Wake locks are reference counted by default.  If a wake lock is
6191244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * reference counted, then each call to {@link #acquire()} must be
6201244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * balanced by an equal number of calls to {@link #release()}.  If a wake
6211244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * lock is not reference counted, then one call to {@link #release()} is
6221244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * sufficient to undo the effect of all previous calls to {@link #acquire()}.
6231244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
6248310b42fbc086b0f05fc8ef45ac34c7e099c485eJoe Onorato         *
6251244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @param value True to make the wake lock reference counted, false to
6261244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * make the wake lock non-reference counted.
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6281244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        public void setReferenceCounted(boolean value) {
6291244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            synchronized (mToken) {
6301244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                mRefCounted = value;
6311244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown            }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6351244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Acquires the wake lock.
6361244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * <p>
6371244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Ensures that the device is on at the level requested when
6381244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * the wake lock was created.
6391244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6411244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        public void acquire() {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mToken) {
643d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                acquireLocked();
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
646d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6481244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Acquires the wake lock with a timeout.
6491244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * <p>
6501244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Ensures that the device is on at the level requested when
6511244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * the wake lock was created.  The lock will be released after the given timeout
6521244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * expires.
6531244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
6541244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         *
6551244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @param timeout The timeout after which to release the wake lock, in milliseconds.
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void acquire(long timeout) {
658d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato            synchronized (mToken) {
659d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                acquireLocked();
660d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                mHandler.postDelayed(mReleaser, timeout);
661d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato            }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6631244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
664d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato        private void acquireLocked() {
665d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato            if (!mRefCounted || mCount++ == 0) {
666ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // Do this even if the wake lock is already thought to be held (mHeld == true)
667ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // because non-reference counted wake locks are not always properly released.
668ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // For example, the keyguard's wake lock might be forcibly released by the
669ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // power manager without the keyguard knowing.  A subsequent call to acquire
670ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // should immediately acquire the wake lock once again despite never having
671ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                // been explicitly released by the keyguard.
672d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                mHandler.removeCallbacks(mReleaser);
673ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                try {
6749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    mService.acquireWakeLock(mToken, mFlags, mTag, mWorkSource);
675ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                } catch (RemoteException e) {
676d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato                }
677ff1baef86c3b34fe2aec33a22bc2d06112af4c03Jeff Brown                mHeld = true;
678d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato            }
679d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato        }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6821244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Releases the wake lock.
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <p>
6841244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * This method releases your claim to the CPU or screen being on.
6851244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * The screen may turn off shortly after you release the wake lock, or it may
6861244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * not if there are other wake locks still held.
6871244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
689d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato        public void release() {
6900e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood            release(0);
6910e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood        }
6920e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood
6930e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood        /**
6941244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Releases the wake lock with flags to modify the release behavior.
6950e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood         * <p>
6961244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * This method releases your claim to the CPU or screen being on.
6971244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * The screen may turn off shortly after you release the wake lock, or it may
6981244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * not if there are other wake locks still held.
6991244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
7001244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         *
7011244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @param flags Combination of flag values to modify the release behavior.
7021244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Currently only {@link #WAIT_FOR_PROXIMITY_NEGATIVE} is supported.
7030e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood         *
7040e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood         * {@hide}
7050e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood         */
706d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato        public void release(int flags) {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mToken) {
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mRefCounted || --mCount == 0) {
709b5962e73e841455b8e2a4e2d5c0ef0a19d62a803Jake Hamby                    mHandler.removeCallbacks(mReleaser);
7101244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    if (mHeld) {
7111244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        try {
7121244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                            mService.releaseWakeLock(mToken, flags);
7131244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        } catch (RemoteException e) {
7141244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        }
7151244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                        mHeld = false;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mCount < 0) {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException("WakeLock under-locked " + mTag);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7241244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        /**
7251244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Returns true if the wake lock has been acquired but not yet released.
7261244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         *
7271244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @return True if the wake lock is held.
7281244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         */
7291244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        public boolean isHeld() {
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mToken) {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHeld;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7351244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        /**
7361244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * Sets the work source associated with the wake lock.
7371244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * <p>
7381244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * The work source is used to determine on behalf of which application
7391244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * the wake lock is being held.  This is useful in the case where a
7401244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * service is performing work on behalf of an application so that the
7411244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * cost of that work can be accounted to the application.
7421244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * </p>
7431244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         *
7441244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         * @param ws The work source, or null if none.
7451244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown         */
7467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        public void setWorkSource(WorkSource ws) {
7477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            synchronized (mToken) {
7487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                if (ws != null && ws.size() == 0) {
7497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    ws = null;
7507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
7511244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
7521244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                final boolean changed;
7537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                if (ws == null) {
7541244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    changed = mWorkSource != null;
7557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    mWorkSource = null;
7567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                } else if (mWorkSource == null) {
7571244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown                    changed = true;
7587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    mWorkSource = new WorkSource(ws);
7597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                } else {
7607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    changed = mWorkSource.diff(ws);
7617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    if (changed) {
7627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                        mWorkSource.set(ws);
7637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    }
7647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
7651244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown
7667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                if (changed && mHeld) {
7677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    try {
7687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                        mService.updateWakeLockWorkSource(mToken, mWorkSource);
7697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    } catch (RemoteException e) {
7707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    }
7717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
7727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            }
7737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7751244cdaedd5bb4518fc75c9a25b834190ea31877Jeff Brown        @Override
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mToken) {
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "WakeLock{"
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Integer.toHexString(System.identityHashCode(this))
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " held=" + mHeld + ", refCount=" + mCount + "}";
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
783322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis    }
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
785