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
196d07baf4d918ea7c8acf2292da08b0f0eedd3391Andrew Zengimport android.annotation.Nullable;
2028939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafovimport android.annotation.UserIdInt;
2113014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brownimport android.app.ActivityManagerInternal;
22713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackbornimport android.app.AppOpsManager;
2328939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafovimport android.app.trust.TrustManager;
249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.content.BroadcastReceiver;
259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.content.Context;
269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.content.Intent;
27037c33eae74bee2774897d969d48947f9abe254fJeff Brownimport android.hardware.input.InputManagerInternal;
28df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverlyimport android.media.AudioAttributes;
2984e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.media.AudioManager;
3084e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.media.Ringtone;
3184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.media.RingtoneManager;
325c38fc2b97cba8a275a24bdf201073d68b101e7aAlison Cichowlasimport android.metrics.LogMaker;
3384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.net.Uri;
349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.BatteryStats;
359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.Handler;
369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.Looper;
379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.Message;
389630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.PowerManager;
39fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brownimport android.os.PowerManagerInternal;
403d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackbornimport android.os.Process;
419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.RemoteException;
429630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.SystemClock;
435ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle;
44df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverlyimport android.os.VibrationEffect;
45df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverlyimport android.os.Vibrator;
469630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.WorkSource;
4784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brownimport android.provider.Settings;
489630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.util.EventLog;
499630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.util.Slog;
50fa6e0a80e20a4917b403fd330e01a9edd021aabcYohei Yukawaimport android.view.inputmethod.InputMethodManagerInternal;
519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
52ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverlyimport com.android.internal.app.IBatteryStats;
53ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverlyimport com.android.internal.logging.MetricsLogger;
54ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverlyimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
55ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverlyimport com.android.server.EventLogTags;
56ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverlyimport com.android.server.LocalServices;
57ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverlyimport com.android.server.policy.WindowManagerPolicy;
58df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverlyimport com.android.server.statusbar.StatusBarManagerInternal;
59ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly
609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown/**
619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * Sends broadcasts about important power state changes.
62543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * <p>
639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * This methods of this class may be called by the power manager service while
649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * its lock is being held.  Internally it takes care of sending broadcasts to
659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * notify other components of the system or applications asynchronously.
66543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * </p><p>
679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * The notifier is designed to collapse unnecessary broadcasts when it is not
689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown * possible for the system to have observed an intermediate state.
69543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * </p><p>
70543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * For example, if the device wakes up, goes to sleep, wakes up again and goes to
71543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * sleep again before the wake up notification is sent, then the system will
72543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * be told about only one wake up and sleep.  However, we always notify the
73543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * fact that at least one transition occurred.  It is especially important to
74543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * tell the system when we go to sleep so that it can lock the keyguard if needed.
75543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown * </p>
769630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown */
779630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownfinal class Notifier {
789630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private static final String TAG = "PowerManagerNotifier";
799630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private static final boolean DEBUG = false;
819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
82fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown    private static final int INTERACTIVE_STATE_UNKNOWN = 0;
83fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown    private static final int INTERACTIVE_STATE_AWAKE = 1;
84fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown    private static final int INTERACTIVE_STATE_ASLEEP = 2;
859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
869630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private static final int MSG_USER_ACTIVITY = 1;
879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private static final int MSG_BROADCAST = 2;
8884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown    private static final int MSG_WIRELESS_CHARGING_STARTED = 3;
8984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee    private static final int MSG_SCREEN_BRIGHTNESS_BOOST_CHANGED = 4;
9028939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov    private static final int MSG_PROFILE_TIMED_OUT = 5;
91c1313eb44d01285983975bd57f010c526ca2ff56Beverly    private static final int MSG_WIRED_CHARGING_STARTED = 6;
929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
93df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    private static final long[] WIRELESS_VIBRATION_TIME = {
94df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly            40, 40, 40, 40, 40, 40, 40, 40, 40, // ramp-up sampling rate = 40ms
95df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly            40, 40, 40, 40, 40, 40, 40 // ramp-down sampling rate = 40ms
96df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    };
97df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    private static final int[] WIRELESS_VIBRATION_AMPLITUDE = {
98df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly            1, 4, 11, 25, 44, 67, 91, 114, 123, // ramp-up amplitude (from 0 to 50%)
99df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly            103, 79, 55, 34, 17, 7, 2 // ramp-up amplitude
100df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    };
101df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    private static final VibrationEffect WIRELESS_CHARGING_VIBRATION_EFFECT =
102df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly            VibrationEffect.createWaveform(WIRELESS_VIBRATION_TIME, WIRELESS_VIBRATION_AMPLITUDE,
103df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly                    -1);
104df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder()
105df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
106df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly            .build();
107df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly
1089630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final Object mLock = new Object();
1099630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
1109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final Context mContext;
1119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final IBatteryStats mBatteryStats;
112f7b4725375dfb5f6b65433f1679c44501c2478e3Svet Ganov    private final AppOpsManager mAppOps;
1139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final SuspendBlocker mSuspendBlocker;
1149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final WindowManagerPolicy mPolicy;
11513014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brown    private final ActivityManagerInternal mActivityManagerInternal;
116037c33eae74bee2774897d969d48947f9abe254fJeff Brown    private final InputManagerInternal mInputManagerInternal;
117fa6e0a80e20a4917b403fd330e01a9edd021aabcYohei Yukawa    private final InputMethodManagerInternal mInputMethodManagerInternal;
1186d07baf4d918ea7c8acf2292da08b0f0eedd3391Andrew Zeng    @Nullable private final StatusBarManagerInternal mStatusBarManagerInternal;
11928939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov    private final TrustManager mTrustManager;
120df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    private final Vibrator mVibrator;
1219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
1229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final NotifierHandler mHandler;
1239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final Intent mScreenOnIntent;
1249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final Intent mScreenOffIntent;
12584d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee    private final Intent mScreenBrightnessBoostIntent;
1269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
127c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown    // True if the device should suspend when the screen is off due to proximity.
128c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown    private final boolean mSuspendWhenScreenOffDueToProximityConfig;
129c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown
130416c49c4049f572134273e228d7988904a51b990Jeff Brown    // The current interactive state.  This is set as soon as an interactive state
131416c49c4049f572134273e228d7988904a51b990Jeff Brown    // transition begins so as to capture the reason that it happened.  At some point
132416c49c4049f572134273e228d7988904a51b990Jeff Brown    // this state will propagate to the pending state then eventually to the
133416c49c4049f572134273e228d7988904a51b990Jeff Brown    // broadcasted state over the course of reporting the transition asynchronously.
134416c49c4049f572134273e228d7988904a51b990Jeff Brown    private boolean mInteractive = true;
135416c49c4049f572134273e228d7988904a51b990Jeff Brown    private int mInteractiveChangeReason;
136416c49c4049f572134273e228d7988904a51b990Jeff Brown    private boolean mInteractiveChanging;
137416c49c4049f572134273e228d7988904a51b990Jeff Brown
138416c49c4049f572134273e228d7988904a51b990Jeff Brown    // The pending interactive state that we will eventually want to broadcast.
139416c49c4049f572134273e228d7988904a51b990Jeff Brown    // This is designed so that we can collapse redundant sequences of awake/sleep
140416c49c4049f572134273e228d7988904a51b990Jeff Brown    // transition pairs while still guaranteeing that at least one transition is observed
141416c49c4049f572134273e228d7988904a51b990Jeff Brown    // whenever this happens.
142416c49c4049f572134273e228d7988904a51b990Jeff Brown    private int mPendingInteractiveState;
143543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown    private boolean mPendingWakeUpBroadcast;
144543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown    private boolean mPendingGoToSleepBroadcast;
145543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown
146fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown    // The currently broadcasted interactive state.  This reflects what other parts of the
1479630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    // system have observed.
148fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown    private int mBroadcastedInteractiveState;
1499630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private boolean mBroadcastInProgress;
1509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private long mBroadcastStartTime;
1519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
1529630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    // True if a user activity message should be sent.
1539630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private boolean mUserActivityPending;
1549630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
1559630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public Notifier(Looper looper, Context context, IBatteryStats batteryStats,
156f7b4725375dfb5f6b65433f1679c44501c2478e3Svet Ganov            SuspendBlocker suspendBlocker, WindowManagerPolicy policy) {
1579630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mContext = context;
1589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mBatteryStats = batteryStats;
159f7b4725375dfb5f6b65433f1679c44501c2478e3Svet Ganov        mAppOps = mContext.getSystemService(AppOpsManager.class);
1609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mSuspendBlocker = suspendBlocker;
1619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mPolicy = policy;
16213014b5fe5967b3c7e232ffaf81581ed178e6df6Jeff Brown        mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
163037c33eae74bee2774897d969d48947f9abe254fJeff Brown        mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
164fa6e0a80e20a4917b403fd330e01a9edd021aabcYohei Yukawa        mInputMethodManagerInternal = LocalServices.getService(InputMethodManagerInternal.class);
165ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly        mStatusBarManagerInternal = LocalServices.getService(StatusBarManagerInternal.class);
16628939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov        mTrustManager = mContext.getSystemService(TrustManager.class);
167df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly        mVibrator = mContext.getSystemService(Vibrator.class);
1689630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
1699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mHandler = new NotifierHandler(looper);
1709630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON);
1719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mScreenOnIntent.addFlags(
172291df4fc0c3fc7a28bf0d89619b7e7bc0ea672e1Chad Brubaker                Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND
173291df4fc0c3fc7a28bf0d89619b7e7bc0ea672e1Chad Brubaker                | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
1749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);
1759630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mScreenOffIntent.addFlags(
176291df4fc0c3fc7a28bf0d89619b7e7bc0ea672e1Chad Brubaker                Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND
177291df4fc0c3fc7a28bf0d89619b7e7bc0ea672e1Chad Brubaker                | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
17884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        mScreenBrightnessBoostIntent =
17984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee                new Intent(PowerManager.ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED);
18084d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        mScreenBrightnessBoostIntent.addFlags(
18184d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee                Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
182e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown
183c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown        mSuspendWhenScreenOffDueToProximityConfig = context.getResources().getBoolean(
184c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                com.android.internal.R.bool.config_suspendWhenScreenOffDueToProximity);
185c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown
186e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown        // Initialize interactive state for battery stats.
187e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown        try {
188e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mBatteryStats.noteInteractive(true);
189e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown        } catch (RemoteException ex) { }
1909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
1919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
1929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
1939630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Called when a wake lock is acquired.
1949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
195713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn    public void onWakeLockAcquired(int flags, String tag, String packageName,
196a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            int ownerUid, int ownerPid, WorkSource workSource, String historyTag) {
1979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        if (DEBUG) {
1989630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            Slog.d(TAG, "onWakeLockAcquired: flags=" + flags + ", tag=\"" + tag
199713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn                    + "\", packageName=" + packageName
200713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn                    + ", ownerUid=" + ownerUid + ", ownerPid=" + ownerPid
2019630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    + ", workSource=" + workSource);
2029630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
2039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
204c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown        final int monitorType = getBatteryStatsWakeLockMonitorType(flags);
205c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown        if (monitorType >= 0) {
206c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown            try {
207c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                final boolean unimportantForLogging = ownerUid == Process.SYSTEM_UID
208c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                        && (flags & PowerManager.UNIMPORTANT_FOR_LOGGING) != 0;
209c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                if (workSource != null) {
210c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                    mBatteryStats.noteStartWakelockFromSource(workSource, ownerPid, tag,
211c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                            historyTag, monitorType, unimportantForLogging);
212c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                } else {
213c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                    mBatteryStats.noteStartWakelock(ownerUid, ownerPid, tag, historyTag,
214c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                            monitorType, unimportantForLogging);
215c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                    // XXX need to deal with disabled operations.
216f7b4725375dfb5f6b65433f1679c44501c2478e3Svet Ganov                    mAppOps.startOpNoThrow(AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName);
217c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                }
218c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown            } catch (RemoteException ex) {
219c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                // Ignore
2209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            }
2219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
2229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
2239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
224d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void onLongPartialWakeLockStart(String tag, int ownerUid, WorkSource workSource,
225d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            String historyTag) {
226d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        if (DEBUG) {
227d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            Slog.d(TAG, "onLongPartialWakeLockStart: ownerUid=" + ownerUid
228d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn                    + ", workSource=" + workSource);
229d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
230d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
231d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        try {
232d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            if (workSource != null) {
23396a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath                mBatteryStats.noteLongPartialWakelockStartFromSource(tag, historyTag, workSource);
234d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            } else {
235d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn                mBatteryStats.noteLongPartialWakelockStart(tag, historyTag, ownerUid);
236d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            }
237d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        } catch (RemoteException ex) {
238d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            // Ignore
239d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
240d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
241d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
242d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void onLongPartialWakeLockFinish(String tag, int ownerUid, WorkSource workSource,
243d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            String historyTag) {
244d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        if (DEBUG) {
245d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            Slog.d(TAG, "onLongPartialWakeLockFinish: ownerUid=" + ownerUid
246d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn                    + ", workSource=" + workSource);
247d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
248d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
249d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        try {
250d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            if (workSource != null) {
25196a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath                mBatteryStats.noteLongPartialWakelockFinishFromSource(tag, historyTag, workSource);
252d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            } else {
253d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn                mBatteryStats.noteLongPartialWakelockFinish(tag, historyTag, ownerUid);
254d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            }
255d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        } catch (RemoteException ex) {
256d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            // Ignore
257d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
258d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
259d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
2609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
261e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn     * Called when a wake lock is changing.
262e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn     */
263e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    public void onWakeLockChanging(int flags, String tag, String packageName,
264e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            int ownerUid, int ownerPid, WorkSource workSource, String historyTag,
265e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            int newFlags, String newTag, String newPackageName, int newOwnerUid,
266e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            int newOwnerPid, WorkSource newWorkSource, String newHistoryTag) {
267e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
268c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown        final int monitorType = getBatteryStatsWakeLockMonitorType(flags);
269c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown        final int newMonitorType = getBatteryStatsWakeLockMonitorType(newFlags);
270c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown        if (workSource != null && newWorkSource != null
271c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                && monitorType >= 0 && newMonitorType >= 0) {
272e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            if (DEBUG) {
273e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                Slog.d(TAG, "onWakeLockChanging: flags=" + newFlags + ", tag=\"" + newTag
274e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                        + "\", packageName=" + newPackageName
275e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                        + ", ownerUid=" + newOwnerUid + ", ownerPid=" + newOwnerPid
276e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                        + ", workSource=" + newWorkSource);
277e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            }
278c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown
279c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown            final boolean unimportantForLogging = newOwnerUid == Process.SYSTEM_UID
280c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                    && (newFlags & PowerManager.UNIMPORTANT_FOR_LOGGING) != 0;
281e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            try {
282cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                mBatteryStats.noteChangeWakelockFromSource(workSource, ownerPid, tag, historyTag,
283cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        monitorType, newWorkSource, newOwnerPid, newTag, newHistoryTag,
284e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                        newMonitorType, unimportantForLogging);
285e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            } catch (RemoteException ex) {
286e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                // Ignore
287e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            }
288e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        } else {
289cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            onWakeLockReleased(flags, tag, packageName, ownerUid, ownerPid, workSource, historyTag);
290e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            onWakeLockAcquired(newFlags, newTag, newPackageName, newOwnerUid, newOwnerPid,
291e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWorkSource, newHistoryTag);
292e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
293e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
294e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
295e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    /**
2969630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Called when a wake lock is released.
2979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
298713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn    public void onWakeLockReleased(int flags, String tag, String packageName,
299cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int ownerUid, int ownerPid, WorkSource workSource, String historyTag) {
3009630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        if (DEBUG) {
3019630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            Slog.d(TAG, "onWakeLockReleased: flags=" + flags + ", tag=\"" + tag
302713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn                    + "\", packageName=" + packageName
303713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn                    + ", ownerUid=" + ownerUid + ", ownerPid=" + ownerPid
3049630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    + ", workSource=" + workSource);
3059630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
3069630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
307c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown        final int monitorType = getBatteryStatsWakeLockMonitorType(flags);
308c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown        if (monitorType >= 0) {
309c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown            try {
310c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                if (workSource != null) {
311c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                    mBatteryStats.noteStopWakelockFromSource(workSource, ownerPid, tag,
312c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                            historyTag, monitorType);
313c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                } else {
314c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                    mBatteryStats.noteStopWakelock(ownerUid, ownerPid, tag,
315c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                            historyTag, monitorType);
316f7b4725375dfb5f6b65433f1679c44501c2478e3Svet Ganov                    mAppOps.finishOp(AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName);
317c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                }
318c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown            } catch (RemoteException ex) {
319c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                // Ignore
3209630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            }
3219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
3229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
3239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
324c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown    private int getBatteryStatsWakeLockMonitorType(int flags) {
3259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        switch (flags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
3269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            case PowerManager.PARTIAL_WAKE_LOCK:
327c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                return BatteryStats.WAKE_TYPE_PARTIAL;
328c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown
329c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown            case PowerManager.SCREEN_DIM_WAKE_LOCK:
330c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown            case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
331c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                return BatteryStats.WAKE_TYPE_FULL;
332c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown
3339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
334c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                if (mSuspendWhenScreenOffDueToProximityConfig) {
335c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                    return -1;
336c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                }
3379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                return BatteryStats.WAKE_TYPE_PARTIAL;
338c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown
339c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown            case PowerManager.DRAW_WAKE_LOCK:
340c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                return BatteryStats.WAKE_TYPE_DRAW;
341c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown
342c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown            case PowerManager.DOZE_WAKE_LOCK:
343c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                // Doze wake locks are an internal implementation detail of the
344c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                // communication between dream manager service and power manager
345c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                // service.  They have no additive battery impact.
346c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                return -1;
347c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown
3489630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            default:
349c4bd42c1eedefca4f15816e4e00af617dcfc8993Jeff Brown                return -1;
3509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
3519630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
3529630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
3539630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
354fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown     * Notifies that the device is changing wakefulness.
355416c49c4049f572134273e228d7988904a51b990Jeff Brown     * This function may be called even if the previous change hasn't finished in
356416c49c4049f572134273e228d7988904a51b990Jeff Brown     * which case it will assume that the state did not fully converge before the
357416c49c4049f572134273e228d7988904a51b990Jeff Brown     * next transition began and will recover accordingly.
3589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
359416c49c4049f572134273e228d7988904a51b990Jeff Brown    public void onWakefulnessChangeStarted(final int wakefulness, int reason) {
360416c49c4049f572134273e228d7988904a51b990Jeff Brown        final boolean interactive = PowerManagerInternal.isInteractive(wakefulness);
3619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        if (DEBUG) {
362fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown            Slog.d(TAG, "onWakefulnessChangeStarted: wakefulness=" + wakefulness
363416c49c4049f572134273e228d7988904a51b990Jeff Brown                    + ", reason=" + reason + ", interactive=" + interactive);
3649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
3659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
366416c49c4049f572134273e228d7988904a51b990Jeff Brown        // Tell the activity manager about changes in wakefulness, not just interactivity.
367416c49c4049f572134273e228d7988904a51b990Jeff Brown        // It needs more granularity than other components.
368416c49c4049f572134273e228d7988904a51b990Jeff Brown        mHandler.post(new Runnable() {
369416c49c4049f572134273e228d7988904a51b990Jeff Brown            @Override
370416c49c4049f572134273e228d7988904a51b990Jeff Brown            public void run() {
371416c49c4049f572134273e228d7988904a51b990Jeff Brown                mActivityManagerInternal.onWakefulnessChanged(wakefulness);
372416c49c4049f572134273e228d7988904a51b990Jeff Brown            }
373416c49c4049f572134273e228d7988904a51b990Jeff Brown        });
374416c49c4049f572134273e228d7988904a51b990Jeff Brown
375416c49c4049f572134273e228d7988904a51b990Jeff Brown        // Handle any early interactive state changes.
376416c49c4049f572134273e228d7988904a51b990Jeff Brown        // Finish pending incomplete ones from a previous cycle.
377416c49c4049f572134273e228d7988904a51b990Jeff Brown        if (mInteractive != interactive) {
378416c49c4049f572134273e228d7988904a51b990Jeff Brown            // Finish up late behaviors if needed.
379416c49c4049f572134273e228d7988904a51b990Jeff Brown            if (mInteractiveChanging) {
380416c49c4049f572134273e228d7988904a51b990Jeff Brown                handleLateInteractiveChange();
381416c49c4049f572134273e228d7988904a51b990Jeff Brown            }
382fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown
383416c49c4049f572134273e228d7988904a51b990Jeff Brown            // Start input as soon as we start waking up or going to sleep.
384416c49c4049f572134273e228d7988904a51b990Jeff Brown            mInputManagerInternal.setInteractive(interactive);
385fa6e0a80e20a4917b403fd330e01a9edd021aabcYohei Yukawa            mInputMethodManagerInternal.setInteractive(interactive);
386416c49c4049f572134273e228d7988904a51b990Jeff Brown
387416c49c4049f572134273e228d7988904a51b990Jeff Brown            // Notify battery stats.
388416c49c4049f572134273e228d7988904a51b990Jeff Brown            try {
389416c49c4049f572134273e228d7988904a51b990Jeff Brown                mBatteryStats.noteInteractive(interactive);
390416c49c4049f572134273e228d7988904a51b990Jeff Brown            } catch (RemoteException ex) { }
391416c49c4049f572134273e228d7988904a51b990Jeff Brown
392416c49c4049f572134273e228d7988904a51b990Jeff Brown            // Handle early behaviors.
393416c49c4049f572134273e228d7988904a51b990Jeff Brown            mInteractive = interactive;
394416c49c4049f572134273e228d7988904a51b990Jeff Brown            mInteractiveChangeReason = reason;
395416c49c4049f572134273e228d7988904a51b990Jeff Brown            mInteractiveChanging = true;
396416c49c4049f572134273e228d7988904a51b990Jeff Brown            handleEarlyInteractiveChange();
397416c49c4049f572134273e228d7988904a51b990Jeff Brown        }
398fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown    }
399fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown
400fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown    /**
401fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown     * Notifies that the device has finished changing wakefulness.
402fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown     */
403416c49c4049f572134273e228d7988904a51b990Jeff Brown    public void onWakefulnessChangeFinished() {
404fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown        if (DEBUG) {
405416c49c4049f572134273e228d7988904a51b990Jeff Brown            Slog.d(TAG, "onWakefulnessChangeFinished");
406fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown        }
407fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown
408416c49c4049f572134273e228d7988904a51b990Jeff Brown        if (mInteractiveChanging) {
409416c49c4049f572134273e228d7988904a51b990Jeff Brown            mInteractiveChanging = false;
410416c49c4049f572134273e228d7988904a51b990Jeff Brown            handleLateInteractiveChange();
411fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown        }
412fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown    }
413fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown
414416c49c4049f572134273e228d7988904a51b990Jeff Brown    /**
415416c49c4049f572134273e228d7988904a51b990Jeff Brown     * Handle early interactive state changes such as getting applications or the lock
416416c49c4049f572134273e228d7988904a51b990Jeff Brown     * screen running and ready for the user to see (such as when turning on the screen).
417416c49c4049f572134273e228d7988904a51b990Jeff Brown     */
418416c49c4049f572134273e228d7988904a51b990Jeff Brown    private void handleEarlyInteractiveChange() {
4199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        synchronized (mLock) {
420416c49c4049f572134273e228d7988904a51b990Jeff Brown            if (mInteractive) {
421037c33eae74bee2774897d969d48947f9abe254fJeff Brown                // Waking up...
422416c49c4049f572134273e228d7988904a51b990Jeff Brown                mHandler.post(new Runnable() {
423416c49c4049f572134273e228d7988904a51b990Jeff Brown                    @Override
424416c49c4049f572134273e228d7988904a51b990Jeff Brown                    public void run() {
4255ab5e1d9514bde75beaf87f46d45b6ffcaac9891Makoto Onuki                        // Note a SCREEN tron event is logged in PowerManagerService.
426416c49c4049f572134273e228d7988904a51b990Jeff Brown                        mPolicy.startedWakingUp();
427416c49c4049f572134273e228d7988904a51b990Jeff Brown                    }
428416c49c4049f572134273e228d7988904a51b990Jeff Brown                });
429416c49c4049f572134273e228d7988904a51b990Jeff Brown
430416c49c4049f572134273e228d7988904a51b990Jeff Brown                // Send interactive broadcast.
431416c49c4049f572134273e228d7988904a51b990Jeff Brown                mPendingInteractiveState = INTERACTIVE_STATE_AWAKE;
432416c49c4049f572134273e228d7988904a51b990Jeff Brown                mPendingWakeUpBroadcast = true;
433416c49c4049f572134273e228d7988904a51b990Jeff Brown                updatePendingBroadcastLocked();
434037c33eae74bee2774897d969d48947f9abe254fJeff Brown            } else {
435037c33eae74bee2774897d969d48947f9abe254fJeff Brown                // Going to sleep...
436416c49c4049f572134273e228d7988904a51b990Jeff Brown                // Tell the policy that we started going to sleep.
437416c49c4049f572134273e228d7988904a51b990Jeff Brown                final int why = translateOffReason(mInteractiveChangeReason);
438416c49c4049f572134273e228d7988904a51b990Jeff Brown                mHandler.post(new Runnable() {
439416c49c4049f572134273e228d7988904a51b990Jeff Brown                    @Override
440416c49c4049f572134273e228d7988904a51b990Jeff Brown                    public void run() {
441416c49c4049f572134273e228d7988904a51b990Jeff Brown                        mPolicy.startedGoingToSleep(why);
442416c49c4049f572134273e228d7988904a51b990Jeff Brown                    }
443416c49c4049f572134273e228d7988904a51b990Jeff Brown                });
444416c49c4049f572134273e228d7988904a51b990Jeff Brown            }
445416c49c4049f572134273e228d7988904a51b990Jeff Brown        }
446416c49c4049f572134273e228d7988904a51b990Jeff Brown    }
447416c49c4049f572134273e228d7988904a51b990Jeff Brown
448416c49c4049f572134273e228d7988904a51b990Jeff Brown    /**
449416c49c4049f572134273e228d7988904a51b990Jeff Brown     * Handle late interactive state changes once they are finished so that the system can
450416c49c4049f572134273e228d7988904a51b990Jeff Brown     * finish pending transitions (such as turning the screen off) before causing
451416c49c4049f572134273e228d7988904a51b990Jeff Brown     * applications to change state visibly.
452416c49c4049f572134273e228d7988904a51b990Jeff Brown     */
453416c49c4049f572134273e228d7988904a51b990Jeff Brown    private void handleLateInteractiveChange() {
454416c49c4049f572134273e228d7988904a51b990Jeff Brown        synchronized (mLock) {
455416c49c4049f572134273e228d7988904a51b990Jeff Brown            if (mInteractive) {
456416c49c4049f572134273e228d7988904a51b990Jeff Brown                // Finished waking up...
457416c49c4049f572134273e228d7988904a51b990Jeff Brown                mHandler.post(new Runnable() {
458416c49c4049f572134273e228d7988904a51b990Jeff Brown                    @Override
459416c49c4049f572134273e228d7988904a51b990Jeff Brown                    public void run() {
460416c49c4049f572134273e228d7988904a51b990Jeff Brown                        mPolicy.finishedWakingUp();
461416c49c4049f572134273e228d7988904a51b990Jeff Brown                    }
462416c49c4049f572134273e228d7988904a51b990Jeff Brown                });
463416c49c4049f572134273e228d7988904a51b990Jeff Brown            } else {
464416c49c4049f572134273e228d7988904a51b990Jeff Brown                // Finished going to sleep...
465037c33eae74bee2774897d969d48947f9abe254fJeff Brown                // This is a good time to make transitions that we don't want the user to see,
466416c49c4049f572134273e228d7988904a51b990Jeff Brown                // such as bringing the key guard to focus.  There's no guarantee for this
467037c33eae74bee2774897d969d48947f9abe254fJeff Brown                // however because the user could turn the device on again at any time.
468037c33eae74bee2774897d969d48947f9abe254fJeff Brown                // Some things may need to be protected by other mechanisms that defer screen on.
469416c49c4049f572134273e228d7988904a51b990Jeff Brown
470416c49c4049f572134273e228d7988904a51b990Jeff Brown                // Cancel pending user activity.
471416c49c4049f572134273e228d7988904a51b990Jeff Brown                if (mUserActivityPending) {
472416c49c4049f572134273e228d7988904a51b990Jeff Brown                    mUserActivityPending = false;
473416c49c4049f572134273e228d7988904a51b990Jeff Brown                    mHandler.removeMessages(MSG_USER_ACTIVITY);
4749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                }
475416c49c4049f572134273e228d7988904a51b990Jeff Brown
476416c49c4049f572134273e228d7988904a51b990Jeff Brown                // Tell the policy we finished going to sleep.
477416c49c4049f572134273e228d7988904a51b990Jeff Brown                final int why = translateOffReason(mInteractiveChangeReason);
478416c49c4049f572134273e228d7988904a51b990Jeff Brown                mHandler.post(new Runnable() {
479416c49c4049f572134273e228d7988904a51b990Jeff Brown                    @Override
480416c49c4049f572134273e228d7988904a51b990Jeff Brown                    public void run() {
4815c38fc2b97cba8a275a24bdf201073d68b101e7aAlison Cichowlas                        LogMaker log = new LogMaker(MetricsEvent.SCREEN);
4825c38fc2b97cba8a275a24bdf201073d68b101e7aAlison Cichowlas                        log.setType(MetricsEvent.TYPE_CLOSE);
4835c38fc2b97cba8a275a24bdf201073d68b101e7aAlison Cichowlas                        log.setSubtype(why);
4845c38fc2b97cba8a275a24bdf201073d68b101e7aAlison Cichowlas                        MetricsLogger.action(log);
4855ab5e1d9514bde75beaf87f46d45b6ffcaac9891Makoto Onuki                        EventLogTags.writePowerScreenState(0, why, 0, 0, 0);
486416c49c4049f572134273e228d7988904a51b990Jeff Brown                        mPolicy.finishedGoingToSleep(why);
487416c49c4049f572134273e228d7988904a51b990Jeff Brown                    }
488416c49c4049f572134273e228d7988904a51b990Jeff Brown                });
489416c49c4049f572134273e228d7988904a51b990Jeff Brown
490416c49c4049f572134273e228d7988904a51b990Jeff Brown                // Send non-interactive broadcast.
491416c49c4049f572134273e228d7988904a51b990Jeff Brown                mPendingInteractiveState = INTERACTIVE_STATE_ASLEEP;
492416c49c4049f572134273e228d7988904a51b990Jeff Brown                mPendingGoToSleepBroadcast = true;
493416c49c4049f572134273e228d7988904a51b990Jeff Brown                updatePendingBroadcastLocked();
4949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            }
4959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
496416c49c4049f572134273e228d7988904a51b990Jeff Brown    }
497e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown
498416c49c4049f572134273e228d7988904a51b990Jeff Brown    private static int translateOffReason(int reason) {
499416c49c4049f572134273e228d7988904a51b990Jeff Brown        switch (reason) {
500416c49c4049f572134273e228d7988904a51b990Jeff Brown            case PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN:
501416c49c4049f572134273e228d7988904a51b990Jeff Brown                return WindowManagerPolicy.OFF_BECAUSE_OF_ADMIN;
502416c49c4049f572134273e228d7988904a51b990Jeff Brown            case PowerManager.GO_TO_SLEEP_REASON_TIMEOUT:
503416c49c4049f572134273e228d7988904a51b990Jeff Brown                return WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT;
504416c49c4049f572134273e228d7988904a51b990Jeff Brown            default:
505416c49c4049f572134273e228d7988904a51b990Jeff Brown                return WindowManagerPolicy.OFF_BECAUSE_OF_USER;
506e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown        }
5079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
5089630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
5099630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    /**
51084d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee     * Called when screen brightness boost begins or ends.
51184d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee     */
51284d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee    public void onScreenBrightnessBoostChanged() {
51384d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        if (DEBUG) {
51484d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee            Slog.d(TAG, "onScreenBrightnessBoostChanged");
51584d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        }
51684d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee
51784d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        mSuspendBlocker.acquire();
51884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        Message msg = mHandler.obtainMessage(MSG_SCREEN_BRIGHTNESS_BOOST_CHANGED);
51984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        msg.setAsynchronous(true);
52084d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        mHandler.sendMessage(msg);
52184d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee    }
522416c49c4049f572134273e228d7988904a51b990Jeff Brown
52384d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee    /**
5249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     * Called when there has been user activity.
5259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown     */
5269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    public void onUserActivity(int event, int uid) {
5279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        if (DEBUG) {
5289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            Slog.d(TAG, "onUserActivity: event=" + event + ", uid=" + uid);
5299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
5309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
5319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        try {
5329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mBatteryStats.noteUserActivity(uid, event);
5339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        } catch (RemoteException ex) {
5349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            // Ignore
5359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
5369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
5379630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        synchronized (mLock) {
5389630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            if (!mUserActivityPending) {
5399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                mUserActivityPending = true;
5409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY);
5419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                msg.setAsynchronous(true);
5429630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                mHandler.sendMessage(msg);
5439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            }
5449630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
5459630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
5469630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
54784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown    /**
548280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn     * Called when the screen has turned on.
549280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn     */
550280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void onWakeUp(String reason, int reasonUid, String opPackageName, int opUid) {
551280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        if (DEBUG) {
552280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            Slog.d(TAG, "onWakeUp: event=" + reason + ", reasonUid=" + reasonUid
553280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn                    + " opPackageName=" + opPackageName + " opUid=" + opUid);
554280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
555280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
556280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        try {
557280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mBatteryStats.noteWakeUp(reason, reasonUid);
558280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            if (opPackageName != null) {
559f7b4725375dfb5f6b65433f1679c44501c2478e3Svet Ganov                mAppOps.noteOpNoThrow(AppOpsManager.OP_TURN_SCREEN_ON, opUid, opPackageName);
560280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            }
561280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        } catch (RemoteException ex) {
562280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            // Ignore
563280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
564280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
565280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
566280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    /**
567ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly     * Called when profile screen lock timeout has expired.
56884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown     */
569ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly    public void onProfileTimeout(@UserIdInt int userId) {
570ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly        final Message msg = mHandler.obtainMessage(MSG_PROFILE_TIMED_OUT);
57184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown        msg.setAsynchronous(true);
572ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly        msg.arg1 = userId;
57384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown        mHandler.sendMessage(msg);
57484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown    }
57584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown
57628939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov    /**
577ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly     * Called when wireless charging has started so as to provide user feedback (sound and visual).
57828939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov     */
579ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly    public void onWirelessChargingStarted(int batteryLevel) {
580ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly        if (DEBUG) {
581ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly            Slog.d(TAG, "onWirelessChargingStarted");
582ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly        }
583ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly
584ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly        mSuspendBlocker.acquire();
585ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly        Message msg = mHandler.obtainMessage(MSG_WIRELESS_CHARGING_STARTED);
58628939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov        msg.setAsynchronous(true);
587ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly        msg.arg1 = batteryLevel;
58828939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov        mHandler.sendMessage(msg);
58928939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov    }
59028939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov
591c1313eb44d01285983975bd57f010c526ca2ff56Beverly    /**
592c1313eb44d01285983975bd57f010c526ca2ff56Beverly     * Called when wired charging has started so as to provide user feedback
593c1313eb44d01285983975bd57f010c526ca2ff56Beverly     */
594c1313eb44d01285983975bd57f010c526ca2ff56Beverly    public void onWiredChargingStarted() {
595c1313eb44d01285983975bd57f010c526ca2ff56Beverly        if (DEBUG) {
596c1313eb44d01285983975bd57f010c526ca2ff56Beverly            Slog.d(TAG, "onWiredChargingStarted");
597c1313eb44d01285983975bd57f010c526ca2ff56Beverly        }
598c1313eb44d01285983975bd57f010c526ca2ff56Beverly
599c1313eb44d01285983975bd57f010c526ca2ff56Beverly        mSuspendBlocker.acquire();
600c1313eb44d01285983975bd57f010c526ca2ff56Beverly        Message msg = mHandler.obtainMessage(MSG_WIRED_CHARGING_STARTED);
601c1313eb44d01285983975bd57f010c526ca2ff56Beverly        msg.setAsynchronous(true);
602c1313eb44d01285983975bd57f010c526ca2ff56Beverly        mHandler.sendMessage(msg);
603c1313eb44d01285983975bd57f010c526ca2ff56Beverly    }
604c1313eb44d01285983975bd57f010c526ca2ff56Beverly
6059630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private void updatePendingBroadcastLocked() {
6069630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        if (!mBroadcastInProgress
607416c49c4049f572134273e228d7988904a51b990Jeff Brown                && mPendingInteractiveState != INTERACTIVE_STATE_UNKNOWN
608543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                && (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast
609416c49c4049f572134273e228d7988904a51b990Jeff Brown                        || mPendingInteractiveState != mBroadcastedInteractiveState)) {
6109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mBroadcastInProgress = true;
6119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mSuspendBlocker.acquire();
6129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            Message msg = mHandler.obtainMessage(MSG_BROADCAST);
6139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            msg.setAsynchronous(true);
6149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mHandler.sendMessage(msg);
6159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
6169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
6179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
618543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown    private void finishPendingBroadcastLocked() {
619543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown        mBroadcastInProgress = false;
620543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown        mSuspendBlocker.release();
621543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown    }
622543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown
6239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private void sendUserActivity() {
6249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        synchronized (mLock) {
6259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            if (!mUserActivityPending) {
6269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                return;
6279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            }
6289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mUserActivityPending = false;
6299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
6309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mPolicy.userActivity();
6319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
6329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
6339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private void sendNextBroadcast() {
6349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        final int powerState;
6359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        synchronized (mLock) {
636fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown            if (mBroadcastedInteractiveState == INTERACTIVE_STATE_UNKNOWN) {
637543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                // Broadcasted power state is unknown.  Send wake up.
638543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                mPendingWakeUpBroadcast = false;
639fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown                mBroadcastedInteractiveState = INTERACTIVE_STATE_AWAKE;
640fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown            } else if (mBroadcastedInteractiveState == INTERACTIVE_STATE_AWAKE) {
641543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                // Broadcasted power state is awake.  Send asleep if needed.
642543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                if (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast
643416c49c4049f572134273e228d7988904a51b990Jeff Brown                        || mPendingInteractiveState == INTERACTIVE_STATE_ASLEEP) {
644543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                    mPendingGoToSleepBroadcast = false;
645fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown                    mBroadcastedInteractiveState = INTERACTIVE_STATE_ASLEEP;
646543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                } else {
647543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                    finishPendingBroadcastLocked();
648543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                    return;
649543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                }
650543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown            } else {
651543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                // Broadcasted power state is asleep.  Send awake if needed.
652543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                if (mPendingWakeUpBroadcast || mPendingGoToSleepBroadcast
653416c49c4049f572134273e228d7988904a51b990Jeff Brown                        || mPendingInteractiveState == INTERACTIVE_STATE_AWAKE) {
654543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                    mPendingWakeUpBroadcast = false;
655fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown                    mBroadcastedInteractiveState = INTERACTIVE_STATE_AWAKE;
656543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                } else {
657543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                    finishPendingBroadcastLocked();
658543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                    return;
659543083593430208af87e51b94cdbbb51cbe2d7b5Jeff Brown                }
6609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            }
6619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
6629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mBroadcastStartTime = SystemClock.uptimeMillis();
663fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown            powerState = mBroadcastedInteractiveState;
6649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
6659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
6669630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_SEND, 1);
6679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
668fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown        if (powerState == INTERACTIVE_STATE_AWAKE) {
6699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            sendWakeUpBroadcast();
6709630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        } else {
671c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller            sendGoToSleepBroadcast();
6729630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
6739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
6749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
67584d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee    private void sendBrightnessBoostChangedBroadcast() {
67684d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        if (DEBUG) {
67784d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee            Slog.d(TAG, "Sending brightness boost changed broadcast.");
67884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        }
67984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee
68084d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        mContext.sendOrderedBroadcastAsUser(mScreenBrightnessBoostIntent, UserHandle.ALL, null,
68184d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee                mScreeBrightnessBoostChangedDone, mHandler, 0, null, null);
68284d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee    }
68384d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee
68484d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee    private final BroadcastReceiver mScreeBrightnessBoostChangedDone = new BroadcastReceiver() {
68584d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        @Override
68684d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        public void onReceive(Context context, Intent intent) {
68784d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee            mSuspendBlocker.release();
68884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee        }
68984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee    };
69084d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee
6919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private void sendWakeUpBroadcast() {
6929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        if (DEBUG) {
6939630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            Slog.d(TAG, "Sending wake up broadcast.");
6949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
6959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
696fc46e9b643881b7b2ab76854f3a0ac077e9def8dSudheer Shanka        if (mActivityManagerInternal.isSystemReady()) {
6975ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            mContext.sendOrderedBroadcastAsUser(mScreenOnIntent, UserHandle.ALL, null,
6989630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    mWakeUpBroadcastDone, mHandler, 0, null, null);
6999630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        } else {
7009630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 2, 1);
7019630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            sendNextBroadcast();
7029630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
7039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
7049630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
7059630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final BroadcastReceiver mWakeUpBroadcastDone = new BroadcastReceiver() {
7069630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        @Override
7079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        public void onReceive(Context context, Intent intent) {
7089630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 1,
7099630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    SystemClock.uptimeMillis() - mBroadcastStartTime, 1);
7109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            sendNextBroadcast();
7119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
7129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    };
7139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
714c522d1646ac353aec302252fa53976c1fa46ad3dJim Miller    private void sendGoToSleepBroadcast() {
7159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        if (DEBUG) {
7169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            Slog.d(TAG, "Sending go to sleep broadcast.");
7179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
7189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
719fc46e9b643881b7b2ab76854f3a0ac077e9def8dSudheer Shanka        if (mActivityManagerInternal.isSystemReady()) {
7205ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn            mContext.sendOrderedBroadcastAsUser(mScreenOffIntent, UserHandle.ALL, null,
7219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    mGoToSleepBroadcastDone, mHandler, 0, null, null);
7229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        } else {
7239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 3, 1);
7249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            sendNextBroadcast();
7259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
7269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
7279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
7289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final BroadcastReceiver mGoToSleepBroadcastDone = new BroadcastReceiver() {
7299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        @Override
7309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        public void onReceive(Context context, Intent intent) {
7319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 0,
7329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    SystemClock.uptimeMillis() - mBroadcastStartTime, 1);
7339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            sendNextBroadcast();
7349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
7359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    };
7369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
737c1313eb44d01285983975bd57f010c526ca2ff56Beverly    /**
738c1313eb44d01285983975bd57f010c526ca2ff56Beverly     * Plays the wireless charging sound for both wireless and non-wireless charging
739c1313eb44d01285983975bd57f010c526ca2ff56Beverly     */
740c1313eb44d01285983975bd57f010c526ca2ff56Beverly    private void playChargingStartedSound() {
74184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown        final String soundPath = Settings.Global.getString(mContext.getContentResolver(),
742c1313eb44d01285983975bd57f010c526ca2ff56Beverly                Settings.Global.CHARGING_STARTED_SOUND);
743df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly        if (isChargingFeedbackEnabled() && soundPath != null) {
74484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown            final Uri soundUri = Uri.parse("file://" + soundPath);
74584e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown            if (soundUri != null) {
74684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown                final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
74784e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown                if (sfx != null) {
74884e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown                    sfx.setStreamType(AudioManager.STREAM_SYSTEM);
74984e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown                    sfx.play();
75084e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown                }
75184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown            }
75284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown        }
753ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly    }
75484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown
755ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly    private void showWirelessChargingStarted(int batteryLevel) {
756df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly        playWirelessChargingVibration();
757c1313eb44d01285983975bd57f010c526ca2ff56Beverly        playChargingStartedSound();
7586d07baf4d918ea7c8acf2292da08b0f0eedd3391Andrew Zeng        if (mStatusBarManagerInternal != null) {
7596d07baf4d918ea7c8acf2292da08b0f0eedd3391Andrew Zeng            mStatusBarManagerInternal.showChargingAnimation(batteryLevel);
7606d07baf4d918ea7c8acf2292da08b0f0eedd3391Andrew Zeng        }
76184e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown        mSuspendBlocker.release();
76284e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown    }
76384e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown
764c1313eb44d01285983975bd57f010c526ca2ff56Beverly    private void showWiredChargingStarted() {
765c1313eb44d01285983975bd57f010c526ca2ff56Beverly        playChargingStartedSound();
766c1313eb44d01285983975bd57f010c526ca2ff56Beverly        mSuspendBlocker.release();
767c1313eb44d01285983975bd57f010c526ca2ff56Beverly    }
768c1313eb44d01285983975bd57f010c526ca2ff56Beverly
76928939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov    private void lockProfile(@UserIdInt int userId) {
77028939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov        mTrustManager.setDeviceLockedForUser(userId, true /*locked*/);
77128939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov    }
77228939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov
773df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    private void playWirelessChargingVibration() {
774df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly        final boolean vibrateEnabled = Settings.Global.getInt(mContext.getContentResolver(),
775df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly                Settings.Global.CHARGING_VIBRATION_ENABLED, 0) != 0;
776df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly        if (vibrateEnabled && isChargingFeedbackEnabled()) {
777df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly            mVibrator.vibrate(WIRELESS_CHARGING_VIBRATION_EFFECT, VIBRATION_ATTRIBUTES);
778df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly        }
779df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    }
780df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly
781df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    private boolean isChargingFeedbackEnabled() {
782df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly        final boolean enabled = Settings.Global.getInt(mContext.getContentResolver(),
783df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly                Settings.Global.CHARGING_SOUNDS_ENABLED, 1) != 0;
784df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly        final boolean dndOff = Settings.Global.getInt(mContext.getContentResolver(),
785df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly                Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS)
786df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly                == Settings.Global.ZEN_MODE_OFF;
787df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly        return enabled && dndOff;
788df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly    }
789df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly
7909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final class NotifierHandler extends Handler {
79128939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov
7929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        public NotifierHandler(Looper looper) {
793a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown            super(looper, null, true /*async*/);
7949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
7959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        @Override
7969630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        public void handleMessage(Message msg) {
7979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            switch (msg.what) {
7989630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                case MSG_USER_ACTIVITY:
7999630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    sendUserActivity();
8009630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    break;
8019630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                case MSG_BROADCAST:
8029630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    sendNextBroadcast();
8039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown                    break;
80484e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown                case MSG_WIRELESS_CHARGING_STARTED:
805ae79ab9d87afcb02c0ea66493ee4c8f56b44a9e1Beverly                    showWirelessChargingStarted(msg.arg1);
80684e2756c0f3794c6efe5568a9d09101ba689fb39Jeff Brown                    break;
80784d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee                case MSG_SCREEN_BRIGHTNESS_BOOST_CHANGED:
80884d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee                    sendBrightnessBoostChangedBroadcast();
80984d6c0fbf6e513d68330234503b809751d0e3564Bryce Lee                    break;
81028939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov                case MSG_PROFILE_TIMED_OUT:
81128939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov                    lockProfile(msg.arg1);
81228939988f0da2f37bac87a6929a1584ad18fdebaPavel Grafov                    break;
813c1313eb44d01285983975bd57f010c526ca2ff56Beverly                case MSG_WIRED_CHARGING_STARTED:
814c1313eb44d01285983975bd57f010c526ca2ff56Beverly                    showWiredChargingStarted();
815df9f36da19ab42bb1c44dc61a8300aecea0a840dBeverly                    break;
8169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            }
8179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        }
8189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    }
8199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown}
820