diff options
| author | 2020-07-31 09:57:22 +0000 | |
|---|---|---|
| committer | 2020-07-31 09:57:22 +0000 | |
| commit | f5abcaa4866003c4eebae4a86c6cb8f13797f9d7 (patch) | |
| tree | 604f9bddfa255403c16cf9259c44361a5a4a008d | |
| parent | 55643e3ae304b8c17852b2ebf139a047b5b830ce (diff) | |
| parent | 45c5ad3bec4dfccca0e75b289f1e21c0478d5ee7 (diff) | |
Merge "Fix issue with internal Active Source state tracking"
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 7007f8b1df50..0576e91b79eb 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -3249,7 +3249,6 @@ public class HdmiControlService extends SystemService { playback.setIsActiveSource(true); playback.wakeUpIfActiveSource(); playback.maySendActiveSource(source); - setActiveSource(playback.mAddress, physicalAddress); } if (deviceType == HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) { @@ -3260,7 +3259,6 @@ public class HdmiControlService extends SystemService { audioSystem.setIsActiveSource(true); audioSystem.wakeUpIfActiveSource(); audioSystem.maySendActiveSource(source); - setActiveSource(audioSystem.mAddress, physicalAddress); } } } @@ -3283,13 +3281,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 32054632dafc..9b2f2b659493 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -617,4 +617,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(); + } } |