From 689ab8fa03462f183c33439dd83fadbd989d48ea Mon Sep 17 00:00:00 2001 From: Kenny Guy Date: Wed, 29 Nov 2017 12:12:06 +0000 Subject: [PATCH] Don't keep sensor listener while screen is off. Register / unregister on screen off / on intents. Bug: 69564178 Test: runtest -c com.android.server.display.BrightnessTrackerTest frameworks-service Test: manual, turn on/off screen and check adb shell dumpsys sensorservice Change-Id: I7bfb6b35108887baf40d9134d16d13a9f5aa839f --- .../server/display/BrightnessTracker.java | 21 ++++++++++++-- .../server/display/BrightnessTrackerTest.java | 29 ++++++++++++++++--- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java index 90888f0a528d8..2c6fe94846625 100644 --- a/services/core/java/com/android/server/display/BrightnessTracker.java +++ b/services/core/java/com/android/server/display/BrightnessTracker.java @@ -34,6 +34,7 @@ import android.net.Uri; import android.os.BatteryManager; import android.os.Environment; import android.os.Handler; +import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; @@ -162,7 +163,10 @@ public class BrightnessTracker { UserHandle.USER_CURRENT); mSensorListener = new SensorListener(); - mInjector.registerSensorListener(mContext, mSensorListener); + + if (mInjector.isInteractive(mContext)) { + mInjector.registerSensorListener(mContext, mSensorListener, mBgHandler); + } mSettingsObserver = new SettingsObserver(mBgHandler); mInjector.registerBrightnessObserver(mContentResolver, mSettingsObserver); @@ -170,6 +174,8 @@ public class BrightnessTracker { final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_SHUTDOWN); intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); + intentFilter.addAction(Intent.ACTION_SCREEN_ON); + intentFilter.addAction(Intent.ACTION_SCREEN_OFF); mBroadcastReceiver = new Receiver(); mInjector.registerReceiver(mContext, mBroadcastReceiver, intentFilter); @@ -584,6 +590,11 @@ public class BrightnessTracker { if (level != -1 && scale != 0) { batteryLevelChanged(level, scale); } + } else if (Intent.ACTION_SCREEN_OFF.equals(action)) { + mInjector.unregisterSensorListener(mContext, mSensorListener); + } else if (Intent.ACTION_SCREEN_ON.equals(action)) { + mInjector.registerSensorListener(mContext, mSensorListener, + mInjector.getBackgroundHandler()); } } } @@ -591,11 +602,11 @@ public class BrightnessTracker { @VisibleForTesting static class Injector { public void registerSensorListener(Context context, - SensorEventListener sensorListener) { + SensorEventListener sensorListener, Handler handler) { SensorManager sensorManager = context.getSystemService(SensorManager.class); Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); sensorManager.registerListener(sensorListener, - lightSensor, SensorManager.SENSOR_DELAY_NORMAL); + lightSensor, SensorManager.SENSOR_DELAY_NORMAL, handler); } public void unregisterSensorListener(Context context, SensorEventListener sensorListener) { @@ -675,5 +686,9 @@ public class BrightnessTracker { public void cancelIdleJob(Context context) { BrightnessIdleJob.cancelJob(context); } + + public boolean isInteractive(Context context) { + return context.getSystemService(PowerManager.class).isInteractive(); + } } } diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java index 6938e0f681cde..6a1d26862715b 100644 --- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java @@ -94,12 +94,29 @@ public class BrightnessTrackerTest { } @Test - public void testStartStopTracker() { + public void testStartStopTrackerScreenOnOff() { + mInjector.mInteractive = false; startTracker(mTracker); - assertNotNull(mInjector.mSensorListener); + assertNull(mInjector.mSensorListener); assertNotNull(mInjector.mSettingsObserver); assertNotNull(mInjector.mBroadcastReceiver); assertTrue(mInjector.mIdleScheduled); + Intent onIntent = new Intent(); + onIntent.setAction(Intent.ACTION_SCREEN_ON); + mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(), + onIntent); + assertNotNull(mInjector.mSensorListener); + + Intent offIntent = new Intent(); + offIntent.setAction(Intent.ACTION_SCREEN_OFF); + mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(), + offIntent); + assertNull(mInjector.mSensorListener); + + mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(), + onIntent); + assertNotNull(mInjector.mSensorListener); + mTracker.stop(); assertNull(mInjector.mSensorListener); assertNull(mInjector.mSettingsObserver); @@ -532,7 +549,6 @@ public class BrightnessTrackerTest { mInjector.waitForHandler(); } - private static final class Idle implements MessageQueue.IdleHandler { private boolean mIdle; @@ -565,6 +581,7 @@ public class BrightnessTrackerTest { long mElapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos(); Handler mHandler; boolean mIdleScheduled; + boolean mInteractive = true; public TestInjector(Handler handler) { mHandler = handler; @@ -577,7 +594,7 @@ public class BrightnessTrackerTest { @Override public void registerSensorListener(Context context, - SensorEventListener sensorListener) { + SensorEventListener sensorListener, Handler handler) { mSensorListener = sensorListener; } @@ -694,5 +711,9 @@ public class BrightnessTrackerTest { public void cancelIdleJob(Context context) { mIdleScheduled = false; } + + public boolean isInteractive(Context context) { + return mInteractive; + } } }