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

Commit d047ac12 authored by Fiona Campbell's avatar Fiona Campbell
Browse files

Compensate for display white balance in all modes

Move creation of dwbcontroller, remove idle mode check.

Bug: 216362485
Test: atest com.server.android.display

Change-Id: I44fd1804fb670a3bf94c9baa4bc6ac393c7faeda
parent 2dae724f
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -69,8 +69,10 @@ public abstract class BrightnessMappingStrategy {
     */
    @Nullable
    public static BrightnessMappingStrategy create(Resources resources,
            DisplayDeviceConfig displayDeviceConfig) {
        return create(resources, displayDeviceConfig, /* isForIdleMode= */ false, null);
            DisplayDeviceConfig displayDeviceConfig,
            DisplayWhiteBalanceController displayWhiteBalanceController) {
        return create(resources, displayDeviceConfig, /* isForIdleMode= */ false,
                displayWhiteBalanceController);
    }

    /**
@@ -845,7 +847,7 @@ public abstract class BrightnessMappingStrategy {
            float nits = mBrightnessSpline.interpolate(lux);

            // Adjust nits to compensate for display white balance colour strength.
            if (mDisplayWhiteBalanceController != null && isForIdleMode()) {
            if (mDisplayWhiteBalanceController != null) {
                nits = mDisplayWhiteBalanceController.calculateAdjustedBrightnessNits(nits);
            }

+24 −23
Original line number Diff line number Diff line
@@ -546,28 +546,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        // Seed the cached brightness
        saveBrightnessInfo(getScreenBrightnessSetting());

        setUpAutoBrightness(resources, handler);

        mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic();
        mColorFadeFadesConfig = resources.getBoolean(
                com.android.internal.R.bool.config_animateScreenLights);

        mDisplayBlanksAfterDozeConfig = resources.getBoolean(
                com.android.internal.R.bool.config_displayBlanksAfterDoze);

        mBrightnessBucketsInDozeConfig = resources.getBoolean(
                com.android.internal.R.bool.config_displayBrightnessBucketsInDoze);

        loadProximitySensor();

        mCurrentScreenBrightnessSetting = getScreenBrightnessSetting();
        mScreenBrightnessForVr = getScreenBrightnessForVrSetting();
        mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();
        mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        mPendingScreenBrightnessSetting = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        mTemporaryAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        mPendingAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;

        DisplayWhiteBalanceSettings displayWhiteBalanceSettings = null;
        DisplayWhiteBalanceController displayWhiteBalanceController = null;
        if (mDisplayId == Display.DEFAULT_DISPLAY) {
@@ -610,6 +588,29 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        } else {
            mCdsi = null;
        }

        setUpAutoBrightness(resources, handler);

        mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic();
        mColorFadeFadesConfig = resources.getBoolean(
                com.android.internal.R.bool.config_animateScreenLights);

        mDisplayBlanksAfterDozeConfig = resources.getBoolean(
                com.android.internal.R.bool.config_displayBlanksAfterDoze);

        mBrightnessBucketsInDozeConfig = resources.getBoolean(
                com.android.internal.R.bool.config_displayBrightnessBucketsInDoze);

        loadProximitySensor();

        mCurrentScreenBrightnessSetting = getScreenBrightnessSetting();
        mScreenBrightnessForVr = getScreenBrightnessForVrSetting();
        mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();
        mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        mPendingScreenBrightnessSetting = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        mTemporaryAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;
        mPendingAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;

    }

    private void applyReduceBrightColorsSplineAdjustment(
@@ -901,7 +902,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        final boolean isIdleScreenBrightnessEnabled = resources.getBoolean(
                R.bool.config_enableIdleScreenBrightnessMode);
        mInteractiveModeBrightnessMapper = BrightnessMappingStrategy.create(resources,
                mDisplayDeviceConfig);
                mDisplayDeviceConfig, mDisplayWhiteBalanceController);
        if (isIdleScreenBrightnessEnabled) {
            mIdleModeBrightnessMapper = BrightnessMappingStrategy.createForIdleMode(resources,
                    mDisplayDeviceConfig, mDisplayWhiteBalanceController);
+35 −25
Original line number Diff line number Diff line
@@ -36,8 +36,11 @@ import android.util.Spline;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.server.display.whitebalance.DisplayWhiteBalanceController;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

import java.util.Arrays;

@@ -147,11 +150,14 @@ public class BrightnessMappingStrategyTest {

    private static final float TOLERANCE = 0.0001f;

    @Mock
    DisplayWhiteBalanceController mMockDwbc;

    @Test
    public void testSimpleStrategyMappingAtControlPoints() {
        Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNotNull("BrightnessMappingStrategy should not be null", simple);
        for (int i = 0; i < LUX_LEVELS.length; i++) {
            final float expectedLevel = MathUtils.map(PowerManager.BRIGHTNESS_OFF + 1,
@@ -166,7 +172,7 @@ public class BrightnessMappingStrategyTest {
    public void testSimpleStrategyMappingBetweenControlPoints() {
        Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNotNull("BrightnessMappingStrategy should not be null", simple);
        for (int i = 1; i < LUX_LEVELS.length; i++) {
            final float lux = (LUX_LEVELS[i - 1] + LUX_LEVELS[i]) / 2;
@@ -181,7 +187,7 @@ public class BrightnessMappingStrategyTest {
    public void testSimpleStrategyIgnoresNewConfiguration() {
        Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);

        final float[] lux = { 0f, 1f };
        final float[] nits = { 0, PowerManager.BRIGHTNESS_ON };
@@ -196,7 +202,7 @@ public class BrightnessMappingStrategyTest {
    public void testSimpleStrategyIgnoresNullConfiguration() {
        Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);

        strategy.setBrightnessConfiguration(null);
        final int N = DISPLAY_LEVELS_BACKLIGHT.length;
@@ -210,7 +216,7 @@ public class BrightnessMappingStrategyTest {
    public void testPhysicalStrategyMappingAtControlPoints() {
        Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_NITS);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNotNull("BrightnessMappingStrategy should not be null", physical);
        for (int i = 0; i < LUX_LEVELS.length; i++) {
            final float expectedLevel = MathUtils.map(DISPLAY_RANGE_NITS[0], DISPLAY_RANGE_NITS[1],
@@ -227,7 +233,7 @@ public class BrightnessMappingStrategyTest {
    public void testPhysicalStrategyMappingBetweenControlPoints() {
        Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_NITS);
        DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, BACKLIGHT_RANGE_ZERO_TO_ONE);
        BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNotNull("BrightnessMappingStrategy should not be null", physical);
        Spline brightnessToNits =
                Spline.createSpline(BACKLIGHT_RANGE_ZERO_TO_ONE, DISPLAY_RANGE_NITS);
@@ -244,7 +250,7 @@ public class BrightnessMappingStrategyTest {
    public void testPhysicalStrategyUsesNewConfigurations() {
        Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_NITS);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);

        final float[] lux = { 0f, 1f };
        final float[] nits = {
@@ -269,7 +275,7 @@ public class BrightnessMappingStrategyTest {
    public void testPhysicalStrategyRecalculateSplines() {
        Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_NITS);
        DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        float[] adjustedNits50p = new float[DISPLAY_RANGE_NITS.length];
        for (int i = 0; i < DISPLAY_RANGE_NITS.length; i++) {
            adjustedNits50p[i] = DISPLAY_RANGE_NITS[i] * 0.5f;
@@ -301,7 +307,7 @@ public class BrightnessMappingStrategyTest {
        Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT,
                DISPLAY_LEVELS_NITS);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertTrue(strategy instanceof BrightnessMappingStrategy.PhysicalMappingStrategy);
    }

@@ -314,13 +320,13 @@ public class BrightnessMappingStrategyTest {
        lux[idx+1] = tmp;
        Resources res = createResources(lux, DISPLAY_LEVELS_NITS);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNull(strategy);

        // And make sure we get the same result even if it's monotone but not increasing.
        lux[idx] = lux[idx+1];
        res = createResources(lux, DISPLAY_LEVELS_NITS);
        strategy = BrightnessMappingStrategy.create(res, ddc);
        strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNull(strategy);
    }

@@ -333,11 +339,11 @@ public class BrightnessMappingStrategyTest {
        lux[lux.length - 1] = lux[lux.length - 2] + 1;
        Resources res = createResources(lux, DISPLAY_LEVELS_NITS);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNull(strategy);

        res = createResources(lux, DISPLAY_LEVELS_BACKLIGHT);
        strategy = BrightnessMappingStrategy.create(res, ddc);
        strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNull(strategy);

        // Extra backlight level
@@ -345,14 +351,14 @@ public class BrightnessMappingStrategyTest {
                DISPLAY_LEVELS_BACKLIGHT, DISPLAY_LEVELS_BACKLIGHT.length+1);
        backlight[backlight.length - 1] = backlight[backlight.length - 2] + 1;
        res = createResources(LUX_LEVELS, backlight);
        strategy = BrightnessMappingStrategy.create(res, ddc);
        strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNull(strategy);

        // Extra nits level
        final float[] nits = Arrays.copyOf(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_NITS.length+1);
        nits[nits.length - 1] = nits[nits.length - 2] + 1;
        res = createResources(LUX_LEVELS, nits);
        strategy = BrightnessMappingStrategy.create(res, ddc);
        strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNull(strategy);
    }

@@ -361,17 +367,17 @@ public class BrightnessMappingStrategyTest {
        Resources res = createResources(LUX_LEVELS, EMPTY_INT_ARRAY /*brightnessLevelsBacklight*/,
                DISPLAY_LEVELS_NITS);
        DisplayDeviceConfig ddc = createDdc(EMPTY_FLOAT_ARRAY /*nitsRange*/);
        BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc);
        BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNull(physical);

        res = createResources(LUX_LEVELS, EMPTY_INT_ARRAY /*brightnessLevelsBacklight*/,
                DISPLAY_LEVELS_NITS);
        physical = BrightnessMappingStrategy.create(res, ddc);
        physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNull(physical);

        res = createResources(LUX_LEVELS, EMPTY_INT_ARRAY /*brightnessLevelsBacklight*/,
                DISPLAY_LEVELS_NITS);
        physical = BrightnessMappingStrategy.create(res, ddc);
        physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
        assertNull(physical);
    }

