Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4dadb089 authored by Piotr Wilczyński's avatar Piotr Wilczyński Committed by Android (Google) Code Review
Browse files

Merge "Define brightness curve in backlight in DDC" into main

parents 7a473d4f 6dbbddc2
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -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(
@@ -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);
@@ -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;
@@ -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!");
@@ -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;
+10 −2
Original line number Diff line number Diff line
@@ -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;

@@ -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;
@@ -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;
    }

    /**
@@ -88,6 +92,10 @@ abstract class DisplayAdapter {
        return mName;
    }

    public final DisplayManagerFlags getFeatureFlags() {
        return mFeatureFlags;
    }

    /**
     * Registers the display adapter with the display manager.
     *
+2 −1
Original line number Diff line number Diff line
@@ -400,6 +400,7 @@ abstract class DisplayDevice {
    }

    private DisplayDeviceConfig loadDisplayDeviceConfig() {
        return DisplayDeviceConfig.create(mContext, false);
        return DisplayDeviceConfig.create(mContext, /* useConfigXml= */ false,
                mDisplayAdapter.getFeatureFlags());
    }
}
+82 −56
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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>
@@ -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
@@ -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;

@@ -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;
    }

    /**
@@ -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;
@@ -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;
        }
@@ -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) {
@@ -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;
        }
@@ -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;
    }

@@ -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
     */
@@ -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"
@@ -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;
    }
@@ -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
@@ -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();
            }
        }
    }

+7 −5
Original line number Diff line number Diff line
@@ -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);
            }
@@ -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() {
@@ -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);
        }
    }
@@ -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