Merge "Fix issue with internal Active Source state tracking"

This commit is contained in:
TreeHugger Robot
2020-07-31 09:57:22 +00:00
committed by Android (Google) Code Review
4 changed files with 42 additions and 7 deletions

View File

@@ -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;

View File

@@ -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);
}
}
}

View File

@@ -143,6 +143,26 @@ public class ActiveSourceActionTest {
assertThat(mNativeWrapper.getResultMessages()).contains(menuStatus);
}
@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(

View File

@@ -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();
}
}