@@ -380,10 +386,10 @@ public class BrightnessMappingStrategyTest {
        Resources res = createResources(LUX_LEVELS, EMPTY_INT_ARRAY /*brightnessLevelsBacklight*/,
                DISPLAY_LEVELS_NITS);
        DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, BACKLIGHT_RANGE_ZERO_TO_ONE);
        assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc));
        assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc, mMockDwbc));
        ddc = createDdc(DISPLAY_RANGE_NITS, BACKLIGHT_RANGE_ZERO_TO_ONE);
        res = createResources(LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT);
        assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc));
        assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc, mMockDwbc));
    }

    @Test
@@ -394,7 +400,7 @@ public class BrightnessMappingStrategyTest {
        // Create an idle mode bms
        // This will fail if it tries to fetch the wrong configuration.
        BrightnessMappingStrategy bms = BrightnessMappingStrategy.createForIdleMode(res, ddc,
                null);
                mMockDwbc);
        assertNotNull("BrightnessMappingStrategy should not be null", bms);

        // Ensure that the config is the one we set
@@ -586,7 +592,8 @@ public class BrightnessMappingStrategyTest {

        Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc,
                mMockDwbc);
        // Let's start with a validity check:
        assertEquals(y1, strategy.getBrightness(x1), 0.0001f /* tolerance */);
        assertEquals(y2, strategy.getBrightness(x2), 0.0001f /* tolerance */);
