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

Commit 71761eae authored by petsjonkin's avatar petsjonkin
Browse files

Improving AmbientFilter usage in tests

DisplayModeDirector uses WeightedMovingAverageAmbientFilter. For test it can introduce flake if Sensor events added with little time gap.
Replacing WeightedMovingAverageAmbientFilter in tests to LastValueAmbientFilter - that always return last sensor value

Bug: b/420256933 , b/423134533
Test: atest DisplayServiceTests
Flag: EXEMPT test fix
Change-Id: I7fe2844031fda3fc07a593ec53f5d8ee3b7696f8
parent 6bc3e26b
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -2334,7 +2334,7 @@ public class DisplayModeDirector {

                if (lightSensor != null && lightSensor != mLightSensor) {
                    final Resources res = mContext.getResources();
                    mAmbientFilter = AmbientFilterFactory.createBrightnessFilter(TAG, res);
                    mAmbientFilter = mInjector.getAmbientFilter(res);
                    mLightSensor = lightSensor;
                }
            } else {
@@ -3158,6 +3158,8 @@ public class DisplayModeDirector {

        @Nullable
        VotesStatsReporter getVotesStatsReporter();

        AmbientFilter getAmbientFilter(Resources res);
    }

    @VisibleForTesting
@@ -3302,6 +3304,11 @@ public class DisplayModeDirector {
            return new VotesStatsReporter(supportsFrameRateOverride());
        }

        @Override
        public AmbientFilter getAmbientFilter(Resources res) {
            return AmbientFilterFactory.createBrightnessFilter(TAG, res);
        }

        private DisplayManager getDisplayManager() {
            if (mDisplayManager == null) {
                mDisplayManager = mContext.getSystemService(DisplayManager.class);
+7 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_R

import static com.android.server.display.TestUtilsKt.createSensor;
import static com.android.server.display.TestUtilsKt.createSensorEvent;
import static com.android.server.display.utils.TestUtilsKt.createLastValueAmbientFilter;

import static com.google.common.truth.Truth.assertThat;

@@ -98,6 +99,7 @@ import com.android.server.display.config.RefreshRateData;
import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.display.mode.DisplayModeDirector.BrightnessObserver;
import com.android.server.display.mode.DisplayModeDirector.DesiredDisplayModeSpecs;
import com.android.server.display.utils.AmbientFilter;
import com.android.server.sensors.SensorManagerInternal;
import com.android.server.sensors.SensorManagerInternal.ProximityActiveListener;
import com.android.server.statusbar.StatusBarManagerInternal;
@@ -1587,7 +1589,6 @@ public class DisplayModeDirectorTest {
                        any(Handler.class));
        SensorEventListener sensorListener = listenerCaptor.getValue();
        sensorListener.onSensorChanged(createSensorEvent(lightSensor, 8));
        waitForIdleSync();
        assertEquals(null, director.getBrightnessObserver().getIdleScreenRefreshRateConfig());

        // Configure DDC with idle screen timeout
@@ -1601,19 +1602,16 @@ public class DisplayModeDirectorTest {

        // Sensor reads 5 lux
        sensorListener.onSensorChanged(createSensorEvent(lightSensor, 5));
        waitForIdleSync();
        assertEquals(new SurfaceControl.IdleScreenRefreshRateConfig(-1),
                director.getBrightnessObserver().getIdleScreenRefreshRateConfig());

        // Sensor reads 50 lux
        sensorListener.onSensorChanged(createSensorEvent(lightSensor, 50));
        waitForIdleSync();
        assertEquals(new IdleScreenRefreshRateConfig(1000),
                director.getBrightnessObserver().getIdleScreenRefreshRateConfig());

        // Sensor reads 200 lux
        sensorListener.onSensorChanged(createSensorEvent(lightSensor, 200));
        waitForIdleSync();
        assertEquals(new SurfaceControl.IdleScreenRefreshRateConfig(800),
                director.getBrightnessObserver().getIdleScreenRefreshRateConfig());
    }
@@ -3992,6 +3990,11 @@ public class DisplayModeDirectorTest {
            return null;
        }

        @Override
        public AmbientFilter getAmbientFilter(Resources res) {
            return createLastValueAmbientFilter();
        }

        protected Display createDisplay(int id) {
            return new Display(DisplayManagerGlobal.getInstance(), id, mDisplayInfo,
                    ApplicationProvider.getApplicationContext().getResources());
+12 −11
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 * Copyright (C) 2025 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.
@@ -14,14 +14,15 @@
 * limitations under the License.
 */

package com.android.server.display.utils;
package com.android.server.display.utils

public class AmbientFilterStubber extends AmbientFilter {
    public AmbientFilterStubber() {
        super(null, 1);
fun createLastValueAmbientFilter(): AmbientFilter =
    object : AmbientFilter("LastValueAmbientFilter", 1) {
        override fun filter(time: Long, buffer: RollingBuffer): Float {
            return if (buffer.isEmpty) {
                -1f
            } else {
                buffer.getValue(buffer.size() - 1)
            }

    protected float filter(long time, RollingBuffer buffer) {
        return 0f;
        }
    }
 No newline at end of file
+20 −24
Original line number Diff line number Diff line
@@ -17,10 +17,10 @@
package com.android.server.display.whitebalance;

import static com.android.server.display.TestUtilsKt.createSensor;
import static com.android.server.display.utils.TestUtilsKt.createLastValueAmbientFilter;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
@@ -43,7 +43,6 @@ import com.android.internal.R;
import com.android.internal.util.test.LocalServiceKeeperRule;
import com.android.server.display.color.ColorDisplayService;
import com.android.server.display.utils.AmbientFilter;
import com.android.server.display.utils.AmbientFilterStubber;

import com.google.common.collect.ImmutableList;

@@ -54,7 +53,6 @@ import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import java.util.List;
@@ -185,7 +183,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = 8000.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) {
            setEstimatedBrightnessAndUpdate(controller, luxOverride);
@@ -205,7 +203,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = 8000.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float t = 0.0f; t <= 1.0f; t += 0.1f) {
            setEstimatedBrightnessAndUpdate(controller,
@@ -237,7 +235,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = 8000.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float t = 0.0f; t <= 1.0f; t += 0.1f) {
            float luxOverride = mix(brightness0, brightness1, t);
@@ -274,7 +272,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = 8000.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        setEstimatedBrightnessAndUpdate(controller, 0.0f);
        assertEquals(controller.mPendingAmbientColorTemperature,
@@ -293,7 +291,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = 8000.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) {
            setEstimatedBrightnessAndUpdate(controller, luxOverride);
@@ -311,7 +309,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = 8000.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) {
            setEstimatedBrightnessAndUpdate(controller, luxOverride);
@@ -331,7 +329,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = 8000.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float t = 0.0f; t <= 1.0f; t += 0.1f) {
            setEstimatedBrightnessAndUpdate(controller,
@@ -364,7 +362,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = 6000.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float t = 0.0f; t <= 1.0f; t += 0.1f) {
            float luxOverride = mix(brightness0, brightness1, t);
@@ -403,7 +401,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = 8000.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) {
            setEstimatedBrightnessAndUpdate(controller, luxOverride);
@@ -428,7 +426,7 @@ public final class AmbientLuxTest {
        DisplayWhiteBalanceController controller =
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        controller.setStrongModeEnabled(true);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float ambientTempFraction = 0.0f; ambientTempFraction <= 1.0f;
                ambientTempFraction += 0.1f) {
@@ -460,7 +458,7 @@ public final class AmbientLuxTest {
                DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy);
        final float ambientColorTemperature = -1.0f;
        setEstimatedColorTemperature(controller, ambientColorTemperature);
        controller.mBrightnessFilter = spy(new AmbientFilterStubber());
        controller.mBrightnessFilter = createLastValueAmbientFilter();

        for (float t = 0.0f; t <= 1.0f; t += 0.1f) {
            setEstimatedBrightnessAndUpdate(controller,
@@ -512,13 +510,11 @@ public final class AmbientLuxTest {
    }

    private void mockResourcesFloat(int id, float floatValue) {
        doAnswer(new Answer<Void>() {
            public Void answer(InvocationOnMock invocation) {
        doAnswer((Answer<Void>) invocation -> {
            TypedValue value = (TypedValue) invocation.getArgument(1);
            value.type = TypedValue.TYPE_FLOAT;
            value.data = Float.floatToIntBits(floatValue);
            return null;
            }
        }).when(mResourcesSpy).getValue(
                eq(id),
                any(TypedValue.class), eq(true));
@@ -526,14 +522,14 @@ public final class AmbientLuxTest {

    private void setEstimatedColorTemperature(DisplayWhiteBalanceController controller,
                                              float ambientColorTemperature) {
        AmbientFilter colorTemperatureFilter = spy(new AmbientFilterStubber());
        AmbientFilter colorTemperatureFilter = createLastValueAmbientFilter();
        controller.mColorTemperatureFilter = colorTemperatureFilter;
        when(colorTemperatureFilter.getEstimate(anyLong())).thenReturn(ambientColorTemperature);
        colorTemperatureFilter.addValue(System.currentTimeMillis(), ambientColorTemperature);
    }

    private void setEstimatedBrightnessAndUpdate(DisplayWhiteBalanceController controller,
                                                 float brightness) {
        when(controller.mBrightnessFilter.getEstimate(anyLong())).thenReturn(brightness);
        controller.mBrightnessFilter.addValue(System.currentTimeMillis(), brightness);
        controller.updateAmbientColorTemperature();
    }