Loading core/java/android/hardware/display/DisplayManagerInternal.java +0 −8 Original line number Diff line number Diff line Loading @@ -363,14 +363,6 @@ public abstract class DisplayManagerInternal { */ public abstract List<RefreshRateLimitation> getRefreshRateLimitations(int displayId); /** * Returns if vrr support is enabled for specified display * * @param displayId The id of the display. * @return true if associated display supports dvrr */ public abstract boolean isVrrSupportEnabled(int displayId); /** * For the given displayId, updates if WindowManager is responsible for mirroring on that * display. If {@code false}, then SurfaceFlinger performs no layer mirroring to the Loading services/core/java/com/android/server/display/DisplayManagerService.java +13 −13 Original line number Diff line number Diff line Loading @@ -548,6 +548,17 @@ public final class DisplayManagerService extends SystemService { } }; private final DisplayModeDirector.DisplayDeviceConfigProvider mDisplayDeviceConfigProvider = displayId -> { synchronized (mSyncRoot) { final DisplayDevice device = getDeviceForDisplayLocked(displayId); if (device == null) { return null; } return device.getDisplayDeviceConfig(); } }; private final BrightnessSynchronizer mBrightnessSynchronizer; private final DeviceConfigParameterProvider mConfigParameterProvider; Loading Loading @@ -599,7 +610,8 @@ public final class DisplayManagerService extends SystemService { mLogicalDisplayMapper = new LogicalDisplayMapper(mContext, foldSettingProvider, new FoldGracePeriodProvider(), mDisplayDeviceRepo, new LogicalDisplayListener(), mSyncRoot, mHandler, mFlags); mDisplayModeDirector = new DisplayModeDirector(context, mHandler, mFlags); mDisplayModeDirector = new DisplayModeDirector( context, mHandler, mFlags, mDisplayDeviceConfigProvider); mBrightnessSynchronizer = new BrightnessSynchronizer(mContext, mFlags.isBrightnessIntRangeUserPerceptionEnabled()); Resources resources = mContext.getResources(); Loading Loading @@ -4939,18 +4951,6 @@ public final class DisplayManagerService extends SystemService { return config.getRefreshRateLimitations(); } @Override public boolean isVrrSupportEnabled(int displayId) { DisplayDevice device; synchronized (mSyncRoot) { device = getDeviceForDisplayLocked(displayId); } if (device == null) { return false; } return device.getDisplayDeviceConfig().isVrrSupportEnabled(); } @Override public void setWindowManagerMirroring(int displayId, boolean isMirroring) { synchronized (mSyncRoot) { Loading services/core/java/com/android/server/display/mode/DisplayModeDirector.java +43 −28 Original line number Diff line number Diff line Loading @@ -120,8 +120,6 @@ public class DisplayModeDirector { private static final int MSG_REFRESH_RATE_IN_HBM_SUNLIGHT_CHANGED = 7; private static final int MSG_REFRESH_RATE_IN_HBM_HDR_CHANGED = 8; private static final float FLOAT_TOLERANCE = RefreshRateRange.FLOAT_TOLERANCE; private final Object mLock = new Object(); private final Context mContext; Loading Loading @@ -149,9 +147,8 @@ public class DisplayModeDirector { private SparseArray<Display.Mode[]> mSupportedModesByDisplay; // A map from the display ID to the default mode of that display. private SparseArray<Display.Mode> mDefaultModeByDisplay; // a map from display id to vrr support private SparseBooleanArray mVrrSupportedByDisplay; // a map from display id to display device config private SparseArray<DisplayDeviceConfig> mDisplayDeviceConfigByDisplay = new SparseArray<>(); private BrightnessObserver mBrightnessObserver; Loading Loading @@ -193,15 +190,19 @@ public class DisplayModeDirector { private final DisplayManagerFlags mDisplayManagerFlags; private final DisplayDeviceConfigProvider mDisplayDeviceConfigProvider; public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler, @NonNull DisplayManagerFlags displayManagerFlags) { this(context, handler, new RealInjector(context), displayManagerFlags); @NonNull DisplayManagerFlags displayManagerFlags, @NonNull DisplayDeviceConfigProvider displayDeviceConfigProvider) { this(context, handler, new RealInjector(context), displayManagerFlags, displayDeviceConfigProvider); } public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler, @NonNull Injector injector, @NonNull DisplayManagerFlags displayManagerFlags) { @NonNull DisplayManagerFlags displayManagerFlags, @NonNull DisplayDeviceConfigProvider displayDeviceConfigProvider) { mIsDisplayResolutionRangeVotingEnabled = displayManagerFlags .isDisplayResolutionRangeVotingEnabled(); mIsUserPreferredModeVoteEnabled = displayManagerFlags.isUserPreferredModeVoteEnabled(); Loading @@ -212,6 +213,7 @@ public class DisplayModeDirector { mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled = displayManagerFlags .isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled(); mDisplayManagerFlags = displayManagerFlags; mDisplayDeviceConfigProvider = displayDeviceConfigProvider; mContext = context; mHandler = new DisplayModeDirectorHandler(handler.getLooper()); mInjector = injector; Loading @@ -219,7 +221,6 @@ public class DisplayModeDirector { displayManagerFlags.isRefreshRateVotingTelemetryEnabled()); mSupportedModesByDisplay = new SparseArray<>(); mDefaultModeByDisplay = new SparseArray<>(); mVrrSupportedByDisplay = new SparseBooleanArray(); mAppRequestObserver = new AppRequestObserver(); mConfigParameterProvider = new DeviceConfigParameterProvider(injector.getDeviceConfig()); mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings(); Loading Loading @@ -315,7 +316,7 @@ public class DisplayModeDirector { List<Display.Mode> availableModes = new ArrayList<>(); availableModes.add(defaultMode); VoteSummary primarySummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled, mVrrSupportedByDisplay.get(displayId), isVrrSupportedLocked(displayId), mLoggingEnabled, mSupportsFrameRateOverride); int lowestConsideredPriority = Vote.MIN_PRIORITY; int highestConsideredPriority = Vote.MAX_PRIORITY; Loading Loading @@ -356,7 +357,7 @@ public class DisplayModeDirector { } VoteSummary appRequestSummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled, mVrrSupportedByDisplay.get(displayId), isVrrSupportedLocked(displayId), mLoggingEnabled, mSupportsFrameRateOverride); appRequestSummary.applyVotes(votes, Loading Loading @@ -444,9 +445,14 @@ public class DisplayModeDirector { return mAppRequestObserver; } private boolean isVrrSupportedLocked(int displayId) { DisplayDeviceConfig config = mDisplayDeviceConfigByDisplay.get(displayId); return config != null && config.isVrrSupportEnabled(); } private boolean isVrrSupportedByAnyDisplayLocked() { for (int i = 0; i < mVrrSupportedByDisplay.size(); i++) { if (mVrrSupportedByDisplay.valueAt(i)) { for (int i = 0; i < mDisplayDeviceConfigByDisplay.size(); i++) { if (mDisplayDeviceConfigByDisplay.valueAt(i).isVrrSupportEnabled()) { return true; } } Loading Loading @@ -552,7 +558,7 @@ public class DisplayModeDirector { if (mSystemRequestObserver != null) { boolean vrrSupported; synchronized (mLock) { vrrSupported = mVrrSupportedByDisplay.get(displayId); vrrSupported = isVrrSupportedLocked(displayId); } if (vrrSupported) { mSystemRequestObserver.requestDisplayModes(token, displayId, modeIds); Loading Loading @@ -644,8 +650,8 @@ public class DisplayModeDirector { } @VisibleForTesting void injectVrrByDisplay(SparseBooleanArray vrrByDisplay) { mVrrSupportedByDisplay = vrrByDisplay; void injectDisplayDeviceConfigByDisplay(SparseArray<DisplayDeviceConfig> ddcByDisplay) { mDisplayDeviceConfigByDisplay = ddcByDisplay; } @VisibleForTesting Loading Loading @@ -700,6 +706,16 @@ public class DisplayModeDirector { mDisplayObserver.onExternalDisplayReadyToBeEnabled(displayId); } /** * Provides access to DisplayDeviceConfig for specific display */ public interface DisplayDeviceConfigProvider { /** * Returns DisplayDeviceConfig for specific display */ @Nullable DisplayDeviceConfig getDisplayDeviceConfig(int displayId); } /** * Listens for changes refresh rate coordination. */ Loading Loading @@ -1324,7 +1340,6 @@ public class DisplayModeDirector { private final Handler mHandler; private final VotesStorage mVotesStorage; private DisplayManagerInternal mDisplayManagerInternal; private int mExternalDisplayPeakWidth; private int mExternalDisplayPeakHeight; private int mExternalDisplayPeakRefreshRate; Loading Loading @@ -1361,7 +1376,6 @@ public class DisplayModeDirector { } public void observe() { mDisplayManagerInternal = mInjector.getDisplayManagerInternal(); mInjector.registerDisplayListener(this, mHandler); // Populate existing displays Loading @@ -1374,15 +1388,15 @@ public class DisplayModeDirector { modes.put(displayId, info.supportedModes); defaultModes.put(displayId, info.getDefaultMode()); } boolean vrrSupportedByDefaultDisplay = mDisplayManagerInternal .isVrrSupportEnabled(Display.DEFAULT_DISPLAY); DisplayDeviceConfig defaultDisplayConfig = mDisplayDeviceConfigProvider .getDisplayDeviceConfig(Display.DEFAULT_DISPLAY); synchronized (mLock) { final int size = modes.size(); for (int i = 0; i < size; i++) { mSupportedModesByDisplay.put(modes.keyAt(i), modes.valueAt(i)); mDefaultModeByDisplay.put(defaultModes.keyAt(i), defaultModes.valueAt(i)); } mVrrSupportedByDisplay.put(Display.DEFAULT_DISPLAY, vrrSupportedByDefaultDisplay); mDisplayDeviceConfigByDisplay.put(Display.DEFAULT_DISPLAY, defaultDisplayConfig); } } Loading @@ -1395,7 +1409,7 @@ public class DisplayModeDirector { @Override public void onDisplayAdded(int displayId) { updateVrrStatus(displayId); updateDisplayDeviceConfig(displayId); DisplayInfo displayInfo = getDisplayInfo(displayId); updateDisplayModes(displayId, displayInfo); updateLayoutLimitedFrameRate(displayId, displayInfo); Loading @@ -1407,7 +1421,7 @@ public class DisplayModeDirector { synchronized (mLock) { mSupportedModesByDisplay.remove(displayId); mDefaultModeByDisplay.remove(displayId); mVrrSupportedByDisplay.delete(displayId); mDisplayDeviceConfigByDisplay.remove(displayId); mSettingsObserver.removeRefreshRateSetting(displayId); } updateLayoutLimitedFrameRate(displayId, null); Loading @@ -1418,7 +1432,7 @@ public class DisplayModeDirector { @Override public void onDisplayChanged(int displayId) { updateVrrStatus(displayId); updateDisplayDeviceConfig(displayId); DisplayInfo displayInfo = getDisplayInfo(displayId); updateDisplayModes(displayId, displayInfo); updateLayoutLimitedFrameRate(displayId, displayInfo); Loading Loading @@ -1548,10 +1562,11 @@ public class DisplayModeDirector { mVotesStorage.updateGlobalVote(Vote.PRIORITY_SYNCHRONIZED_REFRESH_RATE, null); } private void updateVrrStatus(int displayId) { boolean isVrrSupported = mDisplayManagerInternal.isVrrSupportEnabled(displayId); private void updateDisplayDeviceConfig(int displayId) { DisplayDeviceConfig config = mDisplayDeviceConfigProvider .getDisplayDeviceConfig(displayId); synchronized (mLock) { mVrrSupportedByDisplay.put(displayId, isVrrSupported); mDisplayDeviceConfigByDisplay.put(displayId, config); } } Loading Loading @@ -2276,7 +2291,7 @@ public class DisplayModeDirector { } if (mVsyncLowLightBlockingVoteEnabled && mVrrSupportedByDisplay.get(Display.DEFAULT_DISPLAY)) { && isVrrSupportedLocked(Display.DEFAULT_DISPLAY)) { refreshRateSwitchingVote = Vote.forSupportedRefreshRatesAndDisableSwitching( List.of( new SupportedRefreshRatesVote.RefreshRates( Loading services/tests/displayservicetests/src/com/android/server/display/mode/BrightnessObserverTest.kt +8 −5 Original line number Diff line number Diff line Loading @@ -19,12 +19,13 @@ package com.android.server.display.mode import android.content.Context import android.content.ContextWrapper import android.hardware.display.BrightnessInfo import android.util.SparseBooleanArray import android.util.SparseArray import android.view.Display import androidx.test.core.app.ApplicationProvider import androidx.test.filters.SmallTest import com.android.server.display.DisplayDeviceConfig import com.android.server.display.feature.DisplayManagerFlags import com.android.server.display.mode.DisplayModeDirector.DisplayDeviceConfigProvider import com.android.server.testutils.TestHandler import com.google.common.truth.Truth.assertThat import com.google.testing.junit.testparameterinjector.TestParameter Loading @@ -49,6 +50,7 @@ class BrightnessObserverTest { private val mockInjector = mock<DisplayModeDirector.Injector>() private val mockFlags = mock<DisplayManagerFlags>() private val mockDeviceConfig = mock<DisplayDeviceConfig>() private val mockDisplayDeviceConfigProvider = mock<DisplayDeviceConfigProvider>() private val testHandler = TestHandler(null) Loading @@ -62,10 +64,11 @@ class BrightnessObserverTest { setUpLowBrightnessZone() whenever(mockFlags.isVsyncLowLightVoteEnabled).thenReturn(testCase.vsyncLowLightVoteEnabled) val displayModeDirector = DisplayModeDirector( spyContext, testHandler, mockInjector, mockFlags) val vrrByDisplay = SparseBooleanArray() vrrByDisplay.put(Display.DEFAULT_DISPLAY, testCase.vrrSupported) displayModeDirector.injectVrrByDisplay(vrrByDisplay) spyContext, testHandler, mockInjector, mockFlags, mockDisplayDeviceConfigProvider) val ddcByDisplay = SparseArray<DisplayDeviceConfig>() whenever(mockDeviceConfig.isVrrSupportEnabled).thenReturn(testCase.vrrSupported) ddcByDisplay.put(Display.DEFAULT_DISPLAY, mockDeviceConfig) displayModeDirector.injectDisplayDeviceConfigByDisplay(ddcByDisplay) val brightnessObserver = displayModeDirector.BrightnessObserver( spyContext, testHandler, mockInjector, mockFlags) Loading services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +18 −8 Original line number Diff line number Diff line Loading @@ -312,6 +312,8 @@ public class DisplayModeDirectorTest { public DisplayManagerInternal mDisplayManagerInternalMock; @Mock private DisplayManagerFlags mDisplayManagerFlags; @Mock private DisplayModeDirector.DisplayDeviceConfigProvider mDisplayDeviceConfigProvider; @Rule public final ExtendedMockitoRule mExtendedMockitoRule = Loading Loading @@ -412,7 +414,8 @@ public class DisplayModeDirectorTest { private DisplayModeDirector createDirectorFromModeArray(Display.Mode[] modes, Display.Mode defaultMode, int[] displayIds) { DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.setLoggingEnabled(true); setupModesForDisplays(director, displayIds , modes, defaultMode); return director; Loading Loading @@ -1146,7 +1149,8 @@ public class DisplayModeDirectorTest { @Test public void testStaleAppRequestSize() { DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); Display.Mode[] modes = new Display.Mode[] { new Display.Mode(1, 1280, 720, 60), }; Loading Loading @@ -1397,7 +1401,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Display.Mode[] modes1 = new Display.Mode[] { Loading Loading @@ -1808,7 +1813,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Display.Mode[] modes1 = new Display.Mode[] { Loading Loading @@ -1888,7 +1894,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); mInjector.mDisplayInfo.supportedModes = new Display.Mode[] { new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720, Loading Loading @@ -1958,7 +1965,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Display.Mode[] modes1 = new Display.Mode[] { Loading Loading @@ -2038,7 +2046,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); mInjector.mDisplayInfo.supportedModes = new Display.Mode[] { new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720, Loading Loading @@ -2076,7 +2085,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Display.Mode[] modes1 = new Display.Mode[] { Loading Loading
core/java/android/hardware/display/DisplayManagerInternal.java +0 −8 Original line number Diff line number Diff line Loading @@ -363,14 +363,6 @@ public abstract class DisplayManagerInternal { */ public abstract List<RefreshRateLimitation> getRefreshRateLimitations(int displayId); /** * Returns if vrr support is enabled for specified display * * @param displayId The id of the display. * @return true if associated display supports dvrr */ public abstract boolean isVrrSupportEnabled(int displayId); /** * For the given displayId, updates if WindowManager is responsible for mirroring on that * display. If {@code false}, then SurfaceFlinger performs no layer mirroring to the Loading
services/core/java/com/android/server/display/DisplayManagerService.java +13 −13 Original line number Diff line number Diff line Loading @@ -548,6 +548,17 @@ public final class DisplayManagerService extends SystemService { } }; private final DisplayModeDirector.DisplayDeviceConfigProvider mDisplayDeviceConfigProvider = displayId -> { synchronized (mSyncRoot) { final DisplayDevice device = getDeviceForDisplayLocked(displayId); if (device == null) { return null; } return device.getDisplayDeviceConfig(); } }; private final BrightnessSynchronizer mBrightnessSynchronizer; private final DeviceConfigParameterProvider mConfigParameterProvider; Loading Loading @@ -599,7 +610,8 @@ public final class DisplayManagerService extends SystemService { mLogicalDisplayMapper = new LogicalDisplayMapper(mContext, foldSettingProvider, new FoldGracePeriodProvider(), mDisplayDeviceRepo, new LogicalDisplayListener(), mSyncRoot, mHandler, mFlags); mDisplayModeDirector = new DisplayModeDirector(context, mHandler, mFlags); mDisplayModeDirector = new DisplayModeDirector( context, mHandler, mFlags, mDisplayDeviceConfigProvider); mBrightnessSynchronizer = new BrightnessSynchronizer(mContext, mFlags.isBrightnessIntRangeUserPerceptionEnabled()); Resources resources = mContext.getResources(); Loading Loading @@ -4939,18 +4951,6 @@ public final class DisplayManagerService extends SystemService { return config.getRefreshRateLimitations(); } @Override public boolean isVrrSupportEnabled(int displayId) { DisplayDevice device; synchronized (mSyncRoot) { device = getDeviceForDisplayLocked(displayId); } if (device == null) { return false; } return device.getDisplayDeviceConfig().isVrrSupportEnabled(); } @Override public void setWindowManagerMirroring(int displayId, boolean isMirroring) { synchronized (mSyncRoot) { Loading
services/core/java/com/android/server/display/mode/DisplayModeDirector.java +43 −28 Original line number Diff line number Diff line Loading @@ -120,8 +120,6 @@ public class DisplayModeDirector { private static final int MSG_REFRESH_RATE_IN_HBM_SUNLIGHT_CHANGED = 7; private static final int MSG_REFRESH_RATE_IN_HBM_HDR_CHANGED = 8; private static final float FLOAT_TOLERANCE = RefreshRateRange.FLOAT_TOLERANCE; private final Object mLock = new Object(); private final Context mContext; Loading Loading @@ -149,9 +147,8 @@ public class DisplayModeDirector { private SparseArray<Display.Mode[]> mSupportedModesByDisplay; // A map from the display ID to the default mode of that display. private SparseArray<Display.Mode> mDefaultModeByDisplay; // a map from display id to vrr support private SparseBooleanArray mVrrSupportedByDisplay; // a map from display id to display device config private SparseArray<DisplayDeviceConfig> mDisplayDeviceConfigByDisplay = new SparseArray<>(); private BrightnessObserver mBrightnessObserver; Loading Loading @@ -193,15 +190,19 @@ public class DisplayModeDirector { private final DisplayManagerFlags mDisplayManagerFlags; private final DisplayDeviceConfigProvider mDisplayDeviceConfigProvider; public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler, @NonNull DisplayManagerFlags displayManagerFlags) { this(context, handler, new RealInjector(context), displayManagerFlags); @NonNull DisplayManagerFlags displayManagerFlags, @NonNull DisplayDeviceConfigProvider displayDeviceConfigProvider) { this(context, handler, new RealInjector(context), displayManagerFlags, displayDeviceConfigProvider); } public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler, @NonNull Injector injector, @NonNull DisplayManagerFlags displayManagerFlags) { @NonNull DisplayManagerFlags displayManagerFlags, @NonNull DisplayDeviceConfigProvider displayDeviceConfigProvider) { mIsDisplayResolutionRangeVotingEnabled = displayManagerFlags .isDisplayResolutionRangeVotingEnabled(); mIsUserPreferredModeVoteEnabled = displayManagerFlags.isUserPreferredModeVoteEnabled(); Loading @@ -212,6 +213,7 @@ public class DisplayModeDirector { mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled = displayManagerFlags .isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled(); mDisplayManagerFlags = displayManagerFlags; mDisplayDeviceConfigProvider = displayDeviceConfigProvider; mContext = context; mHandler = new DisplayModeDirectorHandler(handler.getLooper()); mInjector = injector; Loading @@ -219,7 +221,6 @@ public class DisplayModeDirector { displayManagerFlags.isRefreshRateVotingTelemetryEnabled()); mSupportedModesByDisplay = new SparseArray<>(); mDefaultModeByDisplay = new SparseArray<>(); mVrrSupportedByDisplay = new SparseBooleanArray(); mAppRequestObserver = new AppRequestObserver(); mConfigParameterProvider = new DeviceConfigParameterProvider(injector.getDeviceConfig()); mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings(); Loading Loading @@ -315,7 +316,7 @@ public class DisplayModeDirector { List<Display.Mode> availableModes = new ArrayList<>(); availableModes.add(defaultMode); VoteSummary primarySummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled, mVrrSupportedByDisplay.get(displayId), isVrrSupportedLocked(displayId), mLoggingEnabled, mSupportsFrameRateOverride); int lowestConsideredPriority = Vote.MIN_PRIORITY; int highestConsideredPriority = Vote.MAX_PRIORITY; Loading Loading @@ -356,7 +357,7 @@ public class DisplayModeDirector { } VoteSummary appRequestSummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled, mVrrSupportedByDisplay.get(displayId), isVrrSupportedLocked(displayId), mLoggingEnabled, mSupportsFrameRateOverride); appRequestSummary.applyVotes(votes, Loading Loading @@ -444,9 +445,14 @@ public class DisplayModeDirector { return mAppRequestObserver; } private boolean isVrrSupportedLocked(int displayId) { DisplayDeviceConfig config = mDisplayDeviceConfigByDisplay.get(displayId); return config != null && config.isVrrSupportEnabled(); } private boolean isVrrSupportedByAnyDisplayLocked() { for (int i = 0; i < mVrrSupportedByDisplay.size(); i++) { if (mVrrSupportedByDisplay.valueAt(i)) { for (int i = 0; i < mDisplayDeviceConfigByDisplay.size(); i++) { if (mDisplayDeviceConfigByDisplay.valueAt(i).isVrrSupportEnabled()) { return true; } } Loading Loading @@ -552,7 +558,7 @@ public class DisplayModeDirector { if (mSystemRequestObserver != null) { boolean vrrSupported; synchronized (mLock) { vrrSupported = mVrrSupportedByDisplay.get(displayId); vrrSupported = isVrrSupportedLocked(displayId); } if (vrrSupported) { mSystemRequestObserver.requestDisplayModes(token, displayId, modeIds); Loading Loading @@ -644,8 +650,8 @@ public class DisplayModeDirector { } @VisibleForTesting void injectVrrByDisplay(SparseBooleanArray vrrByDisplay) { mVrrSupportedByDisplay = vrrByDisplay; void injectDisplayDeviceConfigByDisplay(SparseArray<DisplayDeviceConfig> ddcByDisplay) { mDisplayDeviceConfigByDisplay = ddcByDisplay; } @VisibleForTesting Loading Loading @@ -700,6 +706,16 @@ public class DisplayModeDirector { mDisplayObserver.onExternalDisplayReadyToBeEnabled(displayId); } /** * Provides access to DisplayDeviceConfig for specific display */ public interface DisplayDeviceConfigProvider { /** * Returns DisplayDeviceConfig for specific display */ @Nullable DisplayDeviceConfig getDisplayDeviceConfig(int displayId); } /** * Listens for changes refresh rate coordination. */ Loading Loading @@ -1324,7 +1340,6 @@ public class DisplayModeDirector { private final Handler mHandler; private final VotesStorage mVotesStorage; private DisplayManagerInternal mDisplayManagerInternal; private int mExternalDisplayPeakWidth; private int mExternalDisplayPeakHeight; private int mExternalDisplayPeakRefreshRate; Loading Loading @@ -1361,7 +1376,6 @@ public class DisplayModeDirector { } public void observe() { mDisplayManagerInternal = mInjector.getDisplayManagerInternal(); mInjector.registerDisplayListener(this, mHandler); // Populate existing displays Loading @@ -1374,15 +1388,15 @@ public class DisplayModeDirector { modes.put(displayId, info.supportedModes); defaultModes.put(displayId, info.getDefaultMode()); } boolean vrrSupportedByDefaultDisplay = mDisplayManagerInternal .isVrrSupportEnabled(Display.DEFAULT_DISPLAY); DisplayDeviceConfig defaultDisplayConfig = mDisplayDeviceConfigProvider .getDisplayDeviceConfig(Display.DEFAULT_DISPLAY); synchronized (mLock) { final int size = modes.size(); for (int i = 0; i < size; i++) { mSupportedModesByDisplay.put(modes.keyAt(i), modes.valueAt(i)); mDefaultModeByDisplay.put(defaultModes.keyAt(i), defaultModes.valueAt(i)); } mVrrSupportedByDisplay.put(Display.DEFAULT_DISPLAY, vrrSupportedByDefaultDisplay); mDisplayDeviceConfigByDisplay.put(Display.DEFAULT_DISPLAY, defaultDisplayConfig); } } Loading @@ -1395,7 +1409,7 @@ public class DisplayModeDirector { @Override public void onDisplayAdded(int displayId) { updateVrrStatus(displayId); updateDisplayDeviceConfig(displayId); DisplayInfo displayInfo = getDisplayInfo(displayId); updateDisplayModes(displayId, displayInfo); updateLayoutLimitedFrameRate(displayId, displayInfo); Loading @@ -1407,7 +1421,7 @@ public class DisplayModeDirector { synchronized (mLock) { mSupportedModesByDisplay.remove(displayId); mDefaultModeByDisplay.remove(displayId); mVrrSupportedByDisplay.delete(displayId); mDisplayDeviceConfigByDisplay.remove(displayId); mSettingsObserver.removeRefreshRateSetting(displayId); } updateLayoutLimitedFrameRate(displayId, null); Loading @@ -1418,7 +1432,7 @@ public class DisplayModeDirector { @Override public void onDisplayChanged(int displayId) { updateVrrStatus(displayId); updateDisplayDeviceConfig(displayId); DisplayInfo displayInfo = getDisplayInfo(displayId); updateDisplayModes(displayId, displayInfo); updateLayoutLimitedFrameRate(displayId, displayInfo); Loading Loading @@ -1548,10 +1562,11 @@ public class DisplayModeDirector { mVotesStorage.updateGlobalVote(Vote.PRIORITY_SYNCHRONIZED_REFRESH_RATE, null); } private void updateVrrStatus(int displayId) { boolean isVrrSupported = mDisplayManagerInternal.isVrrSupportEnabled(displayId); private void updateDisplayDeviceConfig(int displayId) { DisplayDeviceConfig config = mDisplayDeviceConfigProvider .getDisplayDeviceConfig(displayId); synchronized (mLock) { mVrrSupportedByDisplay.put(displayId, isVrrSupported); mDisplayDeviceConfigByDisplay.put(displayId, config); } } Loading Loading @@ -2276,7 +2291,7 @@ public class DisplayModeDirector { } if (mVsyncLowLightBlockingVoteEnabled && mVrrSupportedByDisplay.get(Display.DEFAULT_DISPLAY)) { && isVrrSupportedLocked(Display.DEFAULT_DISPLAY)) { refreshRateSwitchingVote = Vote.forSupportedRefreshRatesAndDisableSwitching( List.of( new SupportedRefreshRatesVote.RefreshRates( Loading
services/tests/displayservicetests/src/com/android/server/display/mode/BrightnessObserverTest.kt +8 −5 Original line number Diff line number Diff line Loading @@ -19,12 +19,13 @@ package com.android.server.display.mode import android.content.Context import android.content.ContextWrapper import android.hardware.display.BrightnessInfo import android.util.SparseBooleanArray import android.util.SparseArray import android.view.Display import androidx.test.core.app.ApplicationProvider import androidx.test.filters.SmallTest import com.android.server.display.DisplayDeviceConfig import com.android.server.display.feature.DisplayManagerFlags import com.android.server.display.mode.DisplayModeDirector.DisplayDeviceConfigProvider import com.android.server.testutils.TestHandler import com.google.common.truth.Truth.assertThat import com.google.testing.junit.testparameterinjector.TestParameter Loading @@ -49,6 +50,7 @@ class BrightnessObserverTest { private val mockInjector = mock<DisplayModeDirector.Injector>() private val mockFlags = mock<DisplayManagerFlags>() private val mockDeviceConfig = mock<DisplayDeviceConfig>() private val mockDisplayDeviceConfigProvider = mock<DisplayDeviceConfigProvider>() private val testHandler = TestHandler(null) Loading @@ -62,10 +64,11 @@ class BrightnessObserverTest { setUpLowBrightnessZone() whenever(mockFlags.isVsyncLowLightVoteEnabled).thenReturn(testCase.vsyncLowLightVoteEnabled) val displayModeDirector = DisplayModeDirector( spyContext, testHandler, mockInjector, mockFlags) val vrrByDisplay = SparseBooleanArray() vrrByDisplay.put(Display.DEFAULT_DISPLAY, testCase.vrrSupported) displayModeDirector.injectVrrByDisplay(vrrByDisplay) spyContext, testHandler, mockInjector, mockFlags, mockDisplayDeviceConfigProvider) val ddcByDisplay = SparseArray<DisplayDeviceConfig>() whenever(mockDeviceConfig.isVrrSupportEnabled).thenReturn(testCase.vrrSupported) ddcByDisplay.put(Display.DEFAULT_DISPLAY, mockDeviceConfig) displayModeDirector.injectDisplayDeviceConfigByDisplay(ddcByDisplay) val brightnessObserver = displayModeDirector.BrightnessObserver( spyContext, testHandler, mockInjector, mockFlags) Loading
services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +18 −8 Original line number Diff line number Diff line Loading @@ -312,6 +312,8 @@ public class DisplayModeDirectorTest { public DisplayManagerInternal mDisplayManagerInternalMock; @Mock private DisplayManagerFlags mDisplayManagerFlags; @Mock private DisplayModeDirector.DisplayDeviceConfigProvider mDisplayDeviceConfigProvider; @Rule public final ExtendedMockitoRule mExtendedMockitoRule = Loading Loading @@ -412,7 +414,8 @@ public class DisplayModeDirectorTest { private DisplayModeDirector createDirectorFromModeArray(Display.Mode[] modes, Display.Mode defaultMode, int[] displayIds) { DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.setLoggingEnabled(true); setupModesForDisplays(director, displayIds , modes, defaultMode); return director; Loading Loading @@ -1146,7 +1149,8 @@ public class DisplayModeDirectorTest { @Test public void testStaleAppRequestSize() { DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); Display.Mode[] modes = new Display.Mode[] { new Display.Mode(1, 1280, 720, 60), }; Loading Loading @@ -1397,7 +1401,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Display.Mode[] modes1 = new Display.Mode[] { Loading Loading @@ -1808,7 +1813,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Display.Mode[] modes1 = new Display.Mode[] { Loading Loading @@ -1888,7 +1894,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); mInjector.mDisplayInfo.supportedModes = new Display.Mode[] { new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720, Loading Loading @@ -1958,7 +1965,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Display.Mode[] modes1 = new Display.Mode[] { Loading Loading @@ -2038,7 +2046,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); mInjector.mDisplayInfo.supportedModes = new Display.Mode[] { new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720, Loading Loading @@ -2076,7 +2085,8 @@ public class DisplayModeDirectorTest { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); DisplayModeDirector director = new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags, mDisplayDeviceConfigProvider); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Display.Mode[] modes1 = new Display.Mode[] { Loading