diff options
| -rwxr-xr-x | services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java | 12 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java | 35 |
2 files changed, 45 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index e7f302c1977a..b4fa05464881 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -18,6 +18,7 @@ package com.android.server.hdmi; import android.annotation.CallSuper; import android.annotation.Nullable; +import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.input.InputManager; @@ -560,10 +561,15 @@ abstract class HdmiCecLocalDevice { protected abstract List<Integer> getDeviceFeatures(); protected boolean handleGiveFeatures(HdmiCecMessage message) { - if (mService.getCecVersion() < Constants.VERSION_2_0) { + if (mService.getCecVersion() < HdmiControlManager.HDMI_CEC_VERSION_2_0) { return false; } + reportFeatures(); + return true; + } + + protected void reportFeatures() { List<Integer> localDeviceTypes = new ArrayList<>(); for (HdmiCecLocalDevice localDevice : mService.getAllLocalDevices()) { localDeviceTypes.add(localDevice.mDeviceType); @@ -577,7 +583,6 @@ abstract class HdmiCecLocalDevice { mService.sendCecCommand( HdmiCecMessageBuilder.buildReportFeatures(mAddress, mService.getCecVersion(), localDeviceTypes, rcProfile, rcFeatures, deviceFeatures)); - return true; } @ServiceThreadOnly @@ -789,6 +794,9 @@ abstract class HdmiCecLocalDevice { final void handleAddressAllocated(int logicalAddress, int reason) { assertRunOnServiceThread(); mAddress = mPreferredAddress = logicalAddress; + if (mService.getCecVersion() >= HdmiControlManager.HDMI_CEC_VERSION_2_0) { + reportFeatures(); + } onAddressAllocated(logicalAddress, reason); setPreferredAddress(logicalAddress); } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java index 94291aa3994c..859d232dfe53 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -521,6 +521,41 @@ public class HdmiControlServiceTest { assertThat(mNativeWrapper.getResultMessages()).contains(reportFeatures); } + @Test + public void initializeCec_14_doesNotBroadcastReportFeatures() { + mNativeWrapper.clearResultMessages(); + mHdmiControlService.getHdmiCecConfig().setIntValue( + HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, + HdmiControlManager.HDMI_CEC_VERSION_1_4_b); + mHdmiControlService.setControlEnabled(true); + mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); + mTestLooper.dispatchAll(); + + HdmiCecMessage reportFeatures = HdmiCecMessageBuilder.buildReportFeatures( + Constants.ADDR_PLAYBACK_1, HdmiControlManager.HDMI_CEC_VERSION_2_0, + Arrays.asList(DEVICE_PLAYBACK, DEVICE_AUDIO_SYSTEM), + mMyPlaybackDevice.getRcProfile(), mMyPlaybackDevice.getRcFeatures(), + mMyPlaybackDevice.getDeviceFeatures()); + assertThat(mNativeWrapper.getResultMessages()).doesNotContain(reportFeatures); + } + + @Test + public void initializeCec_20_reportsFeaturesBroadcast() { + mHdmiControlService.getHdmiCecConfig().setIntValue( + HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, + HdmiControlManager.HDMI_CEC_VERSION_2_0); + mHdmiControlService.setControlEnabled(true); + mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); + mTestLooper.dispatchAll(); + + HdmiCecMessage reportFeatures = HdmiCecMessageBuilder.buildReportFeatures( + Constants.ADDR_PLAYBACK_1, HdmiControlManager.HDMI_CEC_VERSION_2_0, + Arrays.asList(DEVICE_PLAYBACK, DEVICE_AUDIO_SYSTEM), + mMyPlaybackDevice.getRcProfile(), mMyPlaybackDevice.getRcFeatures(), + mMyPlaybackDevice.getDeviceFeatures()); + assertThat(mNativeWrapper.getResultMessages()).contains(reportFeatures); + } + private static class VolumeControlFeatureCallback extends IHdmiCecVolumeControlFeatureListener.Stub { boolean mCallbackReceived = false; |