From e1675c3ac3ac797ccdd46b670f71c52d5b39b7d8 Mon Sep 17 00:00:00 2001 From: Nathalie Le Clair Date: Thu, 14 Jan 2021 17:23:35 +0100 Subject: [PATCH] Add setting for main RC profile For TV panel and source devices. Bug: 169121289 Test: atest HdmiCecLocalDevicePlaybackTest and HdmiCecLocalDeviceTvTest Change-Id: I6e870a35bcaf55153eaa2274c9f2d8b8f7bf1dda --- .../hardware/hdmi/HdmiControlManager.java | 218 +++++++++++++++++- .../android/server/hdmi/HdmiCecConfig.java | 26 +++ .../server/hdmi/HdmiCecLocalDeviceSource.java | 31 ++- .../server/hdmi/HdmiCecLocalDeviceTv.java | 8 +- .../com/android/server/hdmi/cec_config.xml | 57 +++++ .../server/hdmi/FakeHdmiCecConfig.java | 57 +++++ .../hdmi/HdmiCecLocalDevicePlaybackTest.java | 11 + .../server/hdmi/HdmiCecLocalDeviceTvTest.java | 10 + 8 files changed, 412 insertions(+), 6 deletions(-) diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 0a9cc1d75db93..4ec3f926ed86f 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -473,7 +473,7 @@ public final class HdmiControlManager { * @see HdmiControlManager#CEC_SETTING_NAME_VOLUME_CONTROL_MODE * @hide */ - @IntDef({ + @IntDef(prefix = { "VOLUME_CONTROL_" }, value = { VOLUME_CONTROL_ENABLED, VOLUME_CONTROL_DISABLED }) @@ -503,6 +503,168 @@ public final class HdmiControlManager { @Retention(RetentionPolicy.SOURCE) public @interface TvWakeOnOneTouchPlay {} + // -- The RC profile of a TV panel. + /** + * RC profile none. + * + * @hide + */ + public static final int RC_PROFILE_TV_NONE = 0x0; + /** + * RC profile 1. + * + * @hide + */ + public static final int RC_PROFILE_TV_ONE = 0x2; + /** + * RC profile 2. + * + * @hide + */ + public static final int RC_PROFILE_TV_TWO = 0x6; + /** + * RC profile 3. + * + * @hide + */ + public static final int RC_PROFILE_TV_THREE = 0xA; + /** + * RC profile 4. + * + * @hide + */ + public static final int RC_PROFILE_TV_FOUR = 0xE; + /** + * @hide + */ + @IntDef(prefix = { "RC_PROFILE_TV_" }, value = { + RC_PROFILE_TV_NONE, + RC_PROFILE_TV_ONE, + RC_PROFILE_TV_TWO, + RC_PROFILE_TV_THREE, + RC_PROFILE_TV_FOUR + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RcProfileTv {} + + // -- RC profile parameter defining if a source handles the root menu. + /** + * Handles the root menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_ROOT_MENU_HANDLED = 1; + /** + * Doesn't handle the root menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_ROOT_MENU_NOT_HANDLED = 0; + /** + * @hide + */ + @IntDef(prefix = { "RC_PROFILE_SOURCE_ROOT_MENU_" }, value = { + RC_PROFILE_SOURCE_ROOT_MENU_HANDLED, + RC_PROFILE_SOURCE_ROOT_MENU_NOT_HANDLED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RcProfileSourceHandlesRootMenu {} + + // -- RC profile parameter defining if a source handles the setup menu. + /** + * Handles the setup menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_SETUP_MENU_HANDLED = 1; + /** + * Doesn't handle the setup menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_SETUP_MENU_NOT_HANDLED = 0; + /** + * @hide + */ + @IntDef(prefix = { "RC_PROFILE_SOURCE_SETUP_MENU_" }, value = { + RC_PROFILE_SOURCE_SETUP_MENU_HANDLED, + RC_PROFILE_SOURCE_SETUP_MENU_NOT_HANDLED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RcProfileSourceHandlesSetupMenu {} + + + // -- RC profile parameter defining if a source handles the contents menu. + /** + * Handles the contents menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_CONTENTS_MENU_HANDLED = 1; + /** + * Doesn't handle the contents menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_CONTENTS_MENU_NOT_HANDLED = 0; + /** + * @hide + */ + @IntDef(prefix = { "RC_PROFILE_SOURCE_CONTENTS_MENU_" }, value = { + RC_PROFILE_SOURCE_CONTENTS_MENU_HANDLED, + RC_PROFILE_SOURCE_CONTENTS_MENU_NOT_HANDLED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RcProfileSourceHandlesContentsMenu {} + + + // -- RC profile parameter defining if a source handles the top menu. + /** + * Handles the top menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_TOP_MENU_HANDLED = 1; + /** + * Doesn't handle the top menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_TOP_MENU_NOT_HANDLED = 0; + /** + * @hide + */ + @IntDef(prefix = { "RC_PROFILE_SOURCE_TOP_MENU_" }, value = { + RC_PROFILE_SOURCE_TOP_MENU_HANDLED, + RC_PROFILE_SOURCE_TOP_MENU_NOT_HANDLED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RcProfileSourceHandlesTopMenu {} + + + // -- RC profile parameter defining if a source handles the media context sensitive menu. + /** + * Handles the media context sensitive menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_MENU_HANDLED = 1; + /** + * Doesn't handle the media context sensitive menu. + * + * @hide + */ + public static final int RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_MENU_NOT_HANDLED = 0; + /** + * @hide + */ + @IntDef(prefix = { "RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_" }, value = { + RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_MENU_HANDLED, + RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_MENU_NOT_HANDLED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface RcProfileSourceHandlesMediaContextSensitiveMenu {} + // -- Settings available in the CEC Configuration. /** * Name of a setting deciding whether the CEC is enabled. @@ -584,6 +746,54 @@ public final class HdmiControlManager { */ public static final String CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY = "tv_wake_on_one_touch_play"; + /** + * Name of a setting representing the RC profile of a TV panel. + * + * @hide + */ + public static final String CEC_SETTING_NAME_RC_PROFILE_TV = + "rc_profile_tv"; + /** + * Name of a setting representing the RC profile parameter defining if a source handles the root + * menu. + * + * @hide + */ + public static final String CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU = + "rc_profile_source_handles_root_menu"; + /** + * Name of a setting representing the RC profile parameter defining if a source handles the + * setup menu. + * + * @hide + */ + public static final String CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU = + "rc_profile_source_handles_setup_menu"; + /** + * Name of a setting representing the RC profile parameter defining if a source handles the + * contents menu. + * + * @hide + */ + public static final String CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU = + "rc_profile_source_handles_contents_menu"; + /** + * Name of a setting representing the RC profile parameter defining if a source handles the top + * menu. + * + * @hide + */ + public static final String CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU = + "rc_profile_source_handles_top_menu"; + /** + * Name of a setting representing the RC profile parameter defining if a source handles the + * media context sensitive menu. + * + * @hide + */ + public static final String + CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU = + "rc_profile_source_handles_media_context_sensitive_menu"; /** * @hide */ @@ -595,6 +805,12 @@ public final class HdmiControlManager { CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING, CEC_SETTING_NAME_VOLUME_CONTROL_MODE, CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY, + CEC_SETTING_NAME_RC_PROFILE_TV, + CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU, + CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU, + CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU, + CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU, + CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU }) public @interface CecSettingName {} diff --git a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java index 9da90cf7a4cc9..d66bf63594268 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java @@ -303,6 +303,19 @@ public class HdmiCecConfig { return STORAGE_SHARED_PREFS; case HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY: return STORAGE_GLOBAL_SETTINGS; + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU: + return STORAGE_SHARED_PREFS; + case HdmiControlManager + .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU: + return STORAGE_SHARED_PREFS; default: throw new RuntimeException("Invalid CEC setting '" + setting.getName() + "' storage."); @@ -325,6 +338,19 @@ public class HdmiCecConfig { return setting.getName(); case HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY: return Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED; + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU: + return setting.getName(); + case HdmiControlManager + .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU: + return setting.getName(); default: throw new RuntimeException("Invalid CEC setting '" + setting.getName() + "' storage key."); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index 8a1a728ba8dd7..04acd5187f777 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -30,6 +30,7 @@ import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import com.google.android.collect.Lists; +import java.util.ArrayList; import java.util.List; /** @@ -304,8 +305,34 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { @Override protected List getRcFeatures() { - return Lists.newArrayList(Constants.RC_PROFILE_SOURCE_HANDLES_ROOT_MENU, - Constants.RC_PROFILE_SOURCE_HANDLES_SETUP_MENU); + List features = new ArrayList<>(); + HdmiCecConfig hdmiCecConfig = mService.getHdmiCecConfig(); + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU) + == HdmiControlManager.RC_PROFILE_SOURCE_ROOT_MENU_HANDLED) { + features.add(Constants.RC_PROFILE_SOURCE_HANDLES_ROOT_MENU); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU) + == HdmiControlManager.RC_PROFILE_SOURCE_SETUP_MENU_HANDLED) { + features.add(Constants.RC_PROFILE_SOURCE_HANDLES_SETUP_MENU); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU) + == HdmiControlManager.RC_PROFILE_SOURCE_CONTENTS_MENU_HANDLED) { + features.add(Constants.RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU) + == HdmiControlManager.RC_PROFILE_SOURCE_TOP_MENU_HANDLED) { + features.add(Constants.RC_PROFILE_SOURCE_HANDLES_TOP_MENU); + } + if (hdmiCecConfig.getIntValue(HdmiControlManager + .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU) + == HdmiControlManager.RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_MENU_HANDLED) { + features.add(Constants.RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU); + } + return features; } @Override diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index b60390bde38bb..5ef3738fc5b6e 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -51,8 +51,6 @@ 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.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -1486,7 +1484,11 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @Override protected List getRcFeatures() { - return Lists.newArrayList(Constants.RC_PROFILE_TV_NONE); + List features = new ArrayList<>(); + @HdmiControlManager.RcProfileTv int profile = mService.getHdmiCecConfig().getIntValue( + HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_TV); + features.add(profile); + return features; } @Override diff --git a/services/core/java/com/android/server/hdmi/cec_config.xml b/services/core/java/com/android/server/hdmi/cec_config.xml index c690b6b6a11ae..a751fd73c5420 100644 --- a/services/core/java/com/android/server/hdmi/cec_config.xml +++ b/services/core/java/com/android/server/hdmi/cec_config.xml @@ -64,4 +64,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java b/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java index d6f32bce12352..a408d4ca02cf4 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java @@ -113,6 +113,63 @@ final class FakeHdmiCecConfig extends HdmiCecConfig { + " " + " " + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + ""; FakeHdmiCecConfig(@NonNull Context context) { diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java index bc808762b8552..882d2f5f15297 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -1371,4 +1371,15 @@ public class HdmiCecLocalDevicePlaybackTest { HdmiControlManager.POWER_CONTROL_MODE_TV); assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isTrue(); } + + @Test + public void getRcFeatures() { + ArrayList features = new ArrayList<>(mHdmiCecLocalDevicePlayback.getRcFeatures()); + assertThat(features.contains(Constants.RC_PROFILE_SOURCE_HANDLES_ROOT_MENU)).isTrue(); + assertThat(features.contains(Constants.RC_PROFILE_SOURCE_HANDLES_SETUP_MENU)).isTrue(); + assertThat(features.contains(Constants.RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU)).isFalse(); + assertThat(features.contains(Constants.RC_PROFILE_SOURCE_HANDLES_TOP_MENU)).isFalse(); + assertThat(features.contains( + Constants.RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU)).isFalse(); + } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java index 352f20bf26bf9..ec806fabdff47 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java @@ -267,4 +267,14 @@ public class HdmiCecLocalDeviceTvTest { mTestLooper.dispatchAll(); assertThat(mWokenUp).isFalse(); } + + @Test + public void getRcFeatures() { + ArrayList features = new ArrayList<>(mHdmiCecLocalDeviceTv.getRcFeatures()); + assertThat(features.contains(Constants.RC_PROFILE_TV_NONE)).isTrue(); + assertThat(features.contains(Constants.RC_PROFILE_TV_ONE)).isFalse(); + assertThat(features.contains(Constants.RC_PROFILE_TV_TWO)).isFalse(); + assertThat(features.contains(Constants.RC_PROFILE_TV_THREE)).isFalse(); + assertThat(features.contains(Constants.RC_PROFILE_TV_FOUR)).isFalse(); + } }