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

Commit b8310336 authored by Oleg Petšjonkin's avatar Oleg Petšjonkin Committed by Android (Google) Code Review
Browse files

Merge "DisplayModeDirector: simplify access to DisplayDeviceConfig" into main

parents 718d9741 29dcdb52
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -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
+13 −13
Original line number Diff line number Diff line
@@ -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;
@@ -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();
@@ -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) {
+43 −28
Original line number Diff line number Diff line
@@ -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;

@@ -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;

@@ -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();
@@ -212,6 +213,7 @@ public class DisplayModeDirector {
        mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled = displayManagerFlags
                .isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled();
        mDisplayManagerFlags = displayManagerFlags;
        mDisplayDeviceConfigProvider = displayDeviceConfigProvider;
        mContext = context;
        mHandler = new DisplayModeDirectorHandler(handler.getLooper());
        mInjector = injector;
@@ -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();
@@ -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;
@@ -356,7 +357,7 @@ public class DisplayModeDirector {
            }

            VoteSummary appRequestSummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled,
                    mVrrSupportedByDisplay.get(displayId),
                    isVrrSupportedLocked(displayId),
                    mLoggingEnabled, mSupportsFrameRateOverride);

            appRequestSummary.applyVotes(votes,
@@ -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;
            }
        }
@@ -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);
@@ -644,8 +650,8 @@ public class DisplayModeDirector {
    }

    @VisibleForTesting
    void injectVrrByDisplay(SparseBooleanArray vrrByDisplay) {
        mVrrSupportedByDisplay = vrrByDisplay;
    void injectDisplayDeviceConfigByDisplay(SparseArray<DisplayDeviceConfig> ddcByDisplay) {
        mDisplayDeviceConfigByDisplay = ddcByDisplay;
    }

    @VisibleForTesting
@@ -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.
     */
@@ -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;
@@ -1361,7 +1376,6 @@ public class DisplayModeDirector {
        }

        public void observe() {
            mDisplayManagerInternal = mInjector.getDisplayManagerInternal();
            mInjector.registerDisplayListener(this, mHandler);

            // Populate existing displays
@@ -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);
            }
        }

@@ -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);
@@ -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);
@@ -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);
@@ -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);
            }
        }

@@ -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(
+8 −5
Original line number Diff line number Diff line
@@ -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
@@ -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)

@@ -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)

+18 −8
Original line number Diff line number Diff line
@@ -312,6 +312,8 @@ public class DisplayModeDirectorTest {
    public DisplayManagerInternal mDisplayManagerInternalMock;
    @Mock
    private DisplayManagerFlags mDisplayManagerFlags;
    @Mock
    private DisplayModeDirector.DisplayDeviceConfigProvider mDisplayDeviceConfigProvider;

    @Rule
    public final ExtendedMockitoRule mExtendedMockitoRule =
@@ -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;
@@ -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),
        };
@@ -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[] {
@@ -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[] {
@@ -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,
@@ -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[] {
@@ -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,
@@ -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