Loading core/java/android/view/DisplayInfo.java +10 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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>() { Loading Loading @@ -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 Loading Loading @@ -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) { Loading Loading @@ -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); } Loading Loading @@ -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 Loading Loading @@ -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(); } Loading services/core/java/com/android/server/display/LogicalDisplay.java +26 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading Loading @@ -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; Loading Loading @@ -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 Loading services/core/java/com/android/server/display/mode/DisplayModeDirector.java +31 −23 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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; } Loading Loading @@ -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)); } } Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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(); } Loading Loading @@ -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); Loading Loading @@ -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); Loading @@ -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) { Loading services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java +2 −2 Original line number Diff line number Diff line Loading @@ -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++) { Loading @@ -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); Loading services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java +34 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading Loading @@ -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
core/java/android/view/DisplayInfo.java +10 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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>() { Loading Loading @@ -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 Loading Loading @@ -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) { Loading Loading @@ -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); } Loading Loading @@ -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 Loading Loading @@ -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(); } Loading
services/core/java/com/android/server/display/LogicalDisplay.java +26 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading Loading @@ -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; Loading Loading @@ -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 Loading
services/core/java/com/android/server/display/mode/DisplayModeDirector.java +31 −23 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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; } Loading Loading @@ -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)); } } Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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(); } Loading Loading @@ -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); Loading Loading @@ -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); Loading @@ -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) { Loading
services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java +2 −2 Original line number Diff line number Diff line Loading @@ -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++) { Loading @@ -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); Loading
services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java +34 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading Loading @@ -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)); } }