Loading core/java/android/view/Display.java +7 −0 Original line number Diff line number Diff line Loading @@ -448,6 +448,13 @@ public final class Display { @TestApi public static final int TYPE_VIRTUAL = 5; /** * The maximum display type value. * Helpful to get all possible display values. * @hide */ public static final int TYPE_MAX = TYPE_VIRTUAL; /** * Display state: The display state is unknown. * Loading services/core/java/com/android/server/display/DisplayPowerController.java +12 −1 Original line number Diff line number Diff line Loading @@ -546,7 +546,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mLastBrightnessEvent = new BrightnessEvent(mDisplayId); mTempBrightnessEvent = new BrightnessEvent(mDisplayId); if (flags.isBatteryStatsEnabledForAllDisplays()) { if (flags.isBatteryStatsEnabledForAllDisplays() && isDisplaySupportedForBatteryStats(displayDeviceInfo)) { mBatteryStats = BatteryStatsService.getService(); } else if (mDisplayId == Display.DEFAULT_DISPLAY) { mBatteryStats = BatteryStatsService.getService(); Loading Loading @@ -2772,6 +2773,16 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } private static boolean isDisplaySupportedForBatteryStats(DisplayDeviceInfo displayDeviceInfo) { switch (displayDeviceInfo.type) { case Display.TYPE_INTERNAL: case Display.TYPE_EXTERNAL: return true; default: return false; } } private void dumpBrightnessEvents(PrintWriter pw) { int size = mBrightnessEventRingBuffer.size(); if (size < 1) { Loading services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +57 −20 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.description; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; Loading Loading @@ -2278,29 +2279,44 @@ public final class DisplayPowerControllerTest { throws Exception { when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(false); verifyNoteScreenState(Display.DEFAULT_DISPLAY, /* expectNote= */ true); verifyNoteScreenState( Display.DEFAULT_DISPLAY, Display.TYPE_INTERNAL, /* expectNote= */ true); } @Test public void testBatteryStatNotes_enabledOnDefaultDisplayWhenEnabledOnOthers() throws Exception { when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(true); verifyNoteScreenState(Display.DEFAULT_DISPLAY, /* expectNote= */ true); verifyNoteScreenState( Display.DEFAULT_DISPLAY, Display.TYPE_INTERNAL, /* expectNote= */ true); } @Test public void testBatteryStatNotes_flagGuardedOnNonDefaultDisplays() throws Exception { public void testBatteryStatNotes_flagOff_disabledForNonDefaultDisplays() throws Exception { when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(false); verifyNoteScreenState(/* displayId= */ 2, /* expectNote= */ false); verifyNoteScreenState(/* displayId= */ 2, Display.TYPE_INTERNAL, /* expectNote= */ false); } @Test public void testBatteryStatNotes_enabledOnlyOnInternalOrExternalDisplays() throws Exception { when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(true); verifyNoteScreenState(/* displayId= */ 2, /* expectNote= */ true); for (int displayType = 0; displayType < Display.TYPE_MAX; displayType++) { boolean expectNote = (displayType == Display.TYPE_INTERNAL) || (displayType == Display.TYPE_EXTERNAL); verifyNoteScreenState(/* displayId= */ 2, displayType, expectNote); } } private void verifyNoteScreenState(int displayId, boolean expectNote) throws Exception { mHolder = createDisplayPowerController(displayId, UNIQUE_ID); private void verifyNoteScreenState(int displayId, int displayDeviceType, boolean expectNote) throws Exception { clearInvocations(mMockBatteryStats); DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); deviceInfo.type = displayDeviceType; deviceInfo.uniqueId = UNIQUE_ID; mHolder = createDisplayPowerController(displayId, deviceInfo); DisplayPowerRequest dpr = new DisplayPowerRequest(); dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); Loading @@ -2308,14 +2324,22 @@ public final class DisplayPowerControllerTest { mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); // Run updatePowerState final String baseErrorMessage = String.format("[display id=%d type=%d]", displayId, displayDeviceType); final String errorMessage; if (expectNote) { verify(mMockBatteryStats) errorMessage = "Expected battery stats: " + baseErrorMessage; verify(mMockBatteryStats, description(errorMessage)) .noteScreenState( displayId, Display.STATE_ON, Display.STATE_REASON_DEFAULT_POLICY); verify(mMockBatteryStats).noteScreenBrightness(eq(displayId), anyInt()); verify(mMockBatteryStats, description(errorMessage)) .noteScreenBrightness(eq(displayId), anyInt()); } else { verify(mMockBatteryStats, never()).noteScreenState(anyInt(), anyInt(), anyInt()); verify(mMockBatteryStats, never()).noteScreenBrightness(anyInt(), anyInt()); errorMessage = "Expected no battery stats: " + baseErrorMessage; verify(mMockBatteryStats, never().description(errorMessage)) .noteScreenState(anyInt(), anyInt(), anyInt()); verify(mMockBatteryStats, never().description(errorMessage)) .noteScreenBrightness(anyInt(), anyInt()); } } Loading Loading @@ -2350,17 +2374,16 @@ public final class DisplayPowerControllerTest { private void setUpDisplay(int displayId, String uniqueId, LogicalDisplay logicalDisplayMock, DisplayDevice displayDeviceMock, DisplayDeviceConfig displayDeviceConfigMock, boolean isEnabled) { setUpDisplay(displayId, uniqueId, logicalDisplayMock, displayDeviceMock, DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); deviceInfo.uniqueId = uniqueId; setUpDisplay(displayId, deviceInfo, logicalDisplayMock, displayDeviceMock, displayDeviceConfigMock, isEnabled, "display_name"); } private void setUpDisplay(int displayId, String uniqueId, LogicalDisplay logicalDisplayMock, DisplayDevice displayDeviceMock, DisplayDeviceConfig displayDeviceConfigMock, boolean isEnabled, String displayName) { private void setUpDisplay(int displayId, DisplayDeviceInfo deviceInfo, LogicalDisplay logicalDisplayMock, DisplayDevice displayDeviceMock, DisplayDeviceConfig displayDeviceConfigMock, boolean isEnabled, String displayName) { DisplayInfo info = new DisplayInfo(); DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); deviceInfo.uniqueId = uniqueId; when(logicalDisplayMock.getDisplayIdLocked()).thenReturn(displayId); when(logicalDisplayMock.getPrimaryDisplayDeviceLocked()).thenReturn(displayDeviceMock); Loading @@ -2368,7 +2391,7 @@ public final class DisplayPowerControllerTest { when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getUniqueId()).thenReturn(deviceInfo.uniqueId); when(displayDeviceMock.getNameLocked()).thenReturn(displayName); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); when(displayDeviceConfigMock.getProximitySensor()).thenReturn( Loading Loading @@ -2415,6 +2438,12 @@ public final class DisplayPowerControllerTest { hysteresisLevels); } private DisplayPowerControllerHolder createDisplayPowerController( int displayId, DisplayDeviceInfo info) { return createDisplayPowerController( displayId, info, /* isEnabled= */ true, /* isAutoBrightnessAvailable= */ true); } private DisplayPowerControllerHolder createDisplayPowerController(int displayId, String uniqueId) { return createDisplayPowerController(displayId, uniqueId, /* isEnabled= */ true); Loading @@ -2428,6 +2457,14 @@ public final class DisplayPowerControllerTest { private DisplayPowerControllerHolder createDisplayPowerController(int displayId, String uniqueId, boolean isEnabled, boolean isAutoBrightnessAvailable) { DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); deviceInfo.uniqueId = uniqueId; return createDisplayPowerController( displayId, deviceInfo, isEnabled, isAutoBrightnessAvailable); } private DisplayPowerControllerHolder createDisplayPowerController(int displayId, DisplayDeviceInfo deviceInfo, boolean isEnabled, boolean isAutoBrightnessAvailable) { final DisplayPowerState displayPowerState = mock(DisplayPowerState.class); final DualRampAnimator<DisplayPowerState> animator = mock(DualRampAnimator.class); final AutomaticBrightnessController automaticBrightnessController = Loading Loading @@ -2469,7 +2506,7 @@ public final class DisplayPowerControllerTest { when(config.getScreenBrightnessHysteresis()).thenReturn(hysteresisLevels); when(config.getScreenBrightnessIdleHysteresis()).thenReturn(hysteresisLevels); setUpDisplay(displayId, uniqueId, display, device, config, isEnabled); setUpDisplay(displayId, deviceInfo, display, device, config, isEnabled, "display_name"); when(config.isAutoBrightnessAvailable()).thenReturn(isAutoBrightnessAvailable); final DisplayPowerController dpc = new DisplayPowerController( Loading Loading
core/java/android/view/Display.java +7 −0 Original line number Diff line number Diff line Loading @@ -448,6 +448,13 @@ public final class Display { @TestApi public static final int TYPE_VIRTUAL = 5; /** * The maximum display type value. * Helpful to get all possible display values. * @hide */ public static final int TYPE_MAX = TYPE_VIRTUAL; /** * Display state: The display state is unknown. * Loading
services/core/java/com/android/server/display/DisplayPowerController.java +12 −1 Original line number Diff line number Diff line Loading @@ -546,7 +546,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mLastBrightnessEvent = new BrightnessEvent(mDisplayId); mTempBrightnessEvent = new BrightnessEvent(mDisplayId); if (flags.isBatteryStatsEnabledForAllDisplays()) { if (flags.isBatteryStatsEnabledForAllDisplays() && isDisplaySupportedForBatteryStats(displayDeviceInfo)) { mBatteryStats = BatteryStatsService.getService(); } else if (mDisplayId == Display.DEFAULT_DISPLAY) { mBatteryStats = BatteryStatsService.getService(); Loading Loading @@ -2772,6 +2773,16 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } private static boolean isDisplaySupportedForBatteryStats(DisplayDeviceInfo displayDeviceInfo) { switch (displayDeviceInfo.type) { case Display.TYPE_INTERNAL: case Display.TYPE_EXTERNAL: return true; default: return false; } } private void dumpBrightnessEvents(PrintWriter pw) { int size = mBrightnessEventRingBuffer.size(); if (size < 1) { Loading
services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +57 −20 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.description; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; Loading Loading @@ -2278,29 +2279,44 @@ public final class DisplayPowerControllerTest { throws Exception { when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(false); verifyNoteScreenState(Display.DEFAULT_DISPLAY, /* expectNote= */ true); verifyNoteScreenState( Display.DEFAULT_DISPLAY, Display.TYPE_INTERNAL, /* expectNote= */ true); } @Test public void testBatteryStatNotes_enabledOnDefaultDisplayWhenEnabledOnOthers() throws Exception { when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(true); verifyNoteScreenState(Display.DEFAULT_DISPLAY, /* expectNote= */ true); verifyNoteScreenState( Display.DEFAULT_DISPLAY, Display.TYPE_INTERNAL, /* expectNote= */ true); } @Test public void testBatteryStatNotes_flagGuardedOnNonDefaultDisplays() throws Exception { public void testBatteryStatNotes_flagOff_disabledForNonDefaultDisplays() throws Exception { when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(false); verifyNoteScreenState(/* displayId= */ 2, /* expectNote= */ false); verifyNoteScreenState(/* displayId= */ 2, Display.TYPE_INTERNAL, /* expectNote= */ false); } @Test public void testBatteryStatNotes_enabledOnlyOnInternalOrExternalDisplays() throws Exception { when(mDisplayManagerFlagsMock.isBatteryStatsEnabledForAllDisplays()).thenReturn(true); verifyNoteScreenState(/* displayId= */ 2, /* expectNote= */ true); for (int displayType = 0; displayType < Display.TYPE_MAX; displayType++) { boolean expectNote = (displayType == Display.TYPE_INTERNAL) || (displayType == Display.TYPE_EXTERNAL); verifyNoteScreenState(/* displayId= */ 2, displayType, expectNote); } } private void verifyNoteScreenState(int displayId, boolean expectNote) throws Exception { mHolder = createDisplayPowerController(displayId, UNIQUE_ID); private void verifyNoteScreenState(int displayId, int displayDeviceType, boolean expectNote) throws Exception { clearInvocations(mMockBatteryStats); DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); deviceInfo.type = displayDeviceType; deviceInfo.uniqueId = UNIQUE_ID; mHolder = createDisplayPowerController(displayId, deviceInfo); DisplayPowerRequest dpr = new DisplayPowerRequest(); dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); Loading @@ -2308,14 +2324,22 @@ public final class DisplayPowerControllerTest { mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); // Run updatePowerState final String baseErrorMessage = String.format("[display id=%d type=%d]", displayId, displayDeviceType); final String errorMessage; if (expectNote) { verify(mMockBatteryStats) errorMessage = "Expected battery stats: " + baseErrorMessage; verify(mMockBatteryStats, description(errorMessage)) .noteScreenState( displayId, Display.STATE_ON, Display.STATE_REASON_DEFAULT_POLICY); verify(mMockBatteryStats).noteScreenBrightness(eq(displayId), anyInt()); verify(mMockBatteryStats, description(errorMessage)) .noteScreenBrightness(eq(displayId), anyInt()); } else { verify(mMockBatteryStats, never()).noteScreenState(anyInt(), anyInt(), anyInt()); verify(mMockBatteryStats, never()).noteScreenBrightness(anyInt(), anyInt()); errorMessage = "Expected no battery stats: " + baseErrorMessage; verify(mMockBatteryStats, never().description(errorMessage)) .noteScreenState(anyInt(), anyInt(), anyInt()); verify(mMockBatteryStats, never().description(errorMessage)) .noteScreenBrightness(anyInt(), anyInt()); } } Loading Loading @@ -2350,17 +2374,16 @@ public final class DisplayPowerControllerTest { private void setUpDisplay(int displayId, String uniqueId, LogicalDisplay logicalDisplayMock, DisplayDevice displayDeviceMock, DisplayDeviceConfig displayDeviceConfigMock, boolean isEnabled) { setUpDisplay(displayId, uniqueId, logicalDisplayMock, displayDeviceMock, DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); deviceInfo.uniqueId = uniqueId; setUpDisplay(displayId, deviceInfo, logicalDisplayMock, displayDeviceMock, displayDeviceConfigMock, isEnabled, "display_name"); } private void setUpDisplay(int displayId, String uniqueId, LogicalDisplay logicalDisplayMock, DisplayDevice displayDeviceMock, DisplayDeviceConfig displayDeviceConfigMock, boolean isEnabled, String displayName) { private void setUpDisplay(int displayId, DisplayDeviceInfo deviceInfo, LogicalDisplay logicalDisplayMock, DisplayDevice displayDeviceMock, DisplayDeviceConfig displayDeviceConfigMock, boolean isEnabled, String displayName) { DisplayInfo info = new DisplayInfo(); DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); deviceInfo.uniqueId = uniqueId; when(logicalDisplayMock.getDisplayIdLocked()).thenReturn(displayId); when(logicalDisplayMock.getPrimaryDisplayDeviceLocked()).thenReturn(displayDeviceMock); Loading @@ -2368,7 +2391,7 @@ public final class DisplayPowerControllerTest { when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getUniqueId()).thenReturn(deviceInfo.uniqueId); when(displayDeviceMock.getNameLocked()).thenReturn(displayName); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); when(displayDeviceConfigMock.getProximitySensor()).thenReturn( Loading Loading @@ -2415,6 +2438,12 @@ public final class DisplayPowerControllerTest { hysteresisLevels); } private DisplayPowerControllerHolder createDisplayPowerController( int displayId, DisplayDeviceInfo info) { return createDisplayPowerController( displayId, info, /* isEnabled= */ true, /* isAutoBrightnessAvailable= */ true); } private DisplayPowerControllerHolder createDisplayPowerController(int displayId, String uniqueId) { return createDisplayPowerController(displayId, uniqueId, /* isEnabled= */ true); Loading @@ -2428,6 +2457,14 @@ public final class DisplayPowerControllerTest { private DisplayPowerControllerHolder createDisplayPowerController(int displayId, String uniqueId, boolean isEnabled, boolean isAutoBrightnessAvailable) { DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); deviceInfo.uniqueId = uniqueId; return createDisplayPowerController( displayId, deviceInfo, isEnabled, isAutoBrightnessAvailable); } private DisplayPowerControllerHolder createDisplayPowerController(int displayId, DisplayDeviceInfo deviceInfo, boolean isEnabled, boolean isAutoBrightnessAvailable) { final DisplayPowerState displayPowerState = mock(DisplayPowerState.class); final DualRampAnimator<DisplayPowerState> animator = mock(DualRampAnimator.class); final AutomaticBrightnessController automaticBrightnessController = Loading Loading @@ -2469,7 +2506,7 @@ public final class DisplayPowerControllerTest { when(config.getScreenBrightnessHysteresis()).thenReturn(hysteresisLevels); when(config.getScreenBrightnessIdleHysteresis()).thenReturn(hysteresisLevels); setUpDisplay(displayId, uniqueId, display, device, config, isEnabled); setUpDisplay(displayId, deviceInfo, display, device, config, isEnabled, "display_name"); when(config.isAutoBrightnessAvailable()).thenReturn(isAutoBrightnessAvailable); final DisplayPowerController dpc = new DisplayPowerController( Loading