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
This commit is contained in:
Kenny Guy
2017-11-29 12:12:06 +00:00
parent c20270b5b2
commit 689ab8fa03
2 changed files with 43 additions and 7 deletions

View File

@@ -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();
}
}
}

View File

@@ -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;
}
}
}