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

Commit 7f7e1a64 authored by Paul Colța's avatar Paul Colța Committed by Android (Google) Code Review
Browse files

Merge "HDMI: Implement DSM atom logging in framework" into main

parents ccf60f8c 0a145a08
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -222,6 +222,21 @@ public class HdmiCecAtomWriter {
        );
    }

    /**
     * Writes a HdmiSoundbarModeStatusReported atom representing a Dynamic soundbar mode status
     * change.
     * @param isSupported         Whether the hardware supports ARC.
     * @param isEnabled           Whether DSM is enabled.
     * @param enumLogReason       The event that triggered the log.
     */
    public void dsmStatusChanged(boolean isSupported, boolean isEnabled, int enumLogReason) {
        FrameworkStatsLog.write(
                FrameworkStatsLog.HDMI_SOUNDBAR_MODE_STATUS_REPORTED,
                isSupported,
                isEnabled,
                enumLogReason);
    }

    private int earcStateToEnum(int earcState) {
        switch (earcState) {
            case HDMI_EARC_STATUS_IDLE:
+21 −6
Original line number Diff line number Diff line
@@ -1064,13 +1064,18 @@ public class HdmiControlService extends SystemService {
     */
    @VisibleForTesting
    public void setSoundbarMode(final int settingValue) {
        boolean isArcSupported = isArcSupported();
        HdmiCecLocalDevicePlayback playback = playback();
        HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem();
        getAtomWriter().dsmStatusChanged(isArcSupported,
                settingValue == SOUNDBAR_MODE_ENABLED,
                HdmiStatsEnums.LOG_REASON_DSM_SETTING_TOGGLED);

        if (playback == null) {
            Slog.w(TAG, "Device type not compatible to change soundbar mode.");
            return;
        }
        if (!SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)) {
        if (!isArcSupported) {
            Slog.w(TAG, "Device type doesn't support ARC.");
            return;
        }
@@ -1269,11 +1274,8 @@ public class HdmiControlService extends SystemService {
    @ServiceThreadOnly
    private List<Integer> getCecLocalDeviceTypes() {
        ArrayList<Integer> allLocalDeviceTypes = new ArrayList<>(mCecLocalDevices);
        if (mHdmiCecConfig.getIntValue(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE)
                == SOUNDBAR_MODE_ENABLED
                && !allLocalDeviceTypes.contains(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM)
                && SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)
                && mSoundbarModeFeatureFlagEnabled) {
        if (isDsmEnabled() && !allLocalDeviceTypes.contains(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM)
                && isArcSupported() && mSoundbarModeFeatureFlagEnabled) {
            allLocalDeviceTypes.add(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
        }
        return allLocalDeviceTypes;
@@ -3589,6 +3591,16 @@ public class HdmiControlService extends SystemService {
        }
    }

    private boolean isDsmEnabled() {
        return mHdmiCecConfig.getIntValue(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE)
                == SOUNDBAR_MODE_ENABLED;
    }

    @VisibleForTesting
    protected boolean isArcSupported() {
        return SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true);
    }

    @ServiceThreadOnly
    int getPowerStatus() {
        assertRunOnServiceThread();
@@ -3705,6 +3717,9 @@ public class HdmiControlService extends SystemService {
            int earcStatus = getEarcStatus();
            getAtomWriter().earcStatusChanged(isEarcSupported(), isEarcEnabled(),
                    earcStatus, earcStatus, HdmiStatsEnums.LOG_REASON_WAKE);
        } else if (isPlaybackDevice()) {
            getAtomWriter().dsmStatusChanged(isArcSupported(), isDsmEnabled(),
                    HdmiStatsEnums.LOG_REASON_DSM_WAKE);
        }
        // TODO: Initialize MHL local devices.
    }
+53 −0
Original line number Diff line number Diff line
@@ -19,14 +19,17 @@ import static com.android.server.SystemService.PHASE_BOOT_COMPLETED;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.PATH_RELATIONSHIP_ANCESTOR;
import static com.android.server.hdmi.HdmiControlService.WAKE_UP_SCREEN_ON;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -307,4 +310,54 @@ public class HdmiCecAtomLoggingTest {
                        HdmiCecAtomWriter.FEATURE_ABORT_OPCODE_UNKNOWN,
                        HdmiStatsEnums.FEATURE_ABORT_REASON_UNKNOWN);
    }

    @Test
    public void testDsmStatusChanged_toggleDsmStatus_ArcSupported_writesAtom() {
        doReturn(true).when(mHdmiControlServiceSpy).isArcSupported();
        mHdmiControlServiceSpy.setSoundbarMode(HdmiControlManager.SOUNDBAR_MODE_ENABLED);
        mTestLooper.dispatchAll();

        verify(mHdmiCecAtomWriterSpy, times(1))
                .dsmStatusChanged(eq(true), eq(true),
                        eq(HdmiStatsEnums.LOG_REASON_DSM_SETTING_TOGGLED));
    }

    @Test
    public void testDsmStatusChanged_toggleDsmStatus_ArcNotSupported_writesAtom() {
        doReturn(false).when(mHdmiControlServiceSpy).isArcSupported();
        mHdmiControlServiceSpy.setSoundbarMode(HdmiControlManager.SOUNDBAR_MODE_ENABLED);
        mTestLooper.dispatchAll();

        verify(mHdmiCecAtomWriterSpy, times(1))
                .dsmStatusChanged(eq(false), eq(true),
                        eq(HdmiStatsEnums.LOG_REASON_DSM_SETTING_TOGGLED));
    }

    @Test
    public void testDsmStatusChanged_onWakeUp_ArcSupported_writesAtom_logReasonWake() {
        doReturn(true).when(mHdmiControlServiceSpy).isArcSupported();
        mHdmiControlServiceSpy.onWakeUp(WAKE_UP_SCREEN_ON);
        mTestLooper.dispatchAll();

        verify(mHdmiCecAtomWriterSpy, times(1))
                .dsmStatusChanged(eq(true), eq(false),
                        eq(HdmiStatsEnums.LOG_REASON_DSM_WAKE));
        verify(mHdmiCecAtomWriterSpy, never())
                .dsmStatusChanged(anyBoolean(), anyBoolean(),
                        eq(HdmiStatsEnums.LOG_REASON_DSM_SETTING_TOGGLED));
    }

    @Test
    public void testDsmStatusChanged_onWakeUp_ArcNotSupported_writesAtom_logReasonWake() {
        doReturn(false).when(mHdmiControlServiceSpy).isArcSupported();
        mHdmiControlServiceSpy.onWakeUp(WAKE_UP_SCREEN_ON);
        mTestLooper.dispatchAll();

        verify(mHdmiCecAtomWriterSpy, times(1))
                .dsmStatusChanged(eq(false), eq(false),
                        eq(HdmiStatsEnums.LOG_REASON_DSM_WAKE));
        verify(mHdmiCecAtomWriterSpy, never())
                .dsmStatusChanged(anyBoolean(), anyBoolean(),
                        eq(HdmiStatsEnums.LOG_REASON_DSM_SETTING_TOGGLED));
    }
}