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