diff options
| author | 2023-04-27 09:07:14 +0000 | |
|---|---|---|
| committer | 2023-04-27 09:07:14 +0000 | |
| commit | 07828885511b67fea7e7316fd95936ee3a3be25c (patch) | |
| tree | 282b45b60a8c1918e1e9af02ae7f2c7080472842 | |
| parent | 0ac26d4d5e7a5c8b1ce73c3591d2d88b4498a9bf (diff) | |
| parent | 4f5cc3723e009dee8723497b04a927750c2b03ca (diff) | |
Merge "Store brightnessThrottlingDataId in DisplayInfo" into udc-dev
8 files changed, 90 insertions, 33 deletions
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index f2373fbfa858..d8fa533dbef7 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -360,6 +360,14 @@ public final class DisplayInfo implements Parcelable { public SparseArray<SurfaceControl.RefreshRateRange> thermalRefreshRateThrottling = new SparseArray<>(); + /** + * The ID of the brightness throttling data that should be used. This can change e.g. in + * concurrent displays mode in which a stricter brightness throttling policy might need to be + * used. + */ + @Nullable + public String thermalBrightnessThrottlingDataId; + public static final @android.annotation.NonNull Creator<DisplayInfo> CREATOR = new Creator<DisplayInfo>() { @Override public DisplayInfo createFromParcel(Parcel source) { @@ -437,7 +445,9 @@ public final class DisplayInfo implements Parcelable { && Objects.equals(displayShape, other.displayShape) && Objects.equals(layoutLimitedRefreshRate, other.layoutLimitedRefreshRate) && BrightnessSynchronizer.floatEquals(hdrSdrRatio, other.hdrSdrRatio) - && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling); + && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling) + && Objects.equals( + thermalBrightnessThrottlingDataId, other.thermalBrightnessThrottlingDataId); } @Override @@ -495,6 +505,7 @@ public final class DisplayInfo implements Parcelable { layoutLimitedRefreshRate = other.layoutLimitedRefreshRate; hdrSdrRatio = other.hdrSdrRatio; thermalRefreshRateThrottling = other.thermalRefreshRateThrottling; + thermalBrightnessThrottlingDataId = other.thermalBrightnessThrottlingDataId; } public void readFromParcel(Parcel source) { @@ -559,6 +570,7 @@ public final class DisplayInfo implements Parcelable { hdrSdrRatio = source.readFloat(); thermalRefreshRateThrottling = source.readSparseArray(null, SurfaceControl.RefreshRateRange.class); + thermalBrightnessThrottlingDataId = source.readString8(); } @Override @@ -620,6 +632,7 @@ public final class DisplayInfo implements Parcelable { dest.writeTypedObject(layoutLimitedRefreshRate, flags); dest.writeFloat(hdrSdrRatio); dest.writeSparseArray(thermalRefreshRateThrottling); + dest.writeString8(thermalBrightnessThrottlingDataId); } @Override @@ -889,6 +902,8 @@ public final class DisplayInfo implements Parcelable { } sb.append(", thermalRefreshRateThrottling "); sb.append(thermalRefreshRateThrottling); + sb.append(", thermalBrightnessThrottlingDataId "); + sb.append(thermalBrightnessThrottlingDataId); sb.append("}"); return sb.toString(); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 0d89ba88c1cf..0861cb59a944 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -83,6 +83,7 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; +import java.util.Objects; /** * Controls the power state of the display. @@ -605,7 +606,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mLastBrightnessEvent = new BrightnessEvent(mDisplayId); mTempBrightnessEvent = new BrightnessEvent(mDisplayId); mThermalBrightnessThrottlingDataId = - logicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + logicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; if (mDisplayId == Display.DEFAULT_DISPLAY) { mBatteryStats = BatteryStatsService.getService(); @@ -955,7 +956,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call && mLogicalDisplay.getPrimaryDisplayDeviceLocked() .getDisplayDeviceInfoLocked().type == Display.TYPE_INTERNAL; final String thermalBrightnessThrottlingDataId = - mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mHandler.postAtTime(() -> { boolean changed = false; if (mDisplayDevice != device) { @@ -972,8 +973,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // last command that was sent to change it's state. Let's assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); - } else if ( - !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) { + } else if (!Objects.equals(mThermalBrightnessThrottlingDataId, + thermalBrightnessThrottlingDataId)) { changed = true; mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId; mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig( @@ -2189,7 +2190,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); - }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(), + }, mUniqueDisplayId, + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId, ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId()); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java index 9e8c47f64926..23163ac35f16 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController2.java +++ b/services/core/java/com/android/server/display/DisplayPowerController2.java @@ -85,6 +85,7 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; +import java.util.Objects; /** * Controls the power state of the display. @@ -488,7 +489,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy(context, mDisplayId); mTag = "DisplayPowerController2[" + mDisplayId + "]"; mThermalBrightnessThrottlingDataId = - logicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + logicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); @@ -760,7 +761,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal && mLogicalDisplay.getPrimaryDisplayDeviceLocked() .getDisplayDeviceInfoLocked().type == Display.TYPE_INTERNAL; final String thermalBrightnessThrottlingDataId = - mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mHandler.postAtTime(() -> { boolean changed = false; @@ -778,8 +779,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal // last command that was sent to change it's state. Let's assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); - } else if ( - !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) { + } else if (!Objects.equals(mThermalBrightnessThrottlingDataId, + thermalBrightnessThrottlingDataId)) { changed = true; mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId; mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig( @@ -1820,7 +1821,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); - }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(), + }, mUniqueDisplayId, + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId, ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId()); } diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java index 0b6d1c851dc4..e5c50e61bf25 100644 --- a/services/core/java/com/android/server/display/LogicalDisplay.java +++ b/services/core/java/com/android/server/display/LogicalDisplay.java @@ -203,6 +203,7 @@ final class LogicalDisplay { mIsEnabled = true; mIsInTransition = false; mThermalBrightnessThrottlingDataId = DisplayDeviceConfig.DEFAULT_ID; + mBaseDisplayInfo.thermalBrightnessThrottlingDataId = mThermalBrightnessThrottlingDataId; } public void setDevicePositionLocked(int position) { @@ -514,6 +515,7 @@ final class LogicalDisplay { mBaseDisplayInfo.layoutLimitedRefreshRate = mLayoutLimitedRefreshRate; mBaseDisplayInfo.thermalRefreshRateThrottling = mThermalRefreshRateThrottling; + mBaseDisplayInfo.thermalBrightnessThrottlingDataId = mThermalBrightnessThrottlingDataId; mPrimaryDisplayDeviceInfo = deviceInfo; mInfo.set(null); @@ -886,19 +888,14 @@ final class LogicalDisplay { } /** - * @return The ID of the brightness throttling data that this display should use. - */ - public String getThermalBrightnessThrottlingDataIdLocked() { - return mThermalBrightnessThrottlingDataId; - } - - /** * @param brightnessThrottlingDataId The ID of the brightness throttling data that this * display should use. */ public void setThermalBrightnessThrottlingDataIdLocked(String brightnessThrottlingDataId) { - mThermalBrightnessThrottlingDataId = - brightnessThrottlingDataId; + if (!Objects.equals(brightnessThrottlingDataId, mThermalBrightnessThrottlingDataId)) { + mThermalBrightnessThrottlingDataId = brightnessThrottlingDataId; + mDirty = true; + } } /** diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java index c4aa0bbc24b5..4f5dc832dd52 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java @@ -596,17 +596,17 @@ public final class DisplayPowerController2Test { // We should still set screen state for the default display DisplayPowerRequest dpr = new DisplayPowerRequest(); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState, times(2)).setScreenState(anyInt()); mHolder = createDisplayPowerController(42, UNIQUE_ID); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState, never()).setScreenState(anyInt()); mHolder.dpc.onBootCompleted(); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState).setScreenState(anyInt()); } @@ -822,6 +822,21 @@ public final class DisplayPowerController2Test { ); } + @Test + public void testUpdateBrightnessThrottlingDataId() { + mHolder.display.getDisplayInfoLocked().thermalBrightnessThrottlingDataId = + "throttling-data-id"; + clearInvocations(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()); + + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()) + .getThermalBrightnessThrottlingDataMapByThrottlingId(); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -862,8 +877,6 @@ public final class DisplayPowerController2Test { when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); - when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn( - DisplayDeviceConfig.DEFAULT_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java index 415adbbac91e..5c0810fdca44 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -829,6 +829,21 @@ public final class DisplayPowerControllerTest { ); } + @Test + public void testUpdateBrightnessThrottlingDataId() { + mHolder.display.getDisplayInfoLocked().thermalBrightnessThrottlingDataId = + "throttling-data-id"; + clearInvocations(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()); + + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()) + .getThermalBrightnessThrottlingDataMapByThrottlingId(); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -869,8 +884,6 @@ public final class DisplayPowerControllerTest { when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); - when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn( - DisplayDeviceConfig.DEFAULT_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java index 7536c7949bcb..1eec70da3d20 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java @@ -649,9 +649,9 @@ public class LogicalDisplayMapperTest { assertEquals(0, mLogicalDisplayMapper.getDisplayLocked(device2) .getLeadDisplayIdLocked()); assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); mLogicalDisplayMapper.setDeviceStateLocked(1, false); advanceTime(1000); @@ -661,10 +661,10 @@ public class LogicalDisplayMapperTest { assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked()); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); mLogicalDisplayMapper.setDeviceStateLocked(2, false); advanceTime(1000); @@ -674,10 +674,10 @@ public class LogicalDisplayMapperTest { assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked()); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); } @Test diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java index 5ea30298890f..f6cf57161f59 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java @@ -205,4 +205,19 @@ public class LogicalDisplayTest { assertNotEquals(info3, info2); assertTrue(refreshRanges.contentEquals(info3.thermalRefreshRateThrottling)); } + + @Test + public void testSetThermalBrightnessThrottlingDataId() { + String brightnessThrottlingDataId = "throttling_data_id"; + DisplayInfo info1 = mLogicalDisplay.getDisplayInfoLocked(); + mLogicalDisplay.setThermalBrightnessThrottlingDataIdLocked(brightnessThrottlingDataId); + 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); + assertEquals(brightnessThrottlingDataId, info3.thermalBrightnessThrottlingDataId); + } } |