PowerManager.java revision 9567a66a5e6f49dd8495fb5f6e2efb9f32e84b35
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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class gives you control of the power state of the device. 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Device battery life will be significantly affected by the use of this API.</b> Do not 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * acquire WakeLocks unless you really need them, use the minimum levels possible, and be sure 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to release it as soon as you can. 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>You can obtain an instance of this class by calling 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService(java.lang.String) Context.getSystemService()}. 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The primary API you'll use is {@link #newWakeLock(int, String) newWakeLock()}. This will 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * create a {@link PowerManager.WakeLock} object. You can then use methods on this object to 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * control the power state of the device. In practice it's quite simple: 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@samplecode 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wl.acquire(); 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ..screen will stay on during this section.. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wl.release(); 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following flags are defined, with varying effects on system power. <i>These flags are 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mutually exclusive - you may only specify one of them.</i> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Flag Value</th> 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <th>CPU</th> <th>Screen</th> <th>Keyboard</th></tr> 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #PARTIAL_WAKE_LOCK}</th> 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>On*</td> <td>Off</td> <td>Off</td> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SCREEN_DIM_WAKE_LOCK}</th> 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>On</td> <td>Dim</td> <td>Off</td> 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #SCREEN_BRIGHT_WAKE_LOCK}</th> 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>On</td> <td>Bright</td> <td>Off</td> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #FULL_WAKE_LOCK}</th> 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>On</td> <td>Bright</td> <td>Bright</td> 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>*<i>If you hold a partial wakelock, the CPU will continue to run, irrespective of any timers 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and even after the user presses the power button. In all other wakelocks, the CPU will run, but 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user can still put the device to sleep using the power button.</i> 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In addition, you can add two more flags, which affect behavior of the screen only. <i>These 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flags have no effect when combined with a {@link #PARTIAL_WAKE_LOCK}.</i> 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" frame="hsides" rules="rows"> 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <thead> 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>Flag Value</th> <th>Description</th></tr> 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </thead> 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tbody> 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #ACQUIRE_CAUSES_WAKEUP}</th> 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>Normal wake locks don't actually turn on the illumination. Instead, they cause 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the illumination to remain on once it turns on (e.g. from user activity). This flag 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will force the screen and/or keyboard to turn on immediately, when the WakeLock is 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * acquired. A typical use would be for notifications which are important for the user to 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * see immediately.</td> 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tr><th>{@link #ON_AFTER_RELEASE}</th> 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <td>If this flag is set, the user activity timer will be reset when the WakeLock is 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * released, causing the illumination to remain on a bit longer. This can be used to 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reduce flicker if you are cycling between wake lock conditions.</td> 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tr> 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </tbody> 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table> 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 100d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK} 101d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code <uses-permission>} element of the application's manifest. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PowerManager 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PowerManager"; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These internal values define the underlying power elements that we might 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * want to control individually. Eventually we'd like to expose them. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int WAKE_BIT_CPU_STRONG = 1; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int WAKE_BIT_CPU_WEAK = 2; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int WAKE_BIT_SCREEN_DIM = 4; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int WAKE_BIT_SCREEN_BRIGHT = 8; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int WAKE_BIT_KEYBOARD_BRIGHT = 16; 116bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood private static final int WAKE_BIT_PROXIMITY_SCREEN_OFF = 32; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LOCK_MASK = WAKE_BIT_CPU_STRONG 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WAKE_BIT_CPU_WEAK 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WAKE_BIT_SCREEN_DIM 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WAKE_BIT_SCREEN_BRIGHT 122bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood | WAKE_BIT_KEYBOARD_BRIGHT 123bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood | WAKE_BIT_PROXIMITY_SCREEN_OFF; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wake lock that ensures that the CPU is running. The screen might 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not be on. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PARTIAL_WAKE_LOCK = WAKE_BIT_CPU_STRONG; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wake lock that ensures that the screen and keyboard are on at 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * full brightness. 1349567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * 1359567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * <p class="note">Most applications should strongly consider using 1369567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON}. 1379567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * This window flag will be correctly managed by the platform 1389567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * as the user moves between applications and doesn't require a special permission.</p> 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FULL_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_BRIGHT 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WAKE_BIT_KEYBOARD_BRIGHT; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1449567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * @deprecated Most applications should use 1459567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead 1469567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * of this type of wake lock, as it will be correctly managed by the platform 1479567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * as the user moves between applications and doesn't require a special permission. 1489567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wake lock that ensures that the screen is on at full brightness; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the keyboard backlight will be allowed to go off. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1529567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn @Deprecated 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SCREEN_BRIGHT_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_BRIGHT; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wake lock that ensures that the screen is on (but may be dimmed); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the keyboard backlight will be allowed to go off. 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SCREEN_DIM_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_DIM; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 162bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * Wake lock that turns the screen off when the proximity sensor activates. 163bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * Since not all devices have proximity sensors, use 164bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * {@link #getSupportedWakeLockFlags() getSupportedWakeLockFlags()} to determine if 165bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * this wake lock mode is supported. 166bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * 167bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * {@hide} 168bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood */ 169bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = WAKE_BIT_PROXIMITY_SCREEN_OFF; 170bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 171bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood /** 1720e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * Flag for {@link WakeLock#release release(int)} to defer releasing a 1730e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * {@link #WAKE_BIT_PROXIMITY_SCREEN_OFF} wakelock until the proximity sensor returns 1740e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * a negative value. 1750e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * 1760e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * {@hide} 1770e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood */ 1780e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood public static final int WAIT_FOR_PROXIMITY_NEGATIVE = 1; 1790e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood 1800e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood /** 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally wake locks don't actually wake the device, they just cause 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it to remain on once it's already on. Think of the video player 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * app as the normal behavior. Notifications that pop up and want 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the device to be on are the exception; use this flag to be like them. 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Does not work with PARTIAL_WAKE_LOCKs. 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ACQUIRE_CAUSES_WAKEUP = 0x10000000; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When this wake lock is released, poke the user activity timer 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * so the screen stays on for a little longer. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Will not turn the screen on if it is not already on. See {@link #ACQUIRE_CAUSES_WAKEUP} 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if you want that. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Does not work with PARTIAL_WAKE_LOCKs. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ON_AFTER_RELEASE = 0x20000000; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Class lets you say that you need to have the device on. 203d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 204d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Call release when you are done and don't need the lock anymore. 205d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 206d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK} 207d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code <uses-permission>} element of the application's manifest. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class WakeLock 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int RELEASE_WAKE_LOCK = 1; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Runnable mReleaser = new Runnable() { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project release(); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mFlags; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mTag; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder mToken; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount = 0; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRefCounted = true; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mHeld = false; 2257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn WorkSource mWorkSource; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WakeLock(int flags, String tag) 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (flags & LOCK_MASK) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PARTIAL_WAKE_LOCK: 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SCREEN_DIM_WAKE_LOCK: 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SCREEN_BRIGHT_WAKE_LOCK: 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FULL_WAKE_LOCK: 234bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood case PROXIMITY_SCREEN_OFF_WAKE_LOCK: 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags = flags; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mToken = new Binder(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets whether this WakeLock is ref counted. 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2488310b42fbc086b0f05fc8ef45ac34c7e099c485eJoe Onorato * <p>Wake locks are reference counted by default. 2498310b42fbc086b0f05fc8ef45ac34c7e099c485eJoe Onorato * 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value true for ref counted, false for not ref counted. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReferenceCounted(boolean value) 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = value; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Makes sure the device is on at the level you asked when you created 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the wake lock. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRefCounted || mCount++ == 0) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.acquireWakeLock(mFlags, mToken, mTag, mWorkSource); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = true; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Makes sure the device is on at the level you asked when you created 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the wake lock. The lock will be released after the given timeout. 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timeout Release the lock after the give timeout in milliseconds. 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire(long timeout) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquire(); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.postDelayed(mReleaser, timeout); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Release your claim to the CPU or screen being on. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It may turn off shortly after you release it, or it may not if there 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are other wake locks held. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2950e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood release(0); 2960e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood } 2970e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood 2980e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood /** 2990e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * Release your claim to the CPU or screen being on. 3000e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * @param flags Combination of flag values to modify the release behavior. 3010e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * Currently only {@link #WAIT_FOR_PROXIMITY_NEGATIVE} is supported. 3020e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * 3030e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * <p> 3040e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * It may turn off shortly after you release it, or it may not if there 3050e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * are other wake locks held. 3060e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * 3070e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * {@hide} 3080e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood */ 3090e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood public void release(int flags) 3100e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRefCounted || --mCount == 0) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3140e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood mService.releaseWakeLock(mToken, flags); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCount < 0) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WakeLock under-locked " + mTag); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isHeld() 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeld; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setWorkSource(WorkSource ws) { 3337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mToken) { 3347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws != null && ws.size() == 0) { 3357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ws = null; 3367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = true; 3387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws == null) { 3397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = null; 3407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else if (mWorkSource == null) { 3417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn changed = mWorkSource != null; 3427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = new WorkSource(ws); 3437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 3447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn changed = mWorkSource.diff(ws); 3457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed) { 3467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource.set(ws); 3477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed && mHeld) { 3507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn try { 3517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.updateWakeLockWorkSource(mToken, mWorkSource); 3527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } catch (RemoteException e) { 3537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "WakeLock{" 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " held=" + mHeld + ", refCount=" + mCount + "}"; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeld) { 37160d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor Log.wtf(TAG, "WakeLock finalized while still held: " + mTag); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3730e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood mService.releaseWakeLock(mToken, 0); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get a wake lock at the level of the flags parameter. Call 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link WakeLock#acquire() acquire()} on the object to acquire the 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wake lock, and {@link WakeLock#release release()} when you are done. 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@samplecode 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *PowerManager pm = (PowerManager)mContext.getSystemService( 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.POWER_SERVICE); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *PowerManager.WakeLock wl = pm.newWakeLock( 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PowerManager.SCREEN_DIM_WAKE_LOCK 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * | PowerManager.ON_AFTER_RELEASE, 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TAG); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *wl.acquire(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // ... 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *wl.release(); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3989567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * <p class="note">If using this to keep the screen on, you should strongly consider using 3999567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead. 4009567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * This window flag will be correctly managed by the platform 4019567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * as the user moves between applications and doesn't require a special permission.</p> 4029567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags Combination of flag values defining the requested behavior of the WakeLock. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag Your class name (or other tag) for debugging purposes. 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WakeLock#acquire() 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WakeLock#release() 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WakeLock newWakeLock(int flags, String tag) 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 411f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood if (tag == null) { 412f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood throw new NullPointerException("tag is null in PowerManager.newWakeLock"); 413f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WakeLock(flags, tag); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * User activity happened. 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Turns the device from whatever state it's in to full on, and resets 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the auto-off timer. 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param when is used to order this correctly with the wake lock calls. 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This time should be in the {@link SystemClock#uptimeMillis 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SystemClock.uptimeMillis()} time base. 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param noChangeLights should be true if you don't want the lights to 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * turn on because of this event. This is set when the power 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * key goes down. We want the device to stay on while the button 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is down, but we're about to turn off. Otherwise the lights 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flash on and then off and it looks weird. 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void userActivity(long when, boolean noChangeLights) 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.userActivity(when, noChangeLights); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Force the device to go to sleep. Overrides all the wake locks that are 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * held. 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param time is used to order this correctly with the wake lock calls. 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The time should be in the {@link SystemClock#uptimeMillis 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SystemClock.uptimeMillis()} time base. 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void goToSleep(long time) 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.goToSleep(time); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 455bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 456237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood /** 457237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * sets the brightness of the backlights (screen, keyboard, button). 458237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * 459237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * @param brightness value from 0 to 255 460237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * 461237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * {@hide} 462237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood */ 463237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood public void setBacklightBrightness(int brightness) 464237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood { 465237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood try { 466237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mService.setBacklightBrightness(brightness); 467237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } catch (RemoteException e) { 468237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } 469237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } 470237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood 471bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood /** 472bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * Returns the set of flags for {@link #newWakeLock(int, String) newWakeLock()} 473bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * that are supported on the device. 474bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * For example, to test to see if the {@link #PROXIMITY_SCREEN_OFF_WAKE_LOCK} 475bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * is supported: 476bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * 477bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * {@samplecode 478bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 479bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * int supportedFlags = pm.getSupportedWakeLockFlags(); 480bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * boolean proximitySupported = ((supportedFlags & PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) 481bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK); 482bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * } 483bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * 484bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * @return the set of supported WakeLock flags. 485bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * 486bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * {@hide} 487bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood */ 488bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood public int getSupportedWakeLockFlags() 489bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood { 490bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood try { 491bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood return mService.getSupportedWakeLockFlags(); 492bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } catch (RemoteException e) { 493bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood return 0; 494bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 495bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 496bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 497322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis /** 498322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * Returns whether the screen is currently on. The screen could be bright 499322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * or dim. 500322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * 501322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * {@samplecode 502322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 503322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * boolean isScreenOn = pm.isScreenOn(); 504322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * } 505322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * 506322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * @return whether the screen is on (bright or dim). 507322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis */ 508322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis public boolean isScreenOn() 509322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis { 510322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis try { 511322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis return mService.isScreenOn(); 512322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis } catch (RemoteException e) { 513322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis return false; 514322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis } 515322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis } 516322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis 51750a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker /** 51850a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * Reboot the device. Will not return if the reboot is 5196fd4e76ca1866772d125089e8f2e3f1d54fcae08Doug Zongker * successful. Requires the {@link android.Manifest.permission#REBOOT} 52050a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * permission. 52150a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * 52250a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * @param reason code to pass to the kernel (e.g., "recovery") to 52350a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * request special boot modes, or null. 52450a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker */ 52550a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker public void reboot(String reason) 52650a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker { 52750a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker try { 52850a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker mService.reboot(reason); 52950a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker } catch (RemoteException e) { 53050a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker } 53150a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker } 53250a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PowerManager() 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PowerManager(IPowerManager service, Handler handler) 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler = handler; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: It would be nice to be able to set the poke lock here, 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but I'm not sure what would be acceptable as an interface - 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either a PokeLock object (like WakeLock) or, possibly just a 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method call to set the poke lock. 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPowerManager mService; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler mHandler; 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 556