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