Merge "Unregister lux sensor when not in adaptive mode." into pi-dev

This commit is contained in:
TreeHugger Robot
2018-03-21 22:38:41 +00:00
committed by Android (Google) Code Review
2 changed files with 163 additions and 27 deletions

View File

@@ -25,12 +25,14 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ParceledListSlice;
import android.database.ContentObserver;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.display.AmbientBrightnessDayStats;
import android.hardware.display.BrightnessChangeEvent;
import android.net.Uri;
import android.os.BatteryManager;
import android.os.Environment;
import android.os.Handler;
@@ -110,6 +112,8 @@ public class BrightnessTracker {
private static final int MSG_BACKGROUND_START = 0;
private static final int MSG_BRIGHTNESS_CHANGED = 1;
private static final int MSG_STOP_SENSOR_LISTENER = 2;
private static final int MSG_START_SENSOR_LISTENER = 3;
// Lock held while accessing mEvents, is held while writing events to flash.
private final Object mEventsLock = new Object();
@@ -127,9 +131,14 @@ public class BrightnessTracker {
private final Context mContext;
private final ContentResolver mContentResolver;
private Handler mBgHandler;
// mBroadcastReceiver and mSensorListener should only be used on the mBgHandler thread.
// mBroadcastReceiver, mSensorListener, mSettingsObserver and mSensorRegistered
// should only be used on the mBgHandler thread.
private BroadcastReceiver mBroadcastReceiver;
private SensorListener mSensorListener;
private SettingsObserver mSettingsObserver;
private boolean mSensorRegistered;
private @UserIdInt int mCurrentUserId = UserHandle.USER_NULL;
// Lock held while collecting data related to brightness changes.
@@ -178,10 +187,9 @@ public class BrightnessTracker {
mSensorListener = new SensorListener();
if (mInjector.isInteractive(mContext)) {
mInjector.registerSensorListener(mContext, mSensorListener, mBgHandler);
}
mSettingsObserver = new SettingsObserver(mBgHandler);
mInjector.registerBrightnessModeObserver(mContentResolver, mSettingsObserver);
startSensorListener();
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SHUTDOWN);
@@ -205,10 +213,11 @@ public class BrightnessTracker {
Slog.d(TAG, "Stop");
}
mBgHandler.removeMessages(MSG_BACKGROUND_START);
stopSensorListener();
mInjector.unregisterSensorListener(mContext, mSensorListener);
mInjector.unregisterBrightnessModeObserver(mContext, mSettingsObserver);
mInjector.unregisterReceiver(mContext, mBroadcastReceiver);
mInjector.cancelIdleJob(mContext);
mAmbientBrightnessStatsTracker.stop();
synchronized (mDataCollectionLock) {
mStarted = false;
@@ -366,6 +375,25 @@ public class BrightnessTracker {
}
}
private void startSensorListener() {
if (!mSensorRegistered
&& mInjector.isInteractive(mContext)
&& mInjector.isBrightnessModeAutomatic(mContentResolver)) {
mAmbientBrightnessStatsTracker.start();
mSensorRegistered = true;
mInjector.registerSensorListener(mContext, mSensorListener,
mInjector.getBackgroundHandler());
}
}
private void stopSensorListener() {
if (mSensorRegistered) {
mAmbientBrightnessStatsTracker.stop();
mInjector.unregisterSensorListener(mContext, mSensorListener);
mSensorRegistered = false;
}
}
private void scheduleWriteBrightnessTrackerState() {
if (!mWriteBrightnessTrackerStateScheduled) {
mBgHandler.post(() -> {
@@ -724,6 +752,24 @@ public class BrightnessTracker {
}
}
private final class SettingsObserver extends ContentObserver {
public SettingsObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
if (DEBUG) {
Slog.v(TAG, "settings change " + uri);
}
if (mInjector.isBrightnessModeAutomatic(mContentResolver)) {
mBgHandler.obtainMessage(MSG_START_SENSOR_LISTENER).sendToTarget();
} else {
mBgHandler.obtainMessage(MSG_STOP_SENSOR_LISTENER).sendToTarget();
}
}
}
private final class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@@ -741,12 +787,9 @@ public class BrightnessTracker {
batteryLevelChanged(level, scale);
}
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
mAmbientBrightnessStatsTracker.stop();
mInjector.unregisterSensorListener(mContext, mSensorListener);
mBgHandler.obtainMessage(MSG_STOP_SENSOR_LISTENER).sendToTarget();
} else if (Intent.ACTION_SCREEN_ON.equals(action)) {
mAmbientBrightnessStatsTracker.start();
mInjector.registerSensorListener(mContext, mSensorListener,
mInjector.getBackgroundHandler());
mBgHandler.obtainMessage(MSG_START_SENSOR_LISTENER).sendToTarget();
}
}
}
@@ -767,6 +810,12 @@ public class BrightnessTracker {
values.powerBrightnessFactor, values.isUserSetBrightness,
values.isDefaultBrightnessConfig);
break;
case MSG_START_SENSOR_LISTENER:
startSensorListener();
break;
case MSG_STOP_SENSOR_LISTENER:
stopSensorListener();
break;
}
}
}
@@ -801,6 +850,18 @@ public class BrightnessTracker {
sensorManager.unregisterListener(sensorListener);
}
public void registerBrightnessModeObserver(ContentResolver resolver,
ContentObserver settingsObserver) {
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.SCREEN_BRIGHTNESS_MODE),
false, settingsObserver, UserHandle.USER_ALL);
}
public void unregisterBrightnessModeObserver(Context context,
ContentObserver settingsObserver) {
context.getContentResolver().unregisterContentObserver(settingsObserver);
}
public void registerReceiver(Context context,
BroadcastReceiver receiver, IntentFilter filter) {
context.registerReceiver(receiver, filter);
@@ -815,6 +876,12 @@ public class BrightnessTracker {
return BackgroundThread.getHandler();
}
public boolean isBrightnessModeAutomatic(ContentResolver resolver) {
return Settings.System.getIntForUser(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, UserHandle.USER_CURRENT)
== Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
}
public int getSecureIntForUser(ContentResolver resolver, String setting, int defaultValue,
int userId) {
return Settings.Secure.getIntForUser(resolver, setting, defaultValue, userId);

View File

@@ -30,6 +30,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.display.BrightnessChangeEvent;
@@ -101,20 +102,24 @@ public class BrightnessTrackerTest {
assertNull(mInjector.mSensorListener);
assertNotNull(mInjector.mBroadcastReceiver);
assertTrue(mInjector.mIdleScheduled);
Intent onIntent = new Intent();
onIntent.setAction(Intent.ACTION_SCREEN_ON);
mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(),
onIntent);
mInjector.sendScreenChange(/*screen on */ true);
assertNotNull(mInjector.mSensorListener);
Intent offIntent = new Intent();
offIntent.setAction(Intent.ACTION_SCREEN_OFF);
mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(),
offIntent);
mInjector.sendScreenChange(/*screen on */ false);
assertNull(mInjector.mSensorListener);
mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(),
onIntent);
// Turn screen on while brightness mode is manual
mInjector.setBrightnessMode(/* isBrightnessModeAutomatic */ false);
mInjector.sendScreenChange(/*screen on */ true);
assertNull(mInjector.mSensorListener);
// Set brightness mode to automatic while screen is off.
mInjector.sendScreenChange(/*screen on */ false);
mInjector.setBrightnessMode(/* isBrightnessModeAutomatic */ true);
assertNull(mInjector.mSensorListener);
// Turn on screen while brightness mode is automatic.
mInjector.sendScreenChange(/*screen on */ true);
assertNotNull(mInjector.mSensorListener);
mTracker.stop();
@@ -123,6 +128,37 @@ public class BrightnessTrackerTest {
assertFalse(mInjector.mIdleScheduled);
}
@Test
public void testAdaptiveOnOff() {
mInjector.mInteractive = true;
mInjector.mIsBrightnessModeAutomatic = false;
startTracker(mTracker);
assertNull(mInjector.mSensorListener);
assertNotNull(mInjector.mBroadcastReceiver);
assertNotNull(mInjector.mContentObserver);
assertTrue(mInjector.mIdleScheduled);
mInjector.setBrightnessMode(/*isBrightnessModeAutomatic*/ true);
assertNotNull(mInjector.mSensorListener);
SensorEventListener listener = mInjector.mSensorListener;
mInjector.mSensorListener = null;
// Duplicate notification
mInjector.setBrightnessMode(/*isBrightnessModeAutomatic*/ true);
// Sensor shouldn't have been registered as it was already registered.
assertNull(mInjector.mSensorListener);
mInjector.mSensorListener = listener;
mInjector.setBrightnessMode(/*isBrightnessModeAutomatic*/ false);
assertNull(mInjector.mSensorListener);
mTracker.stop();
assertNull(mInjector.mSensorListener);
assertNull(mInjector.mBroadcastReceiver);
assertNull(mInjector.mContentObserver);
assertFalse(mInjector.mIdleScheduled);
}
@Test
public void testBrightnessEvent() {
final int brightness = 20;
@@ -618,16 +654,39 @@ public class BrightnessTrackerTest {
boolean mIdleScheduled;
boolean mInteractive = true;
int[] mProfiles;
ContentObserver mContentObserver;
boolean mIsBrightnessModeAutomatic = true;
public TestInjector(Handler handler) {
mHandler = handler;
}
public void incrementTime(long timeMillis) {
void incrementTime(long timeMillis) {
mCurrentTimeMillis += timeMillis;
mElapsedRealtimeNanos += TimeUnit.MILLISECONDS.toNanos(timeMillis);
}
void setBrightnessMode(boolean isBrightnessModeAutomatic) {
mIsBrightnessModeAutomatic = isBrightnessModeAutomatic;
mContentObserver.dispatchChange(false, null);
waitForHandler();
}
void sendScreenChange(boolean screenOn) {
mInteractive = screenOn;
Intent intent = new Intent();
intent.setAction(screenOn ? Intent.ACTION_SCREEN_ON : Intent.ACTION_SCREEN_OFF);
mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(), intent);
waitForHandler();
}
void waitForHandler() {
Idle idle = new Idle();
mHandler.getLooper().getQueue().addIdleHandler(idle);
mHandler.post(() -> {});
idle.waitForIdle();
}
@Override
public void registerSensorListener(Context context,
SensorEventListener sensorListener, Handler handler) {
@@ -640,6 +699,18 @@ public class BrightnessTrackerTest {
mSensorListener = null;
}
@Override
public void registerBrightnessModeObserver(ContentResolver resolver,
ContentObserver settingsObserver) {
mContentObserver = settingsObserver;
}
@Override
public void unregisterBrightnessModeObserver(Context context,
ContentObserver settingsObserver) {
mContentObserver = null;
}
@Override
public void registerReceiver(Context context,
BroadcastReceiver shutdownReceiver, IntentFilter shutdownFilter) {
@@ -658,11 +729,9 @@ public class BrightnessTrackerTest {
return mHandler;
}
public void waitForHandler() {
Idle idle = new Idle();
mHandler.getLooper().getQueue().addIdleHandler(idle);
mHandler.post(() -> {});
idle.waitForIdle();
@Override
public boolean isBrightnessModeAutomatic(ContentResolver resolver) {
return mIsBrightnessModeAutomatic;
}
@Override