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
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index 42dcbeb..d0e7e45 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 @@
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 @@
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 fb71d95..1cbbe2d 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 @@
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 46b09dc..a945c90 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.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 @@
@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 3b3ac74..59ebdd5 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 @@
// do nothing
}
+ @Constants.RcProfile
@Override
protected int getRcProfile() {
return Constants.RC_PROFILE_SOURCE;
@@ -303,10 +304,8 @@
@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 8cf6c975..11e18c5 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.google.android.collect.Lists;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -1480,6 +1481,7 @@
return true;
}
+ @Constants.RcProfile
@Override
protected int getRcProfile() {
return Constants.RC_PROFILE_TV;
@@ -1492,8 +1494,21 @@
@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 96303ce..0a8621b 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 @@
}
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 @@
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 @@
};
}
+ @Constants.DeviceType
private static int hdmiDeviceInfoDeviceTypeToShiftValue(int deviceType) {
switch (deviceType) {
case HdmiDeviceInfo.DEVICE_TV: