Loading services/core/java/com/android/server/hdmi/Constants.java +110 −72 Original line number Diff line number Diff line Loading @@ -151,6 +151,10 @@ final class Constants { MESSAGE_SET_EXTERNAL_TIMER, MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR, MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR, MESSAGE_GIVE_FEATURES, MESSAGE_REPORT_FEATURES, MESSAGE_REQUEST_CURRENT_LATENCY, MESSAGE_REPORT_CURRENT_LATENCY, MESSAGE_INITIATE_ARC, MESSAGE_REPORT_ARC_INITIATED, MESSAGE_REPORT_ARC_TERMINATED, Loading @@ -160,7 +164,8 @@ final class Constants { MESSAGE_CDC_MESSAGE, MESSAGE_ABORT, }) public @interface FeatureOpcode {} public @interface FeatureOpcode { } static final int MESSAGE_FEATURE_ABORT = 0x00; static final int MESSAGE_IMAGE_VIEW_ON = 0x04; Loading Loading @@ -225,6 +230,10 @@ final class Constants { static final int MESSAGE_SET_EXTERNAL_TIMER = 0xA2; static final int MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR = 0xA3; static final int MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR = 0xA4; static final int MESSAGE_GIVE_FEATURES = 0xA5; static final int MESSAGE_REPORT_FEATURES = 0xA6; static final int MESSAGE_REQUEST_CURRENT_LATENCY = 0xA7; static final int MESSAGE_REPORT_CURRENT_LATENCY = 0xA8; static final int MESSAGE_INITIATE_ARC = 0xC0; static final int MESSAGE_REPORT_ARC_INITIATED = 0xC1; static final int MESSAGE_REPORT_ARC_TERMINATED = 0xC2; Loading Loading @@ -501,6 +510,35 @@ final class Constants { static final int VERSION_1_4 = 0x05; static final int VERSION_2_0 = 0x06; static final int ALL_DEVICE_TYPES_TV = 7; static final int ALL_DEVICE_TYPES_RECORDER = 6; static final int ALL_DEVICE_TYPES_TUNER = 5; 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; static final int DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN = 6; static final int DEVICE_FEATURE_TV_SUPPORTS_SET_OSD_STRING = 5; static final int DEVICE_FEATURE_SUPPORTS_DECK_CONTROL = 4; 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; static final int RC_PROFILE_TV = 0; static final int RC_PROFILE_SOURCE = 1; 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; 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; private Constants() { /* cannot be instantiated */ } Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +29 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,8 @@ abstract class HdmiCecLocalDevice { return handleRequestShortAudioDescriptor(message); case Constants.MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR: return handleReportShortAudioDescriptor(message); case Constants.MESSAGE_GIVE_FEATURES: return handleGiveFeatures(message); default: return false; } Loading Loading @@ -551,6 +553,33 @@ abstract class HdmiCecLocalDevice { return false; } protected abstract int getRcProfile(); protected abstract List<Integer> getRcFeatures(); protected abstract List<Integer> getDeviceFeatures(); protected boolean handleGiveFeatures(HdmiCecMessage message) { if (mService.getCecVersion() < Constants.VERSION_2_0) { return false; } List<Integer> localDeviceTypes = new ArrayList<>(); for (HdmiCecLocalDevice localDevice : mService.getAllLocalDevices()) { localDeviceTypes.add(localDevice.mDeviceType); } int rcProfile = getRcProfile(); List<Integer> rcFeatures = getRcFeatures(); List<Integer> deviceFeatures = getDeviceFeatures(); mService.sendCecCommand( HdmiCecMessageBuilder.buildReportFeatures(mAddress, mService.getCecVersion(), localDeviceTypes, rcProfile, rcFeatures, deviceFeatures)); return true; } @ServiceThreadOnly protected boolean handleStandby(HdmiCecMessage message) { assertRunOnServiceThread(); Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +7 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,8 @@ 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; Loading Loading @@ -175,6 +177,11 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { return info != null; } @Override protected List<Integer> getDeviceFeatures() { return Lists.newArrayList(Constants.DEVICE_FEATURE_SOURCE_SUPPORTS_ARC_RX); } @Override @ServiceThreadOnly void onHotplug(int portId, boolean connected) { Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +20 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.server.hdmi.Constants.LocalActivePort; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import com.google.android.collect.Lists; import java.util.List; /** Loading Loading @@ -233,6 +235,24 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // do nothing } @Override protected int getRcProfile() { return Constants.RC_PROFILE_SOURCE; } @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); } @Override protected List<Integer> getDeviceFeatures() { return Lists.newArrayList(); } // Active source claiming needs to be handled in Service // since service can decide who will be the active source when the device supports // multiple device types in this method. Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +18 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import com.android.server.hdmi.HdmiControlService.SendMessageCallback; import com.google.android.collect.Lists; import java.util.Arrays; import java.util.HashMap; import java.util.List; Loading Loading @@ -1478,6 +1480,22 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return true; } @Override protected int getRcProfile() { return Constants.RC_PROFILE_TV; } @Override protected List<Integer> getRcFeatures() { return Lists.newArrayList(Constants.RC_PROFILE_TV_NONE); } @Override protected List<Integer> getDeviceFeatures() { return Lists.newArrayList(Constants.DEVICE_FEATURE_SINK_SUPPORTS_ARC_TX, Constants.DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN); } @Override protected void sendStandby(int deviceId) { HdmiDeviceInfo targetDevice = mService.getHdmiCecNetwork().getDeviceInfo(deviceId); Loading Loading
services/core/java/com/android/server/hdmi/Constants.java +110 −72 Original line number Diff line number Diff line Loading @@ -151,6 +151,10 @@ final class Constants { MESSAGE_SET_EXTERNAL_TIMER, MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR, MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR, MESSAGE_GIVE_FEATURES, MESSAGE_REPORT_FEATURES, MESSAGE_REQUEST_CURRENT_LATENCY, MESSAGE_REPORT_CURRENT_LATENCY, MESSAGE_INITIATE_ARC, MESSAGE_REPORT_ARC_INITIATED, MESSAGE_REPORT_ARC_TERMINATED, Loading @@ -160,7 +164,8 @@ final class Constants { MESSAGE_CDC_MESSAGE, MESSAGE_ABORT, }) public @interface FeatureOpcode {} public @interface FeatureOpcode { } static final int MESSAGE_FEATURE_ABORT = 0x00; static final int MESSAGE_IMAGE_VIEW_ON = 0x04; Loading Loading @@ -225,6 +230,10 @@ final class Constants { static final int MESSAGE_SET_EXTERNAL_TIMER = 0xA2; static final int MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR = 0xA3; static final int MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR = 0xA4; static final int MESSAGE_GIVE_FEATURES = 0xA5; static final int MESSAGE_REPORT_FEATURES = 0xA6; static final int MESSAGE_REQUEST_CURRENT_LATENCY = 0xA7; static final int MESSAGE_REPORT_CURRENT_LATENCY = 0xA8; static final int MESSAGE_INITIATE_ARC = 0xC0; static final int MESSAGE_REPORT_ARC_INITIATED = 0xC1; static final int MESSAGE_REPORT_ARC_TERMINATED = 0xC2; Loading Loading @@ -501,6 +510,35 @@ final class Constants { static final int VERSION_1_4 = 0x05; static final int VERSION_2_0 = 0x06; static final int ALL_DEVICE_TYPES_TV = 7; static final int ALL_DEVICE_TYPES_RECORDER = 6; static final int ALL_DEVICE_TYPES_TUNER = 5; 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; static final int DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN = 6; static final int DEVICE_FEATURE_TV_SUPPORTS_SET_OSD_STRING = 5; static final int DEVICE_FEATURE_SUPPORTS_DECK_CONTROL = 4; 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; static final int RC_PROFILE_TV = 0; static final int RC_PROFILE_SOURCE = 1; 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; 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; private Constants() { /* cannot be instantiated */ } Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +29 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,8 @@ abstract class HdmiCecLocalDevice { return handleRequestShortAudioDescriptor(message); case Constants.MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR: return handleReportShortAudioDescriptor(message); case Constants.MESSAGE_GIVE_FEATURES: return handleGiveFeatures(message); default: return false; } Loading Loading @@ -551,6 +553,33 @@ abstract class HdmiCecLocalDevice { return false; } protected abstract int getRcProfile(); protected abstract List<Integer> getRcFeatures(); protected abstract List<Integer> getDeviceFeatures(); protected boolean handleGiveFeatures(HdmiCecMessage message) { if (mService.getCecVersion() < Constants.VERSION_2_0) { return false; } List<Integer> localDeviceTypes = new ArrayList<>(); for (HdmiCecLocalDevice localDevice : mService.getAllLocalDevices()) { localDeviceTypes.add(localDevice.mDeviceType); } int rcProfile = getRcProfile(); List<Integer> rcFeatures = getRcFeatures(); List<Integer> deviceFeatures = getDeviceFeatures(); mService.sendCecCommand( HdmiCecMessageBuilder.buildReportFeatures(mAddress, mService.getCecVersion(), localDeviceTypes, rcProfile, rcFeatures, deviceFeatures)); return true; } @ServiceThreadOnly protected boolean handleStandby(HdmiCecMessage message) { assertRunOnServiceThread(); Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +7 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,8 @@ 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; Loading Loading @@ -175,6 +177,11 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { return info != null; } @Override protected List<Integer> getDeviceFeatures() { return Lists.newArrayList(Constants.DEVICE_FEATURE_SOURCE_SUPPORTS_ARC_RX); } @Override @ServiceThreadOnly void onHotplug(int portId, boolean connected) { Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +20 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.server.hdmi.Constants.LocalActivePort; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import com.google.android.collect.Lists; import java.util.List; /** Loading Loading @@ -233,6 +235,24 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // do nothing } @Override protected int getRcProfile() { return Constants.RC_PROFILE_SOURCE; } @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); } @Override protected List<Integer> getDeviceFeatures() { return Lists.newArrayList(); } // Active source claiming needs to be handled in Service // since service can decide who will be the active source when the device supports // multiple device types in this method. Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +18 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import com.android.server.hdmi.HdmiControlService.SendMessageCallback; import com.google.android.collect.Lists; import java.util.Arrays; import java.util.HashMap; import java.util.List; Loading Loading @@ -1478,6 +1480,22 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return true; } @Override protected int getRcProfile() { return Constants.RC_PROFILE_TV; } @Override protected List<Integer> getRcFeatures() { return Lists.newArrayList(Constants.RC_PROFILE_TV_NONE); } @Override protected List<Integer> getDeviceFeatures() { return Lists.newArrayList(Constants.DEVICE_FEATURE_SINK_SUPPORTS_ARC_TX, Constants.DEVICE_FEATURE_TV_SUPPORTS_RECORD_TV_SCREEN); } @Override protected void sendStandby(int deviceId) { HdmiDeviceInfo targetDevice = mService.getHdmiCecNetwork().getDeviceInfo(deviceId); Loading