@@ -614,7 +621,8 @@ public class BrightnessMappingStrategyTest {
        final float y3 = GAMMA_CORRECTION_SPLINE.interpolate(x3);
        Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc,
                mMockDwbc);
        // Validity check:
        assertEquals(y1, strategy.getBrightness(x1), 0.0001f /* tolerance */);
        assertEquals(y2, strategy.getBrightness(x2), 0.0001f /* tolerance */);
@@ -639,7 +647,8 @@ public class BrightnessMappingStrategyTest {
        // just make sure the adjustment reflects the change.
        Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc,
                mMockDwbc);
        assertEquals(0.0f, strategy.getAutoBrightnessAdjustment(), 0.0001f /* tolerance */);
        strategy.addUserDataPoint(2500, 1.0f);
        assertEquals(+1.0f, strategy.getAutoBrightnessAdjustment(), 0.0001f /* tolerance */);
@@ -660,7 +669,8 @@ public class BrightnessMappingStrategyTest {
        final float y4 = GAMMA_CORRECTION_SPLINE.interpolate(x4);
        Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS);
        DisplayDeviceConfig ddc = createDdc();
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc);
        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc,
                mMockDwbc);
        // Validity, as per tradition:
        assertEquals(y0, strategy.getBrightness(x0), 0.0001f /* tolerance */);
        assertEquals(y2, strategy.getBrightness(x2), 0.0001f /* tolerance */);