diff options
| author | 2020-11-12 06:41:28 +0100 | |
|---|---|---|
| committer | 2020-11-24 14:48:47 +0100 | |
| commit | 1833e43ee739a0d80bb3cb2a2c679727c272cd3b (patch) | |
| tree | 511bf256d9cd7dfdc15182dc000e7f3a46e1bcea | |
| parent | ba500e9603d116d2a1c9d96dbccb03dd282eaa72 (diff) | |
Update CEC device features constants and handling
This change add IntDef for better handling of CEC device feature
constants. Also update the default device features reported by different
devices. Make CEC ARC feature dependent on the availability of a
physical ARC port on the device.
Bug: 166227212
Test: atest com.android.server.hdmi
Change-Id: Ie6909d47a753501d98cc71959234bf0e2b843694
6 files changed, 75 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java index 42dcbeb73fff..d0e7e459e7f2 100644 --- a/services/core/java/com/android/server/hdmi/Constants.java +++ b/services/core/java/com/android/server/hdmi/Constants.java @@ -507,6 +507,15 @@ final class Constants { static final int ALL_DEVICE_TYPES_PLAYBACK = 4; static final int ALL_DEVICE_TYPES_AUDIO_SYSTEM = 3; static final int ALL_DEVICE_TYPES_SWITCH = 2; + @IntDef({ + ALL_DEVICE_TYPES_TV, + ALL_DEVICE_TYPES_RECORDER, + ALL_DEVICE_TYPES_TUNER, + ALL_DEVICE_TYPES_PLAYBACK, + ALL_DEVICE_TYPES_AUDIO_SYSTEM, + ALL_DEVICE_TYPES_SWITCH + }) + @interface DeviceType {} static final int DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN = 6; static final int DEVICE_FEATURE_TV_SUPPORTS_SET_OSD_STRING = 5; @@ -514,21 +523,51 @@ final class Constants { static final int DEVICE_FEATURE_SUPPORTS_SET_AUDIO_RATE = 3; static final int DEVICE_FEATURE_SINK_SUPPORTS_ARC_TX = 2; static final int DEVICE_FEATURE_SOURCE_SUPPORTS_ARC_RX = 1; + @IntDef({ + DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN, + DEVICE_FEATURE_TV_SUPPORTS_SET_OSD_STRING, + DEVICE_FEATURE_SUPPORTS_DECK_CONTROL, + DEVICE_FEATURE_SUPPORTS_SET_AUDIO_RATE, + DEVICE_FEATURE_SINK_SUPPORTS_ARC_TX, + DEVICE_FEATURE_SOURCE_SUPPORTS_ARC_RX + }) + @interface DeviceFeature {} static final int RC_PROFILE_TV = 0; static final int RC_PROFILE_SOURCE = 1; + @IntDef({ + RC_PROFILE_TV, + RC_PROFILE_SOURCE + }) + @interface RcProfile {} static final int RC_PROFILE_TV_NONE = 0x0; static final int RC_PROFILE_TV_ONE = 0x2; static final int RC_PROFILE_TV_TWO = 0x6; static final int RC_PROFILE_TV_THREE = 0xA; static final int RC_PROFILE_TV_FOUR = 0xE; + @IntDef({ + RC_PROFILE_TV_NONE, + RC_PROFILE_TV_ONE, + RC_PROFILE_TV_TWO, + RC_PROFILE_TV_THREE, + RC_PROFILE_TV_FOUR + }) + @interface RcProfileTv {} static final int RC_PROFILE_SOURCE_HANDLES_ROOT_MENU = 4; static final int RC_PROFILE_SOURCE_HANDLES_SETUP_MENU = 3; static final int RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU = 2; static final int RC_PROFILE_SOURCE_HANDLES_TOP_MENU = 1; static final int RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU = 0; + @IntDef({ + RC_PROFILE_SOURCE_HANDLES_ROOT_MENU, + RC_PROFILE_SOURCE_HANDLES_SETUP_MENU, + RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU, + RC_PROFILE_SOURCE_HANDLES_TOP_MENU, + RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU + }) + @interface RcProfileSource {} private Constants() { /* cannot be instantiated */ diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index fb71d9510627..1cbbe2dc5b6a 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -554,6 +554,7 @@ abstract class HdmiCecLocalDevice { return false; } + @Constants.RcProfile protected abstract int getRcProfile(); protected abstract List<Integer> getRcFeatures(); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index 46b09dc07e61..a945c90d30ef 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -47,8 +47,6 @@ import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import com.android.server.hdmi.HdmiUtils.CodecSad; import com.android.server.hdmi.HdmiUtils.DeviceConfig; -import com.google.android.collect.Lists; - import org.xmlpull.v1.XmlPullParserException; import java.io.File; @@ -179,7 +177,13 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { @Override protected List<Integer> getDeviceFeatures() { - return Lists.newArrayList(Constants.DEVICE_FEATURE_SOURCE_SUPPORTS_ARC_RX); + List<Integer> deviceFeatures = new ArrayList<>(); + + if (SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)) { + deviceFeatures.add(Constants.DEVICE_FEATURE_SOURCE_SUPPORTS_ARC_RX); + } + + return deviceFeatures; } @Override diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index 3b3ac747db6c..59ebdd597279 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -296,6 +296,7 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // do nothing } + @Constants.RcProfile @Override protected int getRcProfile() { return Constants.RC_PROFILE_SOURCE; @@ -303,10 +304,8 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { @Override protected List<Integer> getRcFeatures() { - return Lists.newArrayList(Constants.RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU, - Constants.RC_PROFILE_SOURCE_HANDLES_ROOT_MENU, - Constants.RC_PROFILE_SOURCE_HANDLES_SETUP_MENU, - Constants.RC_PROFILE_SOURCE_HANDLES_TOP_MENU); + return Lists.newArrayList(Constants.RC_PROFILE_SOURCE_HANDLES_ROOT_MENU, + Constants.RC_PROFILE_SOURCE_HANDLES_SETUP_MENU); } @Override diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 8cf6c9757fe8..11e18c54b1e4 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -53,6 +53,7 @@ import com.android.server.hdmi.HdmiControlService.SendMessageCallback; import com.google.android.collect.Lists; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -1480,6 +1481,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return true; } + @Constants.RcProfile @Override protected int getRcProfile() { return Constants.RC_PROFILE_TV; @@ -1492,8 +1494,21 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @Override protected List<Integer> getDeviceFeatures() { - return Lists.newArrayList(Constants.DEVICE_FEATURE_SINK_SUPPORTS_ARC_TX, - Constants.DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN); + List<Integer> deviceFeatures = new ArrayList<>(); + + boolean hasArcPort = false; + List<HdmiPortInfo> ports = mService.getPortInfo(); + for (HdmiPortInfo port : ports) { + if (isArcFeatureEnabled(port.getId())) { + hasArcPort = true; + break; + } + } + if (hasArcPort) { + deviceFeatures.add(Constants.DEVICE_FEATURE_SINK_SUPPORTS_ARC_TX); + } + deviceFeatures.add(Constants.DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN); + return deviceFeatures; } @Override diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java index 96303ce9a76c..0a8621b3e726 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java @@ -697,8 +697,10 @@ public class HdmiCecMessageBuilder { } static HdmiCecMessage buildReportFeatures(int src, - @HdmiControlManager.HdmiCecVersion int cecVersion, List<Integer> allDeviceTypes, - int rcProfile, List<Integer> rcFeatures, List<Integer> deviceFeatures) { + @HdmiControlManager.HdmiCecVersion int cecVersion, + List<Integer> allDeviceTypes, @Constants.RcProfile int rcProfile, + List<Integer> rcFeatures, + List<Integer> deviceFeatures) { byte cecVersionByte = (byte) (cecVersion & 0xFF); byte deviceTypes = 0; for (Integer deviceType : allDeviceTypes) { @@ -708,16 +710,16 @@ public class HdmiCecMessageBuilder { byte rcProfileByte = 0; rcProfileByte |= rcProfile << 6; if (rcProfile == Constants.RC_PROFILE_SOURCE) { - for (Integer rcFeature : rcFeatures) { + for (@Constants.RcProfileSource Integer rcFeature : rcFeatures) { rcProfileByte |= 1 << rcFeature; } } else { - byte rcProfileTv = (byte) (rcFeatures.get(0) & 0xFFFF); + @Constants.RcProfileTv byte rcProfileTv = (byte) (rcFeatures.get(0) & 0xFFFF); rcProfileByte |= rcProfileTv; } byte deviceFeaturesByte = 0; - for (Integer deviceFeature : deviceFeatures) { + for (@Constants.DeviceFeature Integer deviceFeature : deviceFeatures) { deviceFeaturesByte |= 1 << deviceFeature; } @@ -777,6 +779,7 @@ public class HdmiCecMessageBuilder { }; } + @Constants.DeviceType private static int hdmiDeviceInfoDeviceTypeToShiftValue(int deviceType) { switch (deviceType) { case HdmiDeviceInfo.DEVICE_TV: |