Notifier.java revision fbe96706bb9754f9ea3f6345f32e058a45ad10b4
19630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown/* 29630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Copyright (C) 2012 The Android Open Source Project 39630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * 49630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 59630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * you may not use this file except in compliance with the License. 69630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * You may obtain a copy of the License at 79630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * 89630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 99630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * 109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Unless required by applicable law or agreed to in writing, software 119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * See the License for the specific language governing permissions and 149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * limitations under the License. 159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownpackage com.android.server.power; 189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1913014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brownimport android.app.ActivityManagerInternal; 20713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackbornimport android.app.AppOpsManager; 2113014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brown 22713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackbornimport com.android.internal.app.IAppOpsService; 239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport com.android.internal.app.IBatteryStats; 249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport com.android.server.EventLogTags; 2513014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brownimport com.android.server.LocalServices; 269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.app.ActivityManagerNative; 289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.content.BroadcastReceiver; 299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.content.Context; 309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.content.Intent; 31037c33eae74bee2774897d969d48947f9abe254fJeff Brownimport android.hardware.input.InputManagerInternal; 3284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.media.AudioManager; 3384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.media.Ringtone; 3484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.media.RingtoneManager; 3584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.net.Uri; 369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.BatteryStats; 379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.Handler; 389630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.Looper; 399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.Message; 409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.PowerManager; 41fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brownimport android.os.PowerManagerInternal; 423d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackbornimport android.os.Process; 439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.RemoteException; 449630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.SystemClock; 455ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle; 469630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.WorkSource; 4784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.provider.Settings; 489630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.util.EventLog; 499630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.util.Slog; 509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.view.WindowManagerPolicy; 519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 529630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown/** 539630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Sends broadcasts about important power state changes. 54543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * <p> 559630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * This methods of this class may be called by the power manager service while 569630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * its lock is being held. Internally it takes care of sending broadcasts to 579630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * notify other components of the system or applications asynchronously. 58543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * </p><p> 599630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * The notifier is designed to collapse unnecessary broadcasts when it is not 609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * possible for the system to have observed an intermediate state. 61543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * </p><p> 62543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * For example, if the device wakes up, goes to sleep, wakes up again and goes to 63543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * sleep again before the wake up notification is sent, then the system will 64543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * be told about only one wake up and sleep. However, we always notify the 65543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * fact that at least one transition occurred. It is especially important to 66543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * tell the system when we go to sleep so that it can lock the keyguard if needed. 67543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * </p> 689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownfinal class Notifier { 709630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private static final String TAG = "PowerManagerNotifier"; 719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 729630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private static final boolean DEBUG = false; 739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 74fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown private static final int INTERACTIVE_STATE_UNKNOWN = 0; 75fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown private static final int INTERACTIVE_STATE_AWAKE = 1; 76fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown private static final int INTERACTIVE_STATE_ASLEEP = 2; 779630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 789630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private static final int MSG_USER_ACTIVITY = 1; 799630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private static final int MSG_BROADCAST = 2; 8084e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown private static final int MSG_WIRELESS_CHARGING_STARTED = 3; 819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final Object mLock = new Object(); 839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 849630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final Context mContext; 859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final IBatteryStats mBatteryStats; 86713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn private final IAppOpsService mAppOps; 879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final SuspendBlocker mSuspendBlocker; 889630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final WindowManagerPolicy mPolicy; 8913014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brown private final ActivityManagerInternal mActivityManagerInternal; 90037c33eae74bee2774897d969d48947f9abe254fJeff Brown private final InputManagerInternal mInputManagerInternal; 919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final NotifierHandler mHandler; 939630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final Intent mScreenOnIntent; 949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final Intent mScreenOffIntent; 959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 96fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // The current interactive state. 97fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown private int mActualInteractiveState; 98fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown private int mLastReason; 999630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 100543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown // True if there is a pending transition that needs to be reported. 101543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown private boolean mPendingWakeUpBroadcast; 102543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown private boolean mPendingGoToSleepBroadcast; 103543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown 104fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // The currently broadcasted interactive state. This reflects what other parts of the 1059630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown // system have observed. 106fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown private int mBroadcastedInteractiveState; 1079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private boolean mBroadcastInProgress; 1089630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private long mBroadcastStartTime; 1099630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown // True if a user activity message should be sent. 1119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private boolean mUserActivityPending; 1129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public Notifier(Looper looper, Context context, IBatteryStats batteryStats, 1143ee549ca2404067bb8b2fcbaa741ec118c76bf3eJeff Brown IAppOpsService appOps, SuspendBlocker suspendBlocker, 115c38c9be031ddad5cf551b55458889f11e01dc5b2Jeff Brown WindowManagerPolicy policy) { 1169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mContext = context; 1179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mBatteryStats = batteryStats; 118713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn mAppOps = appOps; 1199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mSuspendBlocker = suspendBlocker; 1209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mPolicy = policy; 12113014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brown mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); 122037c33eae74bee2774897d969d48947f9abe254fJeff Brown mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); 1239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mHandler = new NotifierHandler(looper); 1259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON); 1269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mScreenOnIntent.addFlags( 1279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); 1289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF); 1299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mScreenOffIntent.addFlags( 1309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); 131e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown 132e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown // Initialize interactive state for battery stats. 133e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown try { 134e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mBatteryStats.noteInteractive(true); 135e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown } catch (RemoteException ex) { } 1369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1389630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown /** 1399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Called when a wake lock is acquired. 1409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 141713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn public void onWakeLockAcquired(int flags, String tag, String packageName, 142a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn int ownerUid, int ownerPid, WorkSource workSource, String historyTag) { 1439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 1449630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "onWakeLockAcquired: flags=" + flags + ", tag=\"" + tag 145713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn + "\", packageName=" + packageName 146713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn + ", ownerUid=" + ownerUid + ", ownerPid=" + ownerPid 1479630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown + ", workSource=" + workSource); 1489630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1499630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 150259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner try { 151259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner final int monitorType = getBatteryStatsWakeLockMonitorType(flags); 1523d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn boolean unimportantForLogging = (flags&PowerManager.UNIMPORTANT_FOR_LOGGING) != 0 1533d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn && ownerUid == Process.SYSTEM_UID; 154259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner if (workSource != null) { 155a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mBatteryStats.noteStartWakelockFromSource(workSource, ownerPid, tag, historyTag, 156a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn monitorType, unimportantForLogging); 157259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner } else { 158a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mBatteryStats.noteStartWakelock(ownerUid, ownerPid, tag, historyTag, 159a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn monitorType, unimportantForLogging); 160713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn // XXX need to deal with disabled operations. 161e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn mAppOps.startOperation(AppOpsManager.getToken(mAppOps), 162e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName); 1639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 164259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner } catch (RemoteException ex) { 165259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner // Ignore 1669630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown /** 170e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn * Called when a wake lock is changing. 171e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn */ 172e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn public void onWakeLockChanging(int flags, String tag, String packageName, 173e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn int ownerUid, int ownerPid, WorkSource workSource, String historyTag, 174e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn int newFlags, String newTag, String newPackageName, int newOwnerUid, 175e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn int newOwnerPid, WorkSource newWorkSource, String newHistoryTag) { 176e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 177e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn if (workSource != null && newWorkSource != null) { 178bbb7472b8e378a46a1e77747265c19d22bd6968cDianne Hackborn final int monitorType = getBatteryStatsWakeLockMonitorType(flags); 179bbb7472b8e378a46a1e77747265c19d22bd6968cDianne Hackborn final int newMonitorType = getBatteryStatsWakeLockMonitorType(newFlags); 180bbb7472b8e378a46a1e77747265c19d22bd6968cDianne Hackborn boolean unimportantForLogging = (newFlags&PowerManager.UNIMPORTANT_FOR_LOGGING) != 0 181bbb7472b8e378a46a1e77747265c19d22bd6968cDianne Hackborn && newOwnerUid == Process.SYSTEM_UID; 182e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn if (DEBUG) { 183e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn Slog.d(TAG, "onWakeLockChanging: flags=" + newFlags + ", tag=\"" + newTag 184e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn + "\", packageName=" + newPackageName 185e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn + ", ownerUid=" + newOwnerUid + ", ownerPid=" + newOwnerPid 186e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn + ", workSource=" + newWorkSource); 187e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 188e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn try { 189cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mBatteryStats.noteChangeWakelockFromSource(workSource, ownerPid, tag, historyTag, 190cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn monitorType, newWorkSource, newOwnerPid, newTag, newHistoryTag, 191e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newMonitorType, unimportantForLogging); 192e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } catch (RemoteException ex) { 193e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn // Ignore 194e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 195e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } else { 196cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn onWakeLockReleased(flags, tag, packageName, ownerUid, ownerPid, workSource, historyTag); 197e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn onWakeLockAcquired(newFlags, newTag, newPackageName, newOwnerUid, newOwnerPid, 198e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newWorkSource, newHistoryTag); 199e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 200e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 201e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 202e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn /** 2039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Called when a wake lock is released. 2049630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 205713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn public void onWakeLockReleased(int flags, String tag, String packageName, 206cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn int ownerUid, int ownerPid, WorkSource workSource, String historyTag) { 2079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 2089630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "onWakeLockReleased: flags=" + flags + ", tag=\"" + tag 209713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn + "\", packageName=" + packageName 210713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn + ", ownerUid=" + ownerUid + ", ownerPid=" + ownerPid 2119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown + ", workSource=" + workSource); 2129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 214259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner try { 215259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner final int monitorType = getBatteryStatsWakeLockMonitorType(flags); 216259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner if (workSource != null) { 217cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mBatteryStats.noteStopWakelockFromSource(workSource, ownerPid, tag, historyTag, 218cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn monitorType); 219259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner } else { 220cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mBatteryStats.noteStopWakelock(ownerUid, ownerPid, tag, historyTag, monitorType); 221e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn mAppOps.finishOperation(AppOpsManager.getToken(mAppOps), 222e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName); 2239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 224259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner } catch (RemoteException ex) { 225259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner // Ignore 2269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 2299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private static int getBatteryStatsWakeLockMonitorType(int flags) { 2309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown switch (flags & PowerManager.WAKE_LOCK_LEVEL_MASK) { 2319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown case PowerManager.PARTIAL_WAKE_LOCK: 2329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: 2339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown return BatteryStats.WAKE_TYPE_PARTIAL; 2349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown default: 2359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown return BatteryStats.WAKE_TYPE_FULL; 2369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2389630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 2399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown /** 240fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown * Notifies that the device is changing wakefulness. 2419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 242fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown public void onWakefulnessChangeStarted(int wakefulness, int reason) { 2439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 244fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown Slog.d(TAG, "onWakefulnessChangeStarted: wakefulness=" + wakefulness 245037c33eae74bee2774897d969d48947f9abe254fJeff Brown + ", reason=" + reason); 2469630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2479630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 248fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // We handle interactive state changes once they start so that the system can 249fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // set everything up or the user to begin interacting with applications. 250fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown final boolean interactive = PowerManagerInternal.isInteractive(wakefulness); 251fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (interactive) { 252fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown handleWakefulnessChange(wakefulness, interactive, reason); 253fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } else { 254fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mLastReason = reason; 255fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 256fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown 257fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // Start input as soon as we start waking up or going to sleep. 258fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mInputManagerInternal.setInteractive(interactive); 259fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 260fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown 261fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown /** 262fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown * Notifies that the device has finished changing wakefulness. 263fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown */ 264fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown public void onWakefulnessChangeFinished(int wakefulness) { 265fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (DEBUG) { 266fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown Slog.d(TAG, "onWakefulnessChangeFinished: wakefulness=" + wakefulness); 267fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 268fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown 269fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // Handle interactive state changes once they are finished so that the system can 270fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // finish pending transitions (such as turning the screen off) before causing 271fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // applications to change state visibly. 272fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown final boolean interactive = PowerManagerInternal.isInteractive(wakefulness); 273fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (!interactive) { 274fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown handleWakefulnessChange(wakefulness, interactive, mLastReason); 275fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 276fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 277fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown 278fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown private void handleWakefulnessChange(final int wakefulness, boolean interactive, 279fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown final int reason) { 280fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // Tell the activity manager about changes in wakefulness, not just interactivity. 281fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // It needs more granularity than other components. 282fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mHandler.post(new Runnable() { 283fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown @Override 284fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown public void run() { 285fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mActivityManagerInternal.onWakefulnessChanged(wakefulness); 286fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 287fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown }); 288fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown 289fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // Handle changes in the overall interactive state. 290fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown boolean interactiveChanged = false; 2919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown synchronized (mLock) { 292fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // Broadcast interactive state changes. 293037c33eae74bee2774897d969d48947f9abe254fJeff Brown if (interactive) { 294037c33eae74bee2774897d969d48947f9abe254fJeff Brown // Waking up... 295fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown interactiveChanged = (mActualInteractiveState != INTERACTIVE_STATE_AWAKE); 296fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (interactiveChanged) { 297fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mActualInteractiveState = INTERACTIVE_STATE_AWAKE; 298037c33eae74bee2774897d969d48947f9abe254fJeff Brown mPendingWakeUpBroadcast = true; 299c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller mHandler.post(new Runnable() { 300c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller @Override 301c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller public void run() { 302c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 1, 0, 0, 0); 30336c4db8bd3bd7dad4b6cb8abd9cdc1a627fe3bbcJeff Brown mPolicy.wakingUp(); 304c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller } 305c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller }); 306037c33eae74bee2774897d969d48947f9abe254fJeff Brown updatePendingBroadcastLocked(); 307c38c9be031ddad5cf551b55458889f11e01dc5b2Jeff Brown } 308037c33eae74bee2774897d969d48947f9abe254fJeff Brown } else { 309037c33eae74bee2774897d969d48947f9abe254fJeff Brown // Going to sleep... 310037c33eae74bee2774897d969d48947f9abe254fJeff Brown // This is a good time to make transitions that we don't want the user to see, 311037c33eae74bee2774897d969d48947f9abe254fJeff Brown // such as bringing the key guard to focus. There's no guarantee for this, 312037c33eae74bee2774897d969d48947f9abe254fJeff Brown // however because the user could turn the device on again at any time. 313037c33eae74bee2774897d969d48947f9abe254fJeff Brown // Some things may need to be protected by other mechanisms that defer screen on. 314fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown interactiveChanged = (mActualInteractiveState != INTERACTIVE_STATE_ASLEEP); 315fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (interactiveChanged) { 316fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mActualInteractiveState = INTERACTIVE_STATE_ASLEEP; 317037c33eae74bee2774897d969d48947f9abe254fJeff Brown mPendingGoToSleepBroadcast = true; 318037c33eae74bee2774897d969d48947f9abe254fJeff Brown if (mUserActivityPending) { 319037c33eae74bee2774897d969d48947f9abe254fJeff Brown mUserActivityPending = false; 320037c33eae74bee2774897d969d48947f9abe254fJeff Brown mHandler.removeMessages(MSG_USER_ACTIVITY); 321037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 322c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller mHandler.post(new Runnable() { 323c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller @Override 324c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller public void run() { 325c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller int why = WindowManagerPolicy.OFF_BECAUSE_OF_USER; 326fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown switch (reason) { 327c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller case PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN: 328c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller why = WindowManagerPolicy.OFF_BECAUSE_OF_ADMIN; 329c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller break; 330c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller case PowerManager.GO_TO_SLEEP_REASON_TIMEOUT: 331c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller why = WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT; 332c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller break; 333c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller } 334c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 0, why, 0, 0); 335c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller mPolicy.goingToSleep(why); 336c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller } 337c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller }); 338037c33eae74bee2774897d969d48947f9abe254fJeff Brown updatePendingBroadcastLocked(); 3399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 3409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 3419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 342e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown 343fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // Notify battery stats. 344fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (interactiveChanged) { 345e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown try { 346fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mBatteryStats.noteInteractive(interactive); 347e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown } catch (RemoteException ex) { } 348e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown } 3499630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 3509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 3519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown /** 3529630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Called when there has been user activity. 3539630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 3549630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public void onUserActivity(int event, int uid) { 3559630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 3569630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "onUserActivity: event=" + event + ", uid=" + uid); 3579630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 3589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 3599630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown try { 3609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mBatteryStats.noteUserActivity(uid, event); 3619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } catch (RemoteException ex) { 3629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown // Ignore 3639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 3649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 3659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown synchronized (mLock) { 3669630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (!mUserActivityPending) { 3679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mUserActivityPending = true; 3689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY); 3699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown msg.setAsynchronous(true); 3709630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mHandler.sendMessage(msg); 3719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 3729630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 3739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 3749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 37584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown /** 37684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown * Called when wireless charging has started so as to provide user feedback. 37784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown */ 37884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown public void onWirelessChargingStarted() { 37984e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown if (DEBUG) { 38084e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown Slog.d(TAG, "onWirelessChargingStarted"); 38184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 38284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 38384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown mSuspendBlocker.acquire(); 38484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown Message msg = mHandler.obtainMessage(MSG_WIRELESS_CHARGING_STARTED); 38584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown msg.setAsynchronous(true); 38684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown mHandler.sendMessage(msg); 38784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 38884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 3899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private void updatePendingBroadcastLocked() { 3909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (!mBroadcastInProgress 391fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown && mActualInteractiveState != INTERACTIVE_STATE_UNKNOWN 392543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown && (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast 393fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown || mActualInteractiveState != mBroadcastedInteractiveState)) { 3949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mBroadcastInProgress = true; 3959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mSuspendBlocker.acquire(); 3969630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Message msg = mHandler.obtainMessage(MSG_BROADCAST); 3979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown msg.setAsynchronous(true); 3989630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mHandler.sendMessage(msg); 3999630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4009630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4019630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 402543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown private void finishPendingBroadcastLocked() { 403543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mBroadcastInProgress = false; 404543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mSuspendBlocker.release(); 405543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } 406543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown 4079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private void sendUserActivity() { 4089630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown synchronized (mLock) { 4099630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (!mUserActivityPending) { 4109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown return; 4119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mUserActivityPending = false; 4139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mPolicy.userActivity(); 4169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private void sendNextBroadcast() { 4199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown final int powerState; 4209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown synchronized (mLock) { 421fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (mBroadcastedInteractiveState == INTERACTIVE_STATE_UNKNOWN) { 422543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown // Broadcasted power state is unknown. Send wake up. 423543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mPendingWakeUpBroadcast = false; 424fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mBroadcastedInteractiveState = INTERACTIVE_STATE_AWAKE; 425fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } else if (mBroadcastedInteractiveState == INTERACTIVE_STATE_AWAKE) { 426543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown // Broadcasted power state is awake. Send asleep if needed. 427543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown if (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast 428fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown || mActualInteractiveState == INTERACTIVE_STATE_ASLEEP) { 429543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mPendingGoToSleepBroadcast = false; 430fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mBroadcastedInteractiveState = INTERACTIVE_STATE_ASLEEP; 431543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } else { 432543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown finishPendingBroadcastLocked(); 433543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown return; 434543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } 435543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } else { 436543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown // Broadcasted power state is asleep. Send awake if needed. 437543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown if (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast 438fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown || mActualInteractiveState == INTERACTIVE_STATE_AWAKE) { 439543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mPendingWakeUpBroadcast = false; 440fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mBroadcastedInteractiveState = INTERACTIVE_STATE_AWAKE; 441543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } else { 442543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown finishPendingBroadcastLocked(); 443543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown return; 444543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } 4459630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4469630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4479630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mBroadcastStartTime = SystemClock.uptimeMillis(); 448fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown powerState = mBroadcastedInteractiveState; 4499630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_SEND, 1); 4529630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 453fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (powerState == INTERACTIVE_STATE_AWAKE) { 4549630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendWakeUpBroadcast(); 4559630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } else { 456c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller sendGoToSleepBroadcast(); 4579630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4599630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private void sendWakeUpBroadcast() { 4619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 4629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "Sending wake up broadcast."); 4639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (ActivityManagerNative.isSystemReady()) { 4665ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendOrderedBroadcastAsUser(mScreenOnIntent, UserHandle.ALL, null, 4679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mWakeUpBroadcastDone, mHandler, 0, null, null); 4689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } else { 4699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 2, 1); 4709630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 4719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4729630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final BroadcastReceiver mWakeUpBroadcastDone = new BroadcastReceiver() { 4759630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown @Override 4769630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public void onReceive(Context context, Intent intent) { 4779630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 1, 4789630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown SystemClock.uptimeMillis() - mBroadcastStartTime, 1); 4799630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 4809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown }; 4829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 483c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller private void sendGoToSleepBroadcast() { 4849630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 4859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "Sending go to sleep broadcast."); 4869630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4889630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (ActivityManagerNative.isSystemReady()) { 4895ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendOrderedBroadcastAsUser(mScreenOffIntent, UserHandle.ALL, null, 4909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mGoToSleepBroadcastDone, mHandler, 0, null, null); 4919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } else { 4929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 3, 1); 4939630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 4949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4969630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final BroadcastReceiver mGoToSleepBroadcastDone = new BroadcastReceiver() { 4989630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown @Override 4999630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public void onReceive(Context context, Intent intent) { 5009630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 0, 5019630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown SystemClock.uptimeMillis() - mBroadcastStartTime, 1); 5029630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 5039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5049630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown }; 5059630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 50684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown private void playWirelessChargingStartedSound() { 50784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown final String soundPath = Settings.Global.getString(mContext.getContentResolver(), 50884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown Settings.Global.WIRELESS_CHARGING_STARTED_SOUND); 50984e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown if (soundPath != null) { 51084e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown final Uri soundUri = Uri.parse("file://" + soundPath); 51184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown if (soundUri != null) { 51284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri); 51384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown if (sfx != null) { 51484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown sfx.setStreamType(AudioManager.STREAM_SYSTEM); 51584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown sfx.play(); 51684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 51784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 51884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 51984e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 52084e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown mSuspendBlocker.release(); 52184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 52284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 5239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final class NotifierHandler extends Handler { 5249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public NotifierHandler(Looper looper) { 525a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown super(looper, null, true /*async*/); 5269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 5289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown @Override 5299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public void handleMessage(Message msg) { 5309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown switch (msg.what) { 5319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown case MSG_USER_ACTIVITY: 5329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendUserActivity(); 5339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown break; 5349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 5359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown case MSG_BROADCAST: 5369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 5379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown break; 53884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 53984e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown case MSG_WIRELESS_CHARGING_STARTED: 54084e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown playWirelessChargingStartedSound(); 54184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown break; 5429630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5449630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5459630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown} 546