Loading services/core/java/com/android/server/display/DisplayDeviceConfig.java +42 −4 Original line number Diff line number Diff line Loading @@ -1097,13 +1097,34 @@ public class DisplayDeviceConfig { return mBrightnessToBacklightSpline.interpolate(brightness); } private float getBrightnessFromBacklight(float brightness) { /** * Calculates the screen brightness value - as used among the system from the HAL backlight * level * @param backlight value from 0-1 HAL scale * @return brightness value from 0-1 framework scale */ public float getBrightnessFromBacklight(float backlight) { if (mLowBrightnessData != null) { return mLowBrightnessData.mBacklightToBrightness.interpolate(brightness); return mLowBrightnessData.mBacklightToBrightness.interpolate(backlight); } return mBacklightToBrightnessSpline.interpolate(brightness); return mBacklightToBrightnessSpline.interpolate(backlight); } /** * * @return low brightness mode transition point */ public float getLowBrightnessTransitionPoint() { if (mLowBrightnessData == null) { return PowerManager.BRIGHTNESS_MIN; } return mLowBrightnessData.mTransitionPoint; } /** * * @return HAL backlight mapping to framework brightness */ private Spline getBacklightToBrightnessSpline() { if (mLowBrightnessData != null) { return mLowBrightnessData.mBacklightToBrightness; Loading Loading @@ -1133,7 +1154,12 @@ public class DisplayDeviceConfig { return mBacklightToNitsSpline.interpolate(backlight); } private float getBacklightFromNits(float nits) { /** * * @param nits - display brightness * @return corresponding HAL backlight value */ public float getBacklightFromNits(float nits) { if (mLowBrightnessData != null) { return mLowBrightnessData.mNitsToBacklight.interpolate(nits); } Loading @@ -1147,6 +1173,18 @@ public class DisplayDeviceConfig { return mNitsToBacklightSpline; } /** * * @param lux - ambient brightness * @return minimum allowed nits, given the lux. */ public float getMinNitsFromLux(float lux) { if (mLowBrightnessData == null) { return INVALID_NITS; } return mLowBrightnessData.mMinLuxToNits.interpolate(lux); } /** * @return true if there is sdrHdrRatioMap, false otherwise. */ Loading services/core/java/com/android/server/display/DisplayPowerController.java +5 −3 Original line number Diff line number Diff line Loading @@ -1336,12 +1336,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call && (mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentChanged() || userSetBrightnessChanged); mBrightnessRangeController.setAutoBrightnessEnabled( mAutomaticBrightnessStrategy.isAutoBrightnessEnabled() final int autoBrightnessState = mAutomaticBrightnessStrategy.isAutoBrightnessEnabled() ? AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED : mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff() ? AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED); : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED; mBrightnessRangeController.setAutoBrightnessEnabled(autoBrightnessState); mBrightnessClamperController.setAutoBrightnessState(autoBrightnessState); boolean updateScreenBrightnessSetting = displayBrightnessState.shouldUpdateScreenBrightnessSetting(); Loading services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java +20 −3 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public class BrightnessClamperController { private float mCustomAnimationRate = DisplayBrightnessState.CUSTOM_ANIMATION_RATE_NOT_SET; @Nullable private Type mClamperType = null; private int mAutoBrightnessState = -1; private boolean mClamperApplied = false; Loading Loading @@ -94,7 +95,8 @@ public class BrightnessClamperController { mClampers = injector.getClampers(handler, clamperChangeListenerInternal, data, flags, context); mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener); mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener, data.mDisplayDeviceConfig); mOnPropertiesChangedListener = properties -> mClampers.forEach(BrightnessClamper::onDeviceConfigChanged); start(); Loading Loading @@ -197,6 +199,19 @@ public class BrightnessClamperController { mModifiers.forEach(modifier -> modifier.onAmbientLuxChange(ambientLux)); } /** * Sets the autobrightness state for clampers that need to be aware of the state. * @param state autobrightness state */ public void setAutoBrightnessState(int state) { if (state == mAutoBrightnessState) { return; } mModifiers.forEach(modifier -> modifier.setAutoBrightnessState(state)); mAutoBrightnessState = state; recalculateBrightnessCap(); } // Called in DisplayControllerHandler private void recalculateBrightnessCap() { float brightnessCap = PowerManager.BRIGHTNESS_MAX; Loading Loading @@ -265,12 +280,14 @@ public class BrightnessClamperController { } List<BrightnessStateModifier> getModifiers(DisplayManagerFlags flags, Context context, Handler handler, ClamperChangeListener listener) { Handler handler, ClamperChangeListener listener, DisplayDeviceConfig displayDeviceConfig) { List<BrightnessStateModifier> modifiers = new ArrayList<>(); modifiers.add(new DisplayDimModifier(context)); modifiers.add(new BrightnessLowPowerModeModifier()); if (flags.isEvenDimmerEnabled()) { modifiers.add(new BrightnessLowLuxModifier(handler, listener, context)); modifiers.add(new BrightnessLowLuxModifier(handler, listener, context, displayDeviceConfig)); } return modifiers; } Loading services/core/java/com/android/server/display/brightness/clamper/BrightnessLowLuxModifier.java +49 −25 Original line number Diff line number Diff line Loading @@ -16,13 +16,14 @@ package com.android.server.display.brightness.clamper; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.hardware.display.DisplayManagerInternal; import android.net.Uri; import android.os.Handler; import android.os.PowerManager; import android.os.UserHandle; import android.provider.Settings; import android.util.Slog; Loading @@ -30,6 +31,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; import com.android.server.display.DisplayBrightnessState; import com.android.server.display.DisplayDeviceConfig; import com.android.server.display.brightness.BrightnessReason; import com.android.server.display.utils.DebugUtils; Loading @@ -45,19 +47,23 @@ public class BrightnessLowLuxModifier extends BrightnessModifier { // 'adb shell setprop persist.log.tag.BrightnessLowLuxModifier DEBUG && adb reboot' private static final String TAG = "BrightnessLowLuxModifier"; private static final boolean DEBUG = DebugUtils.isDebuggable(TAG); private static final float MIN_NITS = 2.0f; private static final float MIN_NITS_DEFAULT = 0.2f; private final SettingsObserver mSettingsObserver; private final ContentResolver mContentResolver; private final Handler mHandler; private final BrightnessClamperController.ClamperChangeListener mChangeListener; private int mReason; private float mBrightnessLowerBound; private float mMinNitsAllowed; private boolean mIsActive; private boolean mAutoBrightnessEnabled; private float mAmbientLux; private final DisplayDeviceConfig mDisplayDeviceConfig; @VisibleForTesting BrightnessLowLuxModifier(Handler handler, BrightnessClamperController.ClamperChangeListener listener, Context context) { BrightnessClamperController.ClamperChangeListener listener, Context context, DisplayDeviceConfig displayDeviceConfig) { super(); mChangeListener = listener; Loading @@ -67,6 +73,8 @@ public class BrightnessLowLuxModifier extends BrightnessModifier { mHandler.post(() -> { start(); }); mDisplayDeviceConfig = displayDeviceConfig; } /** Loading @@ -78,41 +86,45 @@ public class BrightnessLowLuxModifier extends BrightnessModifier { int userId = UserHandle.USER_CURRENT; float settingNitsLowerBound = Settings.Secure.getFloatForUser( mContentResolver, Settings.Secure.EVEN_DIMMER_MIN_NITS, /* def= */ MIN_NITS, userId); /* def= */ MIN_NITS_DEFAULT, userId); boolean isActive = Settings.Secure.getFloatForUser(mContentResolver, Settings.Secure.EVEN_DIMMER_ACTIVATED, /* def= */ 0, userId) == 1.0f; /* def= */ 0, userId) == 1.0f && mAutoBrightnessEnabled; // TODO: luxBasedNitsLowerBound = mMinLuxToNitsSpline(currentLux); float luxBasedNitsLowerBound = 2.0f; float luxBasedNitsLowerBound = mDisplayDeviceConfig.getMinNitsFromLux(mAmbientLux); final float nitsLowerBound = isActive ? Math.max(settingNitsLowerBound, luxBasedNitsLowerBound) : MIN_NITS; final int reason; float minNitsAllowed = -1f; // undefined, if setting is off. final float minBrightnessAllowed; final int reason = settingNitsLowerBound > luxBasedNitsLowerBound if (isActive) { minNitsAllowed = Math.max(settingNitsLowerBound, luxBasedNitsLowerBound); minBrightnessAllowed = getBrightnessFromNits(minNitsAllowed); reason = settingNitsLowerBound > luxBasedNitsLowerBound ? BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND : BrightnessReason.MODIFIER_MIN_LUX; } else { minBrightnessAllowed = mDisplayDeviceConfig.getLowBrightnessTransitionPoint(); reason = 0; } // TODO: brightnessLowerBound = nitsToBrightnessSpline(nitsLowerBound); final float brightnessLowerBound = PowerManager.BRIGHTNESS_MIN; if (mBrightnessLowerBound != brightnessLowerBound if (mBrightnessLowerBound != minBrightnessAllowed || mReason != reason || mIsActive != isActive) { mIsActive = isActive; mReason = reason; if (DEBUG) { Slog.i(TAG, "isActive: " + isActive + ", brightnessLowerBound: " + brightnessLowerBound + ", minBrightnessAllowed: " + minBrightnessAllowed + ", mAmbientLux: " + mAmbientLux + ", mReason: " + ( mReason == BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND ? "minSetting" : "lux") + ", nitsLowerBound: " + nitsLowerBound + ", mReason: " + (mReason) + ", minNitsAllowed: " + minNitsAllowed ); } mBrightnessLowerBound = brightnessLowerBound; mMinNitsAllowed = minNitsAllowed; mBrightnessLowerBound = minBrightnessAllowed; mChangeListener.onChanged(); } } Loading Loading @@ -176,12 +188,24 @@ public class BrightnessLowLuxModifier extends BrightnessModifier { recalculateLowerBound(); } @Override public void setAutoBrightnessState(int state) { mAutoBrightnessEnabled = state == AUTO_BRIGHTNESS_ENABLED; } @Override public void dump(PrintWriter pw) { pw.println("BrightnessLowLuxModifier:"); pw.println(" mIsActive=" + mIsActive); pw.println(" mBrightnessLowerBound=" + mBrightnessLowerBound); pw.println(" mReason=" + mReason); pw.println(" mAmbientLux=" + mAmbientLux); pw.println(" mMinNitsAllowed=" + mMinNitsAllowed); } private float getBrightnessFromNits(float nits) { return mDisplayDeviceConfig.getBrightnessFromBacklight( mDisplayDeviceConfig.getBacklightFromNits(nits)); } private final class SettingsObserver extends ContentObserver { Loading services/core/java/com/android/server/display/brightness/clamper/BrightnessModifier.java +5 −0 Original line number Diff line number Diff line Loading @@ -73,4 +73,9 @@ abstract class BrightnessModifier implements BrightnessStateModifier { public void onAmbientLuxChange(float ambientLux) { // do nothing } @Override public void setAutoBrightnessState(int state) { // do nothing } } Loading
services/core/java/com/android/server/display/DisplayDeviceConfig.java +42 −4 Original line number Diff line number Diff line Loading @@ -1097,13 +1097,34 @@ public class DisplayDeviceConfig { return mBrightnessToBacklightSpline.interpolate(brightness); } private float getBrightnessFromBacklight(float brightness) { /** * Calculates the screen brightness value - as used among the system from the HAL backlight * level * @param backlight value from 0-1 HAL scale * @return brightness value from 0-1 framework scale */ public float getBrightnessFromBacklight(float backlight) { if (mLowBrightnessData != null) { return mLowBrightnessData.mBacklightToBrightness.interpolate(brightness); return mLowBrightnessData.mBacklightToBrightness.interpolate(backlight); } return mBacklightToBrightnessSpline.interpolate(brightness); return mBacklightToBrightnessSpline.interpolate(backlight); } /** * * @return low brightness mode transition point */ public float getLowBrightnessTransitionPoint() { if (mLowBrightnessData == null) { return PowerManager.BRIGHTNESS_MIN; } return mLowBrightnessData.mTransitionPoint; } /** * * @return HAL backlight mapping to framework brightness */ private Spline getBacklightToBrightnessSpline() { if (mLowBrightnessData != null) { return mLowBrightnessData.mBacklightToBrightness; Loading Loading @@ -1133,7 +1154,12 @@ public class DisplayDeviceConfig { return mBacklightToNitsSpline.interpolate(backlight); } private float getBacklightFromNits(float nits) { /** * * @param nits - display brightness * @return corresponding HAL backlight value */ public float getBacklightFromNits(float nits) { if (mLowBrightnessData != null) { return mLowBrightnessData.mNitsToBacklight.interpolate(nits); } Loading @@ -1147,6 +1173,18 @@ public class DisplayDeviceConfig { return mNitsToBacklightSpline; } /** * * @param lux - ambient brightness * @return minimum allowed nits, given the lux. */ public float getMinNitsFromLux(float lux) { if (mLowBrightnessData == null) { return INVALID_NITS; } return mLowBrightnessData.mMinLuxToNits.interpolate(lux); } /** * @return true if there is sdrHdrRatioMap, false otherwise. */ Loading
services/core/java/com/android/server/display/DisplayPowerController.java +5 −3 Original line number Diff line number Diff line Loading @@ -1336,12 +1336,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call && (mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentChanged() || userSetBrightnessChanged); mBrightnessRangeController.setAutoBrightnessEnabled( mAutomaticBrightnessStrategy.isAutoBrightnessEnabled() final int autoBrightnessState = mAutomaticBrightnessStrategy.isAutoBrightnessEnabled() ? AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED : mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff() ? AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED); : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED; mBrightnessRangeController.setAutoBrightnessEnabled(autoBrightnessState); mBrightnessClamperController.setAutoBrightnessState(autoBrightnessState); boolean updateScreenBrightnessSetting = displayBrightnessState.shouldUpdateScreenBrightnessSetting(); Loading
services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java +20 −3 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public class BrightnessClamperController { private float mCustomAnimationRate = DisplayBrightnessState.CUSTOM_ANIMATION_RATE_NOT_SET; @Nullable private Type mClamperType = null; private int mAutoBrightnessState = -1; private boolean mClamperApplied = false; Loading Loading @@ -94,7 +95,8 @@ public class BrightnessClamperController { mClampers = injector.getClampers(handler, clamperChangeListenerInternal, data, flags, context); mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener); mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener, data.mDisplayDeviceConfig); mOnPropertiesChangedListener = properties -> mClampers.forEach(BrightnessClamper::onDeviceConfigChanged); start(); Loading Loading @@ -197,6 +199,19 @@ public class BrightnessClamperController { mModifiers.forEach(modifier -> modifier.onAmbientLuxChange(ambientLux)); } /** * Sets the autobrightness state for clampers that need to be aware of the state. * @param state autobrightness state */ public void setAutoBrightnessState(int state) { if (state == mAutoBrightnessState) { return; } mModifiers.forEach(modifier -> modifier.setAutoBrightnessState(state)); mAutoBrightnessState = state; recalculateBrightnessCap(); } // Called in DisplayControllerHandler private void recalculateBrightnessCap() { float brightnessCap = PowerManager.BRIGHTNESS_MAX; Loading Loading @@ -265,12 +280,14 @@ public class BrightnessClamperController { } List<BrightnessStateModifier> getModifiers(DisplayManagerFlags flags, Context context, Handler handler, ClamperChangeListener listener) { Handler handler, ClamperChangeListener listener, DisplayDeviceConfig displayDeviceConfig) { List<BrightnessStateModifier> modifiers = new ArrayList<>(); modifiers.add(new DisplayDimModifier(context)); modifiers.add(new BrightnessLowPowerModeModifier()); if (flags.isEvenDimmerEnabled()) { modifiers.add(new BrightnessLowLuxModifier(handler, listener, context)); modifiers.add(new BrightnessLowLuxModifier(handler, listener, context, displayDeviceConfig)); } return modifiers; } Loading
services/core/java/com/android/server/display/brightness/clamper/BrightnessLowLuxModifier.java +49 −25 Original line number Diff line number Diff line Loading @@ -16,13 +16,14 @@ package com.android.server.display.brightness.clamper; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.hardware.display.DisplayManagerInternal; import android.net.Uri; import android.os.Handler; import android.os.PowerManager; import android.os.UserHandle; import android.provider.Settings; import android.util.Slog; Loading @@ -30,6 +31,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; import com.android.server.display.DisplayBrightnessState; import com.android.server.display.DisplayDeviceConfig; import com.android.server.display.brightness.BrightnessReason; import com.android.server.display.utils.DebugUtils; Loading @@ -45,19 +47,23 @@ public class BrightnessLowLuxModifier extends BrightnessModifier { // 'adb shell setprop persist.log.tag.BrightnessLowLuxModifier DEBUG && adb reboot' private static final String TAG = "BrightnessLowLuxModifier"; private static final boolean DEBUG = DebugUtils.isDebuggable(TAG); private static final float MIN_NITS = 2.0f; private static final float MIN_NITS_DEFAULT = 0.2f; private final SettingsObserver mSettingsObserver; private final ContentResolver mContentResolver; private final Handler mHandler; private final BrightnessClamperController.ClamperChangeListener mChangeListener; private int mReason; private float mBrightnessLowerBound; private float mMinNitsAllowed; private boolean mIsActive; private boolean mAutoBrightnessEnabled; private float mAmbientLux; private final DisplayDeviceConfig mDisplayDeviceConfig; @VisibleForTesting BrightnessLowLuxModifier(Handler handler, BrightnessClamperController.ClamperChangeListener listener, Context context) { BrightnessClamperController.ClamperChangeListener listener, Context context, DisplayDeviceConfig displayDeviceConfig) { super(); mChangeListener = listener; Loading @@ -67,6 +73,8 @@ public class BrightnessLowLuxModifier extends BrightnessModifier { mHandler.post(() -> { start(); }); mDisplayDeviceConfig = displayDeviceConfig; } /** Loading @@ -78,41 +86,45 @@ public class BrightnessLowLuxModifier extends BrightnessModifier { int userId = UserHandle.USER_CURRENT; float settingNitsLowerBound = Settings.Secure.getFloatForUser( mContentResolver, Settings.Secure.EVEN_DIMMER_MIN_NITS, /* def= */ MIN_NITS, userId); /* def= */ MIN_NITS_DEFAULT, userId); boolean isActive = Settings.Secure.getFloatForUser(mContentResolver, Settings.Secure.EVEN_DIMMER_ACTIVATED, /* def= */ 0, userId) == 1.0f; /* def= */ 0, userId) == 1.0f && mAutoBrightnessEnabled; // TODO: luxBasedNitsLowerBound = mMinLuxToNitsSpline(currentLux); float luxBasedNitsLowerBound = 2.0f; float luxBasedNitsLowerBound = mDisplayDeviceConfig.getMinNitsFromLux(mAmbientLux); final float nitsLowerBound = isActive ? Math.max(settingNitsLowerBound, luxBasedNitsLowerBound) : MIN_NITS; final int reason; float minNitsAllowed = -1f; // undefined, if setting is off. final float minBrightnessAllowed; final int reason = settingNitsLowerBound > luxBasedNitsLowerBound if (isActive) { minNitsAllowed = Math.max(settingNitsLowerBound, luxBasedNitsLowerBound); minBrightnessAllowed = getBrightnessFromNits(minNitsAllowed); reason = settingNitsLowerBound > luxBasedNitsLowerBound ? BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND : BrightnessReason.MODIFIER_MIN_LUX; } else { minBrightnessAllowed = mDisplayDeviceConfig.getLowBrightnessTransitionPoint(); reason = 0; } // TODO: brightnessLowerBound = nitsToBrightnessSpline(nitsLowerBound); final float brightnessLowerBound = PowerManager.BRIGHTNESS_MIN; if (mBrightnessLowerBound != brightnessLowerBound if (mBrightnessLowerBound != minBrightnessAllowed || mReason != reason || mIsActive != isActive) { mIsActive = isActive; mReason = reason; if (DEBUG) { Slog.i(TAG, "isActive: " + isActive + ", brightnessLowerBound: " + brightnessLowerBound + ", minBrightnessAllowed: " + minBrightnessAllowed + ", mAmbientLux: " + mAmbientLux + ", mReason: " + ( mReason == BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND ? "minSetting" : "lux") + ", nitsLowerBound: " + nitsLowerBound + ", mReason: " + (mReason) + ", minNitsAllowed: " + minNitsAllowed ); } mBrightnessLowerBound = brightnessLowerBound; mMinNitsAllowed = minNitsAllowed; mBrightnessLowerBound = minBrightnessAllowed; mChangeListener.onChanged(); } } Loading Loading @@ -176,12 +188,24 @@ public class BrightnessLowLuxModifier extends BrightnessModifier { recalculateLowerBound(); } @Override public void setAutoBrightnessState(int state) { mAutoBrightnessEnabled = state == AUTO_BRIGHTNESS_ENABLED; } @Override public void dump(PrintWriter pw) { pw.println("BrightnessLowLuxModifier:"); pw.println(" mIsActive=" + mIsActive); pw.println(" mBrightnessLowerBound=" + mBrightnessLowerBound); pw.println(" mReason=" + mReason); pw.println(" mAmbientLux=" + mAmbientLux); pw.println(" mMinNitsAllowed=" + mMinNitsAllowed); } private float getBrightnessFromNits(float nits) { return mDisplayDeviceConfig.getBrightnessFromBacklight( mDisplayDeviceConfig.getBacklightFromNits(nits)); } private final class SettingsObserver extends ContentObserver { Loading
services/core/java/com/android/server/display/brightness/clamper/BrightnessModifier.java +5 −0 Original line number Diff line number Diff line Loading @@ -73,4 +73,9 @@ abstract class BrightnessModifier implements BrightnessStateModifier { public void onAmbientLuxChange(float ambientLux) { // do nothing } @Override public void setAutoBrightnessState(int state) { // do nothing } }