Notifier.java revision 416c49c4049f572134273e228d7988904a51b990
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; 8184d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee private static final int MSG_SCREEN_BRIGHTNESS_BOOST_CHANGED = 4; 829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final Object mLock = new Object(); 849630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final Context mContext; 869630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final IBatteryStats mBatteryStats; 87713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn private final IAppOpsService mAppOps; 889630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final SuspendBlocker mSuspendBlocker; 899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final WindowManagerPolicy mPolicy; 9013014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brown private final ActivityManagerInternal mActivityManagerInternal; 91037c33eae74bee2774897d969d48947f9abe254fJeff Brown private final InputManagerInternal mInputManagerInternal; 929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 939630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final NotifierHandler mHandler; 949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final Intent mScreenOnIntent; 959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final Intent mScreenOffIntent; 9684d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee private final Intent mScreenBrightnessBoostIntent; 979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 98416c49c4049f572134273e228d7988904a51b990Jeff Brown // The current interactive state. This is set as soon as an interactive state 99416c49c4049f572134273e228d7988904a51b990Jeff Brown // transition begins so as to capture the reason that it happened. At some point 100416c49c4049f572134273e228d7988904a51b990Jeff Brown // this state will propagate to the pending state then eventually to the 101416c49c4049f572134273e228d7988904a51b990Jeff Brown // broadcasted state over the course of reporting the transition asynchronously. 102416c49c4049f572134273e228d7988904a51b990Jeff Brown private boolean mInteractive = true; 103416c49c4049f572134273e228d7988904a51b990Jeff Brown private int mInteractiveChangeReason; 104416c49c4049f572134273e228d7988904a51b990Jeff Brown private boolean mInteractiveChanging; 105416c49c4049f572134273e228d7988904a51b990Jeff Brown 106416c49c4049f572134273e228d7988904a51b990Jeff Brown // The pending interactive state that we will eventually want to broadcast. 107416c49c4049f572134273e228d7988904a51b990Jeff Brown // This is designed so that we can collapse redundant sequences of awake/sleep 108416c49c4049f572134273e228d7988904a51b990Jeff Brown // transition pairs while still guaranteeing that at least one transition is observed 109416c49c4049f572134273e228d7988904a51b990Jeff Brown // whenever this happens. 110416c49c4049f572134273e228d7988904a51b990Jeff Brown private int mPendingInteractiveState; 111543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown private boolean mPendingWakeUpBroadcast; 112543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown private boolean mPendingGoToSleepBroadcast; 113543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown 114fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown // The currently broadcasted interactive state. This reflects what other parts of the 1159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown // system have observed. 116fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown private int mBroadcastedInteractiveState; 1179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private boolean mBroadcastInProgress; 1189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private long mBroadcastStartTime; 1199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown // True if a user activity message should be sent. 1219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private boolean mUserActivityPending; 1229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public Notifier(Looper looper, Context context, IBatteryStats batteryStats, 1243ee549ca2404067bb8b2fcbaa741ec118c76bf3eJeff Brown IAppOpsService appOps, SuspendBlocker suspendBlocker, 125c38c9be031ddad5cf551b55458889f11e01dc5b2Jeff Brown WindowManagerPolicy policy) { 1269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mContext = context; 1279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mBatteryStats = batteryStats; 128713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn mAppOps = appOps; 1299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mSuspendBlocker = suspendBlocker; 1309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mPolicy = policy; 13113014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brown mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); 132037c33eae74bee2774897d969d48947f9abe254fJeff Brown mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); 1339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mHandler = new NotifierHandler(looper); 1359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON); 1369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mScreenOnIntent.addFlags( 1379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); 1389630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF); 1399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mScreenOffIntent.addFlags( 1409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); 14184d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee mScreenBrightnessBoostIntent = 14284d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee new Intent(PowerManager.ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED); 14384d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee mScreenBrightnessBoostIntent.addFlags( 14484d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); 145e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown 146e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown // Initialize interactive state for battery stats. 147e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown try { 148e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mBatteryStats.noteInteractive(true); 149e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown } catch (RemoteException ex) { } 1509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1529630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown /** 1539630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Called when a wake lock is acquired. 1549630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 155713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn public void onWakeLockAcquired(int flags, String tag, String packageName, 156a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn int ownerUid, int ownerPid, WorkSource workSource, String historyTag) { 1579630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 1589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "onWakeLockAcquired: flags=" + flags + ", tag=\"" + tag 159713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn + "\", packageName=" + packageName 160713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn + ", ownerUid=" + ownerUid + ", ownerPid=" + ownerPid 1619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown + ", workSource=" + workSource); 1629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 164259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner try { 165259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner final int monitorType = getBatteryStatsWakeLockMonitorType(flags); 1663d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn boolean unimportantForLogging = (flags&PowerManager.UNIMPORTANT_FOR_LOGGING) != 0 1673d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn && ownerUid == Process.SYSTEM_UID; 168259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner if (workSource != null) { 169a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mBatteryStats.noteStartWakelockFromSource(workSource, ownerPid, tag, historyTag, 170a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn monitorType, unimportantForLogging); 171259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner } else { 172a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mBatteryStats.noteStartWakelock(ownerUid, ownerPid, tag, historyTag, 173a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn monitorType, unimportantForLogging); 174713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn // XXX need to deal with disabled operations. 175e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn mAppOps.startOperation(AppOpsManager.getToken(mAppOps), 176e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName); 1779630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 178259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner } catch (RemoteException ex) { 179259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner // Ignore 1809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown /** 184e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn * Called when a wake lock is changing. 185e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn */ 186e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn public void onWakeLockChanging(int flags, String tag, String packageName, 187e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn int ownerUid, int ownerPid, WorkSource workSource, String historyTag, 188e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn int newFlags, String newTag, String newPackageName, int newOwnerUid, 189e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn int newOwnerPid, WorkSource newWorkSource, String newHistoryTag) { 190e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 191e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn if (workSource != null && newWorkSource != null) { 192bbb7472b8e378a46a1e77747265c19d22bd6968cDianne Hackborn final int monitorType = getBatteryStatsWakeLockMonitorType(flags); 193bbb7472b8e378a46a1e77747265c19d22bd6968cDianne Hackborn final int newMonitorType = getBatteryStatsWakeLockMonitorType(newFlags); 194bbb7472b8e378a46a1e77747265c19d22bd6968cDianne Hackborn boolean unimportantForLogging = (newFlags&PowerManager.UNIMPORTANT_FOR_LOGGING) != 0 195bbb7472b8e378a46a1e77747265c19d22bd6968cDianne Hackborn && newOwnerUid == Process.SYSTEM_UID; 196e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn if (DEBUG) { 197e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn Slog.d(TAG, "onWakeLockChanging: flags=" + newFlags + ", tag=\"" + newTag 198e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn + "\", packageName=" + newPackageName 199e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn + ", ownerUid=" + newOwnerUid + ", ownerPid=" + newOwnerPid 200e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn + ", workSource=" + newWorkSource); 201e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 202e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn try { 203cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mBatteryStats.noteChangeWakelockFromSource(workSource, ownerPid, tag, historyTag, 204cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn monitorType, newWorkSource, newOwnerPid, newTag, newHistoryTag, 205e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newMonitorType, unimportantForLogging); 206e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } catch (RemoteException ex) { 207e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn // Ignore 208e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 209e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } else { 210cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn onWakeLockReleased(flags, tag, packageName, ownerUid, ownerPid, workSource, historyTag); 211e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn onWakeLockAcquired(newFlags, newTag, newPackageName, newOwnerUid, newOwnerPid, 212e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newWorkSource, newHistoryTag); 213e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 214e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 215e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 216e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn /** 2179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Called when a wake lock is released. 2189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 219713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn public void onWakeLockReleased(int flags, String tag, String packageName, 220cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn int ownerUid, int ownerPid, WorkSource workSource, String historyTag) { 2219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 2229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "onWakeLockReleased: flags=" + flags + ", tag=\"" + tag 223713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn + "\", packageName=" + packageName 224713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn + ", ownerUid=" + ownerUid + ", ownerPid=" + ownerPid 2259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown + ", workSource=" + workSource); 2269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 228259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner try { 229259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner final int monitorType = getBatteryStatsWakeLockMonitorType(flags); 230259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner if (workSource != null) { 231cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mBatteryStats.noteStopWakelockFromSource(workSource, ownerPid, tag, historyTag, 232cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn monitorType); 233259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner } else { 234cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mBatteryStats.noteStopWakelock(ownerUid, ownerPid, tag, historyTag, monitorType); 235e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn mAppOps.finishOperation(AppOpsManager.getToken(mAppOps), 236e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName); 2379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 238259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner } catch (RemoteException ex) { 239259328c04ce16c554b48a14f68d8af94dc54d7ecCraig Mautner // Ignore 2409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2429630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 2439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private static int getBatteryStatsWakeLockMonitorType(int flags) { 2449630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown switch (flags & PowerManager.WAKE_LOCK_LEVEL_MASK) { 2459630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown case PowerManager.PARTIAL_WAKE_LOCK: 2469630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: 2479630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown return BatteryStats.WAKE_TYPE_PARTIAL; 2489630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown default: 2499630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown return BatteryStats.WAKE_TYPE_FULL; 2509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2529630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 2539630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown /** 254fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown * Notifies that the device is changing wakefulness. 255416c49c4049f572134273e228d7988904a51b990Jeff Brown * This function may be called even if the previous change hasn't finished in 256416c49c4049f572134273e228d7988904a51b990Jeff Brown * which case it will assume that the state did not fully converge before the 257416c49c4049f572134273e228d7988904a51b990Jeff Brown * next transition began and will recover accordingly. 2589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 259416c49c4049f572134273e228d7988904a51b990Jeff Brown public void onWakefulnessChangeStarted(final int wakefulness, int reason) { 260416c49c4049f572134273e228d7988904a51b990Jeff Brown final boolean interactive = PowerManagerInternal.isInteractive(wakefulness); 2619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 262fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown Slog.d(TAG, "onWakefulnessChangeStarted: wakefulness=" + wakefulness 263416c49c4049f572134273e228d7988904a51b990Jeff Brown + ", reason=" + reason + ", interactive=" + interactive); 2649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 2659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 266416c49c4049f572134273e228d7988904a51b990Jeff Brown // Tell the activity manager about changes in wakefulness, not just interactivity. 267416c49c4049f572134273e228d7988904a51b990Jeff Brown // It needs more granularity than other components. 268416c49c4049f572134273e228d7988904a51b990Jeff Brown mHandler.post(new Runnable() { 269416c49c4049f572134273e228d7988904a51b990Jeff Brown @Override 270416c49c4049f572134273e228d7988904a51b990Jeff Brown public void run() { 271416c49c4049f572134273e228d7988904a51b990Jeff Brown mActivityManagerInternal.onWakefulnessChanged(wakefulness); 272416c49c4049f572134273e228d7988904a51b990Jeff Brown } 273416c49c4049f572134273e228d7988904a51b990Jeff Brown }); 274416c49c4049f572134273e228d7988904a51b990Jeff Brown 275416c49c4049f572134273e228d7988904a51b990Jeff Brown // Handle any early interactive state changes. 276416c49c4049f572134273e228d7988904a51b990Jeff Brown // Finish pending incomplete ones from a previous cycle. 277416c49c4049f572134273e228d7988904a51b990Jeff Brown if (mInteractive != interactive) { 278416c49c4049f572134273e228d7988904a51b990Jeff Brown // Finish up late behaviors if needed. 279416c49c4049f572134273e228d7988904a51b990Jeff Brown if (mInteractiveChanging) { 280416c49c4049f572134273e228d7988904a51b990Jeff Brown handleLateInteractiveChange(); 281416c49c4049f572134273e228d7988904a51b990Jeff Brown } 282fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown 283416c49c4049f572134273e228d7988904a51b990Jeff Brown // Start input as soon as we start waking up or going to sleep. 284416c49c4049f572134273e228d7988904a51b990Jeff Brown mInputManagerInternal.setInteractive(interactive); 285416c49c4049f572134273e228d7988904a51b990Jeff Brown 286416c49c4049f572134273e228d7988904a51b990Jeff Brown // Notify battery stats. 287416c49c4049f572134273e228d7988904a51b990Jeff Brown try { 288416c49c4049f572134273e228d7988904a51b990Jeff Brown mBatteryStats.noteInteractive(interactive); 289416c49c4049f572134273e228d7988904a51b990Jeff Brown } catch (RemoteException ex) { } 290416c49c4049f572134273e228d7988904a51b990Jeff Brown 291416c49c4049f572134273e228d7988904a51b990Jeff Brown // Handle early behaviors. 292416c49c4049f572134273e228d7988904a51b990Jeff Brown mInteractive = interactive; 293416c49c4049f572134273e228d7988904a51b990Jeff Brown mInteractiveChangeReason = reason; 294416c49c4049f572134273e228d7988904a51b990Jeff Brown mInteractiveChanging = true; 295416c49c4049f572134273e228d7988904a51b990Jeff Brown handleEarlyInteractiveChange(); 296416c49c4049f572134273e228d7988904a51b990Jeff Brown } 297fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 298fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown 299fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown /** 300fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown * Notifies that the device has finished changing wakefulness. 301fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown */ 302416c49c4049f572134273e228d7988904a51b990Jeff Brown public void onWakefulnessChangeFinished() { 303fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (DEBUG) { 304416c49c4049f572134273e228d7988904a51b990Jeff Brown Slog.d(TAG, "onWakefulnessChangeFinished"); 305fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 306fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown 307416c49c4049f572134273e228d7988904a51b990Jeff Brown if (mInteractiveChanging) { 308416c49c4049f572134273e228d7988904a51b990Jeff Brown mInteractiveChanging = false; 309416c49c4049f572134273e228d7988904a51b990Jeff Brown handleLateInteractiveChange(); 310fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 311fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } 312fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown 313416c49c4049f572134273e228d7988904a51b990Jeff Brown /** 314416c49c4049f572134273e228d7988904a51b990Jeff Brown * Handle early interactive state changes such as getting applications or the lock 315416c49c4049f572134273e228d7988904a51b990Jeff Brown * screen running and ready for the user to see (such as when turning on the screen). 316416c49c4049f572134273e228d7988904a51b990Jeff Brown */ 317416c49c4049f572134273e228d7988904a51b990Jeff Brown private void handleEarlyInteractiveChange() { 3189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown synchronized (mLock) { 319416c49c4049f572134273e228d7988904a51b990Jeff Brown if (mInteractive) { 320037c33eae74bee2774897d969d48947f9abe254fJeff Brown // Waking up... 321416c49c4049f572134273e228d7988904a51b990Jeff Brown mHandler.post(new Runnable() { 322416c49c4049f572134273e228d7988904a51b990Jeff Brown @Override 323416c49c4049f572134273e228d7988904a51b990Jeff Brown public void run() { 324416c49c4049f572134273e228d7988904a51b990Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 1, 0, 0, 0); 325416c49c4049f572134273e228d7988904a51b990Jeff Brown mPolicy.startedWakingUp(); 326416c49c4049f572134273e228d7988904a51b990Jeff Brown } 327416c49c4049f572134273e228d7988904a51b990Jeff Brown }); 328416c49c4049f572134273e228d7988904a51b990Jeff Brown 329416c49c4049f572134273e228d7988904a51b990Jeff Brown // Send interactive broadcast. 330416c49c4049f572134273e228d7988904a51b990Jeff Brown mPendingInteractiveState = INTERACTIVE_STATE_AWAKE; 331416c49c4049f572134273e228d7988904a51b990Jeff Brown mPendingWakeUpBroadcast = true; 332416c49c4049f572134273e228d7988904a51b990Jeff Brown updatePendingBroadcastLocked(); 333037c33eae74bee2774897d969d48947f9abe254fJeff Brown } else { 334037c33eae74bee2774897d969d48947f9abe254fJeff Brown // Going to sleep... 335416c49c4049f572134273e228d7988904a51b990Jeff Brown // Tell the policy that we started going to sleep. 336416c49c4049f572134273e228d7988904a51b990Jeff Brown final int why = translateOffReason(mInteractiveChangeReason); 337416c49c4049f572134273e228d7988904a51b990Jeff Brown mHandler.post(new Runnable() { 338416c49c4049f572134273e228d7988904a51b990Jeff Brown @Override 339416c49c4049f572134273e228d7988904a51b990Jeff Brown public void run() { 340416c49c4049f572134273e228d7988904a51b990Jeff Brown mPolicy.startedGoingToSleep(why); 341416c49c4049f572134273e228d7988904a51b990Jeff Brown } 342416c49c4049f572134273e228d7988904a51b990Jeff Brown }); 343416c49c4049f572134273e228d7988904a51b990Jeff Brown } 344416c49c4049f572134273e228d7988904a51b990Jeff Brown } 345416c49c4049f572134273e228d7988904a51b990Jeff Brown } 346416c49c4049f572134273e228d7988904a51b990Jeff Brown 347416c49c4049f572134273e228d7988904a51b990Jeff Brown /** 348416c49c4049f572134273e228d7988904a51b990Jeff Brown * Handle late interactive state changes once they are finished so that the system can 349416c49c4049f572134273e228d7988904a51b990Jeff Brown * finish pending transitions (such as turning the screen off) before causing 350416c49c4049f572134273e228d7988904a51b990Jeff Brown * applications to change state visibly. 351416c49c4049f572134273e228d7988904a51b990Jeff Brown */ 352416c49c4049f572134273e228d7988904a51b990Jeff Brown private void handleLateInteractiveChange() { 353416c49c4049f572134273e228d7988904a51b990Jeff Brown synchronized (mLock) { 354416c49c4049f572134273e228d7988904a51b990Jeff Brown if (mInteractive) { 355416c49c4049f572134273e228d7988904a51b990Jeff Brown // Finished waking up... 356416c49c4049f572134273e228d7988904a51b990Jeff Brown mHandler.post(new Runnable() { 357416c49c4049f572134273e228d7988904a51b990Jeff Brown @Override 358416c49c4049f572134273e228d7988904a51b990Jeff Brown public void run() { 359416c49c4049f572134273e228d7988904a51b990Jeff Brown mPolicy.finishedWakingUp(); 360416c49c4049f572134273e228d7988904a51b990Jeff Brown } 361416c49c4049f572134273e228d7988904a51b990Jeff Brown }); 362416c49c4049f572134273e228d7988904a51b990Jeff Brown } else { 363416c49c4049f572134273e228d7988904a51b990Jeff Brown // Finished going to sleep... 364037c33eae74bee2774897d969d48947f9abe254fJeff Brown // This is a good time to make transitions that we don't want the user to see, 365416c49c4049f572134273e228d7988904a51b990Jeff Brown // such as bringing the key guard to focus. There's no guarantee for this 366037c33eae74bee2774897d969d48947f9abe254fJeff Brown // however because the user could turn the device on again at any time. 367037c33eae74bee2774897d969d48947f9abe254fJeff Brown // Some things may need to be protected by other mechanisms that defer screen on. 368416c49c4049f572134273e228d7988904a51b990Jeff Brown 369416c49c4049f572134273e228d7988904a51b990Jeff Brown // Cancel pending user activity. 370416c49c4049f572134273e228d7988904a51b990Jeff Brown if (mUserActivityPending) { 371416c49c4049f572134273e228d7988904a51b990Jeff Brown mUserActivityPending = false; 372416c49c4049f572134273e228d7988904a51b990Jeff Brown mHandler.removeMessages(MSG_USER_ACTIVITY); 3739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 374416c49c4049f572134273e228d7988904a51b990Jeff Brown 375416c49c4049f572134273e228d7988904a51b990Jeff Brown // Tell the policy we finished going to sleep. 376416c49c4049f572134273e228d7988904a51b990Jeff Brown final int why = translateOffReason(mInteractiveChangeReason); 377416c49c4049f572134273e228d7988904a51b990Jeff Brown mHandler.post(new Runnable() { 378416c49c4049f572134273e228d7988904a51b990Jeff Brown @Override 379416c49c4049f572134273e228d7988904a51b990Jeff Brown public void run() { 380416c49c4049f572134273e228d7988904a51b990Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 0, why, 0, 0); 381416c49c4049f572134273e228d7988904a51b990Jeff Brown mPolicy.finishedGoingToSleep(why); 382416c49c4049f572134273e228d7988904a51b990Jeff Brown } 383416c49c4049f572134273e228d7988904a51b990Jeff Brown }); 384416c49c4049f572134273e228d7988904a51b990Jeff Brown 385416c49c4049f572134273e228d7988904a51b990Jeff Brown // Send non-interactive broadcast. 386416c49c4049f572134273e228d7988904a51b990Jeff Brown mPendingInteractiveState = INTERACTIVE_STATE_ASLEEP; 387416c49c4049f572134273e228d7988904a51b990Jeff Brown mPendingGoToSleepBroadcast = true; 388416c49c4049f572134273e228d7988904a51b990Jeff Brown updatePendingBroadcastLocked(); 3899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 3909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 391416c49c4049f572134273e228d7988904a51b990Jeff Brown } 392e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown 393416c49c4049f572134273e228d7988904a51b990Jeff Brown private static int translateOffReason(int reason) { 394416c49c4049f572134273e228d7988904a51b990Jeff Brown switch (reason) { 395416c49c4049f572134273e228d7988904a51b990Jeff Brown case PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN: 396416c49c4049f572134273e228d7988904a51b990Jeff Brown return WindowManagerPolicy.OFF_BECAUSE_OF_ADMIN; 397416c49c4049f572134273e228d7988904a51b990Jeff Brown case PowerManager.GO_TO_SLEEP_REASON_TIMEOUT: 398416c49c4049f572134273e228d7988904a51b990Jeff Brown return WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT; 399416c49c4049f572134273e228d7988904a51b990Jeff Brown default: 400416c49c4049f572134273e228d7988904a51b990Jeff Brown return WindowManagerPolicy.OFF_BECAUSE_OF_USER; 401e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown } 4029630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4049630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown /** 40584d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee * Called when screen brightness boost begins or ends. 40684d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee */ 40784d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee public void onScreenBrightnessBoostChanged() { 40884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee if (DEBUG) { 40984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee Slog.d(TAG, "onScreenBrightnessBoostChanged"); 41084d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee } 41184d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee 41284d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee mSuspendBlocker.acquire(); 41384d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee Message msg = mHandler.obtainMessage(MSG_SCREEN_BRIGHTNESS_BOOST_CHANGED); 41484d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee msg.setAsynchronous(true); 41584d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee mHandler.sendMessage(msg); 41684d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee } 417416c49c4049f572134273e228d7988904a51b990Jeff Brown 41884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee /** 4199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Called when there has been user activity. 4209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */ 4219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public void onUserActivity(int event, int uid) { 4229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 4239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "onUserActivity: event=" + event + ", uid=" + uid); 4249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown try { 4279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mBatteryStats.noteUserActivity(uid, event); 4289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } catch (RemoteException ex) { 4299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown // Ignore 4309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown synchronized (mLock) { 4339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (!mUserActivityPending) { 4349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mUserActivityPending = true; 4359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY); 4369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown msg.setAsynchronous(true); 4379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mHandler.sendMessage(msg); 4389630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 44284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown /** 44384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown * Called when wireless charging has started so as to provide user feedback. 44484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown */ 44584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown public void onWirelessChargingStarted() { 44684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown if (DEBUG) { 44784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown Slog.d(TAG, "onWirelessChargingStarted"); 44884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 44984e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 45084e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown mSuspendBlocker.acquire(); 45184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown Message msg = mHandler.obtainMessage(MSG_WIRELESS_CHARGING_STARTED); 45284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown msg.setAsynchronous(true); 45384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown mHandler.sendMessage(msg); 45484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 45584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 4569630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private void updatePendingBroadcastLocked() { 4579630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (!mBroadcastInProgress 458416c49c4049f572134273e228d7988904a51b990Jeff Brown && mPendingInteractiveState != INTERACTIVE_STATE_UNKNOWN 459543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown && (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast 460416c49c4049f572134273e228d7988904a51b990Jeff Brown || mPendingInteractiveState != mBroadcastedInteractiveState)) { 4619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mBroadcastInProgress = true; 4629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mSuspendBlocker.acquire(); 4639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Message msg = mHandler.obtainMessage(MSG_BROADCAST); 4649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown msg.setAsynchronous(true); 4659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mHandler.sendMessage(msg); 4669630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 469543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown private void finishPendingBroadcastLocked() { 470543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mBroadcastInProgress = false; 471543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mSuspendBlocker.release(); 472543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } 473543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown 4749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private void sendUserActivity() { 4759630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown synchronized (mLock) { 4769630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (!mUserActivityPending) { 4779630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown return; 4789630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4799630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mUserActivityPending = false; 4809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mPolicy.userActivity(); 4839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 4849630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 4859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private void sendNextBroadcast() { 4869630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown final int powerState; 4879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown synchronized (mLock) { 488fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (mBroadcastedInteractiveState == INTERACTIVE_STATE_UNKNOWN) { 489543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown // Broadcasted power state is unknown. Send wake up. 490543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mPendingWakeUpBroadcast = false; 491fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mBroadcastedInteractiveState = INTERACTIVE_STATE_AWAKE; 492fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown } else if (mBroadcastedInteractiveState == INTERACTIVE_STATE_AWAKE) { 493543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown // Broadcasted power state is awake. Send asleep if needed. 494543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown if (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast 495416c49c4049f572134273e228d7988904a51b990Jeff Brown || mPendingInteractiveState == INTERACTIVE_STATE_ASLEEP) { 496543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mPendingGoToSleepBroadcast = false; 497fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mBroadcastedInteractiveState = INTERACTIVE_STATE_ASLEEP; 498543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } else { 499543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown finishPendingBroadcastLocked(); 500543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown return; 501543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } 502543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } else { 503543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown // Broadcasted power state is asleep. Send awake if needed. 504543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown if (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast 505416c49c4049f572134273e228d7988904a51b990Jeff Brown || mPendingInteractiveState == INTERACTIVE_STATE_AWAKE) { 506543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown mPendingWakeUpBroadcast = false; 507fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown mBroadcastedInteractiveState = INTERACTIVE_STATE_AWAKE; 508543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } else { 509543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown finishPendingBroadcastLocked(); 510543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown return; 511543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown } 5129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 5149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mBroadcastStartTime = SystemClock.uptimeMillis(); 515fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown powerState = mBroadcastedInteractiveState; 5169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 5189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_SEND, 1); 5199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 520fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown if (powerState == INTERACTIVE_STATE_AWAKE) { 5219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendWakeUpBroadcast(); 5229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } else { 523c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller sendGoToSleepBroadcast(); 5249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 52784d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee private void sendBrightnessBoostChangedBroadcast() { 52884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee if (DEBUG) { 52984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee Slog.d(TAG, "Sending brightness boost changed broadcast."); 53084d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee } 53184d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee 53284d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee mContext.sendOrderedBroadcastAsUser(mScreenBrightnessBoostIntent, UserHandle.ALL, null, 53384d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee mScreeBrightnessBoostChangedDone, mHandler, 0, null, null); 53484d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee } 53584d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee 53684d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee private final BroadcastReceiver mScreeBrightnessBoostChangedDone = new BroadcastReceiver() { 53784d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee @Override 53884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee public void onReceive(Context context, Intent intent) { 53984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee mSuspendBlocker.release(); 54084d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee } 54184d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee }; 54284d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee 5439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private void sendWakeUpBroadcast() { 5449630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 5459630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "Sending wake up broadcast."); 5469630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5479630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 5489630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (ActivityManagerNative.isSystemReady()) { 5495ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendOrderedBroadcastAsUser(mScreenOnIntent, UserHandle.ALL, null, 5509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mWakeUpBroadcastDone, mHandler, 0, null, null); 5519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } else { 5529630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 2, 1); 5539630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 5549630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5559630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5569630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 5579630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final BroadcastReceiver mWakeUpBroadcastDone = new BroadcastReceiver() { 5589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown @Override 5599630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public void onReceive(Context context, Intent intent) { 5609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 1, 5619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown SystemClock.uptimeMillis() - mBroadcastStartTime, 1); 5629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 5639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown }; 5659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 566c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller private void sendGoToSleepBroadcast() { 5679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (DEBUG) { 5689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown Slog.d(TAG, "Sending go to sleep broadcast."); 5699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5709630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 5719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (ActivityManagerNative.isSystemReady()) { 5725ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendOrderedBroadcastAsUser(mScreenOffIntent, UserHandle.ALL, null, 5739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown mGoToSleepBroadcastDone, mHandler, 0, null, null); 5749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } else { 5759630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 3, 1); 5769630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 5779630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5789630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5799630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 5809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final BroadcastReceiver mGoToSleepBroadcastDone = new BroadcastReceiver() { 5819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown @Override 5829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public void onReceive(Context context, Intent intent) { 5839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 0, 5849630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown SystemClock.uptimeMillis() - mBroadcastStartTime, 1); 5859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 5869630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 5879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown }; 5889630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 58984e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown private void playWirelessChargingStartedSound() { 59051a871d48a9f4d912b2c12c29bbddcc5ec175825John Spurlock final boolean enabled = Settings.Global.getInt(mContext.getContentResolver(), 59151a871d48a9f4d912b2c12c29bbddcc5ec175825John Spurlock Settings.Global.CHARGING_SOUNDS_ENABLED, 1) != 0; 59284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown final String soundPath = Settings.Global.getString(mContext.getContentResolver(), 59384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown Settings.Global.WIRELESS_CHARGING_STARTED_SOUND); 59451a871d48a9f4d912b2c12c29bbddcc5ec175825John Spurlock if (enabled && soundPath != null) { 59584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown final Uri soundUri = Uri.parse("file://" + soundPath); 59684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown if (soundUri != null) { 59784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri); 59884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown if (sfx != null) { 59984e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown sfx.setStreamType(AudioManager.STREAM_SYSTEM); 60084e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown sfx.play(); 60184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 60284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 60384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 60484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 60584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown mSuspendBlocker.release(); 60684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown } 60784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 6089630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown private final class NotifierHandler extends Handler { 6099630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public NotifierHandler(Looper looper) { 610a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown super(looper, null, true /*async*/); 6119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 6129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 6139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown @Override 6149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown public void handleMessage(Message msg) { 6159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown switch (msg.what) { 6169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown case MSG_USER_ACTIVITY: 6179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendUserActivity(); 6189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown break; 6199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 6209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown case MSG_BROADCAST: 6219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown sendNextBroadcast(); 6229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown break; 62384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown 62484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown case MSG_WIRELESS_CHARGING_STARTED: 62584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown playWirelessChargingStartedSound(); 62684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown break; 62784d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee case MSG_SCREEN_BRIGHTNESS_BOOST_CHANGED: 62884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee sendBrightnessBoostChangedBroadcast(); 62984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee break; 6309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 6319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 6329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 6339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown} 634