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

Commit 672207ab authored by Rupesh Bansal's avatar Rupesh Bansal
Browse files

Send RR event changed when frame rate is overridden

Bug: 390113266
Test: atest com.android.server.display.DisplayManagerServiceTest.testShouldNotifyChangeWhenDisplayInfoFrameRateOverrideChanged
Flag: EXEMPT trivial change
Change-Id: Ib391ba294acda70712c4e9d3d34dc11da84adec7
parent 1b5cb649
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -3445,8 +3445,11 @@ public final class DisplayManagerService extends SystemService {
    }

    private void sendDisplayEventFrameRateOverrideLocked(int displayId) {
        int event = (mFlags.isFramerateOverrideTriggersRrCallbacksEnabled())
                ? DisplayManagerGlobal.EVENT_DISPLAY_REFRESH_RATE_CHANGED
                : DisplayManagerGlobal.EVENT_DISPLAY_BASIC_CHANGED;
        Message msg = mHandler.obtainMessage(MSG_DELIVER_DISPLAY_EVENT_FRAME_RATE_OVERRIDE,
                displayId, DisplayManagerGlobal.EVENT_DISPLAY_BASIC_CHANGED);
                displayId, event);
        mHandler.sendMessage(msg);
    }

+15 −0
Original line number Diff line number Diff line
@@ -263,6 +263,11 @@ public class DisplayManagerFlags {
            Flags::baseDensityForExternalDisplays
    );

    private final FlagState mFramerateOverrideTriggersRrCallbacks = new FlagState(
            Flags.FLAG_FRAMERATE_OVERRIDE_TRIGGERS_RR_CALLBACKS,
            Flags::framerateOverrideTriggersRrCallbacks
    );

    /**
     * @return {@code true} if 'port' is allowed in display layout configuration file.
     */
