diff options
4 files changed, 42 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/hdmi/ActiveSourceAction.java b/services/core/java/com/android/server/hdmi/ActiveSourceAction.java index 3c4dae0f6467..c90f297e1485 100644 --- a/services/core/java/com/android/server/hdmi/ActiveSourceAction.java +++ b/services/core/java/com/android/server/hdmi/ActiveSourceAction.java @@ -39,15 +39,19 @@ public class ActiveSourceAction extends HdmiCecFeatureAction { @Override boolean start() { mState = STATE_STARTED; - sendCommand(HdmiCecMessageBuilder.buildActiveSource(getSourceAddress(), - source().mService.getPhysicalAddress())); + int logicalAddress = getSourceAddress(); + int physicalAddress = getSourcePath(); + + sendCommand(HdmiCecMessageBuilder.buildActiveSource(logicalAddress, physicalAddress)); if (source().getType() == HdmiDeviceInfo.DEVICE_PLAYBACK) { // Reports menu-status active to receive <User Control Pressed>. sendCommand( - HdmiCecMessageBuilder.buildReportMenuStatus(getSourceAddress(), mDestination, + HdmiCecMessageBuilder.buildReportMenuStatus(logicalAddress, mDestination, Constants.MENU_STATE_ACTIVATED)); } + + source().setActiveSource(logicalAddress, physicalAddress); mState = STATE_FINISHED; finish(); return true; diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 30d7d5494a7e..c55c1ed850bb 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -3244,7 +3244,6 @@ public class HdmiControlService extends SystemService { playback.setIsActiveSource(true); playback.wakeUpIfActiveSource(); playback.maySendActiveSource(source); - setActiveSource(playback.mAddress, physicalAddress); } if (deviceType == HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) { @@ -3255,7 +3254,6 @@ public class HdmiControlService extends SystemService { audioSystem.setIsActiveSource(true); audioSystem.wakeUpIfActiveSource(); audioSystem.maySendActiveSource(source); - setActiveSource(audioSystem.mAddress, physicalAddress); } } } @@ -3278,13 +3276,11 @@ public class HdmiControlService extends SystemService { if (audioSystem != null) { audioSystem.setIsActiveSource(false); } - setActiveSource(playback.mAddress, physicalAddress); } else { if (audioSystem != null) { audioSystem.setIsActiveSource(true); audioSystem.wakeUpIfActiveSource(); audioSystem.maySendActiveSource(sourceAddress); - setActiveSource(audioSystem.mAddress, physicalAddress); } } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java index 50086affcbc5..870a27417cd2 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java @@ -144,6 +144,26 @@ public class ActiveSourceActionTest { } @Test + public void playbackDevice_updatesActiveSourceState() { + HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback( + mHdmiControlService); + playbackDevice.init(); + mLocalDevices.add(playbackDevice); + mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); + mTestLooper.dispatchAll(); + + HdmiCecFeatureAction action = new com.android.server.hdmi.ActiveSourceAction( + playbackDevice, ADDR_TV); + playbackDevice.addAndStartAction(action); + mTestLooper.dispatchAll(); + + assertThat(playbackDevice.getActiveSource().logicalAddress).isEqualTo( + playbackDevice.mAddress); + assertThat(playbackDevice.getActiveSource().physicalAddress).isEqualTo(mPhysicalAddress); + assertThat(playbackDevice.mIsActiveSource).isTrue(); + } + + @Test public void audioDevice_sendsActiveSource_noMenuStatus() { HdmiCecLocalDeviceAudioSystem audioDevice = new HdmiCecLocalDeviceAudioSystem( mHdmiControlService); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java index 35f9ca5cce68..7d3f81c6af35 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -526,4 +526,19 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mNativeWrapper.getResultMessages()).contains(activeSource); } + + @Test + public void handleSetStreamPath_afterHotplug_hasCorrectActiveSource() { + mHdmiControlService.onHotplug(1, false); + mHdmiControlService.onHotplug(1, true); + + HdmiCecMessage setStreamPath = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, + mPlaybackPhysicalAddress); + mHdmiCecLocalDevicePlayback.dispatchMessage(setStreamPath); + mTestLooper.dispatchAll(); + + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress()); + assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue(); + } } |