Loading services/core/java/com/android/server/display/BrightnessRangeController.java +21 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.display; import android.hardware.display.BrightnessInfo; import android.os.Handler; import android.os.IBinder; import android.os.PowerManager; import com.android.server.display.brightness.clamper.HdrClamper; import com.android.server.display.feature.DisplayManagerFlags; Loading Loading @@ -52,17 +53,26 @@ class BrightnessRangeController { HdrClamper hdrClamper, DisplayManagerFlags flags) { mHbmController = hbmController; mModeChangeCallback = modeChangeCallback; mUseHdrClamper = false; mUseNbmController = flags.isNbmControllerEnabled(); mNormalBrightnessModeController.resetNbmData(displayDeviceConfig.getLuxThrottlingData()); mHdrClamper = hdrClamper; mUseHdrClamper = flags.isHdrClamperEnabled(); mUseNbmController = flags.isNbmControllerEnabled(); if (mUseNbmController) { mNormalBrightnessModeController.resetNbmData( displayDeviceConfig.getLuxThrottlingData()); } if (mUseHdrClamper) { mHdrClamper.resetHdrConfig(displayDeviceConfig.getHdrBrightnessData()); } } void dump(PrintWriter pw) { pw.println("BrightnessRangeController:"); pw.println(" mUseNormalBrightnessController=" + mUseNbmController); pw.println(" mUseHdrClamper=" + mUseHdrClamper); mHbmController.dump(pw); mNormalBrightnessModeController.dump(pw); mHdrClamper.dump(pw); } void onAmbientLuxChange(float ambientLux) { Loading Loading @@ -91,6 +101,9 @@ class BrightnessRangeController { displayDeviceConfig::getHdrBrightnessFromSdr); } ); if (mUseHdrClamper) { mHdrClamper.resetHdrConfig(displayDeviceConfig.getHdrBrightnessData()); } } void stop() { Loading Loading @@ -129,7 +142,9 @@ class BrightnessRangeController { float getHdrBrightnessValue() { float hdrBrightness = mHbmController.getHdrBrightnessValue(); return Math.min(hdrBrightness, mHdrClamper.getMaxBrightness()); float brightnessMax = mUseHdrClamper ? mHdrClamper.getMaxBrightness() : PowerManager.BRIGHTNESS_MAX; return Math.min(hdrBrightness, brightnessMax); } float getTransitionPoint() { Loading @@ -151,6 +166,6 @@ class BrightnessRangeController { } public float getHdrTransitionRate() { return mHdrClamper.getTransitionRate(); return mUseHdrClamper ? mHdrClamper.getTransitionRate() : -1; } } services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java +55 −41 Original line number Diff line number Diff line Loading @@ -16,40 +16,41 @@ package com.android.server.display.brightness.clamper; import android.annotation.Nullable; import android.os.Handler; import android.os.PowerManager; import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.config.HdrBrightnessData; import java.util.HashMap; import java.io.PrintWriter; import java.util.Map; public class HdrClamper { private final Configuration mConfiguration = new Configuration(); private final BrightnessClamperController.ClamperChangeListener mClamperChangeListener; private final Handler mHandler; private final Runnable mDebouncer; private float mMaxBrightness = PowerManager.BRIGHTNESS_MAX; @Nullable private HdrBrightnessData mHdrBrightnessData = null; // brightness change speed, in units per seconds, private float mTransitionRate = -1f; private float mAmbientLux = Float.MAX_VALUE; private float mMaxBrightness = PowerManager.BRIGHTNESS_MAX; private float mDesiredMaxBrightness = PowerManager.BRIGHTNESS_MAX; private float mDesiredTransitionDuration = -1; // in seconds // brightness change speed, in units per seconds, private float mTransitionRate = -1f; private float mDesiredTransitionRate = -1f; public HdrClamper(BrightnessClamperController.ClamperChangeListener clamperChangeListener, Handler handler) { mClamperChangeListener = clamperChangeListener; mHandler = handler; mDebouncer = () -> { mTransitionRate = Math.abs((mMaxBrightness - mDesiredMaxBrightness) / mDesiredTransitionDuration); mTransitionRate = mDesiredTransitionRate; mMaxBrightness = mDesiredMaxBrightness; mClamperChangeListener.onChanged(); }; Loading @@ -65,46 +66,74 @@ public class HdrClamper { return mTransitionRate; } /** * Updates brightness cap in response to ambient lux change. * Called by ABC in same looper: mHandler.getLooper() */ public void onAmbientLuxChange(float ambientLux) { float expectedMaxBrightness = findBrightnessLimit(ambientLux); mAmbientLux = ambientLux; recalculateBrightnessCap(mHdrBrightnessData, ambientLux); } /** * Updates brightness cap config. * Called in same looper: mHandler.getLooper() */ public void resetHdrConfig(HdrBrightnessData data) { mHdrBrightnessData = data; recalculateBrightnessCap(data, mAmbientLux); } /** * Dumps the state of HdrClamper. */ public void dump(PrintWriter pw) { pw.println("HdrClamper:"); pw.println(" mMaxBrightness=" + mMaxBrightness); pw.println(" mDesiredMaxBrightness=" + mDesiredMaxBrightness); pw.println(" mTransitionRate=" + mTransitionRate); pw.println(" mDesiredTransitionRate=" + mDesiredTransitionRate); pw.println(" mHdrBrightnessData=" + (mHdrBrightnessData == null ? "null" : mHdrBrightnessData.toString())); pw.println(" mAmbientLux=" + mAmbientLux); } private void recalculateBrightnessCap(HdrBrightnessData data, float ambientLux) { if (data == null) { mHandler.removeCallbacks(mDebouncer); return; } float expectedMaxBrightness = findBrightnessLimit(data, ambientLux); if (mMaxBrightness == expectedMaxBrightness) { mDesiredMaxBrightness = mMaxBrightness; mDesiredTransitionDuration = -1; mDesiredTransitionRate = -1f; mTransitionRate = -1f; mHandler.removeCallbacks(mDebouncer); } else if (mDesiredMaxBrightness != expectedMaxBrightness) { mDesiredMaxBrightness = expectedMaxBrightness; long debounceTime; long transitionDuration; if (mDesiredMaxBrightness > mMaxBrightness) { debounceTime = mConfiguration.mIncreaseConfig.mDebounceTimeMillis; mDesiredTransitionDuration = (float) mConfiguration.mIncreaseConfig.mTransitionTimeMillis / 1000; debounceTime = mHdrBrightnessData.mBrightnessIncreaseDebounceMillis; transitionDuration = mHdrBrightnessData.mBrightnessIncreaseDurationMillis; } else { debounceTime = mConfiguration.mDecreaseConfig.mDebounceTimeMillis; mDesiredTransitionDuration = (float) mConfiguration.mDecreaseConfig.mTransitionTimeMillis / 1000; debounceTime = mHdrBrightnessData.mBrightnessDecreaseDebounceMillis; transitionDuration = mHdrBrightnessData.mBrightnessDecreaseDurationMillis; } mDesiredTransitionRate = Math.abs( (mMaxBrightness - mDesiredMaxBrightness) * 1000f / transitionDuration); mHandler.removeCallbacks(mDebouncer); mHandler.postDelayed(mDebouncer, debounceTime); } } @VisibleForTesting Configuration getConfiguration() { return mConfiguration; } private float findBrightnessLimit(float ambientLux) { private float findBrightnessLimit(HdrBrightnessData data, float ambientLux) { float foundAmbientBoundary = Float.MAX_VALUE; float foundMaxBrightness = PowerManager.BRIGHTNESS_MAX; for (Map.Entry<Float, Float> brightnessPoint : mConfiguration.mMaxBrightnessLimits.entrySet()) { data.mMaxBrightnessLimits.entrySet()) { float ambientBoundary = brightnessPoint.getKey(); // find ambient lux upper boundary closest to current ambient lux if (ambientBoundary > ambientLux && ambientBoundary < foundAmbientBoundary) { Loading @@ -114,19 +143,4 @@ public class HdrClamper { } return foundMaxBrightness; } @VisibleForTesting static class Configuration { final Map<Float, Float> mMaxBrightnessLimits = new HashMap<>(); final TransitionConfiguration mIncreaseConfig = new TransitionConfiguration(); final TransitionConfiguration mDecreaseConfig = new TransitionConfiguration(); } @VisibleForTesting static class TransitionConfiguration { long mDebounceTimeMillis; long mTransitionTimeMillis; } } services/core/java/com/android/server/display/config/HdrBrightnessData.java +4 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.server.display.config; import android.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import java.util.HashMap; import java.util.List; import java.util.Map; Loading Loading @@ -52,7 +54,8 @@ public class HdrBrightnessData { */ public final long mBrightnessDecreaseDurationMillis; private HdrBrightnessData(Map<Float, Float> maxBrightnessLimits, @VisibleForTesting public HdrBrightnessData(Map<Float, Float> maxBrightnessLimits, long brightnessIncreaseDebounceMillis, long brightnessIncreaseDurationMillis, long brightnessDecreaseDebounceMillis, long brightnessDecreaseDurationMillis) { mMaxBrightnessLimits = maxBrightnessLimits; Loading services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +8 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,10 @@ public class DisplayManagerFlags { Flags.FLAG_ENABLE_NBM_CONTROLLER, Flags::enableNbmController); private final FlagState mHdrClamperFlagState = new FlagState( Flags.FLAG_ENABLE_HDR_CLAMPER, Flags::enableHdrClamper); /** Returns whether connected display management is enabled or not. */ public boolean isConnectedDisplayManagementEnabled() { return mConnectedDisplayManagementFlagState.isEnabled(); Loading @@ -49,6 +53,10 @@ public class DisplayManagerFlags { return mNbmControllerFlagState.isEnabled(); } public boolean isHdrClamperEnabled() { return mHdrClamperFlagState.isEnabled(); } private static class FlagState { private final String mName; Loading services/core/java/com/android/server/display/feature/display_flags.aconfig +9 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,14 @@ flag { name: "enable_nbm_controller" namespace: "display_manager" description: "Feature flag for Normal Brightness Mode Controller" bug: "277877297" bug: "299527549" is_fixed_read_only: true } flag { name: "enable_hdr_clamper" namespace: "display_manager" description: "Feature flag for HDR Clamper" bug: "295100043" is_fixed_read_only: true } Loading
services/core/java/com/android/server/display/BrightnessRangeController.java +21 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.display; import android.hardware.display.BrightnessInfo; import android.os.Handler; import android.os.IBinder; import android.os.PowerManager; import com.android.server.display.brightness.clamper.HdrClamper; import com.android.server.display.feature.DisplayManagerFlags; Loading Loading @@ -52,17 +53,26 @@ class BrightnessRangeController { HdrClamper hdrClamper, DisplayManagerFlags flags) { mHbmController = hbmController; mModeChangeCallback = modeChangeCallback; mUseHdrClamper = false; mUseNbmController = flags.isNbmControllerEnabled(); mNormalBrightnessModeController.resetNbmData(displayDeviceConfig.getLuxThrottlingData()); mHdrClamper = hdrClamper; mUseHdrClamper = flags.isHdrClamperEnabled(); mUseNbmController = flags.isNbmControllerEnabled(); if (mUseNbmController) { mNormalBrightnessModeController.resetNbmData( displayDeviceConfig.getLuxThrottlingData()); } if (mUseHdrClamper) { mHdrClamper.resetHdrConfig(displayDeviceConfig.getHdrBrightnessData()); } } void dump(PrintWriter pw) { pw.println("BrightnessRangeController:"); pw.println(" mUseNormalBrightnessController=" + mUseNbmController); pw.println(" mUseHdrClamper=" + mUseHdrClamper); mHbmController.dump(pw); mNormalBrightnessModeController.dump(pw); mHdrClamper.dump(pw); } void onAmbientLuxChange(float ambientLux) { Loading Loading @@ -91,6 +101,9 @@ class BrightnessRangeController { displayDeviceConfig::getHdrBrightnessFromSdr); } ); if (mUseHdrClamper) { mHdrClamper.resetHdrConfig(displayDeviceConfig.getHdrBrightnessData()); } } void stop() { Loading Loading @@ -129,7 +142,9 @@ class BrightnessRangeController { float getHdrBrightnessValue() { float hdrBrightness = mHbmController.getHdrBrightnessValue(); return Math.min(hdrBrightness, mHdrClamper.getMaxBrightness()); float brightnessMax = mUseHdrClamper ? mHdrClamper.getMaxBrightness() : PowerManager.BRIGHTNESS_MAX; return Math.min(hdrBrightness, brightnessMax); } float getTransitionPoint() { Loading @@ -151,6 +166,6 @@ class BrightnessRangeController { } public float getHdrTransitionRate() { return mHdrClamper.getTransitionRate(); return mUseHdrClamper ? mHdrClamper.getTransitionRate() : -1; } }
services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java +55 −41 Original line number Diff line number Diff line Loading @@ -16,40 +16,41 @@ package com.android.server.display.brightness.clamper; import android.annotation.Nullable; import android.os.Handler; import android.os.PowerManager; import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.config.HdrBrightnessData; import java.util.HashMap; import java.io.PrintWriter; import java.util.Map; public class HdrClamper { private final Configuration mConfiguration = new Configuration(); private final BrightnessClamperController.ClamperChangeListener mClamperChangeListener; private final Handler mHandler; private final Runnable mDebouncer; private float mMaxBrightness = PowerManager.BRIGHTNESS_MAX; @Nullable private HdrBrightnessData mHdrBrightnessData = null; // brightness change speed, in units per seconds, private float mTransitionRate = -1f; private float mAmbientLux = Float.MAX_VALUE; private float mMaxBrightness = PowerManager.BRIGHTNESS_MAX; private float mDesiredMaxBrightness = PowerManager.BRIGHTNESS_MAX; private float mDesiredTransitionDuration = -1; // in seconds // brightness change speed, in units per seconds, private float mTransitionRate = -1f; private float mDesiredTransitionRate = -1f; public HdrClamper(BrightnessClamperController.ClamperChangeListener clamperChangeListener, Handler handler) { mClamperChangeListener = clamperChangeListener; mHandler = handler; mDebouncer = () -> { mTransitionRate = Math.abs((mMaxBrightness - mDesiredMaxBrightness) / mDesiredTransitionDuration); mTransitionRate = mDesiredTransitionRate; mMaxBrightness = mDesiredMaxBrightness; mClamperChangeListener.onChanged(); }; Loading @@ -65,46 +66,74 @@ public class HdrClamper { return mTransitionRate; } /** * Updates brightness cap in response to ambient lux change. * Called by ABC in same looper: mHandler.getLooper() */ public void onAmbientLuxChange(float ambientLux) { float expectedMaxBrightness = findBrightnessLimit(ambientLux); mAmbientLux = ambientLux; recalculateBrightnessCap(mHdrBrightnessData, ambientLux); } /** * Updates brightness cap config. * Called in same looper: mHandler.getLooper() */ public void resetHdrConfig(HdrBrightnessData data) { mHdrBrightnessData = data; recalculateBrightnessCap(data, mAmbientLux); } /** * Dumps the state of HdrClamper. */ public void dump(PrintWriter pw) { pw.println("HdrClamper:"); pw.println(" mMaxBrightness=" + mMaxBrightness); pw.println(" mDesiredMaxBrightness=" + mDesiredMaxBrightness); pw.println(" mTransitionRate=" + mTransitionRate); pw.println(" mDesiredTransitionRate=" + mDesiredTransitionRate); pw.println(" mHdrBrightnessData=" + (mHdrBrightnessData == null ? "null" : mHdrBrightnessData.toString())); pw.println(" mAmbientLux=" + mAmbientLux); } private void recalculateBrightnessCap(HdrBrightnessData data, float ambientLux) { if (data == null) { mHandler.removeCallbacks(mDebouncer); return; } float expectedMaxBrightness = findBrightnessLimit(data, ambientLux); if (mMaxBrightness == expectedMaxBrightness) { mDesiredMaxBrightness = mMaxBrightness; mDesiredTransitionDuration = -1; mDesiredTransitionRate = -1f; mTransitionRate = -1f; mHandler.removeCallbacks(mDebouncer); } else if (mDesiredMaxBrightness != expectedMaxBrightness) { mDesiredMaxBrightness = expectedMaxBrightness; long debounceTime; long transitionDuration; if (mDesiredMaxBrightness > mMaxBrightness) { debounceTime = mConfiguration.mIncreaseConfig.mDebounceTimeMillis; mDesiredTransitionDuration = (float) mConfiguration.mIncreaseConfig.mTransitionTimeMillis / 1000; debounceTime = mHdrBrightnessData.mBrightnessIncreaseDebounceMillis; transitionDuration = mHdrBrightnessData.mBrightnessIncreaseDurationMillis; } else { debounceTime = mConfiguration.mDecreaseConfig.mDebounceTimeMillis; mDesiredTransitionDuration = (float) mConfiguration.mDecreaseConfig.mTransitionTimeMillis / 1000; debounceTime = mHdrBrightnessData.mBrightnessDecreaseDebounceMillis; transitionDuration = mHdrBrightnessData.mBrightnessDecreaseDurationMillis; } mDesiredTransitionRate = Math.abs( (mMaxBrightness - mDesiredMaxBrightness) * 1000f / transitionDuration); mHandler.removeCallbacks(mDebouncer); mHandler.postDelayed(mDebouncer, debounceTime); } } @VisibleForTesting Configuration getConfiguration() { return mConfiguration; } private float findBrightnessLimit(float ambientLux) { private float findBrightnessLimit(HdrBrightnessData data, float ambientLux) { float foundAmbientBoundary = Float.MAX_VALUE; float foundMaxBrightness = PowerManager.BRIGHTNESS_MAX; for (Map.Entry<Float, Float> brightnessPoint : mConfiguration.mMaxBrightnessLimits.entrySet()) { data.mMaxBrightnessLimits.entrySet()) { float ambientBoundary = brightnessPoint.getKey(); // find ambient lux upper boundary closest to current ambient lux if (ambientBoundary > ambientLux && ambientBoundary < foundAmbientBoundary) { Loading @@ -114,19 +143,4 @@ public class HdrClamper { } return foundMaxBrightness; } @VisibleForTesting static class Configuration { final Map<Float, Float> mMaxBrightnessLimits = new HashMap<>(); final TransitionConfiguration mIncreaseConfig = new TransitionConfiguration(); final TransitionConfiguration mDecreaseConfig = new TransitionConfiguration(); } @VisibleForTesting static class TransitionConfiguration { long mDebounceTimeMillis; long mTransitionTimeMillis; } }
services/core/java/com/android/server/display/config/HdrBrightnessData.java +4 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.server.display.config; import android.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import java.util.HashMap; import java.util.List; import java.util.Map; Loading Loading @@ -52,7 +54,8 @@ public class HdrBrightnessData { */ public final long mBrightnessDecreaseDurationMillis; private HdrBrightnessData(Map<Float, Float> maxBrightnessLimits, @VisibleForTesting public HdrBrightnessData(Map<Float, Float> maxBrightnessLimits, long brightnessIncreaseDebounceMillis, long brightnessIncreaseDurationMillis, long brightnessDecreaseDebounceMillis, long brightnessDecreaseDurationMillis) { mMaxBrightnessLimits = maxBrightnessLimits; Loading
services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +8 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,10 @@ public class DisplayManagerFlags { Flags.FLAG_ENABLE_NBM_CONTROLLER, Flags::enableNbmController); private final FlagState mHdrClamperFlagState = new FlagState( Flags.FLAG_ENABLE_HDR_CLAMPER, Flags::enableHdrClamper); /** Returns whether connected display management is enabled or not. */ public boolean isConnectedDisplayManagementEnabled() { return mConnectedDisplayManagementFlagState.isEnabled(); Loading @@ -49,6 +53,10 @@ public class DisplayManagerFlags { return mNbmControllerFlagState.isEnabled(); } public boolean isHdrClamperEnabled() { return mHdrClamperFlagState.isEnabled(); } private static class FlagState { private final String mName; Loading
services/core/java/com/android/server/display/feature/display_flags.aconfig +9 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,14 @@ flag { name: "enable_nbm_controller" namespace: "display_manager" description: "Feature flag for Normal Brightness Mode Controller" bug: "277877297" bug: "299527549" is_fixed_read_only: true } flag { name: "enable_hdr_clamper" namespace: "display_manager" description: "Feature flag for HDR Clamper" bug: "295100043" is_fixed_read_only: true }