diff options
Diffstat (limited to 'services/core/java/com/android/server/DeviceIdleController.java')
-rw-r--r-- | services/core/java/com/android/server/DeviceIdleController.java | 75 |
1 files changed, 57 insertions, 18 deletions
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 4aaf0b7b9b36..1fd4a0c384d3 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -613,6 +613,15 @@ public class DeviceIdleController extends SystemService } }; + /** AlarmListener to start monitoring motion if there are registered stationary listeners. */ + private final AlarmManager.OnAlarmListener mMotionRegistrationAlarmListener = () -> { + synchronized (DeviceIdleController.this) { + if (mStationaryListeners.size() > 0) { + startMonitoringMotionLocked(); + } + } + }; + private final AlarmManager.OnAlarmListener mMotionTimeoutAlarmListener = () -> { synchronized (DeviceIdleController.this) { if (!isStationaryLocked()) { @@ -748,6 +757,7 @@ public class DeviceIdleController extends SystemService @Override public void onTrigger(TriggerEvent event) { synchronized (DeviceIdleController.this) { + active = false; motionLocked(); } } @@ -755,6 +765,8 @@ public class DeviceIdleController extends SystemService @Override public void onSensorChanged(SensorEvent event) { synchronized (DeviceIdleController.this) { + mSensorManager.unregisterListener(this, mMotionSensor); + active = false; motionLocked(); } } @@ -1886,6 +1898,27 @@ public class DeviceIdleController extends SystemService return controller.new MyHandler(BackgroundThread.getHandler().getLooper()); } + Sensor getMotionSensor() { + final SensorManager sensorManager = getSensorManager(); + Sensor motionSensor = null; + int sigMotionSensorId = mContext.getResources().getInteger( + com.android.internal.R.integer.config_autoPowerModeAnyMotionSensor); + if (sigMotionSensorId > 0) { + motionSensor = sensorManager.getDefaultSensor(sigMotionSensorId, true); + } + if (motionSensor == null && mContext.getResources().getBoolean( + com.android.internal.R.bool.config_autoPowerModePreferWristTilt)) { + motionSensor = sensorManager.getDefaultSensor( + Sensor.TYPE_WRIST_TILT_GESTURE, true); + } + if (motionSensor == null) { + // As a last ditch, fall back to SMD. + motionSensor = sensorManager.getDefaultSensor( + Sensor.TYPE_SIGNIFICANT_MOTION, true); + } + return motionSensor; + } + PowerManager getPowerManager() { return mContext.getSystemService(PowerManager.class); } @@ -2037,21 +2070,7 @@ public class DeviceIdleController extends SystemService mSensorManager = mInjector.getSensorManager(); if (mUseMotionSensor) { - int sigMotionSensorId = getContext().getResources().getInteger( - com.android.internal.R.integer.config_autoPowerModeAnyMotionSensor); - if (sigMotionSensorId > 0) { - mMotionSensor = mSensorManager.getDefaultSensor(sigMotionSensorId, true); - } - if (mMotionSensor == null && getContext().getResources().getBoolean( - com.android.internal.R.bool.config_autoPowerModePreferWristTilt)) { - mMotionSensor = mSensorManager.getDefaultSensor( - Sensor.TYPE_WRIST_TILT_GESTURE, true); - } - if (mMotionSensor == null) { - // As a last ditch, fall back to SMD. - mMotionSensor = mSensorManager.getDefaultSensor( - Sensor.TYPE_SIGNIFICANT_MOTION, true); - } + mMotionSensor = mInjector.getMotionSensor(); } if (getContext().getResources().getBoolean( @@ -3422,6 +3441,10 @@ public class DeviceIdleController extends SystemService if (mStationaryListeners.size() > 0) { postStationaryStatusUpdated(); scheduleMotionTimeoutAlarmLocked(); + // We need to re-register the motion listener, but we don't want the sensors to be + // constantly active or to churn the CPU by registering too early, register after some + // delay. + scheduleMotionRegistrationAlarmLocked(); } if (mQuickDozeActivated && !mQuickDozeActivatedWhileIdling) { // Don't exit idle due to motion if quick doze is enabled. @@ -3488,9 +3511,12 @@ public class DeviceIdleController extends SystemService */ private void maybeStopMonitoringMotionLocked() { if (DEBUG) Slog.d(TAG, "maybeStopMonitoringMotionLocked()"); - if (mMotionSensor != null && mMotionListener.active && mStationaryListeners.size() == 0) { - mMotionListener.unregisterLocked(); - cancelMotionTimeoutAlarmLocked(); + if (mMotionSensor != null && mStationaryListeners.size() == 0) { + if (mMotionListener.active) { + mMotionListener.unregisterLocked(); + cancelMotionTimeoutAlarmLocked(); + } + cancelMotionRegistrationAlarmLocked(); } } @@ -3521,6 +3547,10 @@ public class DeviceIdleController extends SystemService mAlarmManager.cancel(mMotionTimeoutAlarmListener); } + private void cancelMotionRegistrationAlarmLocked() { + mAlarmManager.cancel(mMotionRegistrationAlarmListener); + } + void cancelSensingTimeoutAlarmLocked() { if (mNextSensingTimeoutAlarmTime != 0) { mNextSensingTimeoutAlarmTime = 0; @@ -3567,6 +3597,15 @@ public class DeviceIdleController extends SystemService mNextLightAlarmTime, "DeviceIdleController.light", mLightAlarmListener, mHandler); } + private void scheduleMotionRegistrationAlarmLocked() { + if (DEBUG) Slog.d(TAG, "scheduleMotionRegistrationAlarmLocked"); + long nextMotionRegistrationAlarmTime = + mInjector.getElapsedRealtime() + mConstants.MOTION_INACTIVE_TIMEOUT / 2; + mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextMotionRegistrationAlarmTime, + "DeviceIdleController.motion_registration", mMotionRegistrationAlarmListener, + mHandler); + } + private void scheduleMotionTimeoutAlarmLocked() { if (DEBUG) Slog.d(TAG, "scheduleMotionAlarmLocked"); long nextMotionTimeoutAlarmTime = |