Loading core/res/res/values/config.xml +6 −0 Original line number Diff line number Diff line Loading @@ -1542,4 +1542,10 @@ policy/src/com/android/internal/policy/impl/PhoneWindowManager.java --> <integer name="config_longPressOnMenuBehavior">3</integer> <!-- Default value for proximity check on screen wake NOTE ! - Enable for devices that have a fast response proximity sensor (ideally < 300ms) --> <bool name="config_proximityCheckOnWake">false</bool> <integer name="config_proximityCheckTimeout">250</integer> </resources> core/res/res/values/symbols.xml +6 −0 Original line number Diff line number Diff line Loading @@ -2023,4 +2023,10 @@ <!-- External media format --> <java-symbol type="string" name="extmedia_format_message_cm" /> <!-- Proximity check on screen on --> <java-symbol type="bool" name="config_proximityCheckOnWake" /> <!-- Proximity check timeout --> <java-symbol type="integer" name="config_proximityCheckTimeout" /> </resources> services/java/com/android/server/power/PowerManagerService.java +38 −10 Original line number Diff line number Diff line Loading @@ -179,8 +179,7 @@ public final class PowerManagerService extends IPowerManager.Stub // Max time (microseconds) to allow a CPU boost for private static final int MAX_CPU_BOOST_TIME = 5000000; // Max time allowed for proximity check private static final int MAX_PROXIMITY_WAIT = 200; private static final float PROXIMITY_NEAR_THRESHOLD = 5.0f; private Context mContext; private LightsService mLightsService; Loading Loading @@ -422,7 +421,11 @@ public final class PowerManagerService extends IPowerManager.Stub private PerformanceManager mPerformanceManager; private SensorManager mSensorManager; private Sensor mProximitySensor; private boolean mProximityWake; private boolean mProximityWakeEnabled; private int mProximityTimeOut; private boolean mProximityWakeSupported; android.os.PowerManager.WakeLock mProximityWakeLock; SensorEventListener mProximityListener; public PowerManagerService() { synchronized (mLock) { Loading Loading @@ -607,6 +610,15 @@ public final class PowerManagerService extends IPowerManager.Stub com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); mProximityTimeOut = resources.getInteger( com.android.internal.R.integer.config_proximityCheckTimeout); mProximityWakeSupported = resources.getBoolean( com.android.internal.R.bool.config_proximityCheckOnWake); if (mProximityWakeSupported) { PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mProximityWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ProximityWakeLock"); } } private void updateSettingsLocked() { Loading @@ -632,7 +644,7 @@ public final class PowerManagerService extends IPowerManager.Stub mWakeUpWhenPluggedOrUnpluggedSetting = Settings.Global.getInt(resolver, Settings.Global.WAKE_WHEN_PLUGGED_OR_UNPLUGGED, (mWakeUpWhenPluggedOrUnpluggedConfig ? 1 : 0)); mProximityWake = Settings.System.getInt(resolver, mProximityWakeEnabled = Settings.System.getInt(resolver, Settings.System.PROXIMITY_ON_WAKE, 0) == 1; final int oldScreenBrightnessSetting = mScreenBrightnessSetting; Loading Loading @@ -1219,31 +1231,44 @@ public final class PowerManagerService extends IPowerManager.Stub // There is already a message queued; return; } if (mProximityWake && mProximitySensor != null) { if (mProximityWakeSupported && mProximityWakeEnabled && mProximitySensor != null) { Message msg = mHandler.obtainMessage(MSG_WAKE_UP); msg.obj = r; mHandler.sendMessageDelayed(msg, MAX_PROXIMITY_WAIT); mHandler.sendMessageDelayed(msg, mProximityTimeOut); runPostProximityCheck(r); } else { r.run(); } } private void cleanupProximity() { if (mProximityWakeLock.isHeld()) { mProximityWakeLock.release(); } if (mProximityListener != null) { mSensorManager.unregisterListener(mProximityListener); mProximityListener = null; } } private void runPostProximityCheck(final Runnable r) { if (mSensorManager == null) { r.run(); return; } mSensorManager.registerListener(new SensorEventListener() { mProximityWakeLock.acquire(); mProximityListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { mSensorManager.unregisterListener(this); cleanupProximity(); if (!mHandler.hasMessages(MSG_WAKE_UP)) { Slog.w(TAG, "The proximity sensor took too long, wake event already triggered!"); return; } mHandler.removeMessages(MSG_WAKE_UP); if (event.values[0] == mProximitySensor.getMaximumRange()) { float distance = event.values[0]; if (distance >= PROXIMITY_NEAR_THRESHOLD || distance >= mProximitySensor.getMaximumRange()) { r.run(); } } Loading @@ -1251,7 +1276,9 @@ public final class PowerManagerService extends IPowerManager.Stub @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} }, mProximitySensor, SensorManager.SENSOR_DELAY_FASTEST); }; mSensorManager.registerListener(mProximityListener, mProximitySensor, SensorManager.SENSOR_DELAY_FASTEST); } @Override // Binder call Loading Loading @@ -2901,6 +2928,7 @@ public final class PowerManagerService extends IPowerManager.Stub checkIfBootAnimationFinished(); break; case MSG_WAKE_UP: cleanupProximity(); ((Runnable) msg.obj).run(); break; } Loading Loading
core/res/res/values/config.xml +6 −0 Original line number Diff line number Diff line Loading @@ -1542,4 +1542,10 @@ policy/src/com/android/internal/policy/impl/PhoneWindowManager.java --> <integer name="config_longPressOnMenuBehavior">3</integer> <!-- Default value for proximity check on screen wake NOTE ! - Enable for devices that have a fast response proximity sensor (ideally < 300ms) --> <bool name="config_proximityCheckOnWake">false</bool> <integer name="config_proximityCheckTimeout">250</integer> </resources>
core/res/res/values/symbols.xml +6 −0 Original line number Diff line number Diff line Loading @@ -2023,4 +2023,10 @@ <!-- External media format --> <java-symbol type="string" name="extmedia_format_message_cm" /> <!-- Proximity check on screen on --> <java-symbol type="bool" name="config_proximityCheckOnWake" /> <!-- Proximity check timeout --> <java-symbol type="integer" name="config_proximityCheckTimeout" /> </resources>
services/java/com/android/server/power/PowerManagerService.java +38 −10 Original line number Diff line number Diff line Loading @@ -179,8 +179,7 @@ public final class PowerManagerService extends IPowerManager.Stub // Max time (microseconds) to allow a CPU boost for private static final int MAX_CPU_BOOST_TIME = 5000000; // Max time allowed for proximity check private static final int MAX_PROXIMITY_WAIT = 200; private static final float PROXIMITY_NEAR_THRESHOLD = 5.0f; private Context mContext; private LightsService mLightsService; Loading Loading @@ -422,7 +421,11 @@ public final class PowerManagerService extends IPowerManager.Stub private PerformanceManager mPerformanceManager; private SensorManager mSensorManager; private Sensor mProximitySensor; private boolean mProximityWake; private boolean mProximityWakeEnabled; private int mProximityTimeOut; private boolean mProximityWakeSupported; android.os.PowerManager.WakeLock mProximityWakeLock; SensorEventListener mProximityListener; public PowerManagerService() { synchronized (mLock) { Loading Loading @@ -607,6 +610,15 @@ public final class PowerManagerService extends IPowerManager.Stub com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); mProximityTimeOut = resources.getInteger( com.android.internal.R.integer.config_proximityCheckTimeout); mProximityWakeSupported = resources.getBoolean( com.android.internal.R.bool.config_proximityCheckOnWake); if (mProximityWakeSupported) { PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mProximityWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ProximityWakeLock"); } } private void updateSettingsLocked() { Loading @@ -632,7 +644,7 @@ public final class PowerManagerService extends IPowerManager.Stub mWakeUpWhenPluggedOrUnpluggedSetting = Settings.Global.getInt(resolver, Settings.Global.WAKE_WHEN_PLUGGED_OR_UNPLUGGED, (mWakeUpWhenPluggedOrUnpluggedConfig ? 1 : 0)); mProximityWake = Settings.System.getInt(resolver, mProximityWakeEnabled = Settings.System.getInt(resolver, Settings.System.PROXIMITY_ON_WAKE, 0) == 1; final int oldScreenBrightnessSetting = mScreenBrightnessSetting; Loading Loading @@ -1219,31 +1231,44 @@ public final class PowerManagerService extends IPowerManager.Stub // There is already a message queued; return; } if (mProximityWake && mProximitySensor != null) { if (mProximityWakeSupported && mProximityWakeEnabled && mProximitySensor != null) { Message msg = mHandler.obtainMessage(MSG_WAKE_UP); msg.obj = r; mHandler.sendMessageDelayed(msg, MAX_PROXIMITY_WAIT); mHandler.sendMessageDelayed(msg, mProximityTimeOut); runPostProximityCheck(r); } else { r.run(); } } private void cleanupProximity() { if (mProximityWakeLock.isHeld()) { mProximityWakeLock.release(); } if (mProximityListener != null) { mSensorManager.unregisterListener(mProximityListener); mProximityListener = null; } } private void runPostProximityCheck(final Runnable r) { if (mSensorManager == null) { r.run(); return; } mSensorManager.registerListener(new SensorEventListener() { mProximityWakeLock.acquire(); mProximityListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { mSensorManager.unregisterListener(this); cleanupProximity(); if (!mHandler.hasMessages(MSG_WAKE_UP)) { Slog.w(TAG, "The proximity sensor took too long, wake event already triggered!"); return; } mHandler.removeMessages(MSG_WAKE_UP); if (event.values[0] == mProximitySensor.getMaximumRange()) { float distance = event.values[0]; if (distance >= PROXIMITY_NEAR_THRESHOLD || distance >= mProximitySensor.getMaximumRange()) { r.run(); } } Loading @@ -1251,7 +1276,9 @@ public final class PowerManagerService extends IPowerManager.Stub @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} }, mProximitySensor, SensorManager.SENSOR_DELAY_FASTEST); }; mSensorManager.registerListener(mProximityListener, mProximitySensor, SensorManager.SENSOR_DELAY_FASTEST); } @Override // Binder call Loading Loading @@ -2901,6 +2928,7 @@ public final class PowerManagerService extends IPowerManager.Stub checkIfBootAnimationFinished(); break; case MSG_WAKE_UP: cleanupProximity(); ((Runnable) msg.obj).run(); break; } Loading