@@ -564,6 +569,14 @@ public class DisplayManagerFlags {
        return mBaseDensityForExternalDisplays.isEnabled();
    }

    /**
     * @return {@code true} if the flag triggering refresh rate callbacks when framerate is
     * overridden is enabled
     */
    public boolean isFramerateOverrideTriggersRrCallbacksEnabled() {
        return mFramerateOverrideTriggersRrCallbacks.isEnabled();
    }


    /**
     * dumps all flagstates
@@ -620,6 +633,8 @@ public class DisplayManagerFlags {
        pw.println(" " + mSubscribeGranularDisplayEvents);
        pw.println(" " + mEnableDisplayContentModeManagementFlagState);
        pw.println(" " + mBaseDensityForExternalDisplays);
        pw.println(" " + mFramerateOverrideTriggersRrCallbacks);

    }

    private static class FlagState {
+11 −0
Original line number Diff line number Diff line
@@ -479,3 +479,14 @@ flag {
    bug: "382954433"
    is_fixed_read_only: true
}

flag {
    name: "framerate_override_triggers_rr_callbacks"
    namespace: "display_manager"
    description: "Feature flag to trigger the RR callbacks when framerate overridding happens."
    bug: "390113266"
    is_fixed_read_only: true
    metadata {
      purpose: PURPOSE_BUGFIX
    }
}
+34 −7
Original line number Diff line number Diff line
@@ -2123,14 +2123,41 @@ public class DisplayManagerServiceTest {
        }
    }

    @Test
    public void test_displayChangedNotified_displayInfoFramerateOverridden() {
        DisplayManagerService displayManager =
                new DisplayManagerService(mContext, mShortMockedInjector);
        DisplayManagerService.BinderService displayManagerBinderService =
                displayManager.new BinderService();
        when(mMockFlags.isFramerateOverrideTriggersRrCallbacksEnabled()).thenReturn(false);

        registerDefaultDisplays(displayManager);
        displayManager.onBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

        FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, new float[]{60f});
        FakeDisplayManagerCallback callback = registerDisplayListenerCallback(displayManager,
                displayManagerBinderService, displayDevice);

        int myUid = Process.myUid();
        updateFrameRateOverride(displayManager, displayDevice,
                new DisplayEventReceiver.FrameRateOverride[]{
                        new DisplayEventReceiver.FrameRateOverride(myUid, 30f),
                });
        waitForIdleHandler(displayManager.getDisplayHandler());
        assertThat(callback.receivedEvents()).contains(EVENT_DISPLAY_BASIC_CHANGED);
        callback.clear();
    }

    /**
     * Tests that there is a display change notification if the frame rate override
     * list is updated.
     */
    @Test
    public void testShouldNotifyChangeWhenDisplayInfoFrameRateOverrideChanged() {
    public void test_refreshRateChangedNotified_displayInfoFramerateOverridden() {
        when(mMockFlags.isFramerateOverrideTriggersRrCallbacksEnabled()).thenReturn(true);

        DisplayManagerService displayManager =
                new DisplayManagerService(mContext, mShortMockedInjector);
                new DisplayManagerService(mContext, mBasicInjector);
        DisplayManagerService.BinderService displayManagerBinderService =
                displayManager.new BinderService();
        registerDefaultDisplays(displayManager);
@@ -2146,7 +2173,7 @@ public class DisplayManagerServiceTest {
                        new DisplayEventReceiver.FrameRateOverride(myUid, 30f),
                });
        waitForIdleHandler(displayManager.getDisplayHandler());
        assertThat(callback.receivedEvents()).contains(EVENT_DISPLAY_BASIC_CHANGED);
        assertThat(callback.receivedEvents()).contains(EVENT_DISPLAY_REFRESH_RATE_CHANGED);
        callback.clear();

        updateFrameRateOverride(displayManager, displayDevice,
@@ -2155,7 +2182,7 @@ public class DisplayManagerServiceTest {
                        new DisplayEventReceiver.FrameRateOverride(1234, 30f),
                });
        waitForIdleHandler(displayManager.getDisplayHandler());
        assertThat(callback.receivedEvents()).doesNotContain(EVENT_DISPLAY_BASIC_CHANGED);
        assertThat(callback.receivedEvents()).doesNotContain(EVENT_DISPLAY_REFRESH_RATE_CHANGED);

        updateFrameRateOverride(displayManager, displayDevice,
                new DisplayEventReceiver.FrameRateOverride[]{
@@ -2164,7 +2191,7 @@ public class DisplayManagerServiceTest {
                        new DisplayEventReceiver.FrameRateOverride(5678, 30f),
                });
        waitForIdleHandler(displayManager.getDisplayHandler());
        assertThat(callback.receivedEvents()).contains(EVENT_DISPLAY_BASIC_CHANGED);
        assertThat(callback.receivedEvents()).contains(EVENT_DISPLAY_REFRESH_RATE_CHANGED);
        callback.clear();

        updateFrameRateOverride(displayManager, displayDevice,
@@ -2173,7 +2200,7 @@ public class DisplayManagerServiceTest {
                        new DisplayEventReceiver.FrameRateOverride(5678, 30f),
                });
        waitForIdleHandler(displayManager.getDisplayHandler());
        assertThat(callback.receivedEvents()).contains(EVENT_DISPLAY_BASIC_CHANGED);
        assertThat(callback.receivedEvents()).contains(EVENT_DISPLAY_REFRESH_RATE_CHANGED);
        callback.clear();

        updateFrameRateOverride(displayManager, displayDevice,
@@ -2181,7 +2208,7 @@ public class DisplayManagerServiceTest {
                        new DisplayEventReceiver.FrameRateOverride(5678, 30f),
                });
        waitForIdleHandler(displayManager.getDisplayHandler());
        assertThat(callback.receivedEvents()).doesNotContain(EVENT_DISPLAY_BASIC_CHANGED);
        assertThat(callback.receivedEvents()).doesNotContain(EVENT_DISPLAY_REFRESH_RATE_CHANGED);
    }

    /**