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