Loading services/core/java/com/android/server/display/BrightnessMappingStrategy.java +17 −6 Original line number Diff line number Diff line Loading @@ -121,6 +121,7 @@ public abstract class BrightnessMappingStrategy { // Display independent, mode dependent values float[] brightnessLevelsNits; float[] brightnessLevels = null; float[] luxLevels; if (isForIdleMode) { brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( Loading @@ -130,11 +131,21 @@ public abstract class BrightnessMappingStrategy { } else { brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(); if (brightnessLevels == null || brightnessLevels.length == 0) { // Load the old configuration in the range [0, 255]. The values need to be // normalized to the range [0, 1]. int[] brightnessLevelsInt = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); brightnessLevels = new float[brightnessLevelsInt.length]; for (int i = 0; i < brightnessLevels.length; i++) { brightnessLevels[i] = normalizeAbsoluteBrightness(brightnessLevelsInt[i]); } } } // Display independent, mode independent values int[] brightnessLevelsBacklight = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); float autoBrightnessAdjustmentMaxGamma = resources.getFraction( com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma, 1, 1); Loading @@ -155,8 +166,8 @@ public abstract class BrightnessMappingStrategy { builder.setShortTermModelUpperLuxMultiplier(SHORT_TERM_MODEL_THRESHOLD_RATIO); return new PhysicalMappingStrategy(builder.build(), nitsRange, brightnessRange, autoBrightnessAdjustmentMaxGamma, isForIdleMode, displayWhiteBalanceController); } else if (isValidMapping(luxLevels, brightnessLevelsBacklight) && !isForIdleMode) { return new SimpleMappingStrategy(luxLevels, brightnessLevelsBacklight, } else if (isValidMapping(luxLevels, brightnessLevels)) { return new SimpleMappingStrategy(luxLevels, brightnessLevels, autoBrightnessAdjustmentMaxGamma, shortTermModelTimeout); } else { return null; Loading Loading @@ -620,7 +631,7 @@ public abstract class BrightnessMappingStrategy { private float mUserBrightness; private long mShortTermModelTimeout; private SimpleMappingStrategy(float[] lux, int[] brightness, float maxGamma, private SimpleMappingStrategy(float[] lux, float[] brightness, float maxGamma, long timeout) { Preconditions.checkArgument(lux.length != 0 && brightness.length != 0, "Lux and brightness arrays must not be empty!"); Loading @@ -635,7 +646,7 @@ public abstract class BrightnessMappingStrategy { mBrightness = new float[N]; for (int i = 0; i < N; i++) { mLux[i] = lux[i]; mBrightness[i] = normalizeAbsoluteBrightness(brightness[i]); mBrightness[i] = brightness[i]; } mMaxGamma = maxGamma; Loading services/core/java/com/android/server/display/DisplayAdapter.java +10 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import android.content.Context; import android.os.Handler; import android.view.Display; import com.android.server.display.feature.DisplayManagerFlags; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicInteger; Loading @@ -39,6 +41,7 @@ abstract class DisplayAdapter { private final Handler mHandler; private final Listener mListener; private final String mName; private final DisplayManagerFlags mFeatureFlags; public static final int DISPLAY_DEVICE_EVENT_ADDED = 1; public static final int DISPLAY_DEVICE_EVENT_CHANGED = 2; Loading @@ -50,13 +53,14 @@ abstract class DisplayAdapter { private static final AtomicInteger NEXT_DISPLAY_MODE_ID = new AtomicInteger(1); // 0 = no mode. // Called with SyncRoot lock held. public DisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener, String name) { DisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener, String name, DisplayManagerFlags featureFlags) { mSyncRoot = syncRoot; mContext = context; mHandler = handler; mListener = listener; mName = name; mFeatureFlags = featureFlags; } /** Loading Loading @@ -88,6 +92,10 @@ abstract class DisplayAdapter { return mName; } public final DisplayManagerFlags getFeatureFlags() { return mFeatureFlags; } /** * Registers the display adapter with the display manager. * Loading services/core/java/com/android/server/display/DisplayDevice.java +2 −1 Original line number Diff line number Diff line Loading @@ -400,6 +400,7 @@ abstract class DisplayDevice { } private DisplayDeviceConfig loadDisplayDeviceConfig() { return DisplayDeviceConfig.create(mContext, false); return DisplayDeviceConfig.create(mContext, /* useConfigXml= */ false, mDisplayAdapter.getFeatureFlags()); } } services/core/java/com/android/server/display/DisplayDeviceConfig.java +82 −56 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ import com.android.server.display.config.HdrBrightnessData; import com.android.server.display.config.HighBrightnessMode; import com.android.server.display.config.IntegerArray; import com.android.server.display.config.LuxThrottling; import com.android.server.display.config.LuxToBrightnessMapping; import com.android.server.display.config.NitsMap; import com.android.server.display.config.NonNegativeFloatToFloatPoint; import com.android.server.display.config.Point; Loading @@ -77,6 +78,7 @@ import com.android.server.display.config.ThermalThrottling; import com.android.server.display.config.ThresholdPoint; import com.android.server.display.config.UsiVersion; import com.android.server.display.config.XmlParser; import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.display.utils.DebugUtils; import org.xmlpull.v1.XmlPullParserException; Loading Loading @@ -310,16 +312,18 @@ import javax.xml.datatype.DatatypeConfigurationException; * <darkeningLightDebounceIdleMillis> * 1000 * </darkeningLightDebounceIdleMillis> * <displayBrightnessMapping> * <displayBrightnessPoint> * <lux>50</lux> * <nits>45.32</nits> * </displayBrightnessPoint> * <displayBrightnessPoint> * <lux>80</lux> * <nits>75.43</nits> * </displayBrightnessPoint> * </displayBrightnessMapping> * <luxToBrightnessMapping> * <map> * <point> * <first>0</first> * <second>0.2</second> * </point> * <point> * <first>80</first> * <second>0.3</second> * </point> * </map> * </luxToBrightnessMapping> * </autoBrightness> * * <screenBrightnessRampFastDecrease>0.01</screenBrightnessRampFastDecrease> Loading Loading @@ -630,7 +634,6 @@ public class DisplayDeviceConfig { // for the corresponding values above private float[] mBrightness; /** * Array of desired screen brightness in nits corresponding to the lux values * in the mBrightnessLevelsLux array. The display brightness is defined as the Loading @@ -640,20 +643,25 @@ public class DisplayDeviceConfig { private float[] mBrightnessLevelsNits; /** * Array of light sensor lux values to define our levels for auto backlight * brightness support. * Array of desired screen brightness corresponding to the lux values * in the mBrightnessLevelsLux array. The brightness values must be non-negative and * non-decreasing. They must be between {@link PowerManager.BRIGHTNESS_MIN} and * {@link PowerManager.BRIGHTNESS_MAX}. This must be overridden in platform specific overlays */ private float[] mBrightnessLevels; /** * Array of light sensor lux values to define our levels for auto-brightness support. * * The N + 1 entries of this array define N control points defined in mBrightnessLevelsNits, * with first value always being 0 lux * The first lux value is always 0. * * The control points must be strictly increasing. Each control point * corresponds to an entry in the brightness backlight values arrays. * For example, if lux == level[1] (second element of the levels array) * then the brightness will be determined by value[0] (first element * of the brightness values array). * The control points must be strictly increasing. Each control point corresponds to an entry * in the brightness values arrays. For example, if lux == luxLevels[1] (second element * of the levels array) then the brightness will be determined by brightnessLevels[1] (second * element of the brightness values array). * * Spline interpolation is used to determine the auto-brightness * backlight values for lux levels between these control points. * Spline interpolation is used to determine the auto-brightness values for lux levels between * these control points. */ private float[] mBrightnessLevelsLux; Loading Loading @@ -849,9 +857,12 @@ public class DisplayDeviceConfig { */ private float mBrightnessCapForWearBedtimeMode; private final DisplayManagerFlags mFlags; @VisibleForTesting DisplayDeviceConfig(Context context) { DisplayDeviceConfig(Context context, DisplayManagerFlags flags) { mContext = context; mFlags = flags; } /** Loading @@ -867,9 +878,9 @@ public class DisplayDeviceConfig { * @return A configuration instance for the specified display. */ public static DisplayDeviceConfig create(Context context, long physicalDisplayId, boolean isFirstDisplay) { boolean isFirstDisplay, DisplayManagerFlags flags) { final DisplayDeviceConfig config = createWithoutDefaultValues(context, physicalDisplayId, isFirstDisplay); isFirstDisplay, flags); config.copyUninitializedValuesFromSecondaryConfig(loadDefaultConfigurationXml(context)); return config; Loading @@ -884,28 +895,29 @@ public class DisplayDeviceConfig { * or the default values. * @return A configuration instance. */ public static DisplayDeviceConfig create(Context context, boolean useConfigXml) { public static DisplayDeviceConfig create(Context context, boolean useConfigXml, DisplayManagerFlags flags) { final DisplayDeviceConfig config; if (useConfigXml) { config = getConfigFromGlobalXml(context); config = getConfigFromGlobalXml(context, flags); } else { config = getConfigFromPmValues(context); config = getConfigFromPmValues(context, flags); } return config; } private static DisplayDeviceConfig createWithoutDefaultValues(Context context, long physicalDisplayId, boolean isFirstDisplay) { long physicalDisplayId, boolean isFirstDisplay, DisplayManagerFlags flags) { DisplayDeviceConfig config; config = loadConfigFromDirectory(context, Environment.getProductDirectory(), physicalDisplayId); physicalDisplayId, flags); if (config != null) { return config; } config = loadConfigFromDirectory(context, Environment.getVendorDirectory(), physicalDisplayId); physicalDisplayId, flags); if (config != null) { return config; } Loading @@ -913,7 +925,7 @@ public class DisplayDeviceConfig { // If no config can be loaded from any ddc xml at all, // prepare a whole config using the global config.xml. // Guaranteed not null return create(context, isFirstDisplay); return create(context, isFirstDisplay, flags); } private static DisplayConfiguration loadDefaultConfigurationXml(Context context) { Loading Loading @@ -966,18 +978,19 @@ public class DisplayDeviceConfig { } private static DisplayDeviceConfig loadConfigFromDirectory(Context context, File baseDirectory, long physicalDisplayId) { File baseDirectory, long physicalDisplayId, DisplayManagerFlags flags) { DisplayDeviceConfig config; // Create config using filename from physical ID (including "stable" bit). config = getConfigFromSuffix(context, baseDirectory, STABLE_ID_SUFFIX_FORMAT, physicalDisplayId); physicalDisplayId, flags); if (config != null) { return config; } // Create config using filename from physical ID (excluding "stable" bit). final long withoutStableFlag = physicalDisplayId & ~STABLE_FLAG; config = getConfigFromSuffix(context, baseDirectory, NO_SUFFIX_FORMAT, withoutStableFlag); config = getConfigFromSuffix(context, baseDirectory, NO_SUFFIX_FORMAT, withoutStableFlag, flags); if (config != null) { return config; } Loading @@ -986,7 +999,7 @@ public class DisplayDeviceConfig { final DisplayAddress.Physical physicalAddress = DisplayAddress.fromPhysicalDisplayId(physicalDisplayId); int port = physicalAddress.getPort(); config = getConfigFromSuffix(context, baseDirectory, PORT_SUFFIX_FORMAT, port); config = getConfigFromSuffix(context, baseDirectory, PORT_SUFFIX_FORMAT, port, flags); return config; } Loading Loading @@ -1604,6 +1617,13 @@ public class DisplayDeviceConfig { return mBrightnessLevelsNits; } /** * @return Auto brightness brightening levels */ public float[] getAutoBrightnessBrighteningLevels() { return mBrightnessLevels; } /** * @return Default peak refresh rate of the associated display */ Loading Loading @@ -1857,6 +1877,7 @@ public class DisplayDeviceConfig { + mAutoBrightnessDarkeningLightDebounceIdle + ", mBrightnessLevelsLux= " + Arrays.toString(mBrightnessLevelsLux) + ", mBrightnessLevelsNits= " + Arrays.toString(mBrightnessLevelsNits) + ", mBrightnessLevels= " + Arrays.toString(mBrightnessLevels) + ", mDdcAutoBrightnessAvailable= " + mDdcAutoBrightnessAvailable + ", mAutoBrightnessAvailable= " + mAutoBrightnessAvailable + "\n" Loading Loading @@ -1890,27 +1911,29 @@ public class DisplayDeviceConfig { } private static DisplayDeviceConfig getConfigFromSuffix(Context context, File baseDirectory, String suffixFormat, long idNumber) { String suffixFormat, long idNumber, DisplayManagerFlags flags) { final String suffix = String.format(Locale.ROOT, suffixFormat, idNumber); final String filename = String.format(Locale.ROOT, CONFIG_FILE_FORMAT, suffix); final File filePath = Environment.buildPath( baseDirectory, ETC_DIR, DISPLAY_CONFIG_DIR, filename); final DisplayDeviceConfig config = new DisplayDeviceConfig(context); final DisplayDeviceConfig config = new DisplayDeviceConfig(context, flags); if (config.initFromFile(filePath)) { return config; } return null; } private static DisplayDeviceConfig getConfigFromGlobalXml(Context context) { DisplayDeviceConfig config = new DisplayDeviceConfig(context); private static DisplayDeviceConfig getConfigFromGlobalXml(Context context, DisplayManagerFlags flags) { DisplayDeviceConfig config = new DisplayDeviceConfig(context, flags); config.initFromGlobalXml(); return config; } private static DisplayDeviceConfig getConfigFromPmValues(Context context) { DisplayDeviceConfig config = new DisplayDeviceConfig(context); private static DisplayDeviceConfig getConfigFromPmValues(Context context, DisplayManagerFlags flags) { DisplayDeviceConfig config = new DisplayDeviceConfig(context, flags); config.initFromDefaultValues(); return config; } Loading Loading @@ -2615,8 +2638,23 @@ public class DisplayDeviceConfig { * loading the value from the display config, and if not present, falls back to config.xml. */ private void loadAutoBrightnessDisplayBrightnessMapping(AutoBrightness autoBrightnessConfig) { if (autoBrightnessConfig == null || autoBrightnessConfig.getDisplayBrightnessMapping() == null) { if (mFlags.areAutoBrightnessModesEnabled() && autoBrightnessConfig != null && autoBrightnessConfig.getLuxToBrightnessMapping() != null) { LuxToBrightnessMapping mapping = autoBrightnessConfig.getLuxToBrightnessMapping(); final int size = mapping.getMap().getPoint().size(); mBrightnessLevels = new float[size]; mBrightnessLevelsLux = new float[size]; for (int i = 0; i < size; i++) { float backlight = mapping.getMap().getPoint().get(i).getSecond().floatValue(); mBrightnessLevels[i] = mBacklightToBrightnessSpline.interpolate(backlight); mBrightnessLevelsLux[i] = mapping.getMap().getPoint().get(i).getFirst() .floatValue(); } if (size > 0 && mBrightnessLevelsLux[0] != 0) { throw new IllegalArgumentException( "The first lux value in the display brightness mapping must be 0"); } } else { mBrightnessLevelsNits = getFloatArray(mContext.getResources() .obtainTypedArray(com.android.internal.R.array .config_autoBrightnessDisplayValuesNits), PowerManager Loading @@ -2624,18 +2662,6 @@ public class DisplayDeviceConfig { mBrightnessLevelsLux = getLuxLevels(mContext.getResources() .getIntArray(com.android.internal.R.array .config_autoBrightnessLevels)); } else { final int size = autoBrightnessConfig.getDisplayBrightnessMapping() .getDisplayBrightnessPoint().size(); mBrightnessLevelsNits = new float[size]; // The first control point is implicit and always at 0 lux. mBrightnessLevelsLux = new float[size + 1]; for (int i = 0; i < size; i++) { mBrightnessLevelsNits[i] = autoBrightnessConfig.getDisplayBrightnessMapping() .getDisplayBrightnessPoint().get(i).getNits().floatValue(); mBrightnessLevelsLux[i + 1] = autoBrightnessConfig.getDisplayBrightnessMapping() .getDisplayBrightnessPoint().get(i).getLux().floatValue(); } } } Loading services/core/java/com/android/server/display/DisplayManagerService.java +7 −5 Original line number Diff line number Diff line Loading @@ -1853,7 +1853,7 @@ public final class DisplayManagerService extends SystemService { // early apps like SetupWizard/Launcher. In particular, SUW is displayed using // the virtual display inside VR before any VR-specific apps even run. mVirtualDisplayAdapter = mInjector.getVirtualDisplayAdapter(mSyncRoot, mContext, mHandler, mDisplayDeviceRepo); mHandler, mDisplayDeviceRepo, mFlags); if (mVirtualDisplayAdapter != null) { registerDisplayAdapterLocked(mVirtualDisplayAdapter); } Loading @@ -1871,7 +1871,7 @@ public final class DisplayManagerService extends SystemService { private void registerOverlayDisplayAdapterLocked() { registerDisplayAdapterLocked(new OverlayDisplayAdapter( mSyncRoot, mContext, mHandler, mDisplayDeviceRepo, mUiHandler)); mSyncRoot, mContext, mHandler, mDisplayDeviceRepo, mUiHandler, mFlags)); } private void registerWifiDisplayAdapterLocked() { Loading @@ -1880,7 +1880,7 @@ public final class DisplayManagerService extends SystemService { || SystemProperties.getInt(FORCE_WIFI_DISPLAY_ENABLE, -1) == 1) { mWifiDisplayAdapter = new WifiDisplayAdapter( mSyncRoot, mContext, mHandler, mDisplayDeviceRepo, mPersistentDataStore); mPersistentDataStore, mFlags); registerDisplayAdapterLocked(mWifiDisplayAdapter); } } Loading Loading @@ -3288,8 +3288,10 @@ public final class DisplayManagerService extends SystemService { @VisibleForTesting static class Injector { VirtualDisplayAdapter getVirtualDisplayAdapter(SyncRoot syncRoot, Context context, Handler handler, DisplayAdapter.Listener displayAdapterListener) { return new VirtualDisplayAdapter(syncRoot, context, handler, displayAdapterListener); Handler handler, DisplayAdapter.Listener displayAdapterListener, DisplayManagerFlags flags) { return new VirtualDisplayAdapter(syncRoot, context, handler, displayAdapterListener, flags); } LocalDisplayAdapter getLocalDisplayAdapter(SyncRoot syncRoot, Context context, Loading Loading
services/core/java/com/android/server/display/BrightnessMappingStrategy.java +17 −6 Original line number Diff line number Diff line Loading @@ -121,6 +121,7 @@ public abstract class BrightnessMappingStrategy { // Display independent, mode dependent values float[] brightnessLevelsNits; float[] brightnessLevels = null; float[] luxLevels; if (isForIdleMode) { brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( Loading @@ -130,11 +131,21 @@ public abstract class BrightnessMappingStrategy { } else { brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(); if (brightnessLevels == null || brightnessLevels.length == 0) { // Load the old configuration in the range [0, 255]. The values need to be // normalized to the range [0, 1]. int[] brightnessLevelsInt = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); brightnessLevels = new float[brightnessLevelsInt.length]; for (int i = 0; i < brightnessLevels.length; i++) { brightnessLevels[i] = normalizeAbsoluteBrightness(brightnessLevelsInt[i]); } } } // Display independent, mode independent values int[] brightnessLevelsBacklight = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); float autoBrightnessAdjustmentMaxGamma = resources.getFraction( com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma, 1, 1); Loading @@ -155,8 +166,8 @@ public abstract class BrightnessMappingStrategy { builder.setShortTermModelUpperLuxMultiplier(SHORT_TERM_MODEL_THRESHOLD_RATIO); return new PhysicalMappingStrategy(builder.build(), nitsRange, brightnessRange, autoBrightnessAdjustmentMaxGamma, isForIdleMode, displayWhiteBalanceController); } else if (isValidMapping(luxLevels, brightnessLevelsBacklight) && !isForIdleMode) { return new SimpleMappingStrategy(luxLevels, brightnessLevelsBacklight, } else if (isValidMapping(luxLevels, brightnessLevels)) { return new SimpleMappingStrategy(luxLevels, brightnessLevels, autoBrightnessAdjustmentMaxGamma, shortTermModelTimeout); } else { return null; Loading Loading @@ -620,7 +631,7 @@ public abstract class BrightnessMappingStrategy { private float mUserBrightness; private long mShortTermModelTimeout; private SimpleMappingStrategy(float[] lux, int[] brightness, float maxGamma, private SimpleMappingStrategy(float[] lux, float[] brightness, float maxGamma, long timeout) { Preconditions.checkArgument(lux.length != 0 && brightness.length != 0, "Lux and brightness arrays must not be empty!"); Loading @@ -635,7 +646,7 @@ public abstract class BrightnessMappingStrategy { mBrightness = new float[N]; for (int i = 0; i < N; i++) { mLux[i] = lux[i]; mBrightness[i] = normalizeAbsoluteBrightness(brightness[i]); mBrightness[i] = brightness[i]; } mMaxGamma = maxGamma; Loading
services/core/java/com/android/server/display/DisplayAdapter.java +10 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import android.content.Context; import android.os.Handler; import android.view.Display; import com.android.server.display.feature.DisplayManagerFlags; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicInteger; Loading @@ -39,6 +41,7 @@ abstract class DisplayAdapter { private final Handler mHandler; private final Listener mListener; private final String mName; private final DisplayManagerFlags mFeatureFlags; public static final int DISPLAY_DEVICE_EVENT_ADDED = 1; public static final int DISPLAY_DEVICE_EVENT_CHANGED = 2; Loading @@ -50,13 +53,14 @@ abstract class DisplayAdapter { private static final AtomicInteger NEXT_DISPLAY_MODE_ID = new AtomicInteger(1); // 0 = no mode. // Called with SyncRoot lock held. public DisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener, String name) { DisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener, String name, DisplayManagerFlags featureFlags) { mSyncRoot = syncRoot; mContext = context; mHandler = handler; mListener = listener; mName = name; mFeatureFlags = featureFlags; } /** Loading Loading @@ -88,6 +92,10 @@ abstract class DisplayAdapter { return mName; } public final DisplayManagerFlags getFeatureFlags() { return mFeatureFlags; } /** * Registers the display adapter with the display manager. * Loading
services/core/java/com/android/server/display/DisplayDevice.java +2 −1 Original line number Diff line number Diff line Loading @@ -400,6 +400,7 @@ abstract class DisplayDevice { } private DisplayDeviceConfig loadDisplayDeviceConfig() { return DisplayDeviceConfig.create(mContext, false); return DisplayDeviceConfig.create(mContext, /* useConfigXml= */ false, mDisplayAdapter.getFeatureFlags()); } }
services/core/java/com/android/server/display/DisplayDeviceConfig.java +82 −56 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ import com.android.server.display.config.HdrBrightnessData; import com.android.server.display.config.HighBrightnessMode; import com.android.server.display.config.IntegerArray; import com.android.server.display.config.LuxThrottling; import com.android.server.display.config.LuxToBrightnessMapping; import com.android.server.display.config.NitsMap; import com.android.server.display.config.NonNegativeFloatToFloatPoint; import com.android.server.display.config.Point; Loading @@ -77,6 +78,7 @@ import com.android.server.display.config.ThermalThrottling; import com.android.server.display.config.ThresholdPoint; import com.android.server.display.config.UsiVersion; import com.android.server.display.config.XmlParser; import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.display.utils.DebugUtils; import org.xmlpull.v1.XmlPullParserException; Loading Loading @@ -310,16 +312,18 @@ import javax.xml.datatype.DatatypeConfigurationException; * <darkeningLightDebounceIdleMillis> * 1000 * </darkeningLightDebounceIdleMillis> * <displayBrightnessMapping> * <displayBrightnessPoint> * <lux>50</lux> * <nits>45.32</nits> * </displayBrightnessPoint> * <displayBrightnessPoint> * <lux>80</lux> * <nits>75.43</nits> * </displayBrightnessPoint> * </displayBrightnessMapping> * <luxToBrightnessMapping> * <map> * <point> * <first>0</first> * <second>0.2</second> * </point> * <point> * <first>80</first> * <second>0.3</second> * </point> * </map> * </luxToBrightnessMapping> * </autoBrightness> * * <screenBrightnessRampFastDecrease>0.01</screenBrightnessRampFastDecrease> Loading Loading @@ -630,7 +634,6 @@ public class DisplayDeviceConfig { // for the corresponding values above private float[] mBrightness; /** * Array of desired screen brightness in nits corresponding to the lux values * in the mBrightnessLevelsLux array. The display brightness is defined as the Loading @@ -640,20 +643,25 @@ public class DisplayDeviceConfig { private float[] mBrightnessLevelsNits; /** * Array of light sensor lux values to define our levels for auto backlight * brightness support. * Array of desired screen brightness corresponding to the lux values * in the mBrightnessLevelsLux array. The brightness values must be non-negative and * non-decreasing. They must be between {@link PowerManager.BRIGHTNESS_MIN} and * {@link PowerManager.BRIGHTNESS_MAX}. This must be overridden in platform specific overlays */ private float[] mBrightnessLevels; /** * Array of light sensor lux values to define our levels for auto-brightness support. * * The N + 1 entries of this array define N control points defined in mBrightnessLevelsNits, * with first value always being 0 lux * The first lux value is always 0. * * The control points must be strictly increasing. Each control point * corresponds to an entry in the brightness backlight values arrays. * For example, if lux == level[1] (second element of the levels array) * then the brightness will be determined by value[0] (first element * of the brightness values array). * The control points must be strictly increasing. Each control point corresponds to an entry * in the brightness values arrays. For example, if lux == luxLevels[1] (second element * of the levels array) then the brightness will be determined by brightnessLevels[1] (second * element of the brightness values array). * * Spline interpolation is used to determine the auto-brightness * backlight values for lux levels between these control points. * Spline interpolation is used to determine the auto-brightness values for lux levels between * these control points. */ private float[] mBrightnessLevelsLux; Loading Loading @@ -849,9 +857,12 @@ public class DisplayDeviceConfig { */ private float mBrightnessCapForWearBedtimeMode; private final DisplayManagerFlags mFlags; @VisibleForTesting DisplayDeviceConfig(Context context) { DisplayDeviceConfig(Context context, DisplayManagerFlags flags) { mContext = context; mFlags = flags; } /** Loading @@ -867,9 +878,9 @@ public class DisplayDeviceConfig { * @return A configuration instance for the specified display. */ public static DisplayDeviceConfig create(Context context, long physicalDisplayId, boolean isFirstDisplay) { boolean isFirstDisplay, DisplayManagerFlags flags) { final DisplayDeviceConfig config = createWithoutDefaultValues(context, physicalDisplayId, isFirstDisplay); isFirstDisplay, flags); config.copyUninitializedValuesFromSecondaryConfig(loadDefaultConfigurationXml(context)); return config; Loading @@ -884,28 +895,29 @@ public class DisplayDeviceConfig { * or the default values. * @return A configuration instance. */ public static DisplayDeviceConfig create(Context context, boolean useConfigXml) { public static DisplayDeviceConfig create(Context context, boolean useConfigXml, DisplayManagerFlags flags) { final DisplayDeviceConfig config; if (useConfigXml) { config = getConfigFromGlobalXml(context); config = getConfigFromGlobalXml(context, flags); } else { config = getConfigFromPmValues(context); config = getConfigFromPmValues(context, flags); } return config; } private static DisplayDeviceConfig createWithoutDefaultValues(Context context, long physicalDisplayId, boolean isFirstDisplay) { long physicalDisplayId, boolean isFirstDisplay, DisplayManagerFlags flags) { DisplayDeviceConfig config; config = loadConfigFromDirectory(context, Environment.getProductDirectory(), physicalDisplayId); physicalDisplayId, flags); if (config != null) { return config; } config = loadConfigFromDirectory(context, Environment.getVendorDirectory(), physicalDisplayId); physicalDisplayId, flags); if (config != null) { return config; } Loading @@ -913,7 +925,7 @@ public class DisplayDeviceConfig { // If no config can be loaded from any ddc xml at all, // prepare a whole config using the global config.xml. // Guaranteed not null return create(context, isFirstDisplay); return create(context, isFirstDisplay, flags); } private static DisplayConfiguration loadDefaultConfigurationXml(Context context) { Loading Loading @@ -966,18 +978,19 @@ public class DisplayDeviceConfig { } private static DisplayDeviceConfig loadConfigFromDirectory(Context context, File baseDirectory, long physicalDisplayId) { File baseDirectory, long physicalDisplayId, DisplayManagerFlags flags) { DisplayDeviceConfig config; // Create config using filename from physical ID (including "stable" bit). config = getConfigFromSuffix(context, baseDirectory, STABLE_ID_SUFFIX_FORMAT, physicalDisplayId); physicalDisplayId, flags); if (config != null) { return config; } // Create config using filename from physical ID (excluding "stable" bit). final long withoutStableFlag = physicalDisplayId & ~STABLE_FLAG; config = getConfigFromSuffix(context, baseDirectory, NO_SUFFIX_FORMAT, withoutStableFlag); config = getConfigFromSuffix(context, baseDirectory, NO_SUFFIX_FORMAT, withoutStableFlag, flags); if (config != null) { return config; } Loading @@ -986,7 +999,7 @@ public class DisplayDeviceConfig { final DisplayAddress.Physical physicalAddress = DisplayAddress.fromPhysicalDisplayId(physicalDisplayId); int port = physicalAddress.getPort(); config = getConfigFromSuffix(context, baseDirectory, PORT_SUFFIX_FORMAT, port); config = getConfigFromSuffix(context, baseDirectory, PORT_SUFFIX_FORMAT, port, flags); return config; } Loading Loading @@ -1604,6 +1617,13 @@ public class DisplayDeviceConfig { return mBrightnessLevelsNits; } /** * @return Auto brightness brightening levels */ public float[] getAutoBrightnessBrighteningLevels() { return mBrightnessLevels; } /** * @return Default peak refresh rate of the associated display */ Loading Loading @@ -1857,6 +1877,7 @@ public class DisplayDeviceConfig { + mAutoBrightnessDarkeningLightDebounceIdle + ", mBrightnessLevelsLux= " + Arrays.toString(mBrightnessLevelsLux) + ", mBrightnessLevelsNits= " + Arrays.toString(mBrightnessLevelsNits) + ", mBrightnessLevels= " + Arrays.toString(mBrightnessLevels) + ", mDdcAutoBrightnessAvailable= " + mDdcAutoBrightnessAvailable + ", mAutoBrightnessAvailable= " + mAutoBrightnessAvailable + "\n" Loading Loading @@ -1890,27 +1911,29 @@ public class DisplayDeviceConfig { } private static DisplayDeviceConfig getConfigFromSuffix(Context context, File baseDirectory, String suffixFormat, long idNumber) { String suffixFormat, long idNumber, DisplayManagerFlags flags) { final String suffix = String.format(Locale.ROOT, suffixFormat, idNumber); final String filename = String.format(Locale.ROOT, CONFIG_FILE_FORMAT, suffix); final File filePath = Environment.buildPath( baseDirectory, ETC_DIR, DISPLAY_CONFIG_DIR, filename); final DisplayDeviceConfig config = new DisplayDeviceConfig(context); final DisplayDeviceConfig config = new DisplayDeviceConfig(context, flags); if (config.initFromFile(filePath)) { return config; } return null; } private static DisplayDeviceConfig getConfigFromGlobalXml(Context context) { DisplayDeviceConfig config = new DisplayDeviceConfig(context); private static DisplayDeviceConfig getConfigFromGlobalXml(Context context, DisplayManagerFlags flags) { DisplayDeviceConfig config = new DisplayDeviceConfig(context, flags); config.initFromGlobalXml(); return config; } private static DisplayDeviceConfig getConfigFromPmValues(Context context) { DisplayDeviceConfig config = new DisplayDeviceConfig(context); private static DisplayDeviceConfig getConfigFromPmValues(Context context, DisplayManagerFlags flags) { DisplayDeviceConfig config = new DisplayDeviceConfig(context, flags); config.initFromDefaultValues(); return config; } Loading Loading @@ -2615,8 +2638,23 @@ public class DisplayDeviceConfig { * loading the value from the display config, and if not present, falls back to config.xml. */ private void loadAutoBrightnessDisplayBrightnessMapping(AutoBrightness autoBrightnessConfig) { if (autoBrightnessConfig == null || autoBrightnessConfig.getDisplayBrightnessMapping() == null) { if (mFlags.areAutoBrightnessModesEnabled() && autoBrightnessConfig != null && autoBrightnessConfig.getLuxToBrightnessMapping() != null) { LuxToBrightnessMapping mapping = autoBrightnessConfig.getLuxToBrightnessMapping(); final int size = mapping.getMap().getPoint().size(); mBrightnessLevels = new float[size]; mBrightnessLevelsLux = new float[size]; for (int i = 0; i < size; i++) { float backlight = mapping.getMap().getPoint().get(i).getSecond().floatValue(); mBrightnessLevels[i] = mBacklightToBrightnessSpline.interpolate(backlight); mBrightnessLevelsLux[i] = mapping.getMap().getPoint().get(i).getFirst() .floatValue(); } if (size > 0 && mBrightnessLevelsLux[0] != 0) { throw new IllegalArgumentException( "The first lux value in the display brightness mapping must be 0"); } } else { mBrightnessLevelsNits = getFloatArray(mContext.getResources() .obtainTypedArray(com.android.internal.R.array .config_autoBrightnessDisplayValuesNits), PowerManager Loading @@ -2624,18 +2662,6 @@ public class DisplayDeviceConfig { mBrightnessLevelsLux = getLuxLevels(mContext.getResources() .getIntArray(com.android.internal.R.array .config_autoBrightnessLevels)); } else { final int size = autoBrightnessConfig.getDisplayBrightnessMapping() .getDisplayBrightnessPoint().size(); mBrightnessLevelsNits = new float[size]; // The first control point is implicit and always at 0 lux. mBrightnessLevelsLux = new float[size + 1]; for (int i = 0; i < size; i++) { mBrightnessLevelsNits[i] = autoBrightnessConfig.getDisplayBrightnessMapping() .getDisplayBrightnessPoint().get(i).getNits().floatValue(); mBrightnessLevelsLux[i + 1] = autoBrightnessConfig.getDisplayBrightnessMapping() .getDisplayBrightnessPoint().get(i).getLux().floatValue(); } } } Loading
services/core/java/com/android/server/display/DisplayManagerService.java +7 −5 Original line number Diff line number Diff line Loading @@ -1853,7 +1853,7 @@ public final class DisplayManagerService extends SystemService { // early apps like SetupWizard/Launcher. In particular, SUW is displayed using // the virtual display inside VR before any VR-specific apps even run. mVirtualDisplayAdapter = mInjector.getVirtualDisplayAdapter(mSyncRoot, mContext, mHandler, mDisplayDeviceRepo); mHandler, mDisplayDeviceRepo, mFlags); if (mVirtualDisplayAdapter != null) { registerDisplayAdapterLocked(mVirtualDisplayAdapter); } Loading @@ -1871,7 +1871,7 @@ public final class DisplayManagerService extends SystemService { private void registerOverlayDisplayAdapterLocked() { registerDisplayAdapterLocked(new OverlayDisplayAdapter( mSyncRoot, mContext, mHandler, mDisplayDeviceRepo, mUiHandler)); mSyncRoot, mContext, mHandler, mDisplayDeviceRepo, mUiHandler, mFlags)); } private void registerWifiDisplayAdapterLocked() { Loading @@ -1880,7 +1880,7 @@ public final class DisplayManagerService extends SystemService { || SystemProperties.getInt(FORCE_WIFI_DISPLAY_ENABLE, -1) == 1) { mWifiDisplayAdapter = new WifiDisplayAdapter( mSyncRoot, mContext, mHandler, mDisplayDeviceRepo, mPersistentDataStore); mPersistentDataStore, mFlags); registerDisplayAdapterLocked(mWifiDisplayAdapter); } } Loading Loading @@ -3288,8 +3288,10 @@ public final class DisplayManagerService extends SystemService { @VisibleForTesting static class Injector { VirtualDisplayAdapter getVirtualDisplayAdapter(SyncRoot syncRoot, Context context, Handler handler, DisplayAdapter.Listener displayAdapterListener) { return new VirtualDisplayAdapter(syncRoot, context, handler, displayAdapterListener); Handler handler, DisplayAdapter.Listener displayAdapterListener, DisplayManagerFlags flags) { return new VirtualDisplayAdapter(syncRoot, context, handler, displayAdapterListener, flags); } LocalDisplayAdapter getLocalDisplayAdapter(SyncRoot syncRoot, Context context, Loading