Loading services/core/java/com/android/server/hdmi/HdmiCecAtomWriter.java +15 −0 Original line number Diff line number Diff line Loading @@ -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: Loading services/core/java/com/android/server/hdmi/HdmiControlService.java +21 −6 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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. } Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecAtomLoggingTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); } } Loading
services/core/java/com/android/server/hdmi/HdmiCecAtomWriter.java +15 −0 Original line number Diff line number Diff line Loading @@ -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: Loading
services/core/java/com/android/server/hdmi/HdmiControlService.java +21 −6 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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. } Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecAtomLoggingTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); } }