diff options
7 files changed, 88 insertions, 38 deletions
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 3b779ecf77e5..626502ef07b4 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -3151,11 +3151,6 @@ public final class DisplayManagerService extends SystemService { // with the corresponding displaydevice. HighBrightnessModeMetadata hbmMetadata = mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); - if (hbmMetadata == null) { - Slog.wtf(TAG, "High Brightness Mode Metadata is null in DisplayManagerService for " - + "display: " + display.getDisplayIdLocked()); - return null; - } if (mConfigParameterProvider.isNewPowerControllerFeatureEnabled()) { displayPowerController = new DisplayPowerController2( mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler, diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 46b543b9cfb9..1dfe6b2de5ab 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -450,6 +450,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private float[] mNitsRange; private final BrightnessRangeController mBrightnessRangeController; + + @Nullable private final HighBrightnessModeMetadata mHighBrightnessModeMetadata; private final BrightnessThrottler mBrightnessThrottler; diff --git a/services/core/java/com/android/server/display/HighBrightnessModeController.java b/services/core/java/com/android/server/display/HighBrightnessModeController.java index 11160a532609..c04c2793b3c5 100644 --- a/services/core/java/com/android/server/display/HighBrightnessModeController.java +++ b/services/core/java/com/android/server/display/HighBrightnessModeController.java @@ -16,6 +16,7 @@ package com.android.server.display; +import android.annotation.Nullable; import android.content.Context; import android.database.ContentObserver; import android.hardware.display.BrightnessInfo; @@ -75,6 +76,8 @@ class HighBrightnessModeController { private final Injector mInjector; private HdrListener mHdrListener; + + @Nullable private HighBrightnessModeData mHbmData; private HdrBrightnessDeviceConfig mHdrBrightnessCfg; private IBinder mRegisteredDisplayToken; @@ -107,7 +110,9 @@ class HighBrightnessModeController { * If HBM is currently running, this is the start time and set of all events, * for the current HBM session. */ - private HighBrightnessModeMetadata mHighBrightnessModeMetadata = null; + @Nullable + private HighBrightnessModeMetadata mHighBrightnessModeMetadata; + HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, String displayUniqueId, float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg, @@ -310,23 +315,29 @@ class HighBrightnessModeController { pw.println(" mBrightnessMax=" + mBrightnessMax); pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis())); pw.println(" mIsTimeAvailable= " + mIsTimeAvailable); - pw.println(" mRunningStartTimeMillis=" - + TimeUtils.formatUptime(mHighBrightnessModeMetadata.getRunningStartTimeMillis())); pw.println(" mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode); pw.println(" width*height=" + mWidth + "*" + mHeight); - pw.println(" mEvents="); - final long currentTime = mClock.uptimeMillis(); - long lastStartTime = currentTime; - long runningStartTimeMillis = mHighBrightnessModeMetadata.getRunningStartTimeMillis(); - if (runningStartTimeMillis != -1) { - lastStartTime = dumpHbmEvent(pw, new HbmEvent(runningStartTimeMillis, currentTime)); - } - for (HbmEvent event : mHighBrightnessModeMetadata.getHbmEventQueue()) { - if (lastStartTime > event.getEndTimeMillis()) { - pw.println(" event: [normal brightness]: " - + TimeUtils.formatDuration(lastStartTime - event.getEndTimeMillis())); + + if (mHighBrightnessModeMetadata != null) { + pw.println(" mRunningStartTimeMillis=" + + TimeUtils.formatUptime( + mHighBrightnessModeMetadata.getRunningStartTimeMillis())); + pw.println(" mEvents="); + final long currentTime = mClock.uptimeMillis(); + long lastStartTime = currentTime; + long runningStartTimeMillis = mHighBrightnessModeMetadata.getRunningStartTimeMillis(); + if (runningStartTimeMillis != -1) { + lastStartTime = dumpHbmEvent(pw, new HbmEvent(runningStartTimeMillis, currentTime)); } - lastStartTime = dumpHbmEvent(pw, event); + for (HbmEvent event : mHighBrightnessModeMetadata.getHbmEventQueue()) { + if (lastStartTime > event.getEndTimeMillis()) { + pw.println(" event: [normal brightness]: " + + TimeUtils.formatDuration(lastStartTime - event.getEndTimeMillis())); + } + lastStartTime = dumpHbmEvent(pw, event); + } + } else { + pw.println(" mHighBrightnessModeMetadata=null"); } } @@ -353,7 +364,7 @@ class HighBrightnessModeController { } private boolean deviceSupportsHbm() { - return mHbmData != null; + return mHbmData != null && mHighBrightnessModeMetadata != null; } private long calculateRemainingTime(long currentTime) { diff --git a/services/core/java/com/android/server/display/HighBrightnessModeMetadataMapper.java b/services/core/java/com/android/server/display/HighBrightnessModeMetadataMapper.java index 76702d3f6f8c..9e6f0eb93831 100644 --- a/services/core/java/com/android/server/display/HighBrightnessModeMetadataMapper.java +++ b/services/core/java/com/android/server/display/HighBrightnessModeMetadataMapper.java @@ -41,6 +41,9 @@ class HighBrightnessModeMetadataMapper { + display.getDisplayIdLocked()); return null; } + if (device.getDisplayDeviceConfig().getHighBrightnessModeData() == null) { + return null; + } final String uniqueId = device.getUniqueId(); diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java index d54eca2ada9b..ad8c5e56b9b4 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java @@ -50,6 +50,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.PowerManager; import android.os.SystemProperties; +import android.os.UserHandle; import android.os.test.TestLooper; import android.provider.Settings; import android.testing.TestableContext; @@ -144,11 +145,12 @@ public final class DisplayPowerController2Test { mTestLooper = new TestLooper(mClock::now); mHandler = new Handler(mTestLooper.getLooper()); - // Put the system into manual brightness by default, just to minimize unexpected events and - // have a consistent starting state + // Set some settings to minimize unexpected events and have a consistent starting state Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); + Settings.System.putFloatForUser(mContext.getContentResolver(), + Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0, UserHandle.USER_CURRENT); addLocalServiceMock(WindowManagerPolicy.class, mWindowManagerPolicyMock); addLocalServiceMock(ColorDisplayService.ColorDisplayServiceInternal.class, diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java index 5de187641ef5..8ddf7b66e816 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -50,6 +50,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.PowerManager; import android.os.SystemProperties; +import android.os.UserHandle; import android.os.test.TestLooper; import android.provider.Settings; import android.testing.TestableContext; @@ -144,12 +145,12 @@ public final class DisplayPowerControllerTest { mTestLooper = new TestLooper(mClock::now); mHandler = new Handler(mTestLooper.getLooper()); - // Put the system into manual brightness by default, just to minimize unexpected events and - // have a consistent starting state + // Set some settings to minimize unexpected events and have a consistent starting state Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); - + Settings.System.putFloatForUser(mContext.getContentResolver(), + Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0, UserHandle.USER_CURRENT); addLocalServiceMock(WindowManagerPolicy.class, mWindowManagerPolicyMock); addLocalServiceMock(ColorDisplayService.ColorDisplayServiceInternal.class, diff --git a/services/tests/displayservicetests/src/com/android/server/display/HighBrightnessModeMetadataMapperTest.java b/services/tests/displayservicetests/src/com/android/server/display/HighBrightnessModeMetadataMapperTest.java index d9fbba5b4274..7e7ccf733876 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/HighBrightnessModeMetadataMapperTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/HighBrightnessModeMetadataMapperTest.java @@ -17,35 +17,69 @@ package com.android.server.display; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; public class HighBrightnessModeMetadataMapperTest { + @Mock + private LogicalDisplay mDisplayMock; + + @Mock + private DisplayDevice mDeviceMock; + + @Mock + private DisplayDeviceConfig mDdcMock; + + @Mock + private DisplayDeviceConfig.HighBrightnessModeData mHbmDataMock; + private HighBrightnessModeMetadataMapper mHighBrightnessModeMetadataMapper; @Before public void setUp() { + MockitoAnnotations.initMocks(this); + when(mDisplayMock.getPrimaryDisplayDeviceLocked()).thenReturn(mDeviceMock); + when(mDeviceMock.getDisplayDeviceConfig()).thenReturn(mDdcMock); + when(mDdcMock.getHighBrightnessModeData()).thenReturn(mHbmDataMock); mHighBrightnessModeMetadataMapper = new HighBrightnessModeMetadataMapper(); } @Test - public void testGetHighBrightnessModeMetadata() { - // Display device is null - final LogicalDisplay display = mock(LogicalDisplay.class); - when(display.getPrimaryDisplayDeviceLocked()).thenReturn(null); - assertNull(mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display)); - - // No HBM metadata stored for this display yet - final DisplayDevice device = mock(DisplayDevice.class); - when(display.getPrimaryDisplayDeviceLocked()).thenReturn(device); + public void testGetHighBrightnessModeMetadata_NoDisplayDevice() { + when(mDisplayMock.getPrimaryDisplayDeviceLocked()).thenReturn(null); + assertNull(mHighBrightnessModeMetadataMapper + .getHighBrightnessModeMetadataLocked(mDisplayMock)); + } + + @Test + public void testGetHighBrightnessModeMetadata_NoHBMData() { + when(mDdcMock.getHighBrightnessModeData()).thenReturn(null); + assertNull(mHighBrightnessModeMetadataMapper + .getHighBrightnessModeMetadataLocked(mDisplayMock)); + } + + @Test + public void testGetHighBrightnessModeMetadata_NewDisplay() { HighBrightnessModeMetadata hbmMetadata = - mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); + mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(mDisplayMock); + assertNotNull(hbmMetadata); + assertTrue(hbmMetadata.getHbmEventQueue().isEmpty()); + assertTrue(hbmMetadata.getRunningStartTimeMillis() < 0); + } + + @Test + public void testGetHighBrightnessModeMetadata_Modify() { + HighBrightnessModeMetadata hbmMetadata = + mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(mDisplayMock); + assertNotNull(hbmMetadata); assertTrue(hbmMetadata.getHbmEventQueue().isEmpty()); assertTrue(hbmMetadata.getRunningStartTimeMillis() < 0); @@ -55,8 +89,10 @@ public class HighBrightnessModeMetadataMapperTest { long setTime = 300; hbmMetadata.addHbmEvent(new HbmEvent(startTimeMillis, endTimeMillis)); hbmMetadata.setRunningStartTimeMillis(setTime); + hbmMetadata = - mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); + mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(mDisplayMock); + assertEquals(1, hbmMetadata.getHbmEventQueue().size()); assertEquals(startTimeMillis, hbmMetadata.getHbmEventQueue().getFirst().getStartTimeMillis()); |