Loading services/core/java/com/android/server/display/DisplayManagerService.java +4 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +15 −0 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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 Loading Loading @@ -620,6 +633,8 @@ public class DisplayManagerFlags { pw.println(" " + mSubscribeGranularDisplayEvents); pw.println(" " + mEnableDisplayContentModeManagementFlagState); pw.println(" " + mBaseDensityForExternalDisplays); pw.println(" " + mFramerateOverrideTriggersRrCallbacks); } private static class FlagState { Loading services/core/java/com/android/server/display/feature/display_flags.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -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 } } services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java +34 −7 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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, Loading @@ -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[]{ Loading @@ -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, Loading @@ -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, Loading @@ -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); } /** Loading Loading
services/core/java/com/android/server/display/DisplayManagerService.java +4 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading
services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +15 −0 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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 Loading Loading @@ -620,6 +633,8 @@ public class DisplayManagerFlags { pw.println(" " + mSubscribeGranularDisplayEvents); pw.println(" " + mEnableDisplayContentModeManagementFlagState); pw.println(" " + mBaseDensityForExternalDisplays); pw.println(" " + mFramerateOverrideTriggersRrCallbacks); } private static class FlagState { Loading
services/core/java/com/android/server/display/feature/display_flags.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -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 } }
services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java +34 −7 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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, Loading @@ -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[]{ Loading @@ -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, Loading @@ -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, Loading @@ -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); } /** Loading