Pass DisplayDeviceConfig to AutomaticBrightness
Pass the default DisplayDeviceConfig to the
AutomaticBrightnessController so the values from it can be used in
future.
Bug: 147415200
Test: AutomaticBrightnessControllerTest & manual
Change-Id: Id796f5fd97b88aabefcba72dbafb6e98ec586e59
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index 6178e6c..f4d7f9a 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -200,7 +200,7 @@
// Context-sensitive brightness configurations require keeping track of the foreground app's
// package name and category, which is done by registering a TaskStackListener to call back to
// us onTaskStackChanged, and then using the ActivityTaskManager to get the foreground app's
- // package namd and PackageManager to get its category (so might as well cache them).
+ // package name and PackageManager to get its category (so might as well cache them).
private String mForegroundAppPackageName;
private String mPendingForegroundAppPackageName;
private @ApplicationInfo.Category int mForegroundAppCategory;
@@ -210,6 +210,7 @@
private PackageManager mPackageManager;
private Context mContext;
+ private DisplayDeviceConfig mDisplayDeviceConfig;
private final Injector mInjector;
AutomaticBrightnessController(Callbacks callbacks, Looper looper,
@@ -218,12 +219,14 @@
float dozeScaleFactor, int lightSensorRate, int initialLightSensorRate,
long brighteningLightDebounceConfig, long darkeningLightDebounceConfig,
boolean resetAmbientLuxAfterWarmUpConfig, HysteresisLevels ambientBrightnessThresholds,
- HysteresisLevels screenBrightnessThresholds, Context context) {
+ HysteresisLevels screenBrightnessThresholds, Context context, DisplayDeviceConfig
+ displayDeviceConfig) {
this(new Injector(), callbacks, looper, sensorManager, lightSensor, mapper,
lightSensorWarmUpTime, brightnessMin, brightnessMax, dozeScaleFactor,
lightSensorRate, initialLightSensorRate, brighteningLightDebounceConfig,
darkeningLightDebounceConfig, resetAmbientLuxAfterWarmUpConfig,
- ambientBrightnessThresholds, screenBrightnessThresholds, context);
+ ambientBrightnessThresholds, screenBrightnessThresholds, context,
+ displayDeviceConfig);
}
@VisibleForTesting
@@ -233,7 +236,8 @@
float dozeScaleFactor, int lightSensorRate, int initialLightSensorRate,
long brighteningLightDebounceConfig, long darkeningLightDebounceConfig,
boolean resetAmbientLuxAfterWarmUpConfig, HysteresisLevels ambientBrightnessThresholds,
- HysteresisLevels screenBrightnessThresholds, Context context) {
+ HysteresisLevels screenBrightnessThresholds, Context context, DisplayDeviceConfig
+ displayDeviceConfig) {
mInjector = injector;
mContext = context;
mCallbacks = callbacks;
@@ -260,7 +264,7 @@
mScreenBrightnessThresholds = screenBrightnessThresholds;
mShortTermModelValid = true;
mShortTermModelAnchor = -1;
-
+ mDisplayDeviceConfig = displayDeviceConfig;
mHandler = new AutomaticBrightnessHandler(looper);
mAmbientLightRingBuffer =
new AmbientLightRingBuffer(mNormalLightSensorRate, mAmbientLightHorizon);
diff --git a/services/core/java/com/android/server/display/DisplayDevice.java b/services/core/java/com/android/server/display/DisplayDevice.java
index 63a8d7c..73015468 100644
--- a/services/core/java/com/android/server/display/DisplayDevice.java
+++ b/services/core/java/com/android/server/display/DisplayDevice.java
@@ -36,6 +36,7 @@
private final DisplayAdapter mDisplayAdapter;
private final IBinder mDisplayToken;
private final String mUniqueId;
+ private DisplayDeviceConfig mDisplayDeviceConfig;
// The display device does not manage these properties itself, they are set by
// the display manager service. The display device shouldn't really be looking at these.
@@ -67,6 +68,16 @@
return mDisplayAdapter;
}
+ /*
+ * Gets the DisplayDeviceConfig for this DisplayDevice.
+ * Returns null for this device but is overridden in LocalDisplayDevice.
+ *
+ * @return The DisplayDeviceConfig.
+ */
+ public DisplayDeviceConfig getDisplayDeviceConfig() {
+ return mDisplayDeviceConfig;
+ }
+
/**
* Gets the Surface Flinger display token for this display.
*
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index a232051..ac341a9 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -2449,7 +2449,8 @@
}
};
mDisplayPowerController = new DisplayPowerController(
- mContext, callbacks, handler, sensorManager, blanker);
+ mContext, callbacks, handler, sensorManager, blanker,
+ mDisplayDevices.get(Display.DEFAULT_DISPLAY));
mSensorManager = sensorManager;
}
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 197842e..f82ec82 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -161,6 +161,9 @@
// The display blanker.
private final DisplayBlanker mBlanker;
+ // The display device.
+ private final DisplayDevice mDisplayDevice;
+
// Tracker for brightness changes.
private final BrightnessTracker mBrightnessTracker;
@@ -348,11 +351,11 @@
@Nullable
private BrightnessConfiguration mBrightnessConfiguration;
- // The last brightness that was set by the user and not temporary. Set to -1 when a brightness
- // has yet to be recorded.
+ // The last brightness that was set by the user and not temporary. Set to
+ // PowerManager.BRIGHTNESS_INVALID_FLOAT when a brightness has yet to be recorded.
private float mLastUserSetScreenBrightness;
- // The screen brightenss setting has changed but not taken effect yet. If this is different
+ // The screen brightness setting has changed but not taken effect yet. If this is different
// from the current screen brightness setting then this is coming from something other than us
// and should be considered a user interaction.
private float mPendingScreenBrightnessSetting;
@@ -377,8 +380,8 @@
private float mPendingAutoBrightnessAdjustment;
// The temporary auto brightness adjustment. Typically set when a user is interacting with the
- // adjustment slider but hasn't settled on a choice yet. Set to Float.NaN when there's no
- // temporary adjustment set.
+ // adjustment slider but hasn't settled on a choice yet. Set to
+ // PowerManager.BRIGHTNESS_INVALID_FLOAT when there's no temporary adjustment set.
private float mTemporaryAutoBrightnessAdjustment;
// Animators.
@@ -386,27 +389,29 @@
private ObjectAnimator mColorFadeOffAnimator;
private RampAnimator<DisplayPowerState> mScreenBrightnessRampAnimator;
- private BrightnessSynchronizer mBrightnessSynchronizer;
/**
* Creates the display power controller.
*/
public DisplayPowerController(Context context,
DisplayPowerCallbacks callbacks, Handler handler,
- SensorManager sensorManager, DisplayBlanker blanker) {
+ SensorManager sensorManager, DisplayBlanker blanker, DisplayDevice displayDevice) {
mHandler = new DisplayControllerHandler(handler.getLooper());
mBrightnessTracker = new BrightnessTracker(context, null);
mSettingsObserver = new SettingsObserver(mHandler);
mCallbacks = callbacks;
- mBrightnessSynchronizer = new BrightnessSynchronizer(context);
mBatteryStats = BatteryStatsService.getService();
mSensorManager = sensorManager;
mWindowManagerPolicy = LocalServices.getService(WindowManagerPolicy.class);
mBlanker = blanker;
mContext = context;
+ mDisplayDevice = displayDevice;
PowerManager pm = context.getSystemService(PowerManager.class);
+ DisplayDeviceConfig displayDeviceConfig = mDisplayDevice.getDisplayDeviceConfig();
+
final Resources resources = context.getResources();
+
final float screenBrightnessSettingMinimumFloat = clampAbsoluteBrightness(
pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM));
@@ -498,7 +503,7 @@
mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce,
autoBrightnessResetAmbientLuxAfterWarmUp, ambientBrightnessThresholds,
- screenBrightnessThresholds, context);
+ screenBrightnessThresholds, context, displayDeviceConfig);
} else {
mUseSoftwareAutoBrightnessConfig = false;
}
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 8eb7710..6132467 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -203,6 +203,8 @@
private Spline mNitsToHalBrightness;
private boolean mHalBrightnessSupport;
+ private DisplayDeviceConfig mDisplayDeviceConfig;
+
LocalDisplayDevice(IBinder displayToken, long physicalDisplayId,
SurfaceControl.DisplayInfo info, SurfaceControl.DisplayConfig[] configs,
int activeConfigId, SurfaceControl.DesiredDisplayConfigSpecs configSpecs,
@@ -224,7 +226,7 @@
mAllmSupported = SurfaceControl.getAutoLowLatencyModeSupport(displayToken);
mGameContentTypeSupported = SurfaceControl.getGameContentTypeSupport(displayToken);
mHalBrightnessSupport = SurfaceControl.getDisplayBrightnessSupport(displayToken);
-
+ mDisplayDeviceConfig = null;
// Defer configuration file loading
BackgroundThread.getHandler().sendMessage(PooledLambda.obtainMessage(
LocalDisplayDevice::loadDisplayConfigurationBrightnessMapping, this));
@@ -373,17 +375,23 @@
return true;
}
+ @Override
+ public DisplayDeviceConfig getDisplayDeviceConfig() {
+ return mDisplayDeviceConfig;
+ }
+
private void loadDisplayConfigurationBrightnessMapping() {
Spline nitsToHal = null;
Spline sysToNits = null;
// Load the mapping from nits to HAL brightness range (display-device-config.xml)
DisplayDeviceConfig config = DisplayDeviceConfig.create(mPhysicalDisplayId);
+ mDisplayDeviceConfig = config;
if (config == null) {
return;
}
- final float[] halNits = config.getNits();
- final float[] halBrightness = config.getBrightness();
+ final float[] halNits = mDisplayDeviceConfig.getNits();
+ final float[] halBrightness = mDisplayDeviceConfig.getBrightness();
if (halNits == null || halBrightness == null) {
return;
}
diff --git a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java b/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
index 234c987..7b3417a 100644
--- a/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
@@ -60,6 +60,7 @@
@Mock HysteresisLevels mAmbientBrightnessThresholds;
@Mock HysteresisLevels mScreenBrightnessThresholds;
@Mock Handler mNoopHandler;
+ @Mock DisplayDeviceConfig mDisplayDeviceConfig;
private static final int LIGHT_SENSOR_WARMUP_TIME = 0;
@Before
@@ -82,7 +83,8 @@
BRIGHTNESS_MAX_FLOAT, DOZE_SCALE_FACTOR, LIGHT_SENSOR_RATE,
INITIAL_LIGHT_SENSOR_RATE, BRIGHTENING_LIGHT_DEBOUNCE_CONFIG,
DARKENING_LIGHT_DEBOUNCE_CONFIG, RESET_AMBIENT_LUX_AFTER_WARMUP_CONFIG,
- mAmbientBrightnessThresholds, mScreenBrightnessThresholds, mContext);
+ mAmbientBrightnessThresholds, mScreenBrightnessThresholds, mContext,
+ mDisplayDeviceConfig);
controller.setLoggingEnabled(true);
// Configure the brightness controller and grab an instance of the sensor listener,