Loading services/java/com/android/server/PowerManagerService.java +88 −46 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ class PowerManagerService extends IPowerManager.Stub private Sensor mLightSensor; private boolean mLightSensorEnabled; private float mLightSensorValue = -1; private boolean mProxIgnoredBecauseScreenTurnedOff = false; private int mHighestLightSensorValue = -1; private float mLightSensorPendingValue = -1; private int mLightSensorScreenBrightness = -1; Loading Loading @@ -252,7 +253,7 @@ class PowerManagerService extends IPowerManager.Stub // could be either static or controllable at runtime private static final boolean mSpew = false; private static final boolean mDebugProximitySensor = (true || mSpew); private static final boolean mDebugProximitySensor = (false || mSpew); private static final boolean mDebugLightSensor = (false || mSpew); private native void nativeInit(); Loading Loading @@ -638,7 +639,8 @@ class PowerManagerService extends IPowerManager.Stub int n = flags & LOCK_MASK; return n == PowerManager.FULL_WAKE_LOCK || n == PowerManager.SCREEN_BRIGHT_WAKE_LOCK || n == PowerManager.SCREEN_DIM_WAKE_LOCK; || n == PowerManager.SCREEN_DIM_WAKE_LOCK || n == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK; } void enforceWakeSourcePermission(int uid, int pid) { Loading Loading @@ -778,6 +780,12 @@ class PowerManagerService extends IPowerManager.Stub // set it to whatever they want. otherwise, we modulate that // by the current state so we never turn it more on than // it already is. if ((flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { mProximityWakeLockCount++; if (mProximityWakeLockCount == 1) { enableProximityLockLocked(); } } else { if ((wl.flags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) { int oldWakeLockState = mWakeLockState; mWakeLockState = mLocks.reactivateScreenLocksLocked(); Loading @@ -785,7 +793,8 @@ class PowerManagerService extends IPowerManager.Stub Slog.d(TAG, "wakeup here mUserState=0x" + Integer.toHexString(mUserState) + " mWakeLockState=0x" + Integer.toHexString(mWakeLockState) + " previous wakeLockState=0x" + Integer.toHexString(oldWakeLockState)); + " previous wakeLockState=0x" + Integer.toHexString(oldWakeLockState)); } } else { if (mSpew) { Loading @@ -798,6 +807,7 @@ class PowerManagerService extends IPowerManager.Stub } setPowerState(mWakeLockState | mUserState); } } else if ((flags & LOCK_MASK) == PowerManager.PARTIAL_WAKE_LOCK) { if (newlock) { mPartialCount++; Loading @@ -806,11 +816,6 @@ class PowerManagerService extends IPowerManager.Stub } } Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,PARTIAL_NAME); } else if ((flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { mProximityWakeLockCount++; if (mProximityWakeLockCount == 1) { enableProximityLockLocked(); } } if (diffsource) { Loading Loading @@ -868,6 +873,20 @@ class PowerManagerService extends IPowerManager.Stub } if (isScreenLock(wl.flags)) { if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { mProximityWakeLockCount--; if (mProximityWakeLockCount == 0) { if (mProximitySensorActive && ((flags & PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE) != 0)) { // wait for proximity sensor to go negative before disabling sensor if (mDebugProximitySensor) { Slog.d(TAG, "waiting for proximity sensor to go negative"); } } else { disableProximityLockLocked(); } } } else { mWakeLockState = mLocks.gatherState(); // goes in the middle to reduce flicker if ((wl.flags & PowerManager.ON_AFTER_RELEASE) != 0) { Loading @@ -875,25 +894,13 @@ class PowerManagerService extends IPowerManager.Stub } setPowerState(mWakeLockState | mUserState); } } else if ((wl.flags & LOCK_MASK) == PowerManager.PARTIAL_WAKE_LOCK) { mPartialCount--; if (mPartialCount == 0) { if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 0, wl.tag); Power.releaseWakeLock(PARTIAL_NAME); } } else if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { mProximityWakeLockCount--; if (mProximityWakeLockCount == 0) { if (mProximitySensorActive && ((flags & PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE) != 0)) { // wait for proximity sensor to go negative before disabling sensor if (mDebugProximitySensor) { Slog.d(TAG, "waiting for proximity sensor to go negative"); } } else { disableProximityLockLocked(); } } } // Unlink the lock from the binder. wl.binder.unlinkToDeath(wl, 0); Loading Loading @@ -2433,13 +2440,25 @@ class PowerManagerService extends IPowerManager.Stub mWakeLockState = SCREEN_OFF; int N = mLocks.size(); int numCleared = 0; boolean proxLock = false; for (int i=0; i<N; i++) { WakeLock wl = mLocks.get(i); if (isScreenLock(wl.flags)) { if (((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) && reason == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR) { proxLock = true; } else { mLocks.get(i).activated = false; numCleared++; } } } if (!proxLock) { mProxIgnoredBecauseScreenTurnedOff = true; if (mDebugProximitySensor) { Slog.d(TAG, "setting mProxIgnoredBecauseScreenTurnedOff"); } } EventLog.writeEvent(EventLogTags.POWER_SLEEP_REQUESTED, numCleared); mStillNeedSleepNotification = true; mUserState = SCREEN_OFF; Loading Loading @@ -2629,6 +2648,11 @@ class PowerManagerService extends IPowerManager.Stub result |= wl.minState; } } if (mDebugProximitySensor) { Slog.d(TAG, "reactivateScreenLocksLocked mProxIgnoredBecauseScreenTurnedOff=" + mProxIgnoredBecauseScreenTurnedOff); } mProxIgnoredBecauseScreenTurnedOff = false; return result; } } Loading Loading @@ -2788,10 +2812,16 @@ class PowerManagerService extends IPowerManager.Stub } if (mProximitySensorActive) { mProximitySensorActive = false; if (mDebugProximitySensor) { Slog.d(TAG, "disableProximityLockLocked mProxIgnoredBecauseScreenTurnedOff=" + mProxIgnoredBecauseScreenTurnedOff); } if (!mProxIgnoredBecauseScreenTurnedOff) { forceUserActivityLocked(); } } } } private void proximityChangedLocked(boolean active) { if (mDebugProximitySensor) { Loading @@ -2802,15 +2832,27 @@ class PowerManagerService extends IPowerManager.Stub return; } if (active) { if (mDebugProximitySensor) { Slog.d(TAG, "b mProxIgnoredBecauseScreenTurnedOff=" + mProxIgnoredBecauseScreenTurnedOff); } if (!mProxIgnoredBecauseScreenTurnedOff) { goToSleepLocked(SystemClock.uptimeMillis(), WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR); } mProximitySensorActive = true; } else { // proximity sensor negative events trigger as user activity. // temporarily set mUserActivityAllowed to true so this will work // even when the keyguard is on. mProximitySensorActive = false; if (mDebugProximitySensor) { Slog.d(TAG, "b mProxIgnoredBecauseScreenTurnedOff=" + mProxIgnoredBecauseScreenTurnedOff); } if (!mProxIgnoredBecauseScreenTurnedOff) { forceUserActivityLocked(); } if (mProximityWakeLockCount == 0) { // disable sensor if we have no listeners left after proximity negative Loading tests/StatusBar/src/com/android/statusbartest/PowerTest.java +20 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ public class PowerTest extends TestActivity int mPokeState = 0; IBinder mPokeToken = new Binder(); Handler mHandler = new Handler(); PowerManager mPm; PowerManager.WakeLock mProx; @Override protected String tag() { Loading @@ -58,10 +60,27 @@ public class PowerTest extends TestActivity @Override protected Test[] tests() { mPowerManager = IPowerManager.Stub.asInterface(ServiceManager.getService("power")); mPm = (PowerManager)getSystemService("power"); mProx = mPm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "PowerTest-prox"); return mTests; } private Test[] mTests = new Test[] { new Test("Enable proximity") { public void run() { mProx.acquire(); } }, new Test("Disable proximity") { public void run() { mProx.release(); } }, new Test("Disable proximity (WAIT_FOR_PROXIMITY_NEGATIVE)") { public void run() { mProx.release(PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE); } }, new Test("Cheek events don't poke") { public void run() { mPokeState |= LocalPowerManager.POKE_LOCK_IGNORE_CHEEK_EVENTS; Loading @@ -72,6 +91,7 @@ public class PowerTest extends TestActivity } } }, new Test("Cheek events poke") { public void run() { mPokeState &= ~LocalPowerManager.POKE_LOCK_IGNORE_CHEEK_EVENTS; Loading Loading
services/java/com/android/server/PowerManagerService.java +88 −46 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ class PowerManagerService extends IPowerManager.Stub private Sensor mLightSensor; private boolean mLightSensorEnabled; private float mLightSensorValue = -1; private boolean mProxIgnoredBecauseScreenTurnedOff = false; private int mHighestLightSensorValue = -1; private float mLightSensorPendingValue = -1; private int mLightSensorScreenBrightness = -1; Loading Loading @@ -252,7 +253,7 @@ class PowerManagerService extends IPowerManager.Stub // could be either static or controllable at runtime private static final boolean mSpew = false; private static final boolean mDebugProximitySensor = (true || mSpew); private static final boolean mDebugProximitySensor = (false || mSpew); private static final boolean mDebugLightSensor = (false || mSpew); private native void nativeInit(); Loading Loading @@ -638,7 +639,8 @@ class PowerManagerService extends IPowerManager.Stub int n = flags & LOCK_MASK; return n == PowerManager.FULL_WAKE_LOCK || n == PowerManager.SCREEN_BRIGHT_WAKE_LOCK || n == PowerManager.SCREEN_DIM_WAKE_LOCK; || n == PowerManager.SCREEN_DIM_WAKE_LOCK || n == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK; } void enforceWakeSourcePermission(int uid, int pid) { Loading Loading @@ -778,6 +780,12 @@ class PowerManagerService extends IPowerManager.Stub // set it to whatever they want. otherwise, we modulate that // by the current state so we never turn it more on than // it already is. if ((flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { mProximityWakeLockCount++; if (mProximityWakeLockCount == 1) { enableProximityLockLocked(); } } else { if ((wl.flags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) { int oldWakeLockState = mWakeLockState; mWakeLockState = mLocks.reactivateScreenLocksLocked(); Loading @@ -785,7 +793,8 @@ class PowerManagerService extends IPowerManager.Stub Slog.d(TAG, "wakeup here mUserState=0x" + Integer.toHexString(mUserState) + " mWakeLockState=0x" + Integer.toHexString(mWakeLockState) + " previous wakeLockState=0x" + Integer.toHexString(oldWakeLockState)); + " previous wakeLockState=0x" + Integer.toHexString(oldWakeLockState)); } } else { if (mSpew) { Loading @@ -798,6 +807,7 @@ class PowerManagerService extends IPowerManager.Stub } setPowerState(mWakeLockState | mUserState); } } else if ((flags & LOCK_MASK) == PowerManager.PARTIAL_WAKE_LOCK) { if (newlock) { mPartialCount++; Loading @@ -806,11 +816,6 @@ class PowerManagerService extends IPowerManager.Stub } } Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,PARTIAL_NAME); } else if ((flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { mProximityWakeLockCount++; if (mProximityWakeLockCount == 1) { enableProximityLockLocked(); } } if (diffsource) { Loading Loading @@ -868,6 +873,20 @@ class PowerManagerService extends IPowerManager.Stub } if (isScreenLock(wl.flags)) { if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { mProximityWakeLockCount--; if (mProximityWakeLockCount == 0) { if (mProximitySensorActive && ((flags & PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE) != 0)) { // wait for proximity sensor to go negative before disabling sensor if (mDebugProximitySensor) { Slog.d(TAG, "waiting for proximity sensor to go negative"); } } else { disableProximityLockLocked(); } } } else { mWakeLockState = mLocks.gatherState(); // goes in the middle to reduce flicker if ((wl.flags & PowerManager.ON_AFTER_RELEASE) != 0) { Loading @@ -875,25 +894,13 @@ class PowerManagerService extends IPowerManager.Stub } setPowerState(mWakeLockState | mUserState); } } else if ((wl.flags & LOCK_MASK) == PowerManager.PARTIAL_WAKE_LOCK) { mPartialCount--; if (mPartialCount == 0) { if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 0, wl.tag); Power.releaseWakeLock(PARTIAL_NAME); } } else if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) { mProximityWakeLockCount--; if (mProximityWakeLockCount == 0) { if (mProximitySensorActive && ((flags & PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE) != 0)) { // wait for proximity sensor to go negative before disabling sensor if (mDebugProximitySensor) { Slog.d(TAG, "waiting for proximity sensor to go negative"); } } else { disableProximityLockLocked(); } } } // Unlink the lock from the binder. wl.binder.unlinkToDeath(wl, 0); Loading Loading @@ -2433,13 +2440,25 @@ class PowerManagerService extends IPowerManager.Stub mWakeLockState = SCREEN_OFF; int N = mLocks.size(); int numCleared = 0; boolean proxLock = false; for (int i=0; i<N; i++) { WakeLock wl = mLocks.get(i); if (isScreenLock(wl.flags)) { if (((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) && reason == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR) { proxLock = true; } else { mLocks.get(i).activated = false; numCleared++; } } } if (!proxLock) { mProxIgnoredBecauseScreenTurnedOff = true; if (mDebugProximitySensor) { Slog.d(TAG, "setting mProxIgnoredBecauseScreenTurnedOff"); } } EventLog.writeEvent(EventLogTags.POWER_SLEEP_REQUESTED, numCleared); mStillNeedSleepNotification = true; mUserState = SCREEN_OFF; Loading Loading @@ -2629,6 +2648,11 @@ class PowerManagerService extends IPowerManager.Stub result |= wl.minState; } } if (mDebugProximitySensor) { Slog.d(TAG, "reactivateScreenLocksLocked mProxIgnoredBecauseScreenTurnedOff=" + mProxIgnoredBecauseScreenTurnedOff); } mProxIgnoredBecauseScreenTurnedOff = false; return result; } } Loading Loading @@ -2788,10 +2812,16 @@ class PowerManagerService extends IPowerManager.Stub } if (mProximitySensorActive) { mProximitySensorActive = false; if (mDebugProximitySensor) { Slog.d(TAG, "disableProximityLockLocked mProxIgnoredBecauseScreenTurnedOff=" + mProxIgnoredBecauseScreenTurnedOff); } if (!mProxIgnoredBecauseScreenTurnedOff) { forceUserActivityLocked(); } } } } private void proximityChangedLocked(boolean active) { if (mDebugProximitySensor) { Loading @@ -2802,15 +2832,27 @@ class PowerManagerService extends IPowerManager.Stub return; } if (active) { if (mDebugProximitySensor) { Slog.d(TAG, "b mProxIgnoredBecauseScreenTurnedOff=" + mProxIgnoredBecauseScreenTurnedOff); } if (!mProxIgnoredBecauseScreenTurnedOff) { goToSleepLocked(SystemClock.uptimeMillis(), WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR); } mProximitySensorActive = true; } else { // proximity sensor negative events trigger as user activity. // temporarily set mUserActivityAllowed to true so this will work // even when the keyguard is on. mProximitySensorActive = false; if (mDebugProximitySensor) { Slog.d(TAG, "b mProxIgnoredBecauseScreenTurnedOff=" + mProxIgnoredBecauseScreenTurnedOff); } if (!mProxIgnoredBecauseScreenTurnedOff) { forceUserActivityLocked(); } if (mProximityWakeLockCount == 0) { // disable sensor if we have no listeners left after proximity negative Loading
tests/StatusBar/src/com/android/statusbartest/PowerTest.java +20 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ public class PowerTest extends TestActivity int mPokeState = 0; IBinder mPokeToken = new Binder(); Handler mHandler = new Handler(); PowerManager mPm; PowerManager.WakeLock mProx; @Override protected String tag() { Loading @@ -58,10 +60,27 @@ public class PowerTest extends TestActivity @Override protected Test[] tests() { mPowerManager = IPowerManager.Stub.asInterface(ServiceManager.getService("power")); mPm = (PowerManager)getSystemService("power"); mProx = mPm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "PowerTest-prox"); return mTests; } private Test[] mTests = new Test[] { new Test("Enable proximity") { public void run() { mProx.acquire(); } }, new Test("Disable proximity") { public void run() { mProx.release(); } }, new Test("Disable proximity (WAIT_FOR_PROXIMITY_NEGATIVE)") { public void run() { mProx.release(PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE); } }, new Test("Cheek events don't poke") { public void run() { mPokeState |= LocalPowerManager.POKE_LOCK_IGNORE_CHEEK_EVENTS; Loading @@ -72,6 +91,7 @@ public class PowerTest extends TestActivity } } }, new Test("Cheek events poke") { public void run() { mPokeState &= ~LocalPowerManager.POKE_LOCK_IGNORE_CHEEK_EVENTS; Loading