diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 52b05f2d112f8..dab1d3e45ad03 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -365,7 +365,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call @Nullable private final ColorDisplayServiceInternal mCdsi; - private final float[] mNitsRange; + private float[] mNitsRange; private final HighBrightnessModeController mHbmController; @@ -447,6 +447,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mLogicalDisplay = logicalDisplay; mDisplayId = mLogicalDisplay.getDisplayIdLocked(); mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); + mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); mHandler = new DisplayControllerHandler(handler.getLooper()); if (mDisplayId == Display.DEFAULT_DISPLAY) { @@ -462,6 +463,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mBlanker = blanker; mContext = context; mBrightnessTracker = brightnessTracker; + // TODO: b/186428377 update brightness setting when display changes mBrightnessSetting = brightnessSetting; mOnBrightnessChangeRunnable = onBrightnessChangeRunnable; @@ -498,13 +500,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mAllowAutoBrightnessWhileDozingConfig = resources.getBoolean( com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing); + mDisplayDeviceConfig = logicalDisplay.getPrimaryDisplayDeviceLocked() + .getDisplayDeviceConfig(); - mDisplayDeviceConfig = logicalDisplay - .getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig(); - mBrightnessRampRateFastDecrease = mDisplayDeviceConfig.getBrightnessRampFastDecrease(); - mBrightnessRampRateFastIncrease = mDisplayDeviceConfig.getBrightnessRampFastIncrease(); - mBrightnessRampRateSlowDecrease = mDisplayDeviceConfig.getBrightnessRampSlowDecrease(); - mBrightnessRampRateSlowIncrease = mDisplayDeviceConfig.getBrightnessRampSlowIncrease(); + loadBrightnessRampRates(); mSkipScreenOnBrightnessRamp = resources.getBoolean( com.android.internal.R.bool.config_skipScreenOnBrightnessRamp); @@ -513,66 +512,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Seed the cached brightness saveBrightnessInfo(getScreenBrightnessSetting()); - if (mUseSoftwareAutoBrightnessConfig) { - final float dozeScaleFactor = resources.getFraction( - com.android.internal.R.fraction.config_screenAutoBrightnessDozeScaleFactor, - 1, 1); - - int[] ambientBrighteningThresholds = resources.getIntArray( - com.android.internal.R.array.config_ambientBrighteningThresholds); - int[] ambientDarkeningThresholds = resources.getIntArray( - com.android.internal.R.array.config_ambientDarkeningThresholds); - int[] ambientThresholdLevels = resources.getIntArray( - com.android.internal.R.array.config_ambientThresholdLevels); - HysteresisLevels ambientBrightnessThresholds = new HysteresisLevels( - ambientBrighteningThresholds, ambientDarkeningThresholds, - ambientThresholdLevels); - - int[] screenBrighteningThresholds = resources.getIntArray( - com.android.internal.R.array.config_screenBrighteningThresholds); - int[] screenDarkeningThresholds = resources.getIntArray( - com.android.internal.R.array.config_screenDarkeningThresholds); - int[] screenThresholdLevels = resources.getIntArray( - com.android.internal.R.array.config_screenThresholdLevels); - HysteresisLevels screenBrightnessThresholds = new HysteresisLevels( - screenBrighteningThresholds, screenDarkeningThresholds, screenThresholdLevels); - - long brighteningLightDebounce = resources.getInteger( - com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce); - long darkeningLightDebounce = resources.getInteger( - com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce); - boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( - com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); - - int lightSensorWarmUpTimeConfig = resources.getInteger( - com.android.internal.R.integer.config_lightSensorWarmupTime); - int lightSensorRate = resources.getInteger( - com.android.internal.R.integer.config_autoBrightnessLightSensorRate); - int initialLightSensorRate = resources.getInteger( - com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate); - if (initialLightSensorRate == -1) { - initialLightSensorRate = lightSensorRate; - } else if (initialLightSensorRate > lightSensorRate) { - Slog.w(TAG, "Expected config_autoBrightnessInitialLightSensorRate (" - + initialLightSensorRate + ") to be less than or equal to " - + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ")."); - } - - loadAmbientLightSensor(); - - mBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig); - if (mBrightnessMapper != null) { - mAutomaticBrightnessController = new AutomaticBrightnessController(this, - handler.getLooper(), sensorManager, mLightSensor, mBrightnessMapper, - lightSensorWarmUpTimeConfig, PowerManager.BRIGHTNESS_MIN, - PowerManager.BRIGHTNESS_MAX, dozeScaleFactor, lightSensorRate, - initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce, - autoBrightnessResetAmbientLuxAfterWarmUp, ambientBrightnessThresholds, - screenBrightnessThresholds, logicalDisplay, context, mHbmController); - } else { - mUseSoftwareAutoBrightnessConfig = false; - } - } + setUpAutoBrightness(resources, handler); mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic(); mColorFadeFadesConfig = resources.getBoolean( @@ -610,13 +550,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mDisplayWhiteBalanceSettings = displayWhiteBalanceSettings; mDisplayWhiteBalanceController = displayWhiteBalanceController; - if (mDisplayDeviceConfig != null && mDisplayDeviceConfig.getNits() != null) { - mNitsRange = mDisplayDeviceConfig.getNits(); - } else { - Slog.w(TAG, "Screen brightness nits configuration is unavailable; falling back"); - mNitsRange = BrightnessMappingStrategy.getFloatArray(context.getResources() - .obtainTypedArray(com.android.internal.R.array.config_screenBrightnessNits)); - } + loadNitsRange(resources); + if (mDisplayId == Display.DEFAULT_DISPLAY) { mCdsi = LocalServices.getService(ColorDisplayServiceInternal.class); boolean active = mCdsi.setReduceBrightColorsListener(new ReduceBrightColorsListener() { @@ -802,10 +737,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mDisplayDevice = device; mUniqueDisplayId = uniqueId; mDisplayDeviceConfig = config; - - loadAmbientLightSensor(); - loadProximitySensor(); - mHbmController.resetHbmData(token, config.getHighBrightnessModeData()); + loadFromDisplayDeviceConfig(token); }); } @@ -846,6 +778,18 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } + private void loadFromDisplayDeviceConfig(IBinder token) { + // All properties that depend on the associated DisplayDevice and the DDC must be + // updated here. + loadAmbientLightSensor(); + loadBrightnessRampRates(); + loadProximitySensor(); + loadNitsRange(mContext.getResources()); + setUpAutoBrightness(mContext.getResources(), mHandler); + reloadReduceBrightColours(); + mHbmController.resetHbmData(token, mDisplayDeviceConfig.getHighBrightnessModeData()); + } + private void sendUpdatePowerState() { synchronized (mLock) { sendUpdatePowerStateLocked(); @@ -903,6 +847,98 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL); } + private void setUpAutoBrightness(Resources resources, Handler handler) { + if (!mUseSoftwareAutoBrightnessConfig) { + return; + } + + mBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig); + + if (mBrightnessMapper != null) { + final float dozeScaleFactor = resources.getFraction( + com.android.internal.R.fraction.config_screenAutoBrightnessDozeScaleFactor, + 1, 1); + + int[] ambientBrighteningThresholds = resources.getIntArray( + com.android.internal.R.array.config_ambientBrighteningThresholds); + int[] ambientDarkeningThresholds = resources.getIntArray( + com.android.internal.R.array.config_ambientDarkeningThresholds); + int[] ambientThresholdLevels = resources.getIntArray( + com.android.internal.R.array.config_ambientThresholdLevels); + HysteresisLevels ambientBrightnessThresholds = new HysteresisLevels( + ambientBrighteningThresholds, ambientDarkeningThresholds, + ambientThresholdLevels); + + int[] screenBrighteningThresholds = resources.getIntArray( + com.android.internal.R.array.config_screenBrighteningThresholds); + int[] screenDarkeningThresholds = resources.getIntArray( + com.android.internal.R.array.config_screenDarkeningThresholds); + int[] screenThresholdLevels = resources.getIntArray( + com.android.internal.R.array.config_screenThresholdLevels); + HysteresisLevels screenBrightnessThresholds = new HysteresisLevels( + screenBrighteningThresholds, screenDarkeningThresholds, screenThresholdLevels); + + long brighteningLightDebounce = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce); + long darkeningLightDebounce = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce); + boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( + com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); + + int lightSensorWarmUpTimeConfig = resources.getInteger( + com.android.internal.R.integer.config_lightSensorWarmupTime); + int lightSensorRate = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessLightSensorRate); + int initialLightSensorRate = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate); + if (initialLightSensorRate == -1) { + initialLightSensorRate = lightSensorRate; + } else if (initialLightSensorRate > lightSensorRate) { + Slog.w(TAG, "Expected config_autoBrightnessInitialLightSensorRate (" + + initialLightSensorRate + ") to be less than or equal to " + + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ")."); + } + + loadAmbientLightSensor(); + + if (mAutomaticBrightnessController != null) { + mAutomaticBrightnessController.stop(); + } + mAutomaticBrightnessController = new AutomaticBrightnessController(this, + handler.getLooper(), mSensorManager, mLightSensor, mBrightnessMapper, + lightSensorWarmUpTimeConfig, PowerManager.BRIGHTNESS_MIN, + PowerManager.BRIGHTNESS_MAX, dozeScaleFactor, lightSensorRate, + initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce, + autoBrightnessResetAmbientLuxAfterWarmUp, ambientBrightnessThresholds, + screenBrightnessThresholds, mLogicalDisplay, mContext, mHbmController); + } else { + mUseSoftwareAutoBrightnessConfig = false; + } + } + + private void loadBrightnessRampRates() { + mBrightnessRampRateFastDecrease = mDisplayDeviceConfig.getBrightnessRampFastDecrease(); + mBrightnessRampRateFastIncrease = mDisplayDeviceConfig.getBrightnessRampFastIncrease(); + mBrightnessRampRateSlowDecrease = mDisplayDeviceConfig.getBrightnessRampSlowDecrease(); + mBrightnessRampRateSlowIncrease = mDisplayDeviceConfig.getBrightnessRampSlowIncrease(); + } + + private void loadNitsRange(Resources resources) { + if (mDisplayDeviceConfig != null && mDisplayDeviceConfig.getNits() != null) { + mNitsRange = mDisplayDeviceConfig.getNits(); + } else { + Slog.w(TAG, "Screen brightness nits configuration is unavailable; falling back"); + mNitsRange = BrightnessMappingStrategy.getFloatArray(resources + .obtainTypedArray(com.android.internal.R.array.config_screenBrightnessNits)); + } + } + + private void reloadReduceBrightColours() { + if (mCdsi != null && mCdsi.isReduceBrightColorsActivated()) { + applyReduceBrightColorsSplineAdjustment(); + } + } + private final Animator.AnimatorListener mAnimatorListener = new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) {