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

Commit 0da6c08d authored by Yeabkal Wubshit's avatar Yeabkal Wubshit Committed by Android (Google) Code Review
Browse files

Merge "Limit display batterystats to internal/external displays" into main

parents fe63fdd5 b355d2c9
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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.
     *
+12 −1
Original line number Diff line number Diff line
@@ -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();
@@ -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) {
+57 −20
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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());
        }
    }

@@ -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);
@@ -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(
@@ -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);
@@ -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 =
@@ -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(