19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.IBatteryStats; 206ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapuimport com.android.internal.app.ShutdownThread; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.server.am.BatteryStatsService; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentQueryMap; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 32d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwoodimport android.content.res.Resources; 3343866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongkerimport android.database.ContentObserver; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 35bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwoodimport android.hardware.Sensor; 36bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwoodimport android.hardware.SensorEvent; 37bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwoodimport android.hardware.SensorEventListener; 38bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwoodimport android.hardware.SensorManager; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 4143866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongkerimport android.os.Environment; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.HandlerThread; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.LocalPowerManager; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Power; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 5114e69afdfcefe21c81679a95c476e64ebb276fbeSan Mehatimport android.os.ServiceManager; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings.SettingNotFoundException; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 578a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerPolicy; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.provider.Settings.System.DIM_SCREEN; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.provider.Settings.System.SCREEN_BRIGHTNESS; 61951764b97010dfa073126f52b43ea1bdf1b35998Dan Murphyimport static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE; 62dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwoodimport static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.provider.Settings.System.STAY_ON_WHILE_PLUGGED_IN; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 6750a21f4d3b70360b36acad20e234c380654fd59fDoug Zongkerimport java.io.IOException; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Observable; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Observer; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwoodclass PowerManagerService extends IPowerManager.Stub 758738e0c040061a179ad88adb997143f076277b04Mike Lockwood implements LocalPowerManager, Watchdog.Monitor { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PowerManagerService"; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String PARTIAL_NAME = "PowerManagerService"; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean LOG_PARTIAL_WL = false; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Indicates whether touch-down cycles should be logged as part of the 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOG_POWER_SCREEN_STATE log events 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean LOG_TOUCH_DOWNS = true; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LOCK_MASK = PowerManager.PARTIAL_WAKE_LOCK 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | PowerManager.SCREEN_DIM_WAKE_LOCK 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | PowerManager.SCREEN_BRIGHT_WAKE_LOCK 89bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood | PowerManager.FULL_WAKE_LOCK 90bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood | PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // time since last state: time since last event: 9343866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker // The short keylight delay comes from secure settings; this is the default. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int SHORT_KEYLIGHT_DELAY_DEFAULT = 6000; // t+6 sec 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MEDIUM_KEYLIGHT_DELAY = 15000; // t+15 sec 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LONG_KEYLIGHT_DELAY = 6000; // t+6 sec 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LONG_DIM_TIME = 7000; // t+N-5 sec 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood // How long to wait to debounce light sensor changes. 1009b813692f5cfe06f10416b61bcb388f1e9ac198bMike Lockwood private static final int LIGHT_SENSOR_DELAY = 2000; 101d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood 10220f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood // For debouncing the proximity sensor. 10320f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood private static final int PROXIMITY_SENSOR_DELAY = 1000; 10420f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood 105d20ea369b26cb40ee6122dd819ce9ef947489146Mike Lockwood // trigger proximity if distance is less than 5 cm 106d20ea369b26cb40ee6122dd819ce9ef947489146Mike Lockwood private static final float PROXIMITY_THRESHOLD = 5.0f; 107d20ea369b26cb40ee6122dd819ce9ef947489146Mike Lockwood 10843866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker // Cached secure settings; see updateSettingsValues() 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mShortKeylightDelay = SHORT_KEYLIGHT_DELAY_DEFAULT; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // flags for setPowerState 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int SCREEN_ON_BIT = 0x00000001; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int SCREEN_BRIGHT_BIT = 0x00000002; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int BUTTON_BRIGHT_BIT = 0x00000004; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int KEYBOARD_BRIGHT_BIT = 0x00000008; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int BATTERY_LOW_BIT = 0x00000010; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // values for setPowerState 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // SCREEN_OFF == everything off 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int SCREEN_OFF = 0x00000000; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // SCREEN_DIM == screen on, screen backlight dim 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int SCREEN_DIM = SCREEN_ON_BIT; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // SCREEN_BRIGHT == screen on, screen backlight bright 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int SCREEN_BRIGHT = SCREEN_ON_BIT | SCREEN_BRIGHT_BIT; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // SCREEN_BUTTON_BRIGHT == screen on, screen and button backlights bright 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int SCREEN_BUTTON_BRIGHT = SCREEN_BRIGHT | BUTTON_BRIGHT_BIT; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // SCREEN_BUTTON_BRIGHT == screen on, screen, button and keyboard backlights bright 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ALL_BRIGHT = SCREEN_BUTTON_BRIGHT | KEYBOARD_BRIGHT_BIT; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // used for noChangeLights in setPowerState() 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LIGHTS_MASK = SCREEN_BRIGHT_BIT | BUTTON_BRIGHT_BIT | KEYBOARD_BRIGHT_BIT; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean ANIMATE_SCREEN_LIGHTS = true; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean ANIMATE_BUTTON_LIGHTS = false; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean ANIMATE_KEYBOARD_LIGHTS = false; 141ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int ANIM_STEPS = 60/4; 143dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood // Slower animation for autobrightness changes 144dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood static final int AUTOBRIGHTNESS_ANIM_STEPS = 60; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These magic numbers are the initial state of the LEDs at boot. Ideally 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we should read them from the driver, but our current hardware returns 0 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for the initial value. Oops! 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int INITIAL_SCREEN_BRIGHTNESS = 255; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int INITIAL_BUTTON_BRIGHTNESS = Power.BRIGHTNESS_OFF; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int INITIAL_KEYBOARD_BRIGHTNESS = Power.BRIGHTNESS_OFF; 152ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int MY_UID; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDoneBooting = false; 1562d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood private boolean mBootCompleted = false; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mStayOnConditions = 0; 158ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood private final int[] mBroadcastQueue = new int[] { -1, -1, -1 }; 159ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood private final int[] mBroadcastWhy = new int[3]; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mPartialCount = 0; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mPowerState; 162435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood // mScreenOffReason can be WindowManagerPolicy.OFF_BECAUSE_OF_USER, 163435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood // WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT or WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR 164435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood private int mScreenOffReason; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mUserState; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mKeyboardVisible = false; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mUserActivityAllowed = true; 168ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood private int mProximityWakeLockCount = 0; 169ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood private boolean mProximitySensorEnabled = false; 17036fc302560fbc6dff3099860356d290d1653371cMike Lockwood private boolean mProximitySensorActive = false; 17120f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood private int mProximityPendingValue = -1; // -1 == nothing, 0 == inactive, 1 == active 17220f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood private long mLastProximityEventTime; 173df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn private int mScreenOffTimeoutSetting; 174df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn private int mMaximumScreenOffTimeout = Integer.MAX_VALUE; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mKeylightDelay; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDimDelay; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mScreenOffDelay; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mWakeLockState; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mLastEventTime = 0; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mScreenOffTime; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private volatile WindowManagerPolicy mPolicy; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final LockList mLocks = new LockList(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Intent mScreenOffIntent; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Intent mScreenOnIntent; 1853a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood private LightsService mLightsService; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 1873cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private LightsService.Light mLcdLight; 1883cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private LightsService.Light mButtonLight; 1893cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private LightsService.Light mKeyboardLight; 1903cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private LightsService.Light mAttentionLight; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private UnsynchronizedWakeLock mBroadcastWakeLock; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private UnsynchronizedWakeLock mStayOnWhilePluggedInScreenDimLock; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private UnsynchronizedWakeLock mStayOnWhilePluggedInPartialLock; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private UnsynchronizedWakeLock mPreventScreenOnPartialLock; 1950e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood private UnsynchronizedWakeLock mProximityPartialLock; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private HandlerThread mHandlerThread; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Handler mHandler; 198ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood private final TimeoutTask mTimeoutTask = new TimeoutTask(); 199ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood private final LightAnimator mLightAnimator = new LightAnimator(); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final BrightnessState mScreenBrightness 201105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project = new BrightnessState(SCREEN_BRIGHT_BIT); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final BrightnessState mKeyboardBrightness 203105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project = new BrightnessState(KEYBOARD_BRIGHT_BIT); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final BrightnessState mButtonBrightness 205105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project = new BrightnessState(BUTTON_BRIGHT_BIT); 206128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato private boolean mStillNeedSleepNotification; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIsPowered = false; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IActivityManager mActivityService; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IBatteryStats mBatteryStats; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BatteryService mBatteryService; 211bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood private SensorManager mSensorManager; 212bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood private Sensor mProximitySensor; 2138738e0c040061a179ad88adb997143f076277b04Mike Lockwood private Sensor mLightSensor; 2148738e0c040061a179ad88adb997143f076277b04Mike Lockwood private boolean mLightSensorEnabled; 2158738e0c040061a179ad88adb997143f076277b04Mike Lockwood private float mLightSensorValue = -1; 216b28654167466277fa262606810115164d9d24d67Mike Lockwood private int mHighestLightSensorValue = -1; 217d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood private float mLightSensorPendingValue = -1; 218fb73f79340375013225618a5d87f46b958f698efMike Lockwood private int mLightSensorScreenBrightness = -1; 219fb73f79340375013225618a5d87f46b958f698efMike Lockwood private int mLightSensorButtonBrightness = -1; 220fb73f79340375013225618a5d87f46b958f698efMike Lockwood private int mLightSensorKeyboardBrightness = -1; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDimScreen = true; 222b28654167466277fa262606810115164d9d24d67Mike Lockwood private boolean mIsDocked = false; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mNextTimeout; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private volatile int mPokey = 0; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private volatile boolean mPokeAwakeOnSet = false; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private volatile boolean mInitComplete = false; 227ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood private final HashMap<IBinder,PokeLock> mPokeLocks = new HashMap<IBinder,PokeLock>(); 22820ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood // mLastScreenOnTime is the time the screen was last turned on 22920ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood private long mLastScreenOnTime; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mPreventScreenOn; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mScreenBrightnessOverride = -1; 232fb73f79340375013225618a5d87f46b958f698efMike Lockwood private int mButtonBrightnessOverride = -1; 233aa66ea880f58c9caa49e31c166bb3bd6bbf14e21Mike Lockwood private boolean mUseSoftwareAutoBrightness; 234dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood private boolean mAutoBrightessEnabled; 235d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood private int[] mAutoBrightnessLevels; 236d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood private int[] mLcdBacklightValues; 237d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood private int[] mButtonBacklightValues; 238d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood private int[] mKeyboardBacklightValues; 23920ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood private int mLightSensorWarmupTime; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Used when logging number and duration of touch-down cycles 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mTotalTouchDownTime; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mLastTouchDown; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mTouchCycles; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // could be either static or controllable at runtime 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean mSpew = false; 248ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood private static final boolean mDebugProximitySensor = (true || mSpew); 249dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood private static final boolean mDebugLightSensor = (false || mSpew); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static PrintStream mLog; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLog = new PrintStream("/data/power.log"); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (FileNotFoundException e) { 2588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato android.util.Slog.e(TAG, "Life is hard", e); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class Log { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void d(String tag, String s) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLog.println(s); 2648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato android.util.Slog.d(tag, s); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void i(String tag, String s) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLog.println(s); 2688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato android.util.Slog.i(tag, s); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void w(String tag, String s) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLog.println(s); 2728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato android.util.Slog.w(tag, s); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void e(String tag, String s) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLog.println(s); 2768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato android.util.Slog.e(tag, s); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class works around a deadlock between the lock in PowerManager.WakeLock 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and our synchronizing on mLocks. PowerManager.WakeLock synchronizes on its 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mToken object so it can be accessed from any thread, but it calls into here 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with its lock held. This class is essentially a reimplementation of 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PowerManager.WakeLock, but without that extra synchronized block, because we'll 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only call it with our own locks held. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class UnsynchronizedWakeLock { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mFlags; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mTag; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder mToken; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount = 0; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRefCounted; 2950e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood boolean mHeld; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project UnsynchronizedWakeLock(int flags, String tag, boolean refCounted) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags = flags; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mToken = new Binder(); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = refCounted; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRefCounted || mCount++ == 0) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService.this.acquireWakeLockLocked(mFlags, mToken, 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MY_UID, mTag); 3100e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood mHeld = true; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(ident); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRefCounted || --mCount == 0) { 3190e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood PowerManagerService.this.releaseWakeLockLocked(mToken, 0, false); 3200e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood mHeld = false; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCount < 0) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WakeLock under-locked " + mTag); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3270e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood public boolean isHeld() 3280e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood { 3290e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood return mHeld; 3300e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood } 3310e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "UnsynchronizedWakeLock(mFlags=0x" + Integer.toHexString(mFlags) 3340e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood + " mCount=" + mCount + " mHeld=" + mHeld + ")"; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final class BatteryReceiver extends BroadcastReceiver { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wasPowered = mIsPowered; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsPowered = mBatteryService.isPowered(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsPowered != wasPowered) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update mStayOnWhilePluggedIn wake lock 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWakeLockLocked(); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // treat plugging and unplugging the devices as a user activity. 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // users find it disconcerting when they unplug the device 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and it shuts off right away. 35284a893467307eb3178b99a7926dea9c8e21579f1Mike Lockwood // to avoid turning on the screen when unplugging, we only trigger 35384a893467307eb3178b99a7926dea9c8e21579f1Mike Lockwood // user activity when screen was already on. 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // temporarily set mUserActivityAllowed to true so this will work 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // even when the keyguard is on. 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 35784a893467307eb3178b99a7926dea9c8e21579f1Mike Lockwood if (!wasPowered || (mPowerState & SCREEN_ON_BIT) != 0) { 35884a893467307eb3178b99a7926dea9c8e21579f1Mike Lockwood forceUserActivityLocked(); 35984a893467307eb3178b99a7926dea9c8e21579f1Mike Lockwood } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3662d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood private final class BootCompletedReceiver extends BroadcastReceiver { 3672d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood @Override 3682d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood public void onReceive(Context context, Intent intent) { 3692d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood bootCompleted(); 3702d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood } 3712d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood } 3722d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood 373b28654167466277fa262606810115164d9d24d67Mike Lockwood private final class DockReceiver extends BroadcastReceiver { 374b28654167466277fa262606810115164d9d24d67Mike Lockwood @Override 375b28654167466277fa262606810115164d9d24d67Mike Lockwood public void onReceive(Context context, Intent intent) { 376b28654167466277fa262606810115164d9d24d67Mike Lockwood int state = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, 377b28654167466277fa262606810115164d9d24d67Mike Lockwood Intent.EXTRA_DOCK_STATE_UNDOCKED); 378b28654167466277fa262606810115164d9d24d67Mike Lockwood dockStateChanged(state); 379b28654167466277fa262606810115164d9d24d67Mike Lockwood } 380b28654167466277fa262606810115164d9d24d67Mike Lockwood } 381b28654167466277fa262606810115164d9d24d67Mike Lockwood 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the setting that determines whether the device stays on when plugged in. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The argument is a bit string, with each bit specifying a power source that, 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the device is connected to that source, causes the device to stay on. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link android.os.BatteryManager} for the list of power sources that 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be specified. Current values include {@link android.os.BatteryManager#BATTERY_PLUGGED_AC} 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link android.os.BatteryManager#BATTERY_PLUGGED_USB} 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val an {@code int} containing the bits that specify which power sources 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should cause the device to stay on. 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStayOnSetting(int val) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WRITE_SETTINGS, null); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.putInt(mContext.getContentResolver(), 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.STAY_ON_WHILE_PLUGGED_IN, val); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 398df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn public void setMaximumScreenOffTimeount(int timeMs) { 399df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn mContext.enforceCallingOrSelfPermission( 400df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn android.Manifest.permission.WRITE_SECURE_SETTINGS, null); 401df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn synchronized (mLocks) { 402df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn mMaximumScreenOffTimeout = timeMs; 403df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn // recalculate everything 404df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn setScreenOffTimeoutsLocked(); 405df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 406df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 407df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SettingsObserver implements Observer { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getInt(String name) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSettings.getValues(name).getAsInteger(Settings.System.VALUE); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void update(Observable o, Object arg) { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // STAY_ON_WHILE_PLUGGED_IN 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStayOnConditions = getInt(STAY_ON_WHILE_PLUGGED_IN); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWakeLockLocked(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // SCREEN_OFF_TIMEOUT 420df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn mScreenOffTimeoutSetting = getInt(SCREEN_OFF_TIMEOUT); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DIM_SCREEN 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //mDimScreen = getInt(DIM_SCREEN) != 0; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 425dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood // SCREEN_BRIGHTNESS_MODE 426dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood setScreenBrightnessMode(getInt(SCREEN_BRIGHTNESS_MODE)); 427dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // recalculate everything 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setScreenOffTimeoutsLocked(); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService() 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Hack to get our uid... should have a func for this. 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long token = Binder.clearCallingIdentity(); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MY_UID = Binder.getCallingUid(); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(token); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX remove this when the kernel doesn't timeout wake locks 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Power.setLastUserActivityTimeout(7*24*3600*1000); // one week 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // assume nothing is on yet 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserState = mPowerState = 0; 446ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add ourself to the Watchdog monitors. 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Watchdog.getInstance().addMonitor(this); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ContentQueryMap mSettings; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4533a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood void init(Context context, LightsService lights, IActivityManager activity, 454105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project BatteryService battery) { 4553a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood mLightsService = lights; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityService = activity; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats = BatteryStatsService.getService(); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryService = battery; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4613cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mLcdLight = lights.getLight(LightsService.LIGHT_ID_BACKLIGHT); 4623cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mButtonLight = lights.getLight(LightsService.LIGHT_ID_BUTTONS); 4633cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mKeyboardLight = lights.getLight(LightsService.LIGHT_ID_KEYBOARD); 4643cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mAttentionLight = lights.getLight(LightsService.LIGHT_ID_ATTENTION); 4653cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandlerThread = new HandlerThread("PowerManagerService") { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onLooperPrepared() { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onLooperPrepared(); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initInThread(); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandlerThread.start(); 474ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mHandlerThread) { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!mInitComplete) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandlerThread.wait(); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 485ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void initInThread() { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler = new Handler(); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBroadcastWakeLock = new UnsynchronizedWakeLock( 490128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato PowerManager.PARTIAL_WAKE_LOCK, "sleep_broadcast", true); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStayOnWhilePluggedInScreenDimLock = new UnsynchronizedWakeLock( 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager.SCREEN_DIM_WAKE_LOCK, "StayOnWhilePluggedIn Screen Dim", false); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStayOnWhilePluggedInPartialLock = new UnsynchronizedWakeLock( 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager.PARTIAL_WAKE_LOCK, "StayOnWhilePluggedIn Partial", false); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreventScreenOnPartialLock = new UnsynchronizedWakeLock( 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager.PARTIAL_WAKE_LOCK, "PreventScreenOn Partial", false); 4970e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood mProximityPartialLock = new UnsynchronizedWakeLock( 4980e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood PowerManager.PARTIAL_WAKE_LOCK, "Proximity Partial", false); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 505d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood Resources resources = mContext.getResources(); 506aa66ea880f58c9caa49e31c166bb3bd6bbf14e21Mike Lockwood 507aa66ea880f58c9caa49e31c166bb3bd6bbf14e21Mike Lockwood // read settings for auto-brightness 508aa66ea880f58c9caa49e31c166bb3bd6bbf14e21Mike Lockwood mUseSoftwareAutoBrightness = resources.getBoolean( 509aa66ea880f58c9caa49e31c166bb3bd6bbf14e21Mike Lockwood com.android.internal.R.bool.config_automatic_brightness_available); 510aa66ea880f58c9caa49e31c166bb3bd6bbf14e21Mike Lockwood if (mUseSoftwareAutoBrightness) { 511d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood mAutoBrightnessLevels = resources.getIntArray( 512d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood com.android.internal.R.array.config_autoBrightnessLevels); 513d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood mLcdBacklightValues = resources.getIntArray( 514d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); 515d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood mButtonBacklightValues = resources.getIntArray( 516d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood com.android.internal.R.array.config_autoBrightnessButtonBacklightValues); 517d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood mKeyboardBacklightValues = resources.getIntArray( 518d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood com.android.internal.R.array.config_autoBrightnessKeyboardBacklightValues); 51920ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood mLightSensorWarmupTime = resources.getInteger( 52020ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood com.android.internal.R.integer.config_lightSensorWarmupTime); 521d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 522dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood 523dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood ContentResolver resolver = mContext.getContentResolver(); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor settingsCursor = resolver.query(Settings.System.CONTENT_URI, null, 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(" + Settings.System.NAME + "=?) or (" 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Settings.System.NAME + "=?) or (" 527dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood + Settings.System.NAME + "=?) or (" 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Settings.System.NAME + "=?)", 529dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood new String[]{STAY_ON_WHILE_PLUGGED_IN, SCREEN_OFF_TIMEOUT, DIM_SCREEN, 530dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood SCREEN_BRIGHTNESS_MODE}, 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettings = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mHandler); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SettingsObserver settingsObserver = new SettingsObserver(); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettings.addObserver(settingsObserver); 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretend that the settings changed so we will get their initial state 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project settingsObserver.update(mSettings, null); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // register for the battery changed notifications 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter = new IntentFilter(); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(Intent.ACTION_BATTERY_CHANGED); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.registerReceiver(new BatteryReceiver(), filter); 5432d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood filter = new IntentFilter(); 5442d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood filter.addAction(Intent.ACTION_BOOT_COMPLETED); 5452d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood mContext.registerReceiver(new BootCompletedReceiver(), filter); 546b28654167466277fa262606810115164d9d24d67Mike Lockwood filter = new IntentFilter(); 547b28654167466277fa262606810115164d9d24d67Mike Lockwood filter.addAction(Intent.ACTION_DOCK_EVENT); 548b28654167466277fa262606810115164d9d24d67Mike Lockwood mContext.registerReceiver(new DockReceiver(), filter); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55043866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker // Listen for secure settings changes 55143866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker mContext.getContentResolver().registerContentObserver( 55243866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker Settings.Secure.CONTENT_URI, true, 55343866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker new ContentObserver(new Handler()) { 55443866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker public void onChange(boolean selfChange) { 55543866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker updateSettingsValues(); 55643866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker } 55743866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker }); 55843866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker updateSettingsValues(); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mHandlerThread) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInitComplete = true; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandlerThread.notifyAll(); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class WakeLock implements IBinder.DeathRecipient 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WakeLock(int f, IBinder b, String t, int u) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags = f; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder = b; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tag = t; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid = u == MY_UID ? Process.SYSTEM_UID : u; 574f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood pid = Binder.getCallingPid(); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u != MY_UID || ( 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !"KEEP_SCREEN_ON_FLAG".equals(tag) 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !"KeyInputQueue".equals(tag))) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project monitorType = (f & LOCK_MASK) == PowerManager.PARTIAL_WAKE_LOCK 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? BatteryStats.WAKE_TYPE_PARTIAL 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : BatteryStats.WAKE_TYPE_FULL; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project monitorType = -1; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.linkToDeath(this, 0); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binderDied(); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 5920e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood releaseWakeLockLocked(this.binder, 0, true); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int flags; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder binder; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String tag; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int uid; 599f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood final int pid; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int monitorType; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean activated = true; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minState; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void updateWakeLockLocked() { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStayOnConditions != 0 && mBatteryService.isPowered(mStayOnConditions)) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // keep the device on if we're plugged in and mStayOnWhilePluggedIn is set. 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStayOnWhilePluggedInScreenDimLock.acquire(); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStayOnWhilePluggedInPartialLock.acquire(); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStayOnWhilePluggedInScreenDimLock.release(); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStayOnWhilePluggedInPartialLock.release(); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean isScreenLock(int flags) 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int n = flags & LOCK_MASK; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return n == PowerManager.FULL_WAKE_LOCK 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || n == PowerManager.SCREEN_BRIGHT_WAKE_LOCK 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || n == PowerManager.SCREEN_DIM_WAKE_LOCK; 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquireWakeLock(int flags, IBinder lock, String tag) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = Binder.getCallingUid(); 626e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan if (uid != Process.myUid()) { 627e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); 628e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireWakeLockLocked(flags, lock, uid, tag); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(ident); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquireWakeLockLocked(int flags, IBinder lock, int uid, String tag) { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int acquireUid = -1; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String acquireName = null; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int acquireType = -1; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 6458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "acquireWakeLock flags=0x" + Integer.toHexString(flags) + " tag=" + tag); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = mLocks.getIndex(lock); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WakeLock wl; 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean newlock; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl = new WakeLock(flags, lock, tag, uid); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (wl.flags & LOCK_MASK) 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PowerManager.FULL_WAKE_LOCK: 6564984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood if (mUseSoftwareAutoBrightness) { 6573333fa4f3d2e1bd3842fe7d41d19557ff9a98372Mike Lockwood wl.minState = SCREEN_BRIGHT; 6583333fa4f3d2e1bd3842fe7d41d19557ff9a98372Mike Lockwood } else { 6593333fa4f3d2e1bd3842fe7d41d19557ff9a98372Mike Lockwood wl.minState = (mKeyboardVisible ? ALL_BRIGHT : SCREEN_BUTTON_BRIGHT); 6603333fa4f3d2e1bd3842fe7d41d19557ff9a98372Mike Lockwood } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.minState = SCREEN_BRIGHT; 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PowerManager.SCREEN_DIM_WAKE_LOCK: 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.minState = SCREEN_DIM; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PowerManager.PARTIAL_WAKE_LOCK: 669bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // just log and bail. we're in the server, so don't 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // throw an exception. 6748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "bad wakelock type for lock '" + tag + "' " 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " flags=" + flags); 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLocks.addLock(wl); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newlock = true; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl = mLocks.get(index); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newlock = false; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isScreenLock(flags)) { 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if this causes a wakeup, we reactivate all of the locks and 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // set it to whatever they want. otherwise, we modulate that 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // by the current state so we never turn it more on than 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it already is. 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((wl.flags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) { 690e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan int oldWakeLockState = mWakeLockState; 691e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan mWakeLockState = mLocks.reactivateScreenLocksLocked(); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 6938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "wakeup here mUserState=0x" + Integer.toHexString(mUserState) 694e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan + " mWakeLockState=0x" 695e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan + Integer.toHexString(mWakeLockState) 696e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan + " previous wakeLockState=0x" + Integer.toHexString(oldWakeLockState)); 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 7008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "here mUserState=0x" + Integer.toHexString(mUserState) 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLocks.gatherState()=0x" 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(mLocks.gatherState()) 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mWakeLockState=0x" + Integer.toHexString(mWakeLockState)); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeLockState = (mUserState | mWakeLockState) & mLocks.gatherState(); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPowerState(mWakeLockState | mUserState); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if ((flags & LOCK_MASK) == PowerManager.PARTIAL_WAKE_LOCK) { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newlock) { 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialCount++; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPartialCount == 1) { 713ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 1, tag); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,PARTIAL_NAME); 717bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } else if ((flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { 718ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood mProximityWakeLockCount++; 719ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mProximityWakeLockCount == 1) { 720bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood enableProximityLockLocked(); 721bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newlock) { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireUid = wl.uid; 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireName = wl.tag; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireType = wl.monitorType; 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (acquireType >= 0) { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.noteStartWakelock(acquireUid, acquireName, acquireType); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7380e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood public void releaseWakeLock(IBinder lock, int flags) { 739e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan int uid = Binder.getCallingUid(); 740e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan if (uid != Process.myUid()) { 741e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); 742e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 7450e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood releaseWakeLockLocked(lock, flags, false); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7490e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood private void releaseWakeLockLocked(IBinder lock, int flags, boolean death) { 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int releaseUid; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String releaseName; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int releaseType; 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WakeLock wl = mLocks.removeLock(lock); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl == null) { 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 758ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 7608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "releaseWakeLock flags=0x" 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(wl.flags) + " tag=" + wl.tag); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isScreenLock(wl.flags)) { 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeLockState = mLocks.gatherState(); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // goes in the middle to reduce flicker 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((wl.flags & PowerManager.ON_AFTER_RELEASE) != 0) { 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userActivity(SystemClock.uptimeMillis(), false); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPowerState(mWakeLockState | mUserState); 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if ((wl.flags & LOCK_MASK) == PowerManager.PARTIAL_WAKE_LOCK) { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialCount--; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPartialCount == 0) { 775ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 0, wl.tag); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Power.releaseWakeLock(PARTIAL_NAME); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 778bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } else if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { 779ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood mProximityWakeLockCount--; 780ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mProximityWakeLockCount == 0) { 7810e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood if (mProximitySensorActive && 7820e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood ((flags & PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE) != 0)) { 783ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood // wait for proximity sensor to go negative before disabling sensor 784ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mDebugProximitySensor) { 7858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "waiting for proximity sensor to go negative"); 786ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } 787ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } else { 788ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood disableProximityLockLocked(); 789ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } 790bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Unlink the lock from the binder. 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.binder.unlinkToDeath(wl, 0); 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseUid = wl.uid; 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseName = wl.tag; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseType = wl.monitorType; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (releaseType >= 0) { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.noteStopWakelock(releaseUid, releaseName, releaseType); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class PokeLock implements IBinder.DeathRecipient 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PokeLock(int p, IBinder b, String t) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.pokey = p; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.binder = b; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.tag = t; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.linkToDeath(this, 0); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binderDied(); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPokeLock(0, this.binder, this.tag); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pokey; 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder binder; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tag; 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean awakeOnSet; 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPokeLock(int pokey, IBinder token, String tag) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token == null) { 8358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "setPokeLock got null token for tag='" + tag + "'"); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((pokey & POKE_LOCK_TIMEOUT_MASK) == POKE_LOCK_TIMEOUT_MASK) { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("setPokeLock can't have both POKE_LOCK_SHORT_TIMEOUT" 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " and POKE_LOCK_MEDIUM_TIMEOUT"); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pokey != 0) { 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PokeLock p = mPokeLocks.get(token); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int oldPokey = 0; 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != null) { 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldPokey = p.pokey; 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.pokey = pokey; 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = new PokeLock(pokey, token, tag); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPokeLocks.put(token, p); 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int oldTimeout = oldPokey & POKE_LOCK_TIMEOUT_MASK; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newTimeout = pokey & POKE_LOCK_TIMEOUT_MASK; 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (((mPowerState & SCREEN_ON_BIT) == 0) && (oldTimeout != newTimeout)) { 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.awakeOnSet = true; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 861fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu PokeLock rLock = mPokeLocks.remove(token); 862fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu if (rLock != null) { 863fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu token.unlinkToDeath(rLock, 0); 864fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int oldPokey = mPokey; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cumulative = 0; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean oldAwakeOnSet = mPokeAwakeOnSet; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean awakeOnSet = false; 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (PokeLock p: mPokeLocks.values()) { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cumulative |= p.pokey; 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p.awakeOnSet) { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project awakeOnSet = true; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPokey = cumulative; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPokeAwakeOnSet = awakeOnSet; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int oldCumulativeTimeout = oldPokey & POKE_LOCK_TIMEOUT_MASK; 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newCumulativeTimeout = pokey & POKE_LOCK_TIMEOUT_MASK; 882ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldCumulativeTimeout != newCumulativeTimeout) { 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setScreenOffTimeoutsLocked(); 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // reset the countdown timer, but use the existing nextState so it doesn't 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // change anything 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setTimeoutLocked(SystemClock.uptimeMillis(), mTimeoutTask.nextState); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String lockType(int type) 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PowerManager.FULL_WAKE_LOCK: 897251faa625002088c2d1b2387b5dc1fcb7e5a341dDavid Brown return "FULL_WAKE_LOCK "; 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: 899251faa625002088c2d1b2387b5dc1fcb7e5a341dDavid Brown return "SCREEN_BRIGHT_WAKE_LOCK "; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PowerManager.SCREEN_DIM_WAKE_LOCK: 901251faa625002088c2d1b2387b5dc1fcb7e5a341dDavid Brown return "SCREEN_DIM_WAKE_LOCK "; 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PowerManager.PARTIAL_WAKE_LOCK: 903251faa625002088c2d1b2387b5dc1fcb7e5a341dDavid Brown return "PARTIAL_WAKE_LOCK "; 904251faa625002088c2d1b2387b5dc1fcb7e5a341dDavid Brown case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: 905251faa625002088c2d1b2387b5dc1fcb7e5a341dDavid Brown return "PROXIMITY_SCREEN_OFF_WAKE_LOCK"; 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 907251faa625002088c2d1b2387b5dc1fcb7e5a341dDavid Brown return "??? "; 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String dumpPowerState(int state) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (((state & KEYBOARD_BRIGHT_BIT) != 0) 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "KEYBOARD_BRIGHT_BIT " : "") 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (((state & SCREEN_BRIGHT_BIT) != 0) 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "SCREEN_BRIGHT_BIT " : "") 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (((state & SCREEN_ON_BIT) != 0) 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "SCREEN_ON_BIT " : "") 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (((state & BATTERY_LOW_BIT) != 0) 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "BATTERY_LOW_BIT " : ""); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Permission Denial: can't dump PowerManager from from pid=" 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid()); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 934ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood synchronized (mLocks) { 935ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println("Power Manager State:"); 936ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mIsPowered=" + mIsPowered 937ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mPowerState=" + mPowerState 938ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mScreenOffTime=" + (SystemClock.elapsedRealtime()-mScreenOffTime) 939ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " ms"); 940ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mPartialCount=" + mPartialCount); 941ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mWakeLockState=" + dumpPowerState(mWakeLockState)); 942ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mUserState=" + dumpPowerState(mUserState)); 943ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mPowerState=" + dumpPowerState(mPowerState)); 944ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mLocks.gather=" + dumpPowerState(mLocks.gatherState())); 945ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mNextTimeout=" + mNextTimeout + " now=" + now 946ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " " + ((mNextTimeout-now)/1000) + "s from now"); 947ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mDimScreen=" + mDimScreen 948ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mStayOnConditions=" + mStayOnConditions); 949ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mScreenOffReason=" + mScreenOffReason 950ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mUserState=" + mUserState); 951ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mBroadcastQueue={" + mBroadcastQueue[0] + ',' + mBroadcastQueue[1] 952ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + ',' + mBroadcastQueue[2] + "}"); 953ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mBroadcastWhy={" + mBroadcastWhy[0] + ',' + mBroadcastWhy[1] 954ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + ',' + mBroadcastWhy[2] + "}"); 955ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mPokey=" + mPokey + " mPokeAwakeonSet=" + mPokeAwakeOnSet); 956ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mKeyboardVisible=" + mKeyboardVisible 957ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mUserActivityAllowed=" + mUserActivityAllowed); 958ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mKeylightDelay=" + mKeylightDelay + " mDimDelay=" + mDimDelay 959ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mScreenOffDelay=" + mScreenOffDelay); 960ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mPreventScreenOn=" + mPreventScreenOn 961ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mScreenBrightnessOverride=" + mScreenBrightnessOverride 962ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mButtonBrightnessOverride=" + mButtonBrightnessOverride); 963ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mScreenOffTimeoutSetting=" + mScreenOffTimeoutSetting 964ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mMaximumScreenOffTimeout=" + mMaximumScreenOffTimeout); 965ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mLastScreenOnTime=" + mLastScreenOnTime); 966ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mBroadcastWakeLock=" + mBroadcastWakeLock); 967ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mStayOnWhilePluggedInScreenDimLock=" + mStayOnWhilePluggedInScreenDimLock); 968ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mStayOnWhilePluggedInPartialLock=" + mStayOnWhilePluggedInPartialLock); 969ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mPreventScreenOnPartialLock=" + mPreventScreenOnPartialLock); 970ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mProximityPartialLock=" + mProximityPartialLock); 971ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mProximityWakeLockCount=" + mProximityWakeLockCount); 972ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mProximitySensorEnabled=" + mProximitySensorEnabled); 973ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mProximitySensorActive=" + mProximitySensorActive); 974ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mProximityPendingValue=" + mProximityPendingValue); 975ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mLastProximityEventTime=" + mLastProximityEventTime); 976ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mLightSensorEnabled=" + mLightSensorEnabled); 977ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mLightSensorValue=" + mLightSensorValue 978ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mLightSensorPendingValue=" + mLightSensorPendingValue); 979ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mLightSensorScreenBrightness=" + mLightSensorScreenBrightness 980ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mLightSensorButtonBrightness=" + mLightSensorButtonBrightness 981ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + " mLightSensorKeyboardBrightness=" + mLightSensorKeyboardBrightness); 982ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mUseSoftwareAutoBrightness=" + mUseSoftwareAutoBrightness); 983ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" mAutoBrightessEnabled=" + mAutoBrightessEnabled); 984ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood mScreenBrightness.dump(pw, " mScreenBrightness: "); 985ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood mKeyboardBrightness.dump(pw, " mKeyboardBrightness: "); 986ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood mButtonBrightness.dump(pw, " mButtonBrightness: "); 987ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood 988ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood int N = mLocks.size(); 989ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(); 990ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println("mLocks.size=" + N + ":"); 991ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood for (int i=0; i<N; i++) { 992ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood WakeLock wl = mLocks.get(i); 993ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood String type = lockType(wl.flags & LOCK_MASK); 994ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood String acquireCausesWakeup = ""; 995ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood if ((wl.flags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) { 996ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood acquireCausesWakeup = "ACQUIRE_CAUSES_WAKEUP "; 997ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood } 998ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood String activated = ""; 999ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood if (wl.activated) { 1000ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood activated = " activated"; 1001ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood } 1002ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" " + type + " '" + wl.tag + "'" + acquireCausesWakeup 1003f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood + activated + " (minState=" + wl.minState + ", uid=" + wl.uid 1004f5bd092b5099cf43f031c3f53ad01592dda57f4bMike Lockwood + ", pid=" + wl.pid + ")"); 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1006ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood 1007ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(); 1008ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println("mPokeLocks.size=" + mPokeLocks.size() + ":"); 1009ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood for (PokeLock p: mPokeLocks.values()) { 1010ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(" poke lock '" + p.tag + "':" 1011ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + ((p.pokey & POKE_LOCK_IGNORE_CHEEK_EVENTS) != 0 1012ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood ? " POKE_LOCK_IGNORE_CHEEK_EVENTS" : "") 1013ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + ((p.pokey & POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS) != 0 1014ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood ? " POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS" : "") 1015ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + ((p.pokey & POKE_LOCK_SHORT_TIMEOUT) != 0 1016ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood ? " POKE_LOCK_SHORT_TIMEOUT" : "") 1017ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood + ((p.pokey & POKE_LOCK_MEDIUM_TIMEOUT) != 0 1018ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood ? " POKE_LOCK_MEDIUM_TIMEOUT" : "")); 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1020ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1021ca44df86ac907fd147633955f6fda7a249625d50Mike Lockwood pw.println(); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10251fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato private void setTimeoutLocked(long now, int nextState) { 10261fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato setTimeoutLocked(now, -1, nextState); 10271fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 10281fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato 10291fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato // If they gave a timeoutOverride it is the number of seconds 10301fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato // to screen-off. Figure out where in the countdown cycle we 10311fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato // should jump to. 1032382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato private void setTimeoutLocked(long now, final long originalTimeoutOverride, int nextState) { 1033382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato long timeoutOverride = originalTimeoutOverride; 10342d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood if (mBootCompleted) { 10351fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato synchronized (mLocks) { 10361fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato long when = 0; 10371fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato if (timeoutOverride <= 0) { 10381fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato switch (nextState) 10391fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato { 10401fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato case SCREEN_BRIGHT: 10411fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato when = now + mKeylightDelay; 10421fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato break; 10431fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato case SCREEN_DIM: 10441fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato if (mDimDelay >= 0) { 10451fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato when = now + mDimDelay; 10468812535137ca657f6830dd01189c429bdb13c237Andreas Huber break; 10471fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } else { 10481fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato Slog.w(TAG, "mDimDelay=" + mDimDelay + " while trying to dim"); 10491fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 10501fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato case SCREEN_OFF: 10511fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato synchronized (mLocks) { 10521fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato when = now + mScreenOffDelay; 10531fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 10541fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato break; 10558812535137ca657f6830dd01189c429bdb13c237Andreas Huber default: 10568812535137ca657f6830dd01189c429bdb13c237Andreas Huber when = now; 10578812535137ca657f6830dd01189c429bdb13c237Andreas Huber break; 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10591fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } else { 10601fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato override: { 10611fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato if (timeoutOverride <= mScreenOffDelay) { 10621fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato when = now + timeoutOverride; 10631fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato nextState = SCREEN_OFF; 10641fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato break override; 10651fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 10661fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato timeoutOverride -= mScreenOffDelay; 10671fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato 10681fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato if (mDimDelay >= 0) { 10691fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato if (timeoutOverride <= mDimDelay) { 10701fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato when = now + timeoutOverride; 10711fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato nextState = SCREEN_DIM; 10721fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato break override; 10731fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 10741fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato timeoutOverride -= mDimDelay; 10751fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 10761fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato 10771fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato when = now + timeoutOverride; 10781fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato nextState = SCREEN_BRIGHT; 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10801fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 10811fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato if (mSpew) { 10821fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato Slog.d(TAG, "setTimeoutLocked now=" + now 10831fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato + " timeoutOverride=" + timeoutOverride 10841fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato + " nextState=" + nextState + " when=" + when); 10851fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 1086382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato 1087382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato mHandler.removeCallbacks(mTimeoutTask); 1088382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato mTimeoutTask.nextState = nextState; 1089382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato mTimeoutTask.remainingTimeoutOverride = timeoutOverride > 0 1090382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato ? (originalTimeoutOverride - timeoutOverride) 1091382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato : -1; 10921fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato mHandler.postAtTime(mTimeoutTask, when); 10931fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato mNextTimeout = when; // for debugging 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void cancelTimerLocked() 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeCallbacks(mTimeoutTask); 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimeoutTask.nextState = -1; 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class TimeoutTask implements Runnable 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nextState; // access should be synchronized on mLocks 1107382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato long remainingTimeoutOverride; 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 11128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "user activity timeout timed out nextState=" + this.nextState); 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextState == -1) { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserState = this.nextState; 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPowerState(this.nextState | mWakeLockState); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.nextState) 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SCREEN_BRIGHT: 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDimDelay >= 0) { 1128382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato setTimeoutLocked(now, remainingTimeoutOverride, SCREEN_DIM); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SCREEN_DIM: 1132382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato setTimeoutLocked(now, remainingTimeoutOverride, SCREEN_OFF); 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void sendNotificationLocked(boolean on, int why) 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 114164c62ba503c73eee1fb647ffcc1b3df287640ab1Joe Onorato if (!on) { 114264c62ba503c73eee1fb647ffcc1b3df287640ab1Joe Onorato mStillNeedSleepNotification = false; 114364c62ba503c73eee1fb647ffcc1b3df287640ab1Joe Onorato } 114464c62ba503c73eee1fb647ffcc1b3df287640ab1Joe Onorato 1145128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // Add to the queue. 1146128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato int index = 0; 1147128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato while (mBroadcastQueue[index] != -1) { 1148128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato index++; 1149128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 1150128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastQueue[index] = on ? 1 : 0; 1151128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastWhy[index] = why; 1152128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato 1153128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // If we added it position 2, then there is a pair that can be stripped. 1154128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // If we added it position 1 and we're turning the screen off, we can strip 1155128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // the pair and do nothing, because the screen is already off, and therefore 1156128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // keyguard has already been enabled. 1157128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // However, if we added it at position 1 and we're turning it on, then position 1158128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // 0 was to turn it off, and we can't strip that, because keyguard needs to come 1159128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // on, so have to run the queue then. 1160128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato if (index == 2) { 1161254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn // While we're collapsing them, if it's going off, and the new reason 1162254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn // is more significant than the first, then use the new one. 1163254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn if (!on && mBroadcastWhy[0] > why) { 1164254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn mBroadcastWhy[0] = why; 1165128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 1166128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastQueue[0] = on ? 1 : 0; 1167128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastQueue[1] = -1; 1168128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastQueue[2] = -1; 11699c90a37c6e8885dfc7848330755401209b605ecdMike Lockwood mBroadcastWakeLock.release(); 11709c90a37c6e8885dfc7848330755401209b605ecdMike Lockwood mBroadcastWakeLock.release(); 1171128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato index = 0; 1172128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 1173128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato if (index == 1 && !on) { 1174128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastQueue[0] = -1; 1175128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastQueue[1] = -1; 1176128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato index = -1; 1177128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // The wake lock was being held, but we're not actually going to do any 1178128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // broadcasts, so release the wake lock. 1179ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 1, mBroadcastWakeLock.mCount); 1180128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastWakeLock.release(); 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1183128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // Now send the message. 1184128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato if (index >= 0) { 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Acquire the broadcast wake lock before changing the power 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // state. It will be release after the broadcast is sent. 1187128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // We always increment the ref count for each notification in the queue 1188128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // and always decrement when that notification is handled. 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBroadcastWakeLock.acquire(); 1190ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_SEND, mBroadcastWakeLock.mCount); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.post(mNotificationTask); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Runnable mNotificationTask = new Runnable() 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1199128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato while (true) { 1200128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato int value; 1201128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato int why; 1202128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato WindowManagerPolicy policy; 1203128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato synchronized (mLocks) { 1204128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato value = mBroadcastQueue[0]; 1205128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato why = mBroadcastWhy[0]; 1206128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato for (int i=0; i<2; i++) { 1207128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastQueue[i] = mBroadcastQueue[i+1]; 1208128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastWhy[i] = mBroadcastWhy[i+1]; 1209128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 1210128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato policy = getPolicyLocked(); 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1212128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato if (value == 1) { 1213128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mScreenOnStart = SystemClock.uptimeMillis(); 1214ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1215128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato policy.screenTurnedOn(); 1216128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato try { 1217128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato ActivityManagerNative.getDefault().wakingUp(); 1218128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } catch (RemoteException e) { 1219128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // ignore it 1220128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1222128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato if (mSpew) { 12238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "mBroadcastWakeLock=" + mBroadcastWakeLock); 1224128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 1225128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato if (mContext != null && ActivityManagerNative.isSystemReady()) { 1226128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mContext.sendOrderedBroadcast(mScreenOnIntent, null, 1227128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mScreenOnBroadcastDone, mHandler, 0, null, null); 1228128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } else { 1229128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato synchronized (mLocks) { 1230ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 2, 1231128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastWakeLock.mCount); 1232128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastWakeLock.release(); 1233128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1236128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato else if (value == 0) { 1237128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mScreenOffStart = SystemClock.uptimeMillis(); 1238ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1239128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato policy.screenTurnedOff(why); 1240128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato try { 1241128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato ActivityManagerNative.getDefault().goingToSleep(); 1242128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } catch (RemoteException e) { 1243128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // ignore it. 1244128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1246128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato if (mContext != null && ActivityManagerNative.isSystemReady()) { 1247128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mContext.sendOrderedBroadcast(mScreenOffIntent, null, 1248128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mScreenOffBroadcastDone, mHandler, 0, null, null); 1249128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } else { 1250128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato synchronized (mLocks) { 1251ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 3, 1252128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastWakeLock.mCount); 1253128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mBroadcastWakeLock.release(); 1254128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1257128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato else { 1258128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // If we're in this case, then this handler is running for a previous 1259128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // paired transaction. mBroadcastWakeLock will already have been released. 1260128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato break; 1261128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mScreenOnStart; 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BroadcastReceiver mScreenOnBroadcastDone = new BroadcastReceiver() { 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 1270ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 1, 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.uptimeMillis() - mScreenOnStart, mBroadcastWakeLock.mCount); 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBroadcastWakeLock.release(); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mScreenOffStart; 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BroadcastReceiver mScreenOffBroadcastDone = new BroadcastReceiver() { 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 1281ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 0, 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.uptimeMillis() - mScreenOffStart, mBroadcastWakeLock.mCount); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBroadcastWakeLock.release(); 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void logPointerUpEvent() { 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LOG_TOUCH_DOWNS) { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTouchDownTime += SystemClock.elapsedRealtime() - mLastTouchDown; 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastTouchDown = 0; 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void logPointerDownEvent() { 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LOG_TOUCH_DOWNS) { 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are not already timing a down/up sequence 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLastTouchDown == 0) { 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastTouchDown = SystemClock.elapsedRealtime(); 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTouchCycles++; 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Prevents the screen from turning on even if it *should* turn on due 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to a subsequent full wake lock being acquired. 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a temporary hack that allows an activity to "cover up" any 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * display glitches that happen during the activity's startup 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sequence. (Specifically, this API was added to work around a 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cosmetic bug in the "incoming call" sequence, where the lock screen 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * would flicker briefly before the incoming call UI became visible.) 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: There ought to be a more elegant way of doing this, 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * probably by having the PowerManager and ActivityManager 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * work together to let apps specify that the screen on/off 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state should be synchronized with the Activity lifecycle. 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that calling preventScreenOn(true) will NOT turn the screen 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * off if it's currently on. (This API only affects *future* 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * acquisitions of full wake locks.) 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * But calling preventScreenOn(false) WILL turn the screen on if 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it's currently off because of a prior preventScreenOn(true) call. 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Any call to preventScreenOn(true) MUST be followed promptly by a call 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to preventScreenOn(false). In fact, if the preventScreenOn(false) 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call doesn't occur within 5 seconds, we'll turn the screen back on 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ourselves (and log a warning about it); this prevents a buggy app 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from disabling the screen forever.) 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: this feature should really be controlled by a new type of poke 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lock (rather than an IPowerManager call). 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void preventScreenOn(boolean prevent) { 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (prevent) { 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First of all, grab a partial wake lock to 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make sure the CPU stays on during the entire 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preventScreenOn(true) -> preventScreenOn(false) sequence. 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreventScreenOnPartialLock.acquire(); 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Post a forceReenableScreen() call (for 5 seconds in the 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // future) to make sure the matching preventScreenOn(false) call 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // has happened by then. 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeCallbacks(mForceReenableScreenTask); 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.postDelayed(mForceReenableScreenTask, 5000); 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Finally, set the flag that prevents the screen from turning on. 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (Below, in setPowerState(), we'll check mPreventScreenOn and 13528738e0c040061a179ad88adb997143f076277b04Mike Lockwood // we *won't* call setScreenStateLocked(true) if it's set.) 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreventScreenOn = true; 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (Re)enable the screen. 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreventScreenOn = false; 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We're "undoing" a the prior preventScreenOn(true) call, so we 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no longer need the 5-second safeguard. 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeCallbacks(mForceReenableScreenTask); 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Forcibly turn on the screen if it's supposed to be on. (This 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // handles the case where the screen is currently off because of 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a prior preventScreenOn(true) call.) 1365e090281428cbd1114f4ae2f10755013cea09cdb5Mike Lockwood if (!mProximitySensorActive && (mPowerState & SCREEN_ON_BIT) != 0) { 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 13678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "preventScreenOn: turning on after a prior preventScreenOn(true)!"); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13708738e0c040061a179ad88adb997143f076277b04Mike Lockwood int err = setScreenStateLocked(true); 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 13728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "preventScreenOn: error from setScreenStateLocked(): " + err); 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Release the partial wake lock that we held during the 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preventScreenOn(true) -> preventScreenOn(false) sequence. 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreventScreenOnPartialLock.release(); 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setScreenBrightnessOverride(int brightness) { 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1386f527c715d7065d8cf6943c37dd5e721bd7a805cdMike Lockwood if (mSpew) Slog.d(TAG, "setScreenBrightnessOverride " + brightness); 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mScreenBrightnessOverride != brightness) { 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenBrightnessOverride = brightness; 1390f527c715d7065d8cf6943c37dd5e721bd7a805cdMike Lockwood if (isScreenOn()) { 1391f527c715d7065d8cf6943c37dd5e721bd7a805cdMike Lockwood updateLightsLocked(mPowerState, SCREEN_ON_BIT); 1392f527c715d7065d8cf6943c37dd5e721bd7a805cdMike Lockwood } 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1396fb73f79340375013225618a5d87f46b958f698efMike Lockwood 1397fb73f79340375013225618a5d87f46b958f698efMike Lockwood public void setButtonBrightnessOverride(int brightness) { 1398fb73f79340375013225618a5d87f46b958f698efMike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 1399fb73f79340375013225618a5d87f46b958f698efMike Lockwood 1400f527c715d7065d8cf6943c37dd5e721bd7a805cdMike Lockwood if (mSpew) Slog.d(TAG, "setButtonBrightnessOverride " + brightness); 1401fb73f79340375013225618a5d87f46b958f698efMike Lockwood synchronized (mLocks) { 1402fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (mButtonBrightnessOverride != brightness) { 1403fb73f79340375013225618a5d87f46b958f698efMike Lockwood mButtonBrightnessOverride = brightness; 1404f527c715d7065d8cf6943c37dd5e721bd7a805cdMike Lockwood if (isScreenOn()) { 1405f527c715d7065d8cf6943c37dd5e721bd7a805cdMike Lockwood updateLightsLocked(mPowerState, BUTTON_BRIGHT_BIT | KEYBOARD_BRIGHT_BIT); 1406f527c715d7065d8cf6943c37dd5e721bd7a805cdMike Lockwood } 1407fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 1408fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 1409fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 1410fb73f79340375013225618a5d87f46b958f698efMike Lockwood 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sanity-check that gets called 5 seconds after any call to 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preventScreenOn(true). This ensures that the original call 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is followed promptly by a call to preventScreenOn(false). 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void forceReenableScreen() { 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We shouldn't get here at all if mPreventScreenOn is false, since 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we should have already removed any existing 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mForceReenableScreenTask messages... 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPreventScreenOn) { 14218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "forceReenableScreen: mPreventScreenOn is false, nothing to do"); 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Uh oh. It's been 5 seconds since a call to 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preventScreenOn(true) and we haven't re-enabled the screen yet. 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This means the app that called preventScreenOn(true) is either 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // slow (i.e. it took more than 5 seconds to call preventScreenOn(false)), 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // or buggy (i.e. it forgot to call preventScreenOn(false), or 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // crashed before doing so.) 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log a warning, and forcibly turn the screen back on. 14338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "App called preventScreenOn(true) but didn't promptly reenable the screen! " 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "Forcing the screen back on..."); 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preventScreenOn(false); 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Runnable mForceReenableScreenTask = new Runnable() { 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project forceReenableScreen(); 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14448738e0c040061a179ad88adb997143f076277b04Mike Lockwood private int setScreenStateLocked(boolean on) { 14458738e0c040061a179ad88adb997143f076277b04Mike Lockwood int err = Power.setScreenState(on); 144620ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood if (err == 0) { 144720ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood mLastScreenOnTime = (on ? SystemClock.elapsedRealtime() : 0); 144820ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood if (mUseSoftwareAutoBrightness) { 144920ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood enableLightSensor(on); 145020ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood if (!on) { 145120ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood // make sure button and key backlights are off too 14523cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mButtonLight.turnOff(); 14533cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mKeyboardLight.turnOff(); 145420ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood // clear current value so we will update based on the new conditions 145520ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood // when the sensor is reenabled. 145620ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood mLightSensorValue = -1; 1457b28654167466277fa262606810115164d9d24d67Mike Lockwood // reset our highest light sensor value when the screen turns off 1458b28654167466277fa262606810115164d9d24d67Mike Lockwood mHighestLightSensorValue = -1; 145920ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood } 1460d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 14618738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 14628738e0c040061a179ad88adb997143f076277b04Mike Lockwood return err; 14638738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 14648738e0c040061a179ad88adb997143f076277b04Mike Lockwood 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setPowerState(int state) 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1467435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood setPowerState(state, false, WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT); 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1470435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood private void setPowerState(int newState, boolean noChangeLights, int reason) 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err; 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 14768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "setPowerState: mPowerState=0x" + Integer.toHexString(mPowerState) 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " newState=0x" + Integer.toHexString(newState) 1478435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood + " noChangeLights=" + noChangeLights 1479435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood + " reason=" + reason); 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (noChangeLights) { 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newState = (newState & ~LIGHTS_MASK) | (mPowerState & LIGHTS_MASK); 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 148536fc302560fbc6dff3099860356d290d1653371cMike Lockwood if (mProximitySensorActive) { 148636fc302560fbc6dff3099860356d290d1653371cMike Lockwood // don't turn on the screen when the proximity sensor lock is held 148736fc302560fbc6dff3099860356d290d1653371cMike Lockwood newState = (newState & ~SCREEN_BRIGHT); 148836fc302560fbc6dff3099860356d290d1653371cMike Lockwood } 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (batteryIsLow()) { 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newState |= BATTERY_LOW_BIT; 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newState &= ~BATTERY_LOW_BIT; 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newState == mPowerState) { 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14983333fa4f3d2e1bd3842fe7d41d19557ff9a98372Mike Lockwood 14992d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood if (!mBootCompleted && !mUseSoftwareAutoBrightness) { 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newState |= ALL_BRIGHT; 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean oldScreenOn = (mPowerState & SCREEN_ON_BIT) != 0; 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean newScreenOn = (newState & SCREEN_ON_BIT) != 0; 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 150651b844965be75a2f2e4e83efdd887b0635637d19Mike Lockwood if (mSpew) { 15078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "setPowerState: mPowerState=" + mPowerState 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " newState=" + newState + " noChangeLights=" + noChangeLights); 15098a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, " oldKeyboardBright=" + ((mPowerState & KEYBOARD_BRIGHT_BIT) != 0) 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " newKeyboardBright=" + ((newState & KEYBOARD_BRIGHT_BIT) != 0)); 15118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, " oldScreenBright=" + ((mPowerState & SCREEN_BRIGHT_BIT) != 0) 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " newScreenBright=" + ((newState & SCREEN_BRIGHT_BIT) != 0)); 15138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, " oldButtonBright=" + ((mPowerState & BUTTON_BRIGHT_BIT) != 0) 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " newButtonBright=" + ((newState & BUTTON_BRIGHT_BIT) != 0)); 15158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, " oldScreenOn=" + oldScreenOn 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " newScreenOn=" + newScreenOn); 15178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, " oldBatteryLow=" + ((mPowerState & BATTERY_LOW_BIT) != 0) 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " newBatteryLow=" + ((newState & BATTERY_LOW_BIT) != 0)); 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPowerState != newState) { 1522105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project updateLightsLocked(newState, 0); 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPowerState = (mPowerState & ~LIGHTS_MASK) | (newState & LIGHTS_MASK); 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldScreenOn != newScreenOn) { 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newScreenOn) { 1528128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // When the user presses the power button, we need to always send out the 1529128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // notification that it's going to sleep so the keyguard goes on. But 1530128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // we can't do that until the screen fades out, so we don't show the keyguard 1531128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato // too early. 1532128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato if (mStillNeedSleepNotification) { 1533128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato sendNotificationLocked(false, WindowManagerPolicy.OFF_BECAUSE_OF_USER); 1534128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 1535128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Turn on the screen UNLESS there was a prior 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preventScreenOn(true) request. (Note that the lifetime 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of a single preventScreenOn() request is limited to 5 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // seconds to prevent a buggy app from disabling the 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // screen forever; see forceReenableScreen().) 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean reallyTurnScreenOn = true; 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 15438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "- turning screen on... mPreventScreenOn = " 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mPreventScreenOn); 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreventScreenOn) { 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 15498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "- PREVENTING screen from really turning on!"); 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reallyTurnScreenOn = false; 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reallyTurnScreenOn) { 15548738e0c040061a179ad88adb997143f076277b04Mike Lockwood err = setScreenStateLocked(true); 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long identity = Binder.clearCallingIdentity(); 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1557fb73f79340375013225618a5d87f46b958f698efMike Lockwood mBatteryStats.noteScreenBrightness(getPreferredBrightness()); 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.noteScreenOn(); 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 15608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "RemoteException calling noteScreenOn on BatteryStatsService", e); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(identity); 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15658738e0c040061a179ad88adb997143f076277b04Mike Lockwood setScreenStateLocked(false); 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // But continue as if we really did turn the screen on... 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 0; 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastTouchDown = 0; 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTouchDownTime = 0; 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTouchCycles = 0; 1573ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 1, reason, 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTouchDownTime, mTouchCycles); 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == 0) { 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPowerState |= SCREEN_ON_BIT; 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNotificationLocked(true, -1); 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1580497087e33d422d576d007f72fb970613d008f1cfMike Lockwood // cancel light sensor task 1581497087e33d422d576d007f72fb970613d008f1cfMike Lockwood mHandler.removeCallbacks(mAutoBrightnessTask); 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffTime = SystemClock.elapsedRealtime(); 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long identity = Binder.clearCallingIdentity(); 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.noteScreenOff(); 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 15878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "RemoteException calling noteScreenOff on BatteryStatsService", e); 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(identity); 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPowerState &= ~SCREEN_ON_BIT; 1592435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood mScreenOffReason = reason; 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mScreenBrightness.animating) { 1594435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood err = screenOffFinishedAnimatingLocked(reason); 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 0; 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastTouchDown = 0; 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1603ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1604435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood private int screenOffFinishedAnimatingLocked(int reason) { 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // I don't think we need to check the current state here because all of these 1606ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker // Power.setScreenState and sendNotificationLocked can both handle being 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // called multiple times in the same state. -joeo 1608ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 0, reason, mTotalTouchDownTime, mTouchCycles); 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastTouchDown = 0; 16108738e0c040061a179ad88adb997143f076277b04Mike Lockwood int err = setScreenStateLocked(false); 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == 0) { 1612435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood mScreenOffReason = reason; 1613435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood sendNotificationLocked(false, reason); 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean batteryIsLow() { 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (!mIsPowered && 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryService.getBatteryLevel() <= Power.LOW_BATTERY_THRESHOLD); 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1623105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project private void updateLightsLocked(int newState, int forceState) { 16249ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn final int oldState = mPowerState; 1625fb73f79340375013225618a5d87f46b958f698efMike Lockwood newState = applyButtonState(newState); 1626fb73f79340375013225618a5d87f46b958f698efMike Lockwood newState = applyKeyboardState(newState); 16279ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn final int realDifference = (newState ^ oldState); 16289ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn final int difference = realDifference | forceState; 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (difference == 0) { 1630105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return; 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1632ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offMask = 0; 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dimMask = 0; 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int onMask = 0; 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int preferredBrightness = getPreferredBrightness(); 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean startAnimation = false; 1639ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((difference & KEYBOARD_BRIGHT_BIT) != 0) { 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ANIMATE_KEYBOARD_LIGHTS) { 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & KEYBOARD_BRIGHT_BIT) == 0) { 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mKeyboardBrightness.setTargetLocked(Power.BRIGHTNESS_OFF, 1644128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato ANIM_STEPS, INITIAL_KEYBOARD_BRIGHTNESS, 1645fb73f79340375013225618a5d87f46b958f698efMike Lockwood Power.BRIGHTNESS_ON); 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1647fb73f79340375013225618a5d87f46b958f698efMike Lockwood mKeyboardBrightness.setTargetLocked(Power.BRIGHTNESS_ON, 1648128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato ANIM_STEPS, INITIAL_KEYBOARD_BRIGHTNESS, 1649128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato Power.BRIGHTNESS_OFF); 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation = true; 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & KEYBOARD_BRIGHT_BIT) == 0) { 1654105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project offMask |= KEYBOARD_BRIGHT_BIT; 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project onMask |= KEYBOARD_BRIGHT_BIT; 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((difference & BUTTON_BRIGHT_BIT) != 0) { 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ANIMATE_BUTTON_LIGHTS) { 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & BUTTON_BRIGHT_BIT) == 0) { 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mButtonBrightness.setTargetLocked(Power.BRIGHTNESS_OFF, 1665128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato ANIM_STEPS, INITIAL_BUTTON_BRIGHTNESS, 1666fb73f79340375013225618a5d87f46b958f698efMike Lockwood Power.BRIGHTNESS_ON); 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1668fb73f79340375013225618a5d87f46b958f698efMike Lockwood mButtonBrightness.setTargetLocked(Power.BRIGHTNESS_ON, 1669128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato ANIM_STEPS, INITIAL_BUTTON_BRIGHTNESS, 1670128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato Power.BRIGHTNESS_OFF); 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation = true; 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & BUTTON_BRIGHT_BIT) == 0) { 1675105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project offMask |= BUTTON_BRIGHT_BIT; 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1677105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project onMask |= BUTTON_BRIGHT_BIT; 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((difference & (SCREEN_ON_BIT | SCREEN_BRIGHT_BIT)) != 0) { 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ANIMATE_SCREEN_LIGHTS) { 16849ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn int nominalCurrentValue = -1; 16859ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn // If there was an actual difference in the light state, then 16869ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn // figure out the "ideal" current value based on the previous 16879ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn // state. Otherwise, this is a change due to the brightness 16889ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn // override, so we want to animate from whatever the current 16899ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn // value is. 16909ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn if ((realDifference & (SCREEN_ON_BIT | SCREEN_BRIGHT_BIT)) != 0) { 16919ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn switch (oldState & (SCREEN_BRIGHT_BIT|SCREEN_ON_BIT)) { 16929ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn case SCREEN_BRIGHT_BIT | SCREEN_ON_BIT: 16939ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn nominalCurrentValue = preferredBrightness; 16949ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn break; 16959ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn case SCREEN_ON_BIT: 16969ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn nominalCurrentValue = Power.BRIGHTNESS_DIM; 16979ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn break; 16989ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn case 0: 16999ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn nominalCurrentValue = Power.BRIGHTNESS_OFF; 17009ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn break; 17019ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn case SCREEN_BRIGHT_BIT: 17029ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn default: 17039ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn // not possible 17049ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn nominalCurrentValue = (int)mScreenBrightness.curValue; 17059ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn break; 17069ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn } 1707128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato } 1708617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int brightness = preferredBrightness; 1709617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int steps = ANIM_STEPS; 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & SCREEN_BRIGHT_BIT) == 0) { 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // dim or turn off backlight, depending on if the screen is on 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the scale is because the brightness ramp isn't linear and this biases 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it so the later parts take longer. 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float scale = 1.5f; 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float ratio = (((float)Power.BRIGHTNESS_DIM)/preferredBrightness); 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ratio > 1.0f) ratio = 1.0f; 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & SCREEN_ON_BIT) == 0) { 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((oldState & SCREEN_BRIGHT_BIT) != 0) { 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was bright 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project steps = ANIM_STEPS; 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was dim 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project steps = (int)(ANIM_STEPS*ratio*scale); 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1725617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn brightness = Power.BRIGHTNESS_OFF; 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((oldState & SCREEN_ON_BIT) != 0) { 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was bright 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project steps = (int)(ANIM_STEPS*(1.0f-ratio)*scale); 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was dim 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project steps = (int)(ANIM_STEPS*ratio); 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStayOnConditions != 0 && mBatteryService.isPowered(mStayOnConditions)) { 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the "stay on while plugged in" option is 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // turned on, then the screen will often not 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // automatically turn off while plugged in. To 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // still have a sense of when it is inactive, we 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // will then count going dim as turning off. 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffTime = SystemClock.elapsedRealtime(); 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1742617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn brightness = Power.BRIGHTNESS_DIM; 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1745617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long identity = Binder.clearCallingIdentity(); 1746617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn try { 1747617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mBatteryStats.noteScreenBrightness(brightness); 1748617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } catch (RemoteException e) { 1749617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Nothing interesting to do. 1750617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } finally { 1751617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Binder.restoreCallingIdentity(identity); 1752617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1753aa80b60b596e54dcfae55db73262440b0acba198Dianne Hackborn if (mScreenBrightness.setTargetLocked(brightness, 1754aa80b60b596e54dcfae55db73262440b0acba198Dianne Hackborn steps, INITIAL_SCREEN_BRIGHTNESS, nominalCurrentValue)) { 1755aa80b60b596e54dcfae55db73262440b0acba198Dianne Hackborn startAnimation = true; 1756aa80b60b596e54dcfae55db73262440b0acba198Dianne Hackborn } 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & SCREEN_BRIGHT_BIT) == 0) { 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // dim or turn off backlight, depending on if the screen is on 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & SCREEN_ON_BIT) == 0) { 1761105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project offMask |= SCREEN_BRIGHT_BIT; 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project dimMask |= SCREEN_BRIGHT_BIT; 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1766105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project onMask |= SCREEN_BRIGHT_BIT; 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startAnimation) { 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 17738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Scheduling light animator!"); 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeCallbacks(mLightAnimator); 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.post(mLightAnimator); 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1778ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offMask != 0) { 178048358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood if (mSpew) Slog.i(TAG, "Setting brightess off: " + offMask); 1781105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project setLightBrightness(offMask, Power.BRIGHTNESS_OFF); 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dimMask != 0) { 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int brightness = Power.BRIGHTNESS_DIM; 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & BATTERY_LOW_BIT) != 0 && 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project brightness > Power.BRIGHTNESS_LOW_BATTERY) { 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project brightness = Power.BRIGHTNESS_LOW_BATTERY; 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 178948358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood if (mSpew) Slog.i(TAG, "Setting brightess dim " + brightness + ": " + dimMask); 1790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project setLightBrightness(dimMask, brightness); 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (onMask != 0) { 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int brightness = getPreferredBrightness(); 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((newState & BATTERY_LOW_BIT) != 0 && 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project brightness > Power.BRIGHTNESS_LOW_BATTERY) { 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project brightness = Power.BRIGHTNESS_LOW_BATTERY; 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 179848358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood if (mSpew) Slog.i(TAG, "Setting brightess on " + brightness + ": " + onMask); 1799105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project setLightBrightness(onMask, brightness); 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1801105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1803105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project private void setLightBrightness(int mask, int value) { 1804cc9a63dbc2b5569ef65ec3a04d86dbdfdee3f134Mike Lockwood int brightnessMode = (mAutoBrightessEnabled 18053a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood ? LightsService.BRIGHTNESS_MODE_SENSOR 18063a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood : LightsService.BRIGHTNESS_MODE_USER); 1807105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if ((mask & SCREEN_BRIGHT_BIT) != 0) { 18083cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mLcdLight.setBrightness(value, brightnessMode); 1809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1810105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if ((mask & BUTTON_BRIGHT_BIT) != 0) { 18113cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mButtonLight.setBrightness(value); 1812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1813105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if ((mask & KEYBOARD_BRIGHT_BIT) != 0) { 18143cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mKeyboardLight.setBrightness(value); 1815105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class BrightnessState { 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mask; 1820ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean initialized; 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int targetValue; 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float curValue; 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float delta; 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean animating; 1826ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BrightnessState(int m) { 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mask = m; 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1830ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(PrintWriter pw, String prefix) { 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "animating=" + animating 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " targetValue=" + targetValue 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " curValue=" + curValue 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " delta=" + delta); 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1837ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1838aa80b60b596e54dcfae55db73262440b0acba198Dianne Hackborn boolean setTargetLocked(int target, int stepsToTarget, int initialValue, 1839128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato int nominalCurrentValue) { 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!initialized) { 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialized = true; 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curValue = (float)initialValue; 1843aa80b60b596e54dcfae55db73262440b0acba198Dianne Hackborn } else if (targetValue == target) { 1844aa80b60b596e54dcfae55db73262440b0acba198Dianne Hackborn return false; 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetValue = target; 18479ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn delta = (targetValue - 18489ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn (nominalCurrentValue >= 0 ? nominalCurrentValue : curValue)) 18499ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn / stepsToTarget; 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 1851128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato String noticeMe = nominalCurrentValue == curValue ? "" : " ******************"; 18528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Setting target " + mask + ": cur=" + curValue 1853128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato + " target=" + targetValue + " delta=" + delta 1854128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato + " nominalCurrentValue=" + nominalCurrentValue 1855128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato + noticeMe); 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animating = true; 1858aa80b60b596e54dcfae55db73262440b0acba198Dianne Hackborn return true; 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1860ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean stepLocked() { 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!animating) return false; 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false && mSpew) { 18648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Step target " + mask + ": cur=" + curValue 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " target=" + targetValue + " delta=" + delta); 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curValue += delta; 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curIntValue = (int)curValue; 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean more = true; 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta == 0) { 18719ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn curValue = curIntValue = targetValue; 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project more = false; 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (delta > 0) { 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curIntValue >= targetValue) { 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curValue = curIntValue = targetValue; 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project more = false; 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curIntValue <= targetValue) { 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curValue = curIntValue = targetValue; 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project more = false; 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Animating brightess " + curIntValue + ": " + mask); 1885105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project setLightBrightness(mask, curIntValue); 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animating = more; 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!more) { 1888105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mask == SCREEN_BRIGHT_BIT && curIntValue == Power.BRIGHTNESS_OFF) { 1889435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood screenOffFinishedAnimatingLocked(mScreenOffReason); 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return more; 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1895ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class LightAnimator implements Runnable { 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean more = mScreenBrightness.stepLocked(); 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mKeyboardBrightness.stepLocked()) { 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project more = true; 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mButtonBrightness.stepLocked()) { 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project more = true; 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (more) { 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.postAtTime(mLightAnimator, now+(1000/60)); 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1913ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getPreferredBrightness() { 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mScreenBrightnessOverride >= 0) { 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mScreenBrightnessOverride; 1918fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else if (mLightSensorScreenBrightness >= 0 && mUseSoftwareAutoBrightness 191927c6dd7aa4ff6f57435a3c87d8b9a782cf7c9116Mike Lockwood && mAutoBrightessEnabled) { 1920fb73f79340375013225618a5d87f46b958f698efMike Lockwood return mLightSensorScreenBrightness; 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int brightness = Settings.System.getInt(mContext.getContentResolver(), 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SCREEN_BRIGHTNESS); 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't let applications turn the screen all the way off 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Math.max(brightness, Power.BRIGHTNESS_DIM); 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (SettingNotFoundException snfe) { 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Power.BRIGHTNESS_ON; 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1931fb73f79340375013225618a5d87f46b958f698efMike Lockwood private int applyButtonState(int state) { 1932fb73f79340375013225618a5d87f46b958f698efMike Lockwood int brightness = -1; 193348358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood if ((state & BATTERY_LOW_BIT) != 0) { 193448358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood // do not override brightness if the battery is low 193548358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood return state; 193648358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood } 1937fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (mButtonBrightnessOverride >= 0) { 1938fb73f79340375013225618a5d87f46b958f698efMike Lockwood brightness = mButtonBrightnessOverride; 1939fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else if (mLightSensorButtonBrightness >= 0 && mUseSoftwareAutoBrightness) { 1940fb73f79340375013225618a5d87f46b958f698efMike Lockwood brightness = mLightSensorButtonBrightness; 1941fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 1942fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (brightness > 0) { 1943fb73f79340375013225618a5d87f46b958f698efMike Lockwood return state | BUTTON_BRIGHT_BIT; 1944fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else if (brightness == 0) { 1945fb73f79340375013225618a5d87f46b958f698efMike Lockwood return state & ~BUTTON_BRIGHT_BIT; 1946fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else { 1947fb73f79340375013225618a5d87f46b958f698efMike Lockwood return state; 1948fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 1949fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 1950fb73f79340375013225618a5d87f46b958f698efMike Lockwood 1951fb73f79340375013225618a5d87f46b958f698efMike Lockwood private int applyKeyboardState(int state) { 1952fb73f79340375013225618a5d87f46b958f698efMike Lockwood int brightness = -1; 195348358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood if ((state & BATTERY_LOW_BIT) != 0) { 195448358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood // do not override brightness if the battery is low 195548358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood return state; 195648358bd5c1a35c153c024608b4a302b90f62abfdMike Lockwood } 1957fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (!mKeyboardVisible) { 1958fb73f79340375013225618a5d87f46b958f698efMike Lockwood brightness = 0; 1959fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else if (mButtonBrightnessOverride >= 0) { 1960fb73f79340375013225618a5d87f46b958f698efMike Lockwood brightness = mButtonBrightnessOverride; 1961fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else if (mLightSensorKeyboardBrightness >= 0 && mUseSoftwareAutoBrightness) { 1962fb73f79340375013225618a5d87f46b958f698efMike Lockwood brightness = mLightSensorKeyboardBrightness; 1963fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 1964fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (brightness > 0) { 1965fb73f79340375013225618a5d87f46b958f698efMike Lockwood return state | KEYBOARD_BRIGHT_BIT; 1966fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else if (brightness == 0) { 1967fb73f79340375013225618a5d87f46b958f698efMike Lockwood return state & ~KEYBOARD_BRIGHT_BIT; 1968fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else { 1969fb73f79340375013225618a5d87f46b958f698efMike Lockwood return state; 1970fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 1971fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 1972fb73f79340375013225618a5d87f46b958f698efMike Lockwood 1973322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis public boolean isScreenOn() { 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mPowerState & SCREEN_ON_BIT) != 0; 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis boolean isScreenBright() { 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mPowerState & SCREEN_BRIGHT) == SCREEN_BRIGHT; 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1985497087e33d422d576d007f72fb970613d008f1cfMike Lockwood private boolean isScreenTurningOffLocked() { 1986497087e33d422d576d007f72fb970613d008f1cfMike Lockwood return (mScreenBrightness.animating && mScreenBrightness.targetValue == 0); 1987497087e33d422d576d007f72fb970613d008f1cfMike Lockwood } 1988497087e33d422d576d007f72fb970613d008f1cfMike Lockwood 1989200b30bba53412919d2b5b4b85c02727b87f51dfMike Lockwood private void forceUserActivityLocked() { 1990e090281428cbd1114f4ae2f10755013cea09cdb5Mike Lockwood if (isScreenTurningOffLocked()) { 1991e090281428cbd1114f4ae2f10755013cea09cdb5Mike Lockwood // cancel animation so userActivity will succeed 1992e090281428cbd1114f4ae2f10755013cea09cdb5Mike Lockwood mScreenBrightness.animating = false; 1993e090281428cbd1114f4ae2f10755013cea09cdb5Mike Lockwood } 1994200b30bba53412919d2b5b4b85c02727b87f51dfMike Lockwood boolean savedActivityAllowed = mUserActivityAllowed; 1995200b30bba53412919d2b5b4b85c02727b87f51dfMike Lockwood mUserActivityAllowed = true; 1996200b30bba53412919d2b5b4b85c02727b87f51dfMike Lockwood userActivity(SystemClock.uptimeMillis(), false); 1997200b30bba53412919d2b5b4b85c02727b87f51dfMike Lockwood mUserActivityAllowed = savedActivityAllowed; 1998200b30bba53412919d2b5b4b85c02727b87f51dfMike Lockwood } 1999200b30bba53412919d2b5b4b85c02727b87f51dfMike Lockwood 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void userActivityWithForce(long time, boolean noChangeLights, boolean force) { 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 20021fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato userActivity(time, -1, noChangeLights, OTHER_EVENT, force); 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void userActivity(long time, boolean noChangeLights) { 20061fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato userActivity(time, -1, noChangeLights, OTHER_EVENT, false); 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void userActivity(long time, boolean noChangeLights, int eventType) { 20101fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato userActivity(time, -1, noChangeLights, eventType, false); 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void userActivity(long time, boolean noChangeLights, int eventType, boolean force) { 20141fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato userActivity(time, -1, noChangeLights, eventType, force); 20151fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 20161fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato 20171fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato /* 20181fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato * Reset the user activity timeout to now + timeout. This overrides whatever else is going 20191fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato * on with user activity. Don't use this function. 20201fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato */ 20211fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato public void clearUserActivityTimeout(long now, long timeout) { 20221fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 20231fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato Slog.i(TAG, "clearUserActivity for " + timeout + "ms from now"); 20241fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato userActivity(now, timeout, false, OTHER_EVENT, false); 20251fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato } 20261fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato 20271fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato private void userActivity(long time, long timeoutOverride, boolean noChangeLights, 20281fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato int eventType, boolean force) { 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (((mPokey & POKE_LOCK_IGNORE_CHEEK_EVENTS) != 0) 2032e68ffcb5764152da6d36adc8f2918200b4472c23Joe Onorato && (eventType == CHEEK_EVENT || eventType == TOUCH_EVENT)) { 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 20348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "dropping cheek or short event mPokey=0x" + Integer.toHexString(mPokey)); 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039e68ffcb5764152da6d36adc8f2918200b4472c23Joe Onorato if (((mPokey & POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS) != 0) 2040e68ffcb5764152da6d36adc8f2918200b4472c23Joe Onorato && (eventType == TOUCH_EVENT || eventType == TOUCH_UP_EVENT 2041e68ffcb5764152da6d36adc8f2918200b4472c23Joe Onorato || eventType == LONG_TOUCH_EVENT || eventType == CHEEK_EVENT)) { 2042e68ffcb5764152da6d36adc8f2918200b4472c23Joe Onorato if (false) { 20438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "dropping touch mPokey=0x" + Integer.toHexString(mPokey)); 2044e68ffcb5764152da6d36adc8f2918200b4472c23Joe Onorato } 2045e68ffcb5764152da6d36adc8f2918200b4472c23Joe Onorato return; 2046e68ffcb5764152da6d36adc8f2918200b4472c23Joe Onorato } 2047e68ffcb5764152da6d36adc8f2918200b4472c23Joe Onorato 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (((mPokey & POKE_LOCK_IGNORE_CHEEK_EVENTS) != 0)) { 20508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "userActivity !!!");//, new RuntimeException()); 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "mPokey=0x" + Integer.toHexString(mPokey)); 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 20588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "userActivity mLastEventTime=" + mLastEventTime + " time=" + time 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUserActivityAllowed=" + mUserActivityAllowed 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUserState=0x" + Integer.toHexString(mUserState) 206136fc302560fbc6dff3099860356d290d1653371cMike Lockwood + " mWakeLockState=0x" + Integer.toHexString(mWakeLockState) 206236fc302560fbc6dff3099860356d290d1653371cMike Lockwood + " mProximitySensorActive=" + mProximitySensorActive 2063382872e3fa45fb1433976b7bda4b26bbc2072f71Joe Onorato + " timeoutOverride=" + timeoutOverride 206436fc302560fbc6dff3099860356d290d1653371cMike Lockwood + " force=" + force); 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 206605067120682487df7121b8d2b6f7b02deeb9cd93Mike Lockwood // ignore user activity if we are in the process of turning off the screen 2067497087e33d422d576d007f72fb970613d008f1cfMike Lockwood if (isScreenTurningOffLocked()) { 20688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "ignoring user activity while turning off screen"); 206905067120682487df7121b8d2b6f7b02deeb9cd93Mike Lockwood return; 207005067120682487df7121b8d2b6f7b02deeb9cd93Mike Lockwood } 20710e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood // Disable proximity sensor if if user presses power key while we are in the 20720e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood // "waiting for proximity sensor to go negative" state. 20730e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood if (mProximitySensorActive && mProximityWakeLockCount == 0) { 20740e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood mProximitySensorActive = false; 20750e39ea83c5578e0d55e120c91ff7cfeeb0c1cb2fMike Lockwood } 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLastEventTime <= time || force) { 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastEventTime = time; 207836fc302560fbc6dff3099860356d290d1653371cMike Lockwood if ((mUserActivityAllowed && !mProximitySensorActive) || force) { 2079d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood // Only turn on button backlights if a button was pressed 2080d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood // and auto brightness is disabled 20814984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood if (eventType == BUTTON_EVENT && !mUseSoftwareAutoBrightness) { 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserState = (mKeyboardVisible ? ALL_BRIGHT : SCREEN_BUTTON_BRIGHT); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // don't clear button/keyboard backlights when the screen is touched. 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserState |= SCREEN_BRIGHT; 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2088617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int uid = Binder.getCallingUid(); 2089617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long ident = Binder.clearCallingIdentity(); 2090617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn try { 2091617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mBatteryStats.noteUserActivity(uid, eventType); 2092617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } catch (RemoteException e) { 2093617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Ignore 2094617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } finally { 2095617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Binder.restoreCallingIdentity(ident); 2096617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2097ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 2098e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan mWakeLockState = mLocks.reactivateScreenLocksLocked(); 2099435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood setPowerState(mUserState | mWakeLockState, noChangeLights, 2100435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood WindowManagerPolicy.OFF_BECAUSE_OF_USER); 21011fdb1fb43a39c8c29e3265592e0d6a2da419e08eJoe Onorato setTimeoutLocked(time, timeoutOverride, SCREEN_BRIGHT); 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2105ef73162887943e16587b8e737b19e59348338e8cMike Lockwood 2106ef73162887943e16587b8e737b19e59348338e8cMike Lockwood if (mPolicy != null) { 2107ef73162887943e16587b8e737b19e59348338e8cMike Lockwood mPolicy.userActivity(); 2108ef73162887943e16587b8e737b19e59348338e8cMike Lockwood } 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2111d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood private int getAutoBrightnessValue(int sensorValue, int[] values) { 2112d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood try { 2113d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood int i; 2114d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood for (i = 0; i < mAutoBrightnessLevels.length; i++) { 2115d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood if (sensorValue < mAutoBrightnessLevels[i]) { 2116d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood break; 2117d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2118d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2119d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood return values[i]; 2120d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } catch (Exception e) { 2121d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood // guard against null pointer or index out of bounds errors 21228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "getAutoBrightnessValue", e); 2123d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood return 255; 2124d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2125d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2126d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood 212720f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood private Runnable mProximityTask = new Runnable() { 212820f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood public void run() { 212920f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood synchronized (mLocks) { 213020f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood if (mProximityPendingValue != -1) { 213120f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood proximityChangedLocked(mProximityPendingValue == 1); 213220f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood mProximityPendingValue = -1; 213320f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood } 21340e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood if (mProximityPartialLock.isHeld()) { 21350e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood mProximityPartialLock.release(); 21360e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood } 213720f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood } 213820f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood } 213920f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood }; 214020f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood 2141d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood private Runnable mAutoBrightnessTask = new Runnable() { 2142d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood public void run() { 2143fa68ab4fb0750b429c43af1d0c20539462ba6746Mike Lockwood synchronized (mLocks) { 2144fa68ab4fb0750b429c43af1d0c20539462ba6746Mike Lockwood int value = (int)mLightSensorPendingValue; 2145fa68ab4fb0750b429c43af1d0c20539462ba6746Mike Lockwood if (value >= 0) { 2146fa68ab4fb0750b429c43af1d0c20539462ba6746Mike Lockwood mLightSensorPendingValue = -1; 2147fa68ab4fb0750b429c43af1d0c20539462ba6746Mike Lockwood lightSensorChangedLocked(value); 2148fa68ab4fb0750b429c43af1d0c20539462ba6746Mike Lockwood } 2149d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2150d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2151d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood }; 2152d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood 2153b28654167466277fa262606810115164d9d24d67Mike Lockwood private void dockStateChanged(int state) { 2154b28654167466277fa262606810115164d9d24d67Mike Lockwood synchronized (mLocks) { 2155b28654167466277fa262606810115164d9d24d67Mike Lockwood mIsDocked = (state != Intent.EXTRA_DOCK_STATE_UNDOCKED); 2156b28654167466277fa262606810115164d9d24d67Mike Lockwood if (mIsDocked) { 2157b28654167466277fa262606810115164d9d24d67Mike Lockwood mHighestLightSensorValue = -1; 2158b28654167466277fa262606810115164d9d24d67Mike Lockwood } 2159b28654167466277fa262606810115164d9d24d67Mike Lockwood if ((mPowerState & SCREEN_ON_BIT) != 0) { 2160b28654167466277fa262606810115164d9d24d67Mike Lockwood // force lights recalculation 2161b28654167466277fa262606810115164d9d24d67Mike Lockwood int value = (int)mLightSensorValue; 2162b28654167466277fa262606810115164d9d24d67Mike Lockwood mLightSensorValue = -1; 2163b28654167466277fa262606810115164d9d24d67Mike Lockwood lightSensorChangedLocked(value); 2164b28654167466277fa262606810115164d9d24d67Mike Lockwood } 2165b28654167466277fa262606810115164d9d24d67Mike Lockwood } 2166b28654167466277fa262606810115164d9d24d67Mike Lockwood } 2167b28654167466277fa262606810115164d9d24d67Mike Lockwood 2168d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood private void lightSensorChangedLocked(int value) { 21698738e0c040061a179ad88adb997143f076277b04Mike Lockwood if (mDebugLightSensor) { 21708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "lightSensorChangedLocked " + value); 21718738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 2172d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood 2173b28654167466277fa262606810115164d9d24d67Mike Lockwood // do not allow light sensor value to decrease 2174b28654167466277fa262606810115164d9d24d67Mike Lockwood if (mHighestLightSensorValue < value) { 2175b28654167466277fa262606810115164d9d24d67Mike Lockwood mHighestLightSensorValue = value; 2176b28654167466277fa262606810115164d9d24d67Mike Lockwood } 2177b28654167466277fa262606810115164d9d24d67Mike Lockwood 2178d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood if (mLightSensorValue != value) { 2179d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood mLightSensorValue = value; 2180d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood if ((mPowerState & BATTERY_LOW_BIT) == 0) { 2181b28654167466277fa262606810115164d9d24d67Mike Lockwood // use maximum light sensor value seen since screen went on for LCD to avoid flicker 2182b28654167466277fa262606810115164d9d24d67Mike Lockwood // we only do this if we are undocked, since lighting should be stable when 2183b28654167466277fa262606810115164d9d24d67Mike Lockwood // stationary in a dock. 2184b28654167466277fa262606810115164d9d24d67Mike Lockwood int lcdValue = getAutoBrightnessValue( 2185b28654167466277fa262606810115164d9d24d67Mike Lockwood (mIsDocked ? value : mHighestLightSensorValue), 2186b28654167466277fa262606810115164d9d24d67Mike Lockwood mLcdBacklightValues); 2187d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood int buttonValue = getAutoBrightnessValue(value, mButtonBacklightValues); 2188df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood int keyboardValue; 2189df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood if (mKeyboardVisible) { 2190df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood keyboardValue = getAutoBrightnessValue(value, mKeyboardBacklightValues); 2191df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood } else { 2192df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood keyboardValue = 0; 2193df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood } 2194fb73f79340375013225618a5d87f46b958f698efMike Lockwood mLightSensorScreenBrightness = lcdValue; 2195fb73f79340375013225618a5d87f46b958f698efMike Lockwood mLightSensorButtonBrightness = buttonValue; 2196fb73f79340375013225618a5d87f46b958f698efMike Lockwood mLightSensorKeyboardBrightness = keyboardValue; 2197d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood 2198d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood if (mDebugLightSensor) { 21998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "lcdValue " + lcdValue); 22008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "buttonValue " + buttonValue); 22018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "keyboardValue " + keyboardValue); 2202d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2203d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood 2204dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood boolean startAnimation = false; 22054984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood if (mAutoBrightessEnabled && mScreenBrightnessOverride < 0) { 2206dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood if (ANIMATE_SCREEN_LIGHTS) { 2207dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood if (mScreenBrightness.setTargetLocked(lcdValue, 2208dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood AUTOBRIGHTNESS_ANIM_STEPS, INITIAL_SCREEN_BRIGHTNESS, 2209dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood (int)mScreenBrightness.curValue)) { 2210dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood startAnimation = true; 2211dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood } 2212dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood } else { 2213cc9a63dbc2b5569ef65ec3a04d86dbdfdee3f134Mike Lockwood int brightnessMode = (mAutoBrightessEnabled 22143a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood ? LightsService.BRIGHTNESS_MODE_SENSOR 22153a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood : LightsService.BRIGHTNESS_MODE_USER); 22163cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mLcdLight.setBrightness(lcdValue, brightnessMode); 2217dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood } 2218d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2219fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (mButtonBrightnessOverride < 0) { 2220fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (ANIMATE_BUTTON_LIGHTS) { 2221fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (mButtonBrightness.setTargetLocked(buttonValue, 2222fb73f79340375013225618a5d87f46b958f698efMike Lockwood AUTOBRIGHTNESS_ANIM_STEPS, INITIAL_BUTTON_BRIGHTNESS, 2223fb73f79340375013225618a5d87f46b958f698efMike Lockwood (int)mButtonBrightness.curValue)) { 2224fb73f79340375013225618a5d87f46b958f698efMike Lockwood startAnimation = true; 2225fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 2226fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else { 22273cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mButtonLight.setBrightness(buttonValue); 2228dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood } 2229d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2230fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (mButtonBrightnessOverride < 0 || !mKeyboardVisible) { 2231fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (ANIMATE_KEYBOARD_LIGHTS) { 2232fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (mKeyboardBrightness.setTargetLocked(keyboardValue, 2233fb73f79340375013225618a5d87f46b958f698efMike Lockwood AUTOBRIGHTNESS_ANIM_STEPS, INITIAL_BUTTON_BRIGHTNESS, 2234fb73f79340375013225618a5d87f46b958f698efMike Lockwood (int)mKeyboardBrightness.curValue)) { 2235fb73f79340375013225618a5d87f46b958f698efMike Lockwood startAnimation = true; 2236fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 2237fb73f79340375013225618a5d87f46b958f698efMike Lockwood } else { 22383cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mKeyboardLight.setBrightness(keyboardValue); 2239dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood } 2240dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood } 2241dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood if (startAnimation) { 2242dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood if (mDebugLightSensor) { 22438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "lightSensorChangedLocked scheduling light animator"); 2244dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood } 2245dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood mHandler.removeCallbacks(mLightAnimator); 2246dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood mHandler.post(mLightAnimator); 2247d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2248d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 2249d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 22508738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 22518738e0c040061a179ad88adb997143f076277b04Mike Lockwood 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The user requested that we go to sleep (probably with the power button). 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This overrides all wake locks that are held. 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void goToSleep(long time) 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2258254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn goToSleepWithReason(time, WindowManagerPolicy.OFF_BECAUSE_OF_USER); 2259254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn } 2260254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn 2261254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn /** 2262254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * The user requested that we go to sleep (probably with the power button). 2263254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn * This overrides all wake locks that are held. 2264254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn */ 2265254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn public void goToSleepWithReason(long time, int reason) 2266254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn { 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 2269254cb446faa7cb13699d8150eb4cc4f44cb61a2dDianne Hackborn goToSleepLocked(time, reason); 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2272ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 227450a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * Reboot the device immediately, passing 'reason' (may be null) 227550a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker * to the underlying __reboot system call. Should not return. 227650a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker */ 227750a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker public void reboot(String reason) 227850a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker { 227950a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); 228014e69afdfcefe21c81679a95c476e64ebb276fbeSan Mehat 22816ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu if (mHandler == null || !ActivityManagerNative.isSystemReady()) { 22826ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu throw new IllegalStateException("Too early to call reboot()"); 22836ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu } 2284b62f959430afa80e616675fe15cec5392e8178deMike Lockwood 22856ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu final String finalReason = reason; 22866ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu Runnable runnable = new Runnable() { 22876ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu public void run() { 22886ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu synchronized (this) { 22896ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu ShutdownThread.reboot(mContext, finalReason, false); 22906ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu } 22916ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu 22926ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu } 22936ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu }; 2294b62f959430afa80e616675fe15cec5392e8178deMike Lockwood // ShutdownThread must run on a looper capable of displaying the UI. 22956ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu mHandler.post(runnable); 22966ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu 2297b62f959430afa80e616675fe15cec5392e8178deMike Lockwood // PowerManager.reboot() is documented not to return so just wait for the inevitable. 22986ffce2e9a3c57634bb73f8ff133ca680f8070d5dSuchi Amalapurapu synchronized (runnable) { 2299b62f959430afa80e616675fe15cec5392e8178deMike Lockwood while (true) { 2300b62f959430afa80e616675fe15cec5392e8178deMike Lockwood try { 2301b62f959430afa80e616675fe15cec5392e8178deMike Lockwood runnable.wait(); 2302b62f959430afa80e616675fe15cec5392e8178deMike Lockwood } catch (InterruptedException e) { 2303b62f959430afa80e616675fe15cec5392e8178deMike Lockwood } 23041e512790bfe13bdf4d174892c8b699b93f7f2203San Mehat } 230550a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker } 230650a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker } 230760d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor 230860d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor /** 230960d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor * Crash the runtime (causing a complete restart of the Android framework). 231060d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor * Requires REBOOT permission. Mostly for testing. Should not return. 231160d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor */ 231260d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor public void crash(final String message) 231360d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor { 231460d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); 231560d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor Thread t = new Thread("PowerManagerService.crash()") { 231660d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor public void run() { throw new RuntimeException(message); } 231760d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor }; 231860d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor try { 231960d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor t.start(); 232060d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor t.join(); 232160d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor } catch (InterruptedException e) { 232260d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor Log.wtf(TAG, e); 232360d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor } 232460d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor } 232550a21f4d3b70360b36acad20e234c380654fd59fDoug Zongker 2326435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood private void goToSleepLocked(long time, int reason) { 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLastEventTime <= time) { 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastEventTime = time; 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // cancel all of the wake locks 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeLockState = SCREEN_OFF; 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mLocks.size(); 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numCleared = 0; 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WakeLock wl = mLocks.get(i); 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isScreenLock(wl.flags)) { 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLocks.get(i).activated = false; 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project numCleared++; 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2341ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.POWER_SLEEP_REQUESTED, numCleared); 2342128e729c493042d694df9d285ea390e25e2c3fdeJoe Onorato mStillNeedSleepNotification = true; 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserState = SCREEN_OFF; 2344435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood setPowerState(SCREEN_OFF, false, reason); 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cancelTimerLocked(); 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long timeSinceScreenOn() { 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPowerState & SCREEN_ON_BIT) != 0) { 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SystemClock.elapsedRealtime() - mScreenOffTime; 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2357ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setKeyboardVisibility(boolean visible) { 2359a625b38cb3a6a6b3a890369b7bbbed7c028cb120Mike Lockwood synchronized (mLocks) { 2360a625b38cb3a6a6b3a890369b7bbbed7c028cb120Mike Lockwood if (mSpew) { 23618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "setKeyboardVisibility: " + visible); 2362a625b38cb3a6a6b3a890369b7bbbed7c028cb120Mike Lockwood } 23633c9435a20597adec7ec2e110b92920b4a9ecb0e7Mike Lockwood if (mKeyboardVisible != visible) { 23643c9435a20597adec7ec2e110b92920b4a9ecb0e7Mike Lockwood mKeyboardVisible = visible; 23653c9435a20597adec7ec2e110b92920b4a9ecb0e7Mike Lockwood // don't signal user activity if the screen is off; other code 23663c9435a20597adec7ec2e110b92920b4a9ecb0e7Mike Lockwood // will take care of turning on due to a true change to the lid 23673c9435a20597adec7ec2e110b92920b4a9ecb0e7Mike Lockwood // switch and synchronized with the lock screen. 23683c9435a20597adec7ec2e110b92920b4a9ecb0e7Mike Lockwood if ((mPowerState & SCREEN_ON_BIT) != 0) { 23694984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood if (mUseSoftwareAutoBrightness) { 2370df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood // force recompute of backlight values 2371df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood if (mLightSensorValue >= 0) { 2372df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood int value = (int)mLightSensorValue; 2373df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood mLightSensorValue = -1; 2374df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood lightSensorChangedLocked(value); 2375df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood } 2376df024920ebc63a82f570105c7a26e339ff244afdMike Lockwood } 23773c9435a20597adec7ec2e110b92920b4a9ecb0e7Mike Lockwood userActivity(SystemClock.uptimeMillis(), false, BUTTON_EVENT, true); 23783c9435a20597adec7ec2e110b92920b4a9ecb0e7Mike Lockwood } 2379a625b38cb3a6a6b3a890369b7bbbed7c028cb120Mike Lockwood } 2380a625b38cb3a6a6b3a890369b7bbbed7c028cb120Mike Lockwood } 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When the keyguard is up, it manages the power state, and userActivity doesn't do anything. 238550c548d242d637328ec6b2c4987969b02695cc7dMike Lockwood * When disabling user activity we also reset user power state so the keyguard can reset its 238650c548d242d637328ec6b2c4987969b02695cc7dMike Lockwood * short screen timeout when keyguard is unhidden. 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enableUserActivity(boolean enabled) { 238950c548d242d637328ec6b2c4987969b02695cc7dMike Lockwood if (mSpew) { 23908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "enableUserActivity " + enabled); 239150c548d242d637328ec6b2c4987969b02695cc7dMike Lockwood } 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserActivityAllowed = enabled; 239450c548d242d637328ec6b2c4987969b02695cc7dMike Lockwood if (!enabled) { 239550c548d242d637328ec6b2c4987969b02695cc7dMike Lockwood // cancel timeout and clear mUserState so the keyguard can set a short timeout 239650c548d242d637328ec6b2c4987969b02695cc7dMike Lockwood setTimeoutLocked(SystemClock.uptimeMillis(), 0); 239750c548d242d637328ec6b2c4987969b02695cc7dMike Lockwood } 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2401dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood private void setScreenBrightnessMode(int mode) { 24022d155d264e5cefc27abf2c5020fcfa06bde755ecMike Lockwood boolean enabled = (mode == SCREEN_BRIGHTNESS_MODE_AUTOMATIC); 2403f90ffcc639fe979f346f062d620d34c28e57c885Mike Lockwood if (mUseSoftwareAutoBrightness && mAutoBrightessEnabled != enabled) { 24042d155d264e5cefc27abf2c5020fcfa06bde755ecMike Lockwood mAutoBrightessEnabled = enabled; 2405322591cb4b158dc2edbc3d95cd02e44f132feb5fCharles Mendis if (isScreenOn()) { 24064984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood // force recompute of backlight values 24074984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood if (mLightSensorValue >= 0) { 24084984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood int value = (int)mLightSensorValue; 24094984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood mLightSensorValue = -1; 24104984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood lightSensorChangedLocked(value); 24114984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood } 24122d155d264e5cefc27abf2c5020fcfa06bde755ecMike Lockwood } 2413dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood } 2414dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood } 2415dc3494e3d8e17aeb0dbbe41953a5ef763d95ff78Mike Lockwood 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Sets the screen off timeouts: 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mKeylightDelay 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mDimDelay 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mScreenOffDelay 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * */ 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setScreenOffTimeoutsLocked() { 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPokey & POKE_LOCK_SHORT_TIMEOUT) != 0) { 242343866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker mKeylightDelay = mShortKeylightDelay; // Configurable via secure settings 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDimDelay = -1; 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffDelay = 0; 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((mPokey & POKE_LOCK_MEDIUM_TIMEOUT) != 0) { 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mKeylightDelay = MEDIUM_KEYLIGHT_DELAY; 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDimDelay = -1; 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffDelay = 0; 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2431df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn int totalDelay = mScreenOffTimeoutSetting; 2432df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn if (totalDelay > mMaximumScreenOffTimeout) { 2433df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn totalDelay = mMaximumScreenOffTimeout; 2434df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn } 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mKeylightDelay = LONG_KEYLIGHT_DELAY; 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalDelay < 0) { 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffDelay = Integer.MAX_VALUE; 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mKeylightDelay < totalDelay) { 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // subtract the time that the keylight delay. This will give us the 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remainder of the time that we need to sleep to get the accurate 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // screen off timeout. 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffDelay = totalDelay - mKeylightDelay; 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffDelay = 0; 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDimScreen && totalDelay >= (LONG_KEYLIGHT_DELAY + LONG_DIM_TIME)) { 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDimDelay = mScreenOffDelay - LONG_DIM_TIME; 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOffDelay = LONG_DIM_TIME; 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDimDelay = -1; 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSpew) { 24548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "setScreenOffTimeouts mKeylightDelay=" + mKeylightDelay 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mDimDelay=" + mDimDelay + " mScreenOffDelay=" + mScreenOffDelay 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mDimScreen=" + mDimScreen); 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 246143866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker * Refreshes cached secure settings. Called once on startup, and 246243866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker * on subsequent changes to secure settings. 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 246443866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker private void updateSettingsValues() { 246543866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker mShortKeylightDelay = Settings.Secure.getInt( 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.getContentResolver(), 246743866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker Settings.Secure.SHORT_KEYLIGHT_DELAY_MS, 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SHORT_KEYLIGHT_DELAY_DEFAULT); 24698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato // Slog.i(TAG, "updateSettingsValues(): mShortKeylightDelay now " + mShortKeylightDelay); 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class LockList extends ArrayList<WakeLock> 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void addLock(WakeLock wl) 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = getIndex(wl.binder); 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.add(wl); 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WakeLock removeLock(IBinder binder) 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = getIndex(binder); 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index >= 0) { 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.remove(index); 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getIndex(IBinder binder) 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = this.size(); 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.get(i).binder == binder) { 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i; 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gatherState() 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = 0; 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = this.size(); 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WakeLock wl = this.get(i); 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.activated) { 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isScreenLock(wl.flags)) { 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result |= wl.minState; 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2517ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 2518e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan int reactivateScreenLocksLocked() 2519e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan { 2520e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan int result = 0; 2521e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan int N = this.size(); 2522e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan for (int i=0; i<N; i++) { 2523e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan WakeLock wl = this.get(i); 2524e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan if (isScreenLock(wl.flags)) { 2525e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan wl.activated = true; 2526e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan result |= wl.minState; 2527e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 2528e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 2529e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan return result; 2530e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setPolicy(WindowManagerPolicy p) { 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy = p; 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLocks.notifyAll(); 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy getPolicyLocked() { 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (mPolicy == null || !mDoneBooting) { 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLocks.wait(); 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPolicy; 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2550ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void systemReady() { 25528738e0c040061a179ad88adb997143f076277b04Mike Lockwood mSensorManager = new SensorManager(mHandlerThread.getLooper()); 25538738e0c040061a179ad88adb997143f076277b04Mike Lockwood mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 25548738e0c040061a179ad88adb997143f076277b04Mike Lockwood // don't bother with the light sensor if auto brightness is handled in hardware 2555aa66ea880f58c9caa49e31c166bb3bd6bbf14e21Mike Lockwood if (mUseSoftwareAutoBrightness) { 25568738e0c040061a179ad88adb997143f076277b04Mike Lockwood mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); 25574984e73dc5fc3df757e4ac8dd333b88151deb3eaMike Lockwood enableLightSensor(true); 25588738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 25598738e0c040061a179ad88adb997143f076277b04Mike Lockwood 2560b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood // wait until sensors are enabled before turning on screen. 2561b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood // some devices will not activate the light sensor properly on boot 2562b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood // unless we do this. 2563b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood if (mUseSoftwareAutoBrightness) { 2564b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood // turn the screen on 2565b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood setPowerState(SCREEN_BRIGHT); 2566b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood } else { 2567b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood // turn everything on 2568b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood setPowerState(ALL_BRIGHT); 2569b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood } 2570b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { 25728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "system ready!"); 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDoneBooting = true; 2574b42ab0f41cb9dc5988d152ba660d39b3910ae373Mike Lockwood 2575617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long identity = Binder.clearCallingIdentity(); 2576617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn try { 2577617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mBatteryStats.noteScreenBrightness(getPreferredBrightness()); 2578617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mBatteryStats.noteScreenOn(); 2579617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } catch (RemoteException e) { 2580617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Nothing interesting to do. 2581617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } finally { 2582617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Binder.restoreCallingIdentity(identity); 2583617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 25842d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood } 25852d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood } 25862d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood 25872d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood void bootCompleted() { 25888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "bootCompleted"); 25892d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood synchronized (mLocks) { 25902d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood mBootCompleted = true; 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userActivity(SystemClock.uptimeMillis(), false, BUTTON_EVENT, true); 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWakeLockLocked(); 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLocks.notifyAll(); 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void monitor() { 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLocks) { } 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2600bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 2601bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood public int getSupportedWakeLockFlags() { 2602bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood int result = PowerManager.PARTIAL_WAKE_LOCK 2603bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood | PowerManager.FULL_WAKE_LOCK 2604bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood | PowerManager.SCREEN_DIM_WAKE_LOCK; 2605bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 2606bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood if (mProximitySensor != null) { 2607bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood result |= PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK; 2608bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 2609bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 2610bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood return result; 2611bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 2612bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 2613237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood public void setBacklightBrightness(int brightness) { 2614237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 2615237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood // Don't let applications turn the screen all the way off 2616237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood brightness = Math.max(brightness, Power.BRIGHTNESS_DIM); 26173cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mLcdLight.setBrightness(brightness); 26183cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mKeyboardLight.setBrightness(mKeyboardVisible ? brightness : 0); 26193cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mButtonLight.setBrightness(brightness); 2620237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood long identity = Binder.clearCallingIdentity(); 2621237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood try { 2622237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mBatteryStats.noteScreenBrightness(brightness); 2623237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } catch (RemoteException e) { 26248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "RemoteException calling noteScreenBrightness on BatteryStatsService", e); 2625237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } finally { 2626237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood Binder.restoreCallingIdentity(identity); 2627237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } 2628237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood 2629237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood // update our animation state 2630237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood if (ANIMATE_SCREEN_LIGHTS) { 2631237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mScreenBrightness.curValue = brightness; 2632237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mScreenBrightness.animating = false; 2633dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood mScreenBrightness.targetValue = -1; 2634237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } 2635237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood if (ANIMATE_KEYBOARD_LIGHTS) { 2636237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mKeyboardBrightness.curValue = brightness; 2637237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mKeyboardBrightness.animating = false; 2638dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood mKeyboardBrightness.targetValue = -1; 2639237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } 2640237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood if (ANIMATE_BUTTON_LIGHTS) { 2641237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mButtonBrightness.curValue = brightness; 2642237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood mButtonBrightness.animating = false; 2643dd9668ec63887136b62642546d4b82ff21db17f8Mike Lockwood mButtonBrightness.targetValue = -1; 2644237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } 2645237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood } 2646237a29923a05663a2195bf93b392768dbaf31ebfMike Lockwood 2647b11832de735e95aac1a1b9e900dbbd8285cee3adMike Lockwood public void setAttentionLight(boolean on, int color) { 2648b11832de735e95aac1a1b9e900dbbd8285cee3adMike Lockwood mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 26493cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mAttentionLight.setFlashing(color, LightsService.LIGHT_FLASH_HARDWARE, (on ? 3 : 0), 0); 2650b11832de735e95aac1a1b9e900dbbd8285cee3adMike Lockwood } 2651b11832de735e95aac1a1b9e900dbbd8285cee3adMike Lockwood 2652bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood private void enableProximityLockLocked() { 2653ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mDebugProximitySensor) { 26548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "enableProximityLockLocked"); 265536fc302560fbc6dff3099860356d290d1653371cMike Lockwood } 2656ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (!mProximitySensorEnabled) { 2657ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood // clear calling identity so sensor manager battery stats are accurate 2658ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood long identity = Binder.clearCallingIdentity(); 2659ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood try { 2660ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood mSensorManager.registerListener(mProximityListener, mProximitySensor, 2661ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood SensorManager.SENSOR_DELAY_NORMAL); 2662ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood mProximitySensorEnabled = true; 2663ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } finally { 2664ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood Binder.restoreCallingIdentity(identity); 2665ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } 2666809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood } 2667bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 2668bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 2669bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood private void disableProximityLockLocked() { 2670ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mDebugProximitySensor) { 26718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "disableProximityLockLocked"); 267236fc302560fbc6dff3099860356d290d1653371cMike Lockwood } 2673ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mProximitySensorEnabled) { 2674ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood // clear calling identity so sensor manager battery stats are accurate 2675ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood long identity = Binder.clearCallingIdentity(); 2676ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood try { 2677ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood mSensorManager.unregisterListener(mProximityListener); 2678ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood mHandler.removeCallbacks(mProximityTask); 26790e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood if (mProximityPartialLock.isHeld()) { 26800e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood mProximityPartialLock.release(); 26810e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood } 2682ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood mProximitySensorEnabled = false; 2683ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } finally { 2684ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood Binder.restoreCallingIdentity(identity); 2685ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } 2686ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mProximitySensorActive) { 2687ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood mProximitySensorActive = false; 2688ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood forceUserActivityLocked(); 2689ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } 2690200b30bba53412919d2b5b4b85c02727b87f51dfMike Lockwood } 2691bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 2692bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 269320f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood private void proximityChangedLocked(boolean active) { 2694ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mDebugProximitySensor) { 26958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "proximityChangedLocked, active: " + active); 269620f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood } 2697ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (!mProximitySensorEnabled) { 26988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "Ignoring proximity change after sensor is disabled"); 26990d72f7e9fc0d6f774eda5758d111bec5608bcf42Mike Lockwood return; 27000d72f7e9fc0d6f774eda5758d111bec5608bcf42Mike Lockwood } 270120f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood if (active) { 2702435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood goToSleepLocked(SystemClock.uptimeMillis(), 2703435eb6464c1f326caf8179438a5401f358f0d7acMike Lockwood WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR); 270420f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood mProximitySensorActive = true; 270520f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood } else { 270620f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood // proximity sensor negative events trigger as user activity. 270720f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood // temporarily set mUserActivityAllowed to true so this will work 270820f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood // even when the keyguard is on. 270920f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood mProximitySensorActive = false; 271020f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood forceUserActivityLocked(); 2711ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood 2712ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mProximityWakeLockCount == 0) { 2713ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood // disable sensor if we have no listeners left after proximity negative 2714ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood disableProximityLockLocked(); 2715ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } 271620f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood } 271720f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood } 271820f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood 27198738e0c040061a179ad88adb997143f076277b04Mike Lockwood private void enableLightSensor(boolean enable) { 27208738e0c040061a179ad88adb997143f076277b04Mike Lockwood if (mDebugLightSensor) { 27218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "enableLightSensor " + enable); 27228738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 27238738e0c040061a179ad88adb997143f076277b04Mike Lockwood if (mSensorManager != null && mLightSensorEnabled != enable) { 27248738e0c040061a179ad88adb997143f076277b04Mike Lockwood mLightSensorEnabled = enable; 2725809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood // clear calling identity so sensor manager battery stats are accurate 2726809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood long identity = Binder.clearCallingIdentity(); 2727809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood try { 2728809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood if (enable) { 2729809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood mSensorManager.registerListener(mLightListener, mLightSensor, 2730809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood SensorManager.SENSOR_DELAY_NORMAL); 2731809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood } else { 2732809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood mSensorManager.unregisterListener(mLightListener); 2733809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood mHandler.removeCallbacks(mAutoBrightnessTask); 2734809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood } 2735809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood } finally { 2736809ad0fce357de0a55fbc57356a06f29a1021e3bMike Lockwood Binder.restoreCallingIdentity(identity); 273706952d9299c23ee15df0825e75934971cfecf2baMike Lockwood } 2738bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 2739bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood } 2740bc706a03a25f0dfe2cb0ecd1f6e4f7be905592a7Mike Lockwood 27418738e0c040061a179ad88adb997143f076277b04Mike Lockwood SensorEventListener mProximityListener = new SensorEventListener() { 27428738e0c040061a179ad88adb997143f076277b04Mike Lockwood public void onSensorChanged(SensorEvent event) { 2743ba8eb1efefdc98c016b64e10c26f9729697f254fMike Lockwood long milliseconds = SystemClock.elapsedRealtime(); 27448738e0c040061a179ad88adb997143f076277b04Mike Lockwood synchronized (mLocks) { 27458738e0c040061a179ad88adb997143f076277b04Mike Lockwood float distance = event.values[0]; 274620f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood long timeSinceLastEvent = milliseconds - mLastProximityEventTime; 274720f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood mLastProximityEventTime = milliseconds; 274820f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood mHandler.removeCallbacks(mProximityTask); 27490e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood boolean proximityTaskQueued = false; 275020f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood 27518738e0c040061a179ad88adb997143f076277b04Mike Lockwood // compare against getMaximumRange to support sensors that only return 0 or 1 275220f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood boolean active = (distance >= 0.0 && distance < PROXIMITY_THRESHOLD && 275320f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood distance < mProximitySensor.getMaximumRange()); 275420f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood 2755ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood if (mDebugProximitySensor) { 27568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "mProximityListener.onSensorChanged active: " + active); 2757ee2b094de0c5d7ffa64d51e7bd4ec3238be97113Mike Lockwood } 275820f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood if (timeSinceLastEvent < PROXIMITY_SENSOR_DELAY) { 275920f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood // enforce delaying atleast PROXIMITY_SENSOR_DELAY before processing 276020f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood mProximityPendingValue = (active ? 1 : 0); 276120f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood mHandler.postDelayed(mProximityTask, PROXIMITY_SENSOR_DELAY - timeSinceLastEvent); 27620e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood proximityTaskQueued = true; 27638738e0c040061a179ad88adb997143f076277b04Mike Lockwood } else { 276420f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood // process the value immediately 276520f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood mProximityPendingValue = -1; 276620f87d7aed6c926eadd8beea44968a8d13780021Mike Lockwood proximityChangedLocked(active); 27678738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 27680e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood 27690e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood // update mProximityPartialLock state 27700e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood boolean held = mProximityPartialLock.isHeld(); 27710e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood if (!held && proximityTaskQueued) { 27720e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood // hold wakelock until mProximityTask runs 27730e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood mProximityPartialLock.acquire(); 27740e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood } else if (held && !proximityTaskQueued) { 27750e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood mProximityPartialLock.release(); 27760e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood } 27778738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 27788738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 27798738e0c040061a179ad88adb997143f076277b04Mike Lockwood 27808738e0c040061a179ad88adb997143f076277b04Mike Lockwood public void onAccuracyChanged(Sensor sensor, int accuracy) { 27818738e0c040061a179ad88adb997143f076277b04Mike Lockwood // ignore 27828738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 27838738e0c040061a179ad88adb997143f076277b04Mike Lockwood }; 27848738e0c040061a179ad88adb997143f076277b04Mike Lockwood 27858738e0c040061a179ad88adb997143f076277b04Mike Lockwood SensorEventListener mLightListener = new SensorEventListener() { 27868738e0c040061a179ad88adb997143f076277b04Mike Lockwood public void onSensorChanged(SensorEvent event) { 27878738e0c040061a179ad88adb997143f076277b04Mike Lockwood synchronized (mLocks) { 2788497087e33d422d576d007f72fb970613d008f1cfMike Lockwood // ignore light sensor while screen is turning off 2789497087e33d422d576d007f72fb970613d008f1cfMike Lockwood if (isScreenTurningOffLocked()) { 2790497087e33d422d576d007f72fb970613d008f1cfMike Lockwood return; 2791497087e33d422d576d007f72fb970613d008f1cfMike Lockwood } 2792497087e33d422d576d007f72fb970613d008f1cfMike Lockwood 27938738e0c040061a179ad88adb997143f076277b04Mike Lockwood int value = (int)event.values[0]; 2794ba8eb1efefdc98c016b64e10c26f9729697f254fMike Lockwood long milliseconds = SystemClock.elapsedRealtime(); 27958738e0c040061a179ad88adb997143f076277b04Mike Lockwood if (mDebugLightSensor) { 27968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.d(TAG, "onSensorChanged: light value: " + value); 27978738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 2798d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood mHandler.removeCallbacks(mAutoBrightnessTask); 2799d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood if (mLightSensorValue != value) { 280020ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood if (mLightSensorValue == -1 || 280120ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood milliseconds < mLastScreenOnTime + mLightSensorWarmupTime) { 280220ee6f2dd30b8f0940b5f447ef2df340628e1876Mike Lockwood // process the value immediately if screen has just turned on 28036c97fcabbc4592a115afa5f3357b3172c4791855Mike Lockwood lightSensorChangedLocked(value); 28046c97fcabbc4592a115afa5f3357b3172c4791855Mike Lockwood } else { 28056c97fcabbc4592a115afa5f3357b3172c4791855Mike Lockwood // delay processing to debounce the sensor 28066c97fcabbc4592a115afa5f3357b3172c4791855Mike Lockwood mLightSensorPendingValue = value; 28076c97fcabbc4592a115afa5f3357b3172c4791855Mike Lockwood mHandler.postDelayed(mAutoBrightnessTask, LIGHT_SENSOR_DELAY); 28086c97fcabbc4592a115afa5f3357b3172c4791855Mike Lockwood } 2809d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } else { 2810d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood mLightSensorPendingValue = -1; 2811d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood } 28128738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 28138738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 28148738e0c040061a179ad88adb997143f076277b04Mike Lockwood 28158738e0c040061a179ad88adb997143f076277b04Mike Lockwood public void onAccuracyChanged(Sensor sensor, int accuracy) { 28168738e0c040061a179ad88adb997143f076277b04Mike Lockwood // ignore 28178738e0c040061a179ad88adb997143f076277b04Mike Lockwood } 28188738e0c040061a179ad88adb997143f076277b04Mike Lockwood }; 28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2820