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; 2007304c343821309dd15f769b18f1de2fa43751573Jeff Brown 2017304c343821309dd15f769b18f1de2fa43751573Jeff Brown /** 2027304c343821309dd15f769b18f1de2fa43751573Jeff Brown * Brightness value to use when battery is low. 2037304c343821309dd15f769b18f1de2fa43751573Jeff Brown * @hide 2047304c343821309dd15f769b18f1de2fa43751573Jeff Brown */ 2057304c343821309dd15f769b18f1de2fa43751573Jeff Brown public static final int BRIGHTNESS_LOW_BATTERY = 10; 2067304c343821309dd15f769b18f1de2fa43751573Jeff Brown 2077304c343821309dd15f769b18f1de2fa43751573Jeff Brown /** 2087304c343821309dd15f769b18f1de2fa43751573Jeff Brown * Brightness value for fully on. 2097304c343821309dd15f769b18f1de2fa43751573Jeff Brown * @hide 2107304c343821309dd15f769b18f1de2fa43751573Jeff Brown */ 2117304c343821309dd15f769b18f1de2fa43751573Jeff Brown public static final int BRIGHTNESS_ON = 255; 2127304c343821309dd15f769b18f1de2fa43751573Jeff Brown 2137304c343821309dd15f769b18f1de2fa43751573Jeff Brown /** 2147304c343821309dd15f769b18f1de2fa43751573Jeff Brown * Brightness value for dim backlight. 2157304c343821309dd15f769b18f1de2fa43751573Jeff Brown * @hide 2167304c343821309dd15f769b18f1de2fa43751573Jeff Brown */ 2177304c343821309dd15f769b18f1de2fa43751573Jeff Brown public static final int BRIGHTNESS_DIM = 20; 2187304c343821309dd15f769b18f1de2fa43751573Jeff Brown 2197304c343821309dd15f769b18f1de2fa43751573Jeff Brown /** 2207304c343821309dd15f769b18f1de2fa43751573Jeff Brown * Brightness value for fully off. 2217304c343821309dd15f769b18f1de2fa43751573Jeff Brown * @hide 2227304c343821309dd15f769b18f1de2fa43751573Jeff Brown */ 2237304c343821309dd15f769b18f1de2fa43751573Jeff Brown public static final int BRIGHTNESS_OFF = 0; 2247304c343821309dd15f769b18f1de2fa43751573Jeff Brown 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Class lets you say that you need to have the device on. 227d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 228d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Call release when you are done and don't need the lock anymore. 229d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 230d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WakeLock must request the {@code android.permission.WAKE_LOCK} 231d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code <uses-permission>} element of the application's manifest. 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class WakeLock 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int RELEASE_WAKE_LOCK = 1; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Runnable mReleaser = new Runnable() { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project release(); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mFlags; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mTag; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder mToken; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount = 0; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRefCounted = true; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mHeld = false; 2497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn WorkSource mWorkSource; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WakeLock(int flags, String tag) 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (flags & LOCK_MASK) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PARTIAL_WAKE_LOCK: 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SCREEN_DIM_WAKE_LOCK: 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SCREEN_BRIGHT_WAKE_LOCK: 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FULL_WAKE_LOCK: 258bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood case PROXIMITY_SCREEN_OFF_WAKE_LOCK: 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags = flags; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mToken = new Binder(); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets whether this WakeLock is ref counted. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2728310b42fbc086b0f05fc8ef45ac34c7e099c485eJoe Onorato * <p>Wake locks are reference counted by default. 2738310b42fbc086b0f05fc8ef45ac34c7e099c485eJoe Onorato * 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value true for ref counted, false for not ref counted. 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReferenceCounted(boolean value) 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = value; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Makes sure the device is on at the level you asked when you created 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the wake lock. 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 288d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato acquireLocked(); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 291d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Makes sure the device is on at the level you asked when you created 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the wake lock. The lock will be released after the given timeout. 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timeout Release the lock after the give timeout in milliseconds. 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire(long timeout) { 299d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato synchronized (mToken) { 300d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato acquireLocked(); 301d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato mHandler.postDelayed(mReleaser, timeout); 302d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 305d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato private void acquireLocked() { 306d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato if (!mRefCounted || mCount++ == 0) { 307d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato mHandler.removeCallbacks(mReleaser); 308d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato try { 309d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato mService.acquireWakeLock(mFlags, mToken, mTag, mWorkSource); 310d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato } catch (RemoteException e) { 311d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato } 312d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato mHeld = true; 313d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato } 314d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Release your claim to the CPU or screen being on. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It may turn off shortly after you release it, or it may not if there 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are other wake locks held. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 323d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato public void release() { 3240e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood release(0); 3250e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood } 3260e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood 3270e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood /** 3280e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * Release your claim to the CPU or screen being on. 3290e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * @param flags Combination of flag values to modify the release behavior. 3300e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * Currently only {@link #WAIT_FOR_PROXIMITY_NEGATIVE} is supported. 3310e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * 3320e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * <p> 3330e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * It may turn off shortly after you release it, or it may not if there 3340e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * are other wake locks held. 3350e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * 3360e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood * {@hide} 3370e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood */ 338d7350e3a56daa44e2d2c6e5175e6430492cf0dc9Joe Onorato public void release(int flags) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRefCounted || --mCount == 0) { 341b5962e73e841455b8e2a4e2d5c0ef0a19d62a803Jake Hamby mHandler.removeCallbacks(mReleaser); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3430e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood mService.releaseWakeLock(mToken, flags); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCount < 0) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WakeLock under-locked " + mTag); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isHeld() 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeld; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setWorkSource(WorkSource ws) { 3627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mToken) { 3637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws != null && ws.size() == 0) { 3647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ws = null; 3657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = true; 3677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws == null) { 3687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = null; 3697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else if (mWorkSource == null) { 3707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn changed = mWorkSource != null; 3717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = new WorkSource(ws); 3727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 3737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn changed = mWorkSource.diff(ws); 3747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed) { 3757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource.set(ws); 3767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed && mHeld) { 3797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn try { 3807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.updateWakeLockWorkSource(mToken, mWorkSource); 3817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } catch (RemoteException e) { 3827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "WakeLock{" 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " held=" + mHeld + ", refCount=" + mCount + "}"; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mToken) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeld) { 40060d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor Log.wtf(TAG, "WakeLock finalized while still held: " + mTag); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4020e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood mService.releaseWakeLock(mToken, 0); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get a wake lock at the level of the flags parameter. Call 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link WakeLock#acquire() acquire()} on the object to acquire the 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wake lock, and {@link WakeLock#release release()} when you are done. 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@samplecode 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *PowerManager pm = (PowerManager)mContext.getSystemService( 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.POWER_SERVICE); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *PowerManager.WakeLock wl = pm.newWakeLock( 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PowerManager.SCREEN_DIM_WAKE_LOCK 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * | PowerManager.ON_AFTER_RELEASE, 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TAG); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *wl.acquire(); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // ... 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *wl.release(); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4279567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * <p class="note">If using this to keep the screen on, you should strongly consider using 4289567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead. 4299567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * This window flag will be correctly managed by the platform 4309567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * as the user moves between applications and doesn't require a special permission.</p> 4319567a66a5e6f49dd8495fb5f6e2efb9f32e84b35Dianne Hackborn * 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags Combination of flag values defining the requested behavior of the WakeLock. 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag Your class name (or other tag) for debugging purposes. 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WakeLock#acquire() 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WakeLock#release() 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WakeLock newWakeLock(int flags, String tag) 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 440f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood if (tag == null) { 441f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood throw new NullPointerException("tag is null in PowerManager.newWakeLock"); 442f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WakeLock(flags, tag); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * User activity happened. 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Turns the device from whatever state it's in to full on, and resets 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the auto-off timer. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param when is used to order this correctly with the wake lock calls. 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This time should be in the {@link SystemClock#uptimeMillis 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SystemClock.uptimeMillis()} time base. 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param noChangeLights should be true if you don't want the lights to 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * turn on because of this event. This is set when the power 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * key goes down. We want the device to stay on while the button 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is down, but we're about to turn off. Otherwise the lights 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flash on and then off and it looks weird. 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void userActivity(long when, boolean noChangeLights) 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.userActivity(when, noChangeLights); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Force the device to go to sleep. Overrides all the wake locks that are 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * held. 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param time is used to order this correctly with the wake lock calls. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The time should be in the {@link SystemClock#uptimeMillis 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SystemClock.uptimeMillis()} time base. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void goToSleep(long time) 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.goToSleep(time); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 484bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 485237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood /** 486237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * sets the brightness of the backlights (screen, keyboard, button). 487237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * 488237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * @param brightness value from 0 to 255 489237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * 490237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood * {@hide} 491237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood */ 492237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood public void setBacklightBrightness(int brightness) 493237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood { 494237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood try { 495237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mService.setBacklightBrightness(brightness); 496237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } catch (RemoteException e) { 497237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } 498237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } 499237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood 500bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood /** 501bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * Returns the set of flags for {@link #newWakeLock(int, String) newWakeLock()} 502bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * that are supported on the device. 503bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * For example, to test to see if the {@link #PROXIMITY_SCREEN_OFF_WAKE_LOCK} 504bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * is supported: 505bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * 506bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * {@samplecode 507bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 508bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * int supportedFlags = pm.getSupportedWakeLockFlags(); 509bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * boolean proximitySupported = ((supportedFlags & PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) 510bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK); 511bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * } 512bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * 513bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * @return the set of supported WakeLock flags. 514bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * 515bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood * {@hide} 516bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood */ 517bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood public int getSupportedWakeLockFlags() 518bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood { 519bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood try { 520bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood return mService.getSupportedWakeLockFlags(); 521bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } catch (RemoteException e) { 522bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood return 0; 523bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 524bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 525bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 526322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis /** 527322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * Returns whether the screen is currently on. The screen could be bright 528322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * or dim. 529322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * 530322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * {@samplecode 531322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 532322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * boolean isScreenOn = pm.isScreenOn(); 533322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * } 534322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * 535322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis * @return whether the screen is on (bright or dim). 536322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis */ 537322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis public boolean isScreenOn() 538322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis { 539322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis try { 540322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis return mService.isScreenOn(); 541322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis } catch (RemoteException e) { 542322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis return false; 543322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis } 544322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis } 545322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis 54650a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker /** 54750a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * Reboot the device. Will not return if the reboot is 5486fd4e76ca1866772d125089e8f2e3f1d54fcae08Doug Zongker * successful. Requires the {@link android.Manifest.permission#REBOOT} 54950a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * permission. 55050a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * 55150a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * @param reason code to pass to the kernel (e.g., "recovery") to 55250a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * request special boot modes, or null. 55350a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker */ 55450a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker public void reboot(String reason) 55550a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker { 55650a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker try { 55750a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker mService.reboot(reason); 55850a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker } catch (RemoteException e) { 55950a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker } 56050a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker } 56150a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PowerManager() 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PowerManager(IPowerManager service, Handler handler) 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler = handler; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: It would be nice to be able to set the poke lock here, 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but I'm not sure what would be acceptable as an interface - 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either a PokeLock object (like WakeLock) or, possibly just a 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method call to set the poke lock. 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPowerManager mService; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler mHandler; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 585