From 755dd5818cb20a3b62cfc2a7c58e9dc209979540 Mon Sep 17 00:00:00 2001 From: Rupesh Bansal Date: Fri, 15 Nov 2024 13:37:16 +0000 Subject: Subscribing viewroot impl to only display state changes Bug: 379250246 Test: Manually verified the callbacks are received only on display state changes Flag: com.android.server.display.feature.flags.subscribe_granular_display_events Change-Id: I85539fb9fe6e5873b671ae667a17e7978752bf97 --- core/java/android/view/ViewRootImpl.java | 18 +++++++++++++++--- .../server/display/feature/DisplayManagerFlags.java | 13 +++++++++++++ .../server/display/feature/display_flags.aconfig | 11 +++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 19d3dc4df04e..00a0e1dfe907 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1237,6 +1237,8 @@ public final class ViewRootImpl implements ViewParent, private @ActivityInfo.ColorMode int mCurrentColorMode = ActivityInfo.COLOR_MODE_DEFAULT; private long mColorModeLastSetMillis = -1; + private final boolean mIsSubscribeGranularDisplayEventsEnabled; + public ViewRootImpl(Context context, Display display) { this(context, display, WindowManagerGlobal.getWindowSession(), new WindowLayout()); } @@ -1334,6 +1336,8 @@ public final class ViewRootImpl implements ViewParent, // Disable DRAW_WAKE_LOCK starting U. mDisableDrawWakeLock = CompatChanges.isChangeEnabled(DISABLE_DRAW_WAKE_LOCK) && disableDrawWakeLock(); + mIsSubscribeGranularDisplayEventsEnabled = + com.android.server.display.feature.flags.Flags.subscribeGranularDisplayEvents(); } public static void addFirstDrawHandler(Runnable callback) { @@ -1811,14 +1815,22 @@ public final class ViewRootImpl implements ViewParent, mAccessibilityInteractionConnectionManager, mHandler); mAccessibilityManager.addHighContrastTextStateChangeListener( mExecutor, mHighContrastTextManager); + + + long eventsToBeRegistered = + (mIsSubscribeGranularDisplayEventsEnabled) + ? DisplayManagerGlobal.INTERNAL_EVENT_FLAG_DISPLAY_ADDED + | DisplayManagerGlobal.INTERNAL_EVENT_FLAG_DISPLAY_STATE + | DisplayManagerGlobal.INTERNAL_EVENT_FLAG_DISPLAY_REMOVED + : DisplayManagerGlobal.INTERNAL_EVENT_FLAG_DISPLAY_ADDED + | DisplayManagerGlobal.INTERNAL_EVENT_FLAG_DISPLAY_CHANGED + | DisplayManagerGlobal.INTERNAL_EVENT_FLAG_DISPLAY_REMOVED; DisplayManagerGlobal .getInstance() .registerDisplayListener( mDisplayListener, mHandler, - DisplayManagerGlobal.INTERNAL_EVENT_FLAG_DISPLAY_ADDED - | DisplayManagerGlobal.INTERNAL_EVENT_FLAG_DISPLAY_CHANGED - | DisplayManagerGlobal.INTERNAL_EVENT_FLAG_DISPLAY_REMOVED, + eventsToBeRegistered, mBasePackageName); if (forceInvertColor()) { 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 1a7d74ae1713..8b1a1f524294 100644 --- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java @@ -251,6 +251,11 @@ public class DisplayManagerFlags { Flags::displayListenerPerformanceImprovements ); + private final FlagState mSubscribeGranularDisplayEvents = new FlagState( + Flags.FLAG_SUBSCRIBE_GRANULAR_DISPLAY_EVENTS, + Flags::subscribeGranularDisplayEvents + ); + /** * @return {@code true} if 'port' is allowed in display layout configuration file. */ @@ -537,6 +542,13 @@ public class DisplayManagerFlags { return mDisplayListenerPerformanceImprovementsFlagState.isEnabled(); } + /** + * @return {@code true} if the flag for subscribing to granular display events is enabled + */ + public boolean isSubscribeGranularDisplayEventsEnabled() { + return mSubscribeGranularDisplayEvents.isEnabled(); + } + /** * dumps all flagstates * @param pw printWriter @@ -590,6 +602,7 @@ public class DisplayManagerFlags { pw.println(" " + mAutoBrightnessModeBedtimeWearFlagState); pw.println(" " + mEnablePluginManagerFlagState); pw.println(" " + mDisplayListenerPerformanceImprovementsFlagState); + pw.println(" " + mSubscribeGranularDisplayEvents); } 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 e7ea868ca04f..3976d01d806d 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 @@ -478,3 +478,14 @@ flag { bug: "378385869" is_fixed_read_only: true } + +flag { + name: "subscribe_granular_display_events" + namespace: "display_manager" + description: "Enable subscription to granular display change events." + bug: "379250634" + is_fixed_read_only: true + metadata { + purpose: PURPOSE_BUGFIX + } +} -- cgit v1.2.3-59-g8ed1b