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