diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index f9802e1e480c8..b796abd8ea7b2 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -66,11 +66,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, mSystemAudioActivated ? "true" : "false"); } - if (setSystemAudioMode(false)) { - mService.sendCecCommand( - HdmiCecMessageBuilder.buildSetSystemAudioMode( - mAddress, Constants.ADDR_BROADCAST, false)); - } + terminateSystemAudioMode(); } @Override @@ -332,6 +328,21 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { } } + protected void terminateSystemAudioMode() { + // remove pending initiation actions + removeAction(SystemAudioInitiationActionFromAvr.class); + if (!isSystemAudioActivated()) { + return; + } + + if (setSystemAudioMode(false)) { + // send [“Off”] + mService.sendCecCommand( + HdmiCecMessageBuilder.buildSetSystemAudioMode( + mAddress, Constants.ADDR_BROADCAST, false)); + } + } + /** Reports if System Audio Mode is supported by the connected TV */ interface TvSystemAudioModeSupportedCallback { diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java index 232fb8c192c37..cde8e63824e2a 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java @@ -21,9 +21,6 @@ import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF; import static com.google.common.truth.Truth.assertThat; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.assertEquals; import android.media.AudioManager; import android.os.Looper; @@ -140,52 +137,56 @@ public class HdmiCecLocalDeviceAudioSystemTest { mMusicMute = true; mMusicMaxVolume = 20; int scaledVolume = VolumeControlAction.scaleToCecVolume(10, mMusicMaxVolume); - HdmiCecMessage expectMessage = HdmiCecMessageBuilder.buildReportAudioStatus( + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildReportAudioStatus( ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true); HdmiCecMessage messageGive = HdmiCecMessageBuilder.buildGiveAudioStatus( ADDR_TV, ADDR_AUDIO_SYSTEM); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } @Test public void handleGiveSystemAudioModeStatus_originalOff() { - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); HdmiCecMessage messageGive = HdmiCecMessageBuilder .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } @Test public void handleRequestArcInitiate() { // TODO(b/80296911): Add tests when finishing handler impl. - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildInitiateArc(ADDR_AUDIO_SYSTEM, ADDR_TV); HdmiCecMessage message = HdmiCecMessageBuilder .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } @Test public void handleRequestArcTermination() { // TODO(b/80297105): Add tests when finishing handler impl. - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildTerminateArc(ADDR_AUDIO_SYSTEM, ADDR_TV); HdmiCecMessage messageRequestOff = HdmiCecMessageBuilder .buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(messageRequestOff)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(messageRequestOff)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } @Test @@ -197,28 +198,31 @@ public class HdmiCecLocalDeviceAudioSystemTest { .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM); // Check if originally off - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); // Check if correctly turned on - expectMessage = HdmiCecMessageBuilder + expectedMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); - assertFalse(mMusicMute); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); + assertThat(mMusicMute).isEqualTo(false); } @Test public void handleSystemAudioModeRequest_turnOffByTv() { - assertFalse(mMusicMute); + assertThat(mMusicMute).isEqualTo(false); // Check if feature correctly turned off HdmiCecMessage messageGive = HdmiCecMessageBuilder @@ -226,18 +230,20 @@ public class HdmiCecLocalDeviceAudioSystemTest { HdmiCecMessage messageRequestOff = HdmiCecMessageBuilder .buildSystemAudioModeRequest(ADDR_TV, ADDR_AUDIO_SYSTEM, 2, false); - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); - expectMessage = HdmiCecMessageBuilder + expectedMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); - assertTrue(mMusicMute); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); + assertThat(mMusicMute).isEqualTo(true); } @Test @@ -248,10 +254,10 @@ public class HdmiCecLocalDeviceAudioSystemTest { // Check if standby correctly turns off the feature mHdmiCecLocalDeviceAudioSystem.onStandby(false, STANDBY_SCREEN_OFF); mTestLooper.dispatchAll(); - HdmiCecMessage expectMessage = HdmiCecMessageBuilder + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false); - assertEquals(expectMessage, mNativeWrapper.getResultMessage()); - assertTrue(mMusicMute); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); + assertThat(mMusicMute).isEqualTo(true); } @Test @@ -304,8 +310,43 @@ public class HdmiCecLocalDeviceAudioSystemTest { .buildActiveSource(ADDR_TV, 0x0000); ActiveSource expectedActiveSource = new ActiveSource(ADDR_TV, 0x0000); - assertTrue(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)); + assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)) + .isEqualTo(true); mTestLooper.dispatchAll(); - assertTrue(mHdmiCecLocalDeviceAudioSystem.getActiveSource().equals(expectedActiveSource)); + assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().equals(expectedActiveSource)) + .isEqualTo(true); + } + + @Test + public void terminateSystemAudioMode_systemAudioModeOff() { + mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(false); + assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isEqualTo(false); + + mMusicMute = false; + HdmiCecMessage message = HdmiCecMessageBuilder + .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false); + + mHdmiCecLocalDeviceAudioSystem.terminateSystemAudioMode(); + + assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isEqualTo(false); + assertThat(mMusicMute).isEqualTo(false); + assertThat(mNativeWrapper.getResultMessage()).isNotEqualTo(message); + } + + @Test + public void terminateSystemAudioMode_systemAudioModeOn() { + mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(true); + assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isEqualTo(true); + + mMusicMute = false; + HdmiCecMessage expectedMessage = HdmiCecMessageBuilder + .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false); + + mHdmiCecLocalDeviceAudioSystem.terminateSystemAudioMode(); + + assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isEqualTo(false); + assertThat(mMusicMute).isEqualTo(true); + mTestLooper.dispatchAll(); + assertThat(mNativeWrapper.getResultMessage()).isEqualTo(expectedMessage); } }