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

Commit 4ebc884d authored by Oleg Petšjonkin's avatar Oleg Petšjonkin Committed by Android (Google) Code Review
Browse files

Merge "Introducing HDR brightness config" into main

parents 4a423681 487f9dd3
Loading
Loading
Loading
Loading
+31 −2
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import com.android.server.display.config.DisplayBrightnessPoint;
import com.android.server.display.config.DisplayConfiguration;
import com.android.server.display.config.DisplayQuirks;
import com.android.server.display.config.HbmTiming;
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;
@@ -232,7 +233,22 @@ import javax.xml.datatype.DatatypeConfigurationException;
 *          </point>
 *        </sdrHdrRatioMap>
 *      </highBrightnessMode>
 *
 *      <hdrBrightnessConfig>
 *         <brightnessMap>
 *             <point>
 *                <first>500</first>
 *                <second>0.3</second>
 *             </point>
 *             <point>
 *                 <first>1200</first>
 *                 <second>0.6</second>
 *             </point>
 *         </brightnessMap>
 *         <brightnessIncreaseDebounceMillis>1000</brightnessIncreaseDebounceMillis>
 *         <brightnessIncreaseDurationMillis>10000</brightnessIncreaseDurationMillis>
 *         <brightnessDecreaseDebounceMillis>13000</brightnessDecreaseDebounceMillis>
 *         <brightnessDecreaseDurationMillis>10000</brightnessDecreaseDurationMillis>
 *      </hdrBrightnessConfig>
 *      <luxThrottling>
 *        <brightnessLimitMap>
 *          <type>default</type>
@@ -769,6 +785,9 @@ public class DisplayDeviceConfig {
    @Nullable
    private HostUsiVersion mHostUsiVersion;

    @Nullable
    private HdrBrightnessData mHdrBrightnessData;

    @VisibleForTesting
    DisplayDeviceConfig(Context context) {
        mContext = context;
@@ -1543,6 +1562,14 @@ public class DisplayDeviceConfig {
        return mDefaultLowBlockingZoneRefreshRate;
    }

    /**
     * @return HDR brightness related configuration
     */
    @Nullable
    public HdrBrightnessData getHdrBrightnessData() {
        return mHdrBrightnessData;
    }

    /**
     * @return Refresh rate range for specific profile id or null
     */
@@ -1759,7 +1786,8 @@ public class DisplayDeviceConfig {
                + "mScreenOffBrightnessSensorValueToLux=" + Arrays.toString(
                mScreenOffBrightnessSensorValueToLux)
                + "\n"
                + "mUsiVersion= " + mHostUsiVersion
                + "mUsiVersion= " + mHostUsiVersion + "\n"
                + "mHdrBrightnessData" + mHdrBrightnessData
                + "}";
    }

@@ -1823,6 +1851,7 @@ public class DisplayDeviceConfig {
                loadRefreshRateSetting(config);
                loadScreenOffBrightnessSensorValueToLuxFromDdc(config);
                loadUsiVersion(config);
                mHdrBrightnessData = HdrBrightnessData.loadConfig(config);
            } else {
                Slog.w(TAG, "DisplayDeviceConfig file is null");
            }
+98 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.display.config;

import android.annotation.Nullable;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Brightness config for HDR content
 */
public class HdrBrightnessData {

    /**
     * Lux to brightness map
     */
    public final Map<Float, Float> mMaxBrightnessLimits;

    /**
     * Debounce time for brightness increase
     */
    public final long mBrightnessIncreaseDebounceMillis;

    /**
     * Brightness increase animation duration
     */
    public final long mBrightnessIncreaseDurationMillis;

    /**
     * Debounce time for brightness decrease
     */
    public final long mBrightnessDecreaseDebounceMillis;

    /**
     * Brightness decrease animation duration
     */
    public final long mBrightnessDecreaseDurationMillis;

    private HdrBrightnessData(Map<Float, Float> maxBrightnessLimits,
            long brightnessIncreaseDebounceMillis, long brightnessIncreaseDurationMillis,
            long brightnessDecreaseDebounceMillis, long brightnessDecreaseDurationMillis) {
        mMaxBrightnessLimits = maxBrightnessLimits;
        mBrightnessIncreaseDebounceMillis = brightnessIncreaseDebounceMillis;
        mBrightnessIncreaseDurationMillis = brightnessIncreaseDurationMillis;
        mBrightnessDecreaseDebounceMillis = brightnessDecreaseDebounceMillis;
        mBrightnessDecreaseDurationMillis = brightnessDecreaseDurationMillis;
    }

    @Override
    public String toString() {
        return "HdrBrightnessData {"
                + "mMaxBrightnessLimits: " + mMaxBrightnessLimits
                + ", mBrightnessIncreaseDebounceMillis: " + mBrightnessIncreaseDebounceMillis
                + ", mBrightnessIncreaseDurationMillis: " + mBrightnessIncreaseDurationMillis
                + ", mBrightnessDecreaseDebounceMillis: " + mBrightnessDecreaseDebounceMillis
                + ", mBrightnessDecreaseDurationMillis: " + mBrightnessDecreaseDurationMillis
                + "} ";
    }

    /**
     * Loads HdrBrightnessData from DisplayConfiguration
     */
    @Nullable
    public static HdrBrightnessData loadConfig(DisplayConfiguration config) {
        HdrBrightnessConfig hdrConfig = config.getHdrBrightnessConfig();
        if (hdrConfig == null) {
            return null;
        }

        List<NonNegativeFloatToFloatPoint> points = hdrConfig.getBrightnessMap().getPoint();
        Map<Float, Float> brightnessLimits = new HashMap<>();
        for (NonNegativeFloatToFloatPoint point: points) {
            brightnessLimits.put(point.getFirst().floatValue(), point.getSecond().floatValue());
        }

        return new HdrBrightnessData(brightnessLimits,
                hdrConfig.getBrightnessIncreaseDebounceMillis().longValue(),
                hdrConfig.getBrightnessIncreaseDurationMillis().longValue(),
                hdrConfig.getBrightnessDecreaseDebounceMillis().longValue(),
                hdrConfig.getBrightnessDecreaseDurationMillis().longValue());
    }
}
+32 −0
Original line number Diff line number Diff line
@@ -50,6 +50,13 @@
                            maxOccurs="1"/>
                <xs:element type="highBrightnessMode" name="highBrightnessMode" minOccurs="0"
                            maxOccurs="1"/>

                <xs:element name="hdrBrightnessConfig" type="hdrBrightnessConfig"
                            minOccurs="0" maxOccurs="1">
                    <xs:annotation name="nullable"/>
                    <xs:annotation name="final"/>
                </xs:element>

                <xs:element type="displayQuirks" name="quirks" minOccurs="0" maxOccurs="1"/>
                <xs:element type="autoBrightness" name="autoBrightness" minOccurs="0"
                            maxOccurs="1"/>
@@ -238,6 +245,31 @@
        </xs:all>
    </xs:complexType>

    <!-- brightness config for HDR content -->
    <xs:complexType name="hdrBrightnessConfig">
        <!-- lux level from light sensor to screen brightness recommended max value map. -->
        <xs:element name="brightnessMap" type="nonNegativeFloatToFloatMap">
            <xs:annotation name="nonnull"/>
            <xs:annotation name="final"/>
        </xs:element>
        <!-- Debounce for brightness increase in millis -->
        <xs:element name="brightnessIncreaseDebounceMillis" type="xs:nonNegativeInteger">
            <xs:annotation name="final"/>
        </xs:element>
        <!-- Debounce for brightness decrease in millis -->
        <xs:element name="brightnessDecreaseDebounceMillis" type="xs:nonNegativeInteger">
            <xs:annotation name="final"/>
        </xs:element>
        <!-- Animation time for brightness increase in millis -->
        <xs:element  name="brightnessIncreaseDurationMillis" type="xs:nonNegativeInteger">
            <xs:annotation name="final"/>
        </xs:element>
        <!-- Animation time for brightness decrease in millis -->
        <xs:element name="brightnessDecreaseDurationMillis" type="xs:nonNegativeInteger">
            <xs:annotation name="final"/>
        </xs:element>
    </xs:complexType>

    <!-- Maps to PowerManager.THERMAL_STATUS_* values. -->
    <xs:simpleType name="thermalStatus">
        <xs:restriction base="xs:string">
+16 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ package com.android.server.display.config {
    method @Nullable public final com.android.server.display.config.DensityMapping getDensityMapping();
    method @NonNull public final com.android.server.display.config.Thresholds getDisplayBrightnessChangeThresholds();
    method public final com.android.server.display.config.Thresholds getDisplayBrightnessChangeThresholdsIdle();
    method @Nullable public final com.android.server.display.config.HdrBrightnessConfig getHdrBrightnessConfig();
    method public com.android.server.display.config.HighBrightnessMode getHighBrightnessMode();
    method public final com.android.server.display.config.SensorDetails getLightSensor();
    method public com.android.server.display.config.LuxThrottling getLuxThrottling();
@@ -130,6 +131,7 @@ package com.android.server.display.config {
    method public final void setDensityMapping(@Nullable com.android.server.display.config.DensityMapping);
    method public final void setDisplayBrightnessChangeThresholds(@NonNull com.android.server.display.config.Thresholds);
    method public final void setDisplayBrightnessChangeThresholdsIdle(com.android.server.display.config.Thresholds);
    method public final void setHdrBrightnessConfig(@Nullable com.android.server.display.config.HdrBrightnessConfig);
    method public void setHighBrightnessMode(com.android.server.display.config.HighBrightnessMode);
    method public final void setLightSensor(com.android.server.display.config.SensorDetails);
    method public void setLuxThrottling(com.android.server.display.config.LuxThrottling);
@@ -168,6 +170,20 @@ package com.android.server.display.config {
    method public final void setTimeWindowSecs_all(@NonNull java.math.BigInteger);
  }

  public class HdrBrightnessConfig {
    ctor public HdrBrightnessConfig();
    method public final java.math.BigInteger getBrightnessDecreaseDebounceMillis();
    method public final java.math.BigInteger getBrightnessDecreaseDurationMillis();
    method public final java.math.BigInteger getBrightnessIncreaseDebounceMillis();
    method public final java.math.BigInteger getBrightnessIncreaseDurationMillis();
    method @NonNull public final com.android.server.display.config.NonNegativeFloatToFloatMap getBrightnessMap();
    method public final void setBrightnessDecreaseDebounceMillis(java.math.BigInteger);
    method public final void setBrightnessDecreaseDurationMillis(java.math.BigInteger);
    method public final void setBrightnessIncreaseDebounceMillis(java.math.BigInteger);
    method public final void setBrightnessIncreaseDurationMillis(java.math.BigInteger);
    method public final void setBrightnessMap(@NonNull com.android.server.display.config.NonNegativeFloatToFloatMap);
  }

  public class HighBrightnessMode {
    ctor public HighBrightnessMode();
    method @NonNull public final boolean getAllowInLowPowerMode_all();
+38 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;

import com.android.internal.R;
import com.android.server.display.config.HdrBrightnessData;
import com.android.server.display.config.ThermalStatus;

import org.junit.Before;
@@ -477,6 +478,23 @@ public final class DisplayDeviceConfigTest {
                mDisplayDeviceConfig.getHighAmbientBrightnessThresholds(), ZERO_DELTA);
    }

    @Test
    public void testHdrBrightnessDataFromDisplayConfig() throws IOException {
        setupDisplayDeviceConfigFromDisplayConfigFile();

        HdrBrightnessData data = mDisplayDeviceConfig.getHdrBrightnessData();

        assertNotNull(data);
        assertEquals(2, data.mMaxBrightnessLimits.size());
        assertEquals(13000, data.mBrightnessDecreaseDebounceMillis);
        assertEquals(10000, data.mBrightnessDecreaseDurationMillis);
        assertEquals(1000, data.mBrightnessIncreaseDebounceMillis);
        assertEquals(11000, data.mBrightnessIncreaseDurationMillis);

        assertEquals(0.3f, data.mMaxBrightnessLimits.get(500f), SMALL_DELTA);
        assertEquals(0.6f, data.mMaxBrightnessLimits.get(1200f), SMALL_DELTA);
    }

    private void verifyConfigValuesFromConfigResource() {
        assertNull(mDisplayDeviceConfig.getName());
        assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(), new
@@ -694,6 +712,25 @@ public final class DisplayDeviceConfigTest {
                + "</proxSensor>\n";
    }

    private String getHdrBrightnessConfig() {
        return "<hdrBrightnessConfig>\n"
              + "    <brightnessMap>\n"
              + "        <point>\n"
              + "            <first>500</first>\n"
              + "            <second>0.3</second>\n"
              + "        </point>\n"
              + "        <point>\n"
              + "           <first>1200</first>\n"
              + "           <second>0.6</second>\n"
              + "        </point>\n"
              + "    </brightnessMap>\n"
              + "    <brightnessIncreaseDebounceMillis>1000</brightnessIncreaseDebounceMillis>\n"
              + "    <brightnessIncreaseDurationMillis>11000</brightnessIncreaseDurationMillis>\n"
              + "    <brightnessDecreaseDebounceMillis>13000</brightnessDecreaseDebounceMillis>\n"
              + "    <brightnessDecreaseDurationMillis>10000</brightnessDecreaseDurationMillis>\n"
              + "</hdrBrightnessConfig>";
    }

    private String getContent() {
        return getContent(getValidLuxThrottling(), getValidProxSensor());
    }
@@ -784,6 +821,7 @@ public final class DisplayDeviceConfigTest {
                +            "</point>\n"
                +       "</sdrHdrRatioMap>\n"
                +   "</highBrightnessMode>\n"
                + getHdrBrightnessConfig()
                + brightnessCapConfig
                +   "<lightSensor>\n"
                +       "<type>test_light_sensor</type>\n"