diff options
author | 2025-01-17 07:40:51 -0800 | |
---|---|---|
committer | 2025-01-17 07:40:51 -0800 | |
commit | e564f785f28f0f4c21d4f8f602d92d46701b5850 (patch) | |
tree | 3ebf55ab6fa31d7f507f57c3d587353c52b1acaf | |
parent | 0026e37481398e08e51635e9c026da31e66e4768 (diff) | |
parent | 672207abab4be2135a2da25e93f8e040e8d80e4f (diff) |
Merge "Send RR event changed when frame rate is overridden" into main
4 files changed, 64 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index a37e9c3ac1b8..33501094206b 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -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); } diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java index 43aa6f46da78..72306ae341e7 100644 --- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java @@ -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 { diff --git a/services/core/java/com/android/server/display/feature/display_flags.aconfig b/services/core/java/com/android/server/display/feature/display_flags.aconfig index 00a9dcb71b4b..1cd050553d03 100644 --- a/services/core/java/com/android/server/display/feature/display_flags.aconfig +++ b/services/core/java/com/android/server/display/feature/display_flags.aconfig @@ -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 + } +} diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java index 02e5470e8673..8e4d8edb4837 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -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); } /** |