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

Commit 8dbdec89 authored by Piotr Wilczyński's avatar Piotr Wilczyński
Browse files

Refresh rate preference controllers aware of multiple displays

Set mPeakRefreshRate in the preference controllers to the highest refresh rate among all the modes of all the displays. It'll then be used to determine two things:
- if the setting is available
- the summary of the setting

This should only be done if the back up smooth display feature flag is enabled. If it's disabled, mPeakRefreshRate is passed to DisplayModeDirector and used for the votes. If the highest refresh rate of one display is 120 and that of the other is 130, we shouldn't set the vote to 130 for both displays. With the flag enabled, DisplayModeDirector figures out the highest refresh rate for each display.

Bug: 310238382
Test: atest PeakRefreshRatePreferenceControllerTest
Test: atest ForcePeakRefreshRatePreferenceControllerTest
Test: atest RefreshRateSettingsUtilsTest
Change-Id: Iff0db6b31fc3a7d449d6705b6e391485acca27b5
parent 8305ef34
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.display;

import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED;

import android.content.Context;
import android.hardware.display.DisplayManager;
import android.util.Log;
@@ -54,4 +56,31 @@ public class RefreshRateSettingsUtils {
        }
        return maxRefreshRate;
    }

    /**
     * Find the highest refresh rate among all the modes of all the displays.
     *
     * This method will acquire DisplayManager.mLock, so calling it while holding other locks
     * should be done with care.
     * @param context The context
     * @return The highest refresh rate
     */
    public static float findHighestRefreshRateAmongAllDisplays(Context context) {
        final DisplayManager dm = context.getSystemService(DisplayManager.class);
        final Display[] displays = dm.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
        if (displays.length == 0) {
            Log.w(TAG, "No valid display devices");
            return DEFAULT_REFRESH_RATE;
        }

        float maxRefreshRate = DEFAULT_REFRESH_RATE;
        for (Display display : displays) {
            for (Display.Mode mode : display.getSupportedModes()) {
                if (mode.getRefreshRate() > maxRefreshRate) {
                    maxRefreshRate = mode.getRefreshRate();
                }
            }
        }
        return maxRefreshRate;
    }
}
+36 −3
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.display;

import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED;

import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE;

import static org.junit.Assert.assertEquals;
@@ -50,6 +52,8 @@ public class RefreshRateSettingsUtilsTest {
    private DisplayManager mDisplayManagerMock;
    @Mock
    private Display mDisplayMock;
    @Mock
    private Display mDisplayMock2;

    @Before
    public void setUp() {
@@ -65,25 +69,54 @@ public class RefreshRateSettingsUtilsTest {
                new Display.Mode(/* modeId= */ 0, /* width= */ 800, /* height= */ 600,
                        /* refreshRate= */ 90)
        };

        when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock);
        when(mDisplayMock.getSupportedModes()).thenReturn(modes);

        Display.Mode[] modes2 = new Display.Mode[]{
                new Display.Mode(/* modeId= */ 0, /* width= */ 800, /* height= */ 600,
                        /* refreshRate= */ 70),
                new Display.Mode(/* modeId= */ 0, /* width= */ 800, /* height= */ 600,
                        /* refreshRate= */ 130),
                new Display.Mode(/* modeId= */ 0, /* width= */ 800, /* height= */ 600,
                        /* refreshRate= */ 80)
        };
        when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY + 1)).thenReturn(mDisplayMock2);
        when(mDisplayMock2.getSupportedModes()).thenReturn(modes2);

        when(mDisplayManagerMock.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED))
                .thenReturn(new Display[]{ mDisplayMock, mDisplayMock2 });
    }

    @Test
    public void testFindHighestRefreshRateForDefaultDisplay() {
        when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock);
        assertEquals(120,
                RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext),
                /* delta= */ 0);
    }

    @Test
    public void testFindHighestRefreshRate_DisplayIsNull() {
    public void testFindHighestRefreshRateForDefaultDisplay_DisplayIsNull() {
        when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(null);
        assertEquals(DEFAULT_REFRESH_RATE,
                RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext),
                /* delta= */ 0);

    }

    @Test
    public void testFindHighestRefreshRateAmongAllDisplays() {
        assertEquals(130,
                RefreshRateSettingsUtils.findHighestRefreshRateAmongAllDisplays(mContext),
                /* delta= */ 0);
    }

    @Test
    public void testFindHighestRefreshRateAmongAllDisplays_NoDisplays() {
        when(mDisplayManagerMock.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED))
                .thenReturn(new Display[0]);
        assertEquals(DEFAULT_REFRESH_RATE,
                RefreshRateSettingsUtils.findHighestRefreshRateAmongAllDisplays(mContext),
                /* delta= */ 0);

    }
}