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

Commit d6817b1d authored by Oleg Petšjonkin's avatar Oleg Petšjonkin Committed by Automerger Merge Worker
Browse files

Merge "Properly handling situation when display is added and removed...

Merge "Properly handling situation when display is added and removed instantly" into udc-dev am: 23636fed

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22761588



Change-Id: I41351d21775dd368eb22858c8b9270011694a3e3
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents c11a6fde 23636fed
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -341,6 +341,9 @@ public final class DisplayInfo implements Parcelable {
    @Nullable
    public DisplayShape displayShape;

    /**
     * Refresh rate range limitation based on the current device layout
     */
    @Nullable
    public SurfaceControl.RefreshRateRange layoutLimitedRefreshRate;

@@ -354,7 +357,7 @@ public final class DisplayInfo implements Parcelable {
     * RefreshRateRange limitation for @Temperature.ThrottlingStatus
     */
    @NonNull
    public SparseArray<SurfaceControl.RefreshRateRange> refreshRateThermalThrottling =
    public SparseArray<SurfaceControl.RefreshRateRange> thermalRefreshRateThrottling =
            new SparseArray<>();

    public static final @android.annotation.NonNull Creator<DisplayInfo> CREATOR = new Creator<DisplayInfo>() {
@@ -434,7 +437,7 @@ public final class DisplayInfo implements Parcelable {
                && Objects.equals(displayShape, other.displayShape)
                && Objects.equals(layoutLimitedRefreshRate, other.layoutLimitedRefreshRate)
                && BrightnessSynchronizer.floatEquals(hdrSdrRatio, other.hdrSdrRatio)
                && refreshRateThermalThrottling.contentEquals(other.refreshRateThermalThrottling);
                && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling);
    }

    @Override
@@ -491,7 +494,7 @@ public final class DisplayInfo implements Parcelable {
        displayShape = other.displayShape;
        layoutLimitedRefreshRate = other.layoutLimitedRefreshRate;
        hdrSdrRatio = other.hdrSdrRatio;
        refreshRateThermalThrottling = other.refreshRateThermalThrottling;
        thermalRefreshRateThrottling = other.thermalRefreshRateThrottling;
    }

    public void readFromParcel(Parcel source) {
@@ -554,7 +557,7 @@ public final class DisplayInfo implements Parcelable {
        displayShape = source.readTypedObject(DisplayShape.CREATOR);
        layoutLimitedRefreshRate = source.readTypedObject(SurfaceControl.RefreshRateRange.CREATOR);
        hdrSdrRatio = source.readFloat();
        refreshRateThermalThrottling = source.readSparseArray(null,
        thermalRefreshRateThrottling = source.readSparseArray(null,
                SurfaceControl.RefreshRateRange.class);
    }

@@ -616,7 +619,7 @@ public final class DisplayInfo implements Parcelable {
        dest.writeTypedObject(displayShape, flags);
        dest.writeTypedObject(layoutLimitedRefreshRate, flags);
        dest.writeFloat(hdrSdrRatio);
        dest.writeSparseArray(refreshRateThermalThrottling);
        dest.writeSparseArray(thermalRefreshRateThrottling);
    }

    @Override
@@ -884,8 +887,8 @@ public final class DisplayInfo implements Parcelable {
        } else {
            sb.append(hdrSdrRatio);
        }
        sb.append(", refreshRateThermalThrottling ");
        sb.append(refreshRateThermalThrottling);
        sb.append(", thermalRefreshRateThrottling ");
        sb.append(thermalRefreshRateThrottling);
        sb.append("}");
        return sb.toString();
    }
+26 −8
Original line number Diff line number Diff line
@@ -181,6 +181,19 @@ final class LogicalDisplay {
     */
    private String mThermalBrightnessThrottlingDataId;

    /**
     * Refresh rate range limitation based on the current device layout
     */
    @Nullable
    private SurfaceControl.RefreshRateRange mLayoutLimitedRefreshRate;

    /**
     * RefreshRateRange limitation for @Temperature.ThrottlingStatus
     */
    @NonNull
    private SparseArray<SurfaceControl.RefreshRateRange> mThermalRefreshRateThrottling =
            new SparseArray<>();

    public LogicalDisplay(int displayId, int layerStack, DisplayDevice primaryDisplayDevice) {
        mDisplayId = displayId;
        mLayerStack = layerStack;
@@ -339,24 +352,24 @@ final class LogicalDisplay {
     */
    public void updateLayoutLimitedRefreshRateLocked(
            @Nullable SurfaceControl.RefreshRateRange layoutLimitedRefreshRate) {
        if (!Objects.equals(layoutLimitedRefreshRate, mBaseDisplayInfo.layoutLimitedRefreshRate)) {
            mBaseDisplayInfo.layoutLimitedRefreshRate = layoutLimitedRefreshRate;
            mInfo.set(null);
        if (!Objects.equals(layoutLimitedRefreshRate, mLayoutLimitedRefreshRate)) {
            mLayoutLimitedRefreshRate = layoutLimitedRefreshRate;
            mDirty = true;
        }
    }
    /**
     * Updates refreshRateThermalThrottling
     * Updates thermalRefreshRateThrottling
     *
     * @param refreshRanges new refreshRateThermalThrottling ranges limited by layout or default
     * @param refreshRanges new thermalRefreshRateThrottling ranges limited by layout or default
     */
    public void updateThermalRefreshRateThrottling(
            @Nullable SparseArray<SurfaceControl.RefreshRateRange> refreshRanges) {
        if (refreshRanges == null) {
            refreshRanges = new SparseArray<>();
        }
        if (!mBaseDisplayInfo.refreshRateThermalThrottling.contentEquals(refreshRanges)) {
            mBaseDisplayInfo.refreshRateThermalThrottling = refreshRanges;
            mInfo.set(null);
        if (!mThermalRefreshRateThrottling.contentEquals(refreshRanges)) {
            mThermalRefreshRateThrottling = refreshRanges;
            mDirty = true;
        }
    }

@@ -499,6 +512,9 @@ final class LogicalDisplay {
                mBaseDisplayInfo.removeMode = Display.REMOVE_MODE_DESTROY_CONTENT;
            }

            mBaseDisplayInfo.layoutLimitedRefreshRate = mLayoutLimitedRefreshRate;
            mBaseDisplayInfo.thermalRefreshRateThrottling = mThermalRefreshRateThrottling;

            mPrimaryDisplayDeviceInfo = deviceInfo;
            mInfo.set(null);
            mDirty = false;
@@ -952,6 +968,8 @@ final class LogicalDisplay {
        pw.println("mDisplayGroupName=" + mDisplayGroupName);
        pw.println("mThermalBrightnessThrottlingDataId=" + mThermalBrightnessThrottlingDataId);
        pw.println("mLeadDisplayId=" + mLeadDisplayId);
        pw.println("mLayoutLimitedRefreshRate=" + mLayoutLimitedRefreshRate);
        pw.println("mThermalRefreshRateThrottling=" + mThermalRefreshRateThrottling);
    }

    @Override
+31 −23
Original line number Diff line number Diff line
@@ -1705,14 +1705,13 @@ public class DisplayModeDirector {
        }

        public void observe() {
            DisplayManager dm = mContext.getSystemService(DisplayManager.class);
            dm.registerDisplayListener(this, mHandler);
            mInjector.registerDisplayListener(this, mHandler);

            // Populate existing displays
            SparseArray<Display.Mode[]> modes = new SparseArray<>();
            SparseArray<Display.Mode> defaultModes = new SparseArray<>();
            DisplayInfo info = new DisplayInfo();
            Display[] displays = dm.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
            Display[] displays = mInjector.getDisplays();
            for (Display d : displays) {
                final int displayId = d.getDisplayId();
                d.getDisplayInfo(info);
@@ -1753,16 +1752,9 @@ public class DisplayModeDirector {

        @Nullable
        private DisplayInfo getDisplayInfo(int displayId) {
            Display d = mContext.getSystemService(DisplayManager.class).getDisplay(displayId);
            if (d == null) {
                // We can occasionally get a display added or changed event for a display that was
                // subsequently removed, which means this returns null. Check this case and bail
                // out early; if it gets re-attached we'll eventually get another call back for it.
                return null;
            }
            DisplayInfo info = new DisplayInfo();
            d.getDisplayInfo(info);
            return info;
            // Display info might be invalid, in this case return null
            return mInjector.getDisplayInfo(displayId, info) ? info : null;
        }

        private void updateLayoutLimitedFrameRate(int displayId, @Nullable DisplayInfo info) {
@@ -2432,8 +2424,7 @@ public class DisplayModeDirector {
        }

        private void updateDefaultDisplayState() {
            Display display = mContext.getSystemService(DisplayManager.class)
                    .getDisplay(Display.DEFAULT_DISPLAY);
            Display display = mInjector.getDisplay(Display.DEFAULT_DISPLAY);
            if (display == null) {
                return;
            }
@@ -2750,8 +2741,7 @@ public class DisplayModeDirector {
            sensorManager.addProximityActiveListener(BackgroundThread.getExecutor(), this);

            synchronized (mSensorObserverLock) {
                for (Display d : mDisplayManager.getDisplays(
                        DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) {
                for (Display d : mInjector.getDisplays()) {
                    mDozeStateByDisplay.put(d.getDisplayId(), mInjector.isDozeState(d));
                }
            }
@@ -2762,8 +2752,7 @@ public class DisplayModeDirector {
        }

        private void recalculateVotesLocked() {
            final Display[] displays = mDisplayManager.getDisplays(
                    DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
            final Display[] displays = mInjector.getDisplays();
            for (Display d : displays) {
                int displayId = d.getDisplayId();
                Vote vote = null;
@@ -2794,7 +2783,7 @@ public class DisplayModeDirector {

        @Override
        public void onDisplayAdded(int displayId) {
            boolean isDozeState = mInjector.isDozeState(mDisplayManager.getDisplay(displayId));
            boolean isDozeState = mInjector.isDozeState(mInjector.getDisplay(displayId));
            synchronized (mSensorObserverLock) {
                mDozeStateByDisplay.put(displayId, isDozeState);
                recalculateVotesLocked();
@@ -2806,7 +2795,7 @@ public class DisplayModeDirector {
            boolean wasDozeState = mDozeStateByDisplay.get(displayId);
            synchronized (mSensorObserverLock) {
                mDozeStateByDisplay.put(displayId,
                        mInjector.isDozeState(mDisplayManager.getDisplay(displayId)));
                        mInjector.isDozeState(mInjector.getDisplay(displayId)));
                if (wasDozeState != mDozeStateByDisplay.get(displayId)) {
                    recalculateVotesLocked();
                }
@@ -3175,9 +3164,14 @@ public class DisplayModeDirector {
        void registerForcePeakRefreshRateObserver(@NonNull ContentResolver cr,
                @NonNull ContentObserver observer);

        void registerDisplayListener(@NonNull DisplayManager.DisplayListener listener,
                Handler handler);

        void registerDisplayListener(@NonNull DisplayManager.DisplayListener listener,
                Handler handler, long flags);

        Display getDisplay(int displayId);

        Display[] getDisplays();

        boolean getDisplayInfo(int displayId, DisplayInfo displayInfo);
@@ -3220,12 +3214,23 @@ public class DisplayModeDirector {
                    observer, UserHandle.USER_SYSTEM);
        }

        @Override
        public void registerDisplayListener(DisplayManager.DisplayListener listener,
                Handler handler) {
            getDisplayManager().registerDisplayListener(listener, handler);
        }

        @Override
        public void registerDisplayListener(DisplayManager.DisplayListener listener,
                Handler handler, long flags) {
            getDisplayManager().registerDisplayListener(listener, handler, flags);
        }

        @Override
        public Display getDisplay(int displayId) {
            return getDisplayManager().getDisplay(displayId);
        }

        @Override
        public Display[] getDisplays() {
            return getDisplayManager().getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED);
@@ -3234,11 +3239,14 @@ public class DisplayModeDirector {
        @Override
        public boolean getDisplayInfo(int displayId, DisplayInfo displayInfo) {
            Display display = getDisplayManager().getDisplay(displayId);
            if (display != null) {
                return display.getDisplayInfo(displayInfo);
            }
            if (display == null) {
                // We can occasionally get a display added or changed event for a display that was
                // subsequently removed, which means this returns null. Check this case and bail
                // out early; if it gets re-attached we'll eventually get another call back for it.
                return false;
            }
            return display.getDisplayInfo(displayInfo);
        }

        @Override
        public BrightnessInfo getBrightnessInfo(int displayId) {
+2 −2
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ final class SkinThermalStatusObserver extends IThermalEventListener.Stub impleme
        for (Display d : displays) {
            final int displayId = d.getDisplayId();
            d.getDisplayInfo(info);
            localMap.put(displayId, info.refreshRateThermalThrottling);
            localMap.put(displayId, info.thermalRefreshRateThrottling);
        }
        synchronized (mThermalObserverLock) {
            for (int i = 0; i < size; i++) {
@@ -154,7 +154,7 @@ final class SkinThermalStatusObserver extends IThermalEventListener.Stub impleme
        DisplayInfo displayInfo = new DisplayInfo();
        mInjector.getDisplayInfo(displayId, displayInfo);
        SparseArray<SurfaceControl.RefreshRateRange> throttlingMap =
                displayInfo.refreshRateThermalThrottling;
                displayInfo.thermalRefreshRateThrottling;

        synchronized (mThermalObserverLock) {
            mThermalThrottlingByDisplay.put(displayId, throttlingMap);
+34 −7
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.server.display;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
@@ -26,6 +28,7 @@ import static org.mockito.Mockito.when;

import android.app.PropertyInvalidatedCache;
import android.graphics.Point;
import android.util.SparseArray;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.Surface;
@@ -47,6 +50,7 @@ public class LogicalDisplayTest {
    private static final int LAYER_STACK = 0;
    private static final int DISPLAY_WIDTH = 100;
    private static final int DISPLAY_HEIGHT = 200;
    private static final int MODE_ID = 1;

    private LogicalDisplay mLogicalDisplay;
    private DisplayDevice mDisplayDevice;
@@ -65,6 +69,9 @@ public class LogicalDisplayTest {
        mDisplayDeviceInfo.height = DISPLAY_HEIGHT;
        mDisplayDeviceInfo.flags = DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;
        mDisplayDeviceInfo.touch = DisplayDeviceInfo.TOUCH_INTERNAL;
        mDisplayDeviceInfo.modeId = MODE_ID;
        mDisplayDeviceInfo.supportedModes = new Display.Mode[] {new Display.Mode(MODE_ID,
                DISPLAY_WIDTH, DISPLAY_HEIGHT, /* refreshRate= */ 60)};
        when(mDisplayDevice.getDisplayDeviceInfoLocked()).thenReturn(mDisplayDeviceInfo);

        // Disable binder caches in this process.
@@ -168,14 +175,34 @@ public class LogicalDisplayTest {
    }

    @Test
    public void testLayoutLimitedRefreshRateNotClearedAfterUpdate() {
        SurfaceControl.RefreshRateRange refreshRateRange = new SurfaceControl.RefreshRateRange(1,
                2);
        mLogicalDisplay.updateLayoutLimitedRefreshRateLocked(refreshRateRange);
        mLogicalDisplay.updateDisplayGroupIdLocked(1);
    public void testUpdateLayoutLimitedRefreshRate() {
        SurfaceControl.RefreshRateRange layoutLimitedRefreshRate =
                new SurfaceControl.RefreshRateRange(0, 120);
        DisplayInfo info1 = mLogicalDisplay.getDisplayInfoLocked();
        mLogicalDisplay.updateLayoutLimitedRefreshRateLocked(layoutLimitedRefreshRate);
        DisplayInfo info2 = mLogicalDisplay.getDisplayInfoLocked();
        // Display info should only be updated when updateLocked is called
        assertEquals(info2, info1);

        DisplayInfo result = mLogicalDisplay.getDisplayInfoLocked();
        mLogicalDisplay.updateLocked(mDeviceRepo);
        DisplayInfo info3 = mLogicalDisplay.getDisplayInfoLocked();
        assertNotEquals(info3, info2);
        assertEquals(layoutLimitedRefreshRate, info3.layoutLimitedRefreshRate);
    }

        assertEquals(refreshRateRange, result.layoutLimitedRefreshRate);
    @Test
    public void testUpdateRefreshRateThermalThrottling() {
        SparseArray<SurfaceControl.RefreshRateRange> refreshRanges = new SparseArray<>();
        refreshRanges.put(0, new SurfaceControl.RefreshRateRange(0, 120));
        DisplayInfo info1 = mLogicalDisplay.getDisplayInfoLocked();
        mLogicalDisplay.updateThermalRefreshRateThrottling(refreshRanges);
        DisplayInfo info2 = mLogicalDisplay.getDisplayInfoLocked();
        // Display info should only be updated when updateLocked is called
        assertEquals(info2, info1);

        mLogicalDisplay.updateLocked(mDeviceRepo);
        DisplayInfo info3 = mLogicalDisplay.getDisplayInfoLocked();
        assertNotEquals(info3, info2);
        assertTrue(refreshRanges.contentEquals(info3.thermalRefreshRateThrottling));
    }
}
Loading