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 <uses-permission>} 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 <uses-permission>} 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