Loading services/core/java/com/android/server/hdmi/HdmiControlService.java +34 −54 Original line number Diff line number Diff line Loading @@ -1549,61 +1549,8 @@ public class HdmiControlService extends SystemService { @Nullable public HdmiDeviceInfo getActiveSource() { enforceAccessPermission(); HdmiCecLocalDeviceTv tv = tv(); if (tv == null) { if (isTvDevice()) { Slog.e(TAG, "Local tv device not available."); return null; } if (isPlaybackDevice()) { // if playback device itself is the active source, // return its own device info. if (playback() != null && playback().isActiveSource()) { return playback().getDeviceInfo(); } // Otherwise get the active source and look for it from the device list ActiveSource activeSource = getLocalActiveSource(); // If the physical address is not set yet, return null if (activeSource.physicalAddress == Constants.INVALID_PHYSICAL_ADDRESS) { return null; } if (audioSystem() != null) { for (HdmiDeviceInfo info : mHdmiCecNetwork.getSafeCecDevicesLocked()) { if (info.getPhysicalAddress() == activeSource.physicalAddress) { return info; } } } // If the device info is not in the list yet, return a device info with minimum // information from mActiveSource. // If the Active Source has unregistered logical address, return with an // HdmiDeviceInfo built from physical address information only. return HdmiUtils.isValidAddress(activeSource.logicalAddress) ? new HdmiDeviceInfo(activeSource.logicalAddress, activeSource.physicalAddress, pathToPortId(activeSource.physicalAddress), HdmiUtils.getTypeFromAddress(activeSource.logicalAddress).get(0), 0, HdmiUtils.getDefaultDeviceName(activeSource.logicalAddress)) : new HdmiDeviceInfo(activeSource.physicalAddress, pathToPortId(activeSource.physicalAddress)); } return null; } ActiveSource activeSource = tv.getActiveSource(); if (activeSource.isValid()) { return new HdmiDeviceInfo(activeSource.logicalAddress, activeSource.physicalAddress, HdmiDeviceInfo.PORT_INVALID, HdmiDeviceInfo.DEVICE_INACTIVE, 0, ""); } int activePath = tv.getActivePath(); if (activePath != HdmiDeviceInfo.PATH_INVALID) { HdmiDeviceInfo info = mHdmiCecNetwork.getSafeDeviceInfoByPath(activePath); return (info != null) ? info : new HdmiDeviceInfo(activePath, tv.getActivePortId()); } return null; return HdmiControlService.this.getActiveSource(); } @Override Loading Loading @@ -2435,6 +2382,39 @@ public class HdmiControlService extends SystemService { source.queryDisplayStatus(callback); } protected HdmiDeviceInfo getActiveSource() { // If a the device is a playback device that is the current active source, return the // local device info if (playback() != null && playback().isActiveSource()) { return playback().getDeviceInfo(); } // Otherwise get the active source and look for it from the device list ActiveSource activeSource = getLocalActiveSource(); if (activeSource.isValid()) { HdmiDeviceInfo activeSourceInfo = mHdmiCecNetwork.getSafeCecDeviceInfo( activeSource.logicalAddress); if (activeSourceInfo != null) { return activeSourceInfo; } return new HdmiDeviceInfo(activeSource.physicalAddress, pathToPortId(activeSource.physicalAddress)); } if (tv() != null) { int activePath = tv().getActivePath(); if (activePath != HdmiDeviceInfo.PATH_INVALID) { HdmiDeviceInfo info = mHdmiCecNetwork.getSafeDeviceInfoByPath(activePath); return (info != null) ? info : new HdmiDeviceInfo(activePath, tv().getActivePortId()); } } return null; } private void addHdmiControlStatusChangeListener( final IHdmiControlStatusChangeListener listener) { final HdmiControlStatusChangeListenerRecord record = Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +95 −50 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.hdmi.IHdmiControlCallback; import android.os.Handler; Loading Loading @@ -68,8 +69,10 @@ public class HdmiCecLocalDevicePlaybackTest { private boolean mWokenUp; private boolean mStandby; @Mock private IPowerManager mIPowerManagerMock; @Mock private IThermalService mIThermalServiceMock; @Mock private IPowerManager mIPowerManagerMock; @Mock private IThermalService mIThermalServiceMock; @Before public void setUp() { Loading Loading @@ -1129,4 +1132,46 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mNativeWrapper.getResultMessages()).contains(activeSource); assertThat(mNativeWrapper.getResultMessages()).doesNotContain(systemAudioModeRequest); } @Test public void getActiveSource_noActiveSource() { mHdmiControlService.setActiveSource(Constants.ADDR_UNREGISTERED, Constants.INVALID_PHYSICAL_ADDRESS, "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource()).isNull(); } @Test public void getActiveSource_localPlaybackIsActiveSource() { mHdmiControlService.setActiveSource(mHdmiCecLocalDevicePlayback.mAddress, mHdmiControlService.getPhysicalAddress(), "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource()).isEqualTo( mHdmiCecLocalDevicePlayback.getDeviceInfo()); } @Test public void getActiveSource_deviceInNetworkIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(Constants.ADDR_PLAYBACK_3, 0x3000, 0, Constants.ADDR_PLAYBACK_1, 0, "Test Device"); mHdmiControlService.getHdmiCecNetwork().addCecDevice(externalDevice); mTestLooper.dispatchAll(); mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(), externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource()).isEqualTo(externalDevice); } @Test public void getActiveSource_unknownDeviceIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(Constants.ADDR_PLAYBACK_3, 0x3000, 0, Constants.ADDR_PLAYBACK_1, 0, "Test Device"); mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(), externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource().getPhysicalAddress()).isEqualTo( externalDevice.getPhysicalAddress()); } } services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +48 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.tv.cec.V1_0.SendMessageResult; import android.os.Handler; Loading Loading @@ -136,4 +137,51 @@ public class HdmiCecLocalDeviceTvTest { ADDR_PLAYBACK_1); assertThat(mNativeWrapper.getResultMessages()).contains(givePhysicalAddress); } @Test public void getActiveSource_noActiveSource() { mHdmiControlService.setActiveSource(Constants.ADDR_UNREGISTERED, Constants.INVALID_PHYSICAL_ADDRESS, "HdmiControlServiceTest"); mHdmiCecLocalDeviceTv.setActivePath(HdmiDeviceInfo.PATH_INVALID); assertThat(mHdmiControlService.getActiveSource()).isNull(); } @Test public void getActiveSource_deviceInNetworkIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(Constants.ADDR_PLAYBACK_3, 0x1000, 0, Constants.ADDR_PLAYBACK_1, 0, "Test Device"); mHdmiControlService.getHdmiCecNetwork().addCecDevice(externalDevice); mTestLooper.dispatchAll(); mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(), externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource()).isEqualTo(externalDevice); } @Test public void getActiveSource_unknownLogicalAddressInNetworkIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(0x1000, 1); mHdmiControlService.setActiveSource(Constants.ADDR_UNREGISTERED, externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); mHdmiCecLocalDeviceTv.setActivePath(0x1000); assertThat(mHdmiControlService.getActiveSource()).isEqualTo( externalDevice); } @Test public void getActiveSource_unknownDeviceIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(Constants.ADDR_PLAYBACK_3, 0x1000, 0, Constants.ADDR_PLAYBACK_1, 0, "Test Device"); mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(), externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); mHdmiCecLocalDeviceTv.setActivePath(0x1000); assertThat(mHdmiControlService.getActiveSource().getPhysicalAddress()).isEqualTo( externalDevice.getPhysicalAddress()); } } Loading
services/core/java/com/android/server/hdmi/HdmiControlService.java +34 −54 Original line number Diff line number Diff line Loading @@ -1549,61 +1549,8 @@ public class HdmiControlService extends SystemService { @Nullable public HdmiDeviceInfo getActiveSource() { enforceAccessPermission(); HdmiCecLocalDeviceTv tv = tv(); if (tv == null) { if (isTvDevice()) { Slog.e(TAG, "Local tv device not available."); return null; } if (isPlaybackDevice()) { // if playback device itself is the active source, // return its own device info. if (playback() != null && playback().isActiveSource()) { return playback().getDeviceInfo(); } // Otherwise get the active source and look for it from the device list ActiveSource activeSource = getLocalActiveSource(); // If the physical address is not set yet, return null if (activeSource.physicalAddress == Constants.INVALID_PHYSICAL_ADDRESS) { return null; } if (audioSystem() != null) { for (HdmiDeviceInfo info : mHdmiCecNetwork.getSafeCecDevicesLocked()) { if (info.getPhysicalAddress() == activeSource.physicalAddress) { return info; } } } // If the device info is not in the list yet, return a device info with minimum // information from mActiveSource. // If the Active Source has unregistered logical address, return with an // HdmiDeviceInfo built from physical address information only. return HdmiUtils.isValidAddress(activeSource.logicalAddress) ? new HdmiDeviceInfo(activeSource.logicalAddress, activeSource.physicalAddress, pathToPortId(activeSource.physicalAddress), HdmiUtils.getTypeFromAddress(activeSource.logicalAddress).get(0), 0, HdmiUtils.getDefaultDeviceName(activeSource.logicalAddress)) : new HdmiDeviceInfo(activeSource.physicalAddress, pathToPortId(activeSource.physicalAddress)); } return null; } ActiveSource activeSource = tv.getActiveSource(); if (activeSource.isValid()) { return new HdmiDeviceInfo(activeSource.logicalAddress, activeSource.physicalAddress, HdmiDeviceInfo.PORT_INVALID, HdmiDeviceInfo.DEVICE_INACTIVE, 0, ""); } int activePath = tv.getActivePath(); if (activePath != HdmiDeviceInfo.PATH_INVALID) { HdmiDeviceInfo info = mHdmiCecNetwork.getSafeDeviceInfoByPath(activePath); return (info != null) ? info : new HdmiDeviceInfo(activePath, tv.getActivePortId()); } return null; return HdmiControlService.this.getActiveSource(); } @Override Loading Loading @@ -2435,6 +2382,39 @@ public class HdmiControlService extends SystemService { source.queryDisplayStatus(callback); } protected HdmiDeviceInfo getActiveSource() { // If a the device is a playback device that is the current active source, return the // local device info if (playback() != null && playback().isActiveSource()) { return playback().getDeviceInfo(); } // Otherwise get the active source and look for it from the device list ActiveSource activeSource = getLocalActiveSource(); if (activeSource.isValid()) { HdmiDeviceInfo activeSourceInfo = mHdmiCecNetwork.getSafeCecDeviceInfo( activeSource.logicalAddress); if (activeSourceInfo != null) { return activeSourceInfo; } return new HdmiDeviceInfo(activeSource.physicalAddress, pathToPortId(activeSource.physicalAddress)); } if (tv() != null) { int activePath = tv().getActivePath(); if (activePath != HdmiDeviceInfo.PATH_INVALID) { HdmiDeviceInfo info = mHdmiCecNetwork.getSafeDeviceInfoByPath(activePath); return (info != null) ? info : new HdmiDeviceInfo(activePath, tv().getActivePortId()); } } return null; } private void addHdmiControlStatusChangeListener( final IHdmiControlStatusChangeListener listener) { final HdmiControlStatusChangeListenerRecord record = Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +95 −50 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.hdmi.IHdmiControlCallback; import android.os.Handler; Loading Loading @@ -68,8 +69,10 @@ public class HdmiCecLocalDevicePlaybackTest { private boolean mWokenUp; private boolean mStandby; @Mock private IPowerManager mIPowerManagerMock; @Mock private IThermalService mIThermalServiceMock; @Mock private IPowerManager mIPowerManagerMock; @Mock private IThermalService mIThermalServiceMock; @Before public void setUp() { Loading Loading @@ -1129,4 +1132,46 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mNativeWrapper.getResultMessages()).contains(activeSource); assertThat(mNativeWrapper.getResultMessages()).doesNotContain(systemAudioModeRequest); } @Test public void getActiveSource_noActiveSource() { mHdmiControlService.setActiveSource(Constants.ADDR_UNREGISTERED, Constants.INVALID_PHYSICAL_ADDRESS, "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource()).isNull(); } @Test public void getActiveSource_localPlaybackIsActiveSource() { mHdmiControlService.setActiveSource(mHdmiCecLocalDevicePlayback.mAddress, mHdmiControlService.getPhysicalAddress(), "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource()).isEqualTo( mHdmiCecLocalDevicePlayback.getDeviceInfo()); } @Test public void getActiveSource_deviceInNetworkIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(Constants.ADDR_PLAYBACK_3, 0x3000, 0, Constants.ADDR_PLAYBACK_1, 0, "Test Device"); mHdmiControlService.getHdmiCecNetwork().addCecDevice(externalDevice); mTestLooper.dispatchAll(); mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(), externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource()).isEqualTo(externalDevice); } @Test public void getActiveSource_unknownDeviceIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(Constants.ADDR_PLAYBACK_3, 0x3000, 0, Constants.ADDR_PLAYBACK_1, 0, "Test Device"); mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(), externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource().getPhysicalAddress()).isEqualTo( externalDevice.getPhysicalAddress()); } }
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +48 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.tv.cec.V1_0.SendMessageResult; import android.os.Handler; Loading Loading @@ -136,4 +137,51 @@ public class HdmiCecLocalDeviceTvTest { ADDR_PLAYBACK_1); assertThat(mNativeWrapper.getResultMessages()).contains(givePhysicalAddress); } @Test public void getActiveSource_noActiveSource() { mHdmiControlService.setActiveSource(Constants.ADDR_UNREGISTERED, Constants.INVALID_PHYSICAL_ADDRESS, "HdmiControlServiceTest"); mHdmiCecLocalDeviceTv.setActivePath(HdmiDeviceInfo.PATH_INVALID); assertThat(mHdmiControlService.getActiveSource()).isNull(); } @Test public void getActiveSource_deviceInNetworkIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(Constants.ADDR_PLAYBACK_3, 0x1000, 0, Constants.ADDR_PLAYBACK_1, 0, "Test Device"); mHdmiControlService.getHdmiCecNetwork().addCecDevice(externalDevice); mTestLooper.dispatchAll(); mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(), externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); assertThat(mHdmiControlService.getActiveSource()).isEqualTo(externalDevice); } @Test public void getActiveSource_unknownLogicalAddressInNetworkIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(0x1000, 1); mHdmiControlService.setActiveSource(Constants.ADDR_UNREGISTERED, externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); mHdmiCecLocalDeviceTv.setActivePath(0x1000); assertThat(mHdmiControlService.getActiveSource()).isEqualTo( externalDevice); } @Test public void getActiveSource_unknownDeviceIsActiveSource() { HdmiDeviceInfo externalDevice = new HdmiDeviceInfo(Constants.ADDR_PLAYBACK_3, 0x1000, 0, Constants.ADDR_PLAYBACK_1, 0, "Test Device"); mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(), externalDevice.getPhysicalAddress(), "HdmiControlServiceTest"); mHdmiCecLocalDeviceTv.setActivePath(0x1000); assertThat(mHdmiControlService.getActiveSource().getPhysicalAddress()).isEqualTo( externalDevice.getPhysicalAddress()); } }