diff --git a/core/api/system-current.txt b/core/api/system-current.txt index d11c874eb4053..786b7876fb35c 100755 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3355,6 +3355,7 @@ package android.hardware.hdmi { method @NonNull @RequiresPermission(android.Manifest.permission.HDMI_CEC) public String getPowerControlMode(); method @NonNull @RequiresPermission(android.Manifest.permission.HDMI_CEC) public String getPowerStateChangeOnActiveSourceLost(); method @NonNull @RequiresPermission(android.Manifest.permission.HDMI_CEC) public int getRoutingControl(); + method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public int getSadPresenceInQuery(@NonNull String); method @Nullable public android.hardware.hdmi.HdmiSwitchClient getSwitchClient(); method @NonNull @RequiresPermission(android.Manifest.permission.HDMI_CEC) public int getSystemAudioControl(); method @NonNull @RequiresPermission(android.Manifest.permission.HDMI_CEC) public int getSystemAudioModeMuting(); @@ -3373,6 +3374,8 @@ package android.hardware.hdmi { method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setPowerControlMode(@NonNull String); method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setPowerStateChangeOnActiveSourceLost(@NonNull String); method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setRoutingControl(@NonNull int); + method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setSadPresenceInQuery(@NonNull String, int); + method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setSadsPresenceInQuery(@NonNull java.util.List, int); method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setStandbyMode(boolean); method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setSystemAudioControl(@NonNull int); method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setSystemAudioModeMuting(@NonNull int); @@ -3384,6 +3387,21 @@ package android.hardware.hdmi { field public static final String CEC_SETTING_NAME_HDMI_CEC_VERSION = "hdmi_cec_version"; field public static final String CEC_SETTING_NAME_POWER_CONTROL_MODE = "power_control_mode"; field public static final String CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST = "power_state_change_on_active_source_lost"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_AAC = "query_sad_aac"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_ATRAC = "query_sad_atrac"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_DD = "query_sad_dd"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_DDP = "query_sad_ddp"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_DST = "query_sad_dst"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_DTS = "query_sad_dts"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_DTSHD = "query_sad_dtshd"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_LPCM = "query_sad_lpcm"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_MAX = "query_sad_max"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_MP3 = "query_sad_mp3"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_MPEG1 = "query_sad_mpeg1"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_MPEG2 = "query_sad_mpeg2"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO = "query_sad_onebitaudio"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_TRUEHD = "query_sad_truehd"; + field public static final String CEC_SETTING_NAME_QUERY_SAD_WMAPRO = "query_sad_wmapro"; field public static final String CEC_SETTING_NAME_ROUTING_CONTROL = "routing_control"; field public static final String CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL = "system_audio_control"; field public static final String CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING = "system_audio_mode_muting"; @@ -3451,6 +3469,8 @@ package android.hardware.hdmi { field public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; // 0x2 field public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; // 0x3 field public static final int POWER_STATUS_UNKNOWN = -1; // 0xffffffff + field public static final int QUERY_SAD_DISABLED = 0; // 0x0 + field public static final int QUERY_SAD_ENABLED = 1; // 0x1 field @Deprecated public static final int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4 field public static final int RESULT_COMMUNICATION_FAILED = 7; // 0x7 field public static final int RESULT_EXCEPTION = 5; // 0x5 diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 0a5496e47fddb..5874385f81919 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -115,8 +115,6 @@ public final class HdmiControlManager { public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; - /** @hide */ - @SystemApi @IntDef ({ RESULT_SUCCESS, RESULT_TIMEOUT, @@ -297,19 +295,19 @@ public final class HdmiControlManager { /** * HDMI CEC enabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_HDMI_CEC_ENABLED */ - @SystemApi public static final int HDMI_CEC_CONTROL_ENABLED = 1; /** * HDMI CEC disabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_HDMI_CEC_ENABLED */ - @SystemApi public static final int HDMI_CEC_CONTROL_DISABLED = 0; /** * @hide + * + * @see HdmiControlManager#CEC_SETTING_NAME_HDMI_CEC_ENABLED */ @IntDef(prefix = { "HDMI_CEC_CONTROL_" }, value = { HDMI_CEC_CONTROL_ENABLED, @@ -322,18 +320,17 @@ public final class HdmiControlManager { /** * Version constant for HDMI-CEC v1.4b. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_HDMI_CEC_VERSION */ - @SystemApi public static final int HDMI_CEC_VERSION_1_4_B = 0x05; /** * Version constant for HDMI-CEC v2.0. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_HDMI_CEC_VERSION */ - @SystemApi public static final int HDMI_CEC_VERSION_2_0 = 0x06; /** + * @see HdmiControlManager#CEC_SETTING_NAME_HDMI_CEC_VERSION * @hide */ @IntDef(prefix = { "HDMI_CEC_VERSION_" }, value = { @@ -347,18 +344,17 @@ public final class HdmiControlManager { /** * Routing Control feature enabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_ROUTING_CONTROL */ - @SystemApi public static final int ROUTING_CONTROL_ENABLED = 1; /** * Routing Control feature disabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_ROUTING_CONTROL */ - @SystemApi public static final int ROUTING_CONTROL_DISABLED = 0; /** + * @see HdmiControlManager#CEC_SETTING_NAME_ROUTING_CONTROL * @hide */ @IntDef(prefix = { "ROUTING_CONTROL_" }, value = { @@ -375,9 +371,8 @@ public final class HdmiControlManager { * Upon waking up, attempt to turn on the TV via {@code } but do not turn on the * Audio system via {@code }. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_CONTROL_MODE */ - @SystemApi public static final String POWER_CONTROL_MODE_TV = "to_tv"; /** * Send CEC power control messages to TV and Audio System: @@ -385,9 +380,8 @@ public final class HdmiControlManager { * Upon waking up, attempt to turn on the TV via {@code } and attempt to turn on * the Audio system via {@code }. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_CONTROL_MODE */ - @SystemApi public static final String POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM = "to_tv_and_audio_system"; /** * Broadcast CEC power control messages to all devices in the network: @@ -395,9 +389,8 @@ public final class HdmiControlManager { * Upon waking up, attempt to turn on the TV via {@code } and attempt to turn on * the Audio system via {@code }. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_CONTROL_MODE */ - @SystemApi public static final String POWER_CONTROL_MODE_BROADCAST = "broadcast"; /** * Don't send any CEC power control messages: @@ -405,11 +398,11 @@ public final class HdmiControlManager { * Upon waking up, do not turn on the TV via {@code } and do not turn on the * Audio system via {@code }. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_CONTROL_MODE */ - @SystemApi public static final String POWER_CONTROL_MODE_NONE = "none"; /** + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_CONTROL_MODE * @hide */ @StringDef(prefix = { "POWER_CONTROL_MODE_" }, value = { @@ -425,18 +418,17 @@ public final class HdmiControlManager { /** * No action to be taken. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST */ - @SystemApi public static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE = "none"; /** * Go to standby immediately. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST */ - @SystemApi public static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW = "standby_now"; /** + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST * @hide */ @StringDef(prefix = { "POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_" }, value = { @@ -450,18 +442,17 @@ public final class HdmiControlManager { /** * System Audio Control enabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL */ - @SystemApi public static final int SYSTEM_AUDIO_CONTROL_ENABLED = 1; /** * System Audio Control disabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL */ - @SystemApi public static final int SYSTEM_AUDIO_CONTROL_DISABLED = 0; /** + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL * @hide */ @IntDef(prefix = { "SYSTEM_AUDIO_CONTROL_" }, value = { @@ -475,18 +466,17 @@ public final class HdmiControlManager { /** * System Audio Mode muting enabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING */ - @SystemApi public static final int SYSTEM_AUDIO_MODE_MUTING_ENABLED = 1; /** * System Audio Mode muting disabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING */ - @SystemApi public static final int SYSTEM_AUDIO_MODE_MUTING_DISABLED = 0; /** + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING * @hide */ @IntDef(prefix = { "SYSTEM_AUDIO_MODE_MUTING_" }, value = { @@ -501,17 +491,13 @@ public final class HdmiControlManager { * HDMI CEC enabled. * * @see HdmiControlManager#CEC_SETTING_NAME_VOLUME_CONTROL_MODE - * @hide */ - @SystemApi public static final int VOLUME_CONTROL_ENABLED = 1; /** * HDMI CEC disabled. * * @see HdmiControlManager#CEC_SETTING_NAME_VOLUME_CONTROL_MODE - * @hide */ - @SystemApi public static final int VOLUME_CONTROL_DISABLED = 0; /** * @see HdmiControlManager#CEC_SETTING_NAME_VOLUME_CONTROL_MODE @@ -528,18 +514,17 @@ public final class HdmiControlManager { /** * TV Wake on One Touch Play enabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY */ - @SystemApi public static final int TV_WAKE_ON_ONE_TOUCH_PLAY_ENABLED = 1; /** * TV Wake on One Touch Play disabled. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY */ - @SystemApi public static final int TV_WAKE_ON_ONE_TOUCH_PLAY_DISABLED = 0; /** + * @see HdmiControlManager#CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY * @hide */ @IntDef(prefix = { "TV_WAKE_ON_ONE_TOUCH_PLAY_" }, value = { @@ -553,18 +538,17 @@ public final class HdmiControlManager { /** * Sending <Standby> on sleep. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP */ - @SystemApi public static final int TV_SEND_STANDBY_ON_SLEEP_ENABLED = 1; /** * Not sending <Standby> on sleep. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP */ - @SystemApi public static final int TV_SEND_STANDBY_ON_SLEEP_DISABLED = 0; /** + * @see HdmiControlManager#CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP * @hide */ @IntDef(prefix = { "TV_SEND_STANDBY_ON_SLEEP_" }, value = { @@ -578,34 +562,40 @@ public final class HdmiControlManager { /** * RC profile none. * + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_TV * @hide */ public static final int RC_PROFILE_TV_NONE = 0x0; /** * RC profile 1. * + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_TV * @hide */ public static final int RC_PROFILE_TV_ONE = 0x2; /** * RC profile 2. * + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_TV * @hide */ public static final int RC_PROFILE_TV_TWO = 0x6; /** * RC profile 3. * + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_TV * @hide */ public static final int RC_PROFILE_TV_THREE = 0xA; /** * RC profile 4. * + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_TV * @hide */ public static final int RC_PROFILE_TV_FOUR = 0xE; /** + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_TV * @hide */ @IntDef(prefix = { "RC_PROFILE_TV_" }, value = { @@ -618,175 +608,157 @@ public final class HdmiControlManager { @Retention(RetentionPolicy.SOURCE) public @interface RcProfileTv {} - // -- RC profile parameter defining if a source handles the root menu. + // -- RC profile parameter defining if a source handles a specific menu. /** - * Handles the root menu. + * Handles the menu. * + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU + * @see HdmiControlManager# + * CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU * @hide */ - public static final int RC_PROFILE_SOURCE_ROOT_MENU_HANDLED = 1; + public static final int RC_PROFILE_SOURCE_MENU_HANDLED = 1; /** - * Doesn't handle the root menu. + * Doesn't handle the menu. * + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU + * @see HdmiControlManager# + * CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU * @hide */ - public static final int RC_PROFILE_SOURCE_ROOT_MENU_NOT_HANDLED = 0; + public static final int RC_PROFILE_SOURCE_MENU_NOT_HANDLED = 0; /** + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU + * @see HdmiControlManager#CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU + * @see HdmiControlManager# + * CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU * @hide */ - @IntDef(prefix = { "RC_PROFILE_SOURCE_ROOT_MENU_" }, value = { - RC_PROFILE_SOURCE_ROOT_MENU_HANDLED, - RC_PROFILE_SOURCE_ROOT_MENU_NOT_HANDLED + @IntDef(prefix = { "RC_PROFILE_SOURCE_MENU_" }, value = { + RC_PROFILE_SOURCE_MENU_HANDLED, + RC_PROFILE_SOURCE_MENU_NOT_HANDLED }) @Retention(RetentionPolicy.SOURCE) - public @interface RcProfileSourceHandlesRootMenu {} + public @interface RcProfileSourceHandlesMenu {} - // -- RC profile parameter defining if a source handles the setup menu. + // -- Whether the Short Audio Descriptor (SAD) for a specific codec should be queried or not. /** - * Handles the setup menu. + * Query the SAD. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_LPCM + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DD + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MPEG1 + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MP3 + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MPEG2 + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_AAC + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DTS + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_ATRAC + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DDP + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DTSHD + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_TRUEHD + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DST + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_WMAPRO + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MAX */ - public static final int RC_PROFILE_SOURCE_SETUP_MENU_HANDLED = 1; + public static final int QUERY_SAD_ENABLED = 1; /** - * Doesn't handle the setup menu. + * Don't query the SAD. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_LPCM + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DD + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MPEG1 + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MP3 + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MPEG2 + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_AAC + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DTS + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_ATRAC + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DDP + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DTSHD + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_TRUEHD + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DST + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_WMAPRO + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MAX */ - public static final int RC_PROFILE_SOURCE_SETUP_MENU_NOT_HANDLED = 0; + public static final int QUERY_SAD_DISABLED = 0; /** + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_LPCM + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DD + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MPEG1 + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MP3 + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MPEG2 + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_AAC + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DTS + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_ATRAC + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DDP + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DTSHD + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_TRUEHD + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_DST + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_WMAPRO + * @see HdmiControlManager#CEC_SETTING_NAME_QUERY_SAD_MAX * @hide */ - @IntDef(prefix = { "RC_PROFILE_SOURCE_SETUP_MENU_" }, value = { - RC_PROFILE_SOURCE_SETUP_MENU_HANDLED, - RC_PROFILE_SOURCE_SETUP_MENU_NOT_HANDLED + @IntDef(prefix = { "QUERY_SAD_" }, value = { + QUERY_SAD_ENABLED, + QUERY_SAD_DISABLED }) @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 {} + public @interface SadPresenceInQuery {} // -- Settings available in the CEC Configuration. /** * Name of a setting deciding whether the CEC is enabled. * - * @hide + * @see HdmiControlManager#setHdmiCecEnabled(int) */ - @SystemApi public static final String CEC_SETTING_NAME_HDMI_CEC_ENABLED = "hdmi_cec_enabled"; /** * Name of a setting controlling the version of HDMI-CEC used. * - * @hide + * @see HdmiControlManager#setHdmiCecVersion(int) */ - @SystemApi public static final String CEC_SETTING_NAME_HDMI_CEC_VERSION = "hdmi_cec_version"; /** * Name of a setting deciding whether the Routing Control feature is enabled. * - * @hide + * @see HdmiControlManager#setRoutingControl(int) */ - @SystemApi public static final String CEC_SETTING_NAME_ROUTING_CONTROL = "routing_control"; /** * Name of a setting deciding on the power control mode. * - * @hide + * @see HdmiControlManager#setPowerControlMode(String) */ - @SystemApi public static final String CEC_SETTING_NAME_POWER_CONTROL_MODE = "power_control_mode"; /** * Name of a setting deciding on power state action when losing Active Source. * - * @hide + * @see HdmiControlManager#setPowerStateChangeOnActiveSourceLost(String) */ - @SystemApi public static final String CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST = "power_state_change_on_active_source_lost"; /** * Name of a setting deciding whether System Audio Control is enabled. * - * @hide + * @see HdmiControlManager#setSystemAudioControl(int) */ - @SystemApi public static final String CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL = "system_audio_control"; /** * Name of a setting deciding whether System Audio Muting is allowed. * - * @hide + * @see HdmiControlManager#setSystemAudioModeMuting(int) */ - @SystemApi public static final String CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING = "system_audio_mode_muting"; /** @@ -819,28 +791,24 @@ public final class HdmiControlManager { * *

Due to the resulting behavior, usage on TV and Audio devices is discouraged. * - * @hide - * @see android.hardware.hdmi.HdmiControlManager#setHdmiCecVolumeControlEnabled(int) + * @see HdmiControlManager#setHdmiCecVolumeControlEnabled(int) */ - @SystemApi public static final String CEC_SETTING_NAME_VOLUME_CONTROL_MODE = "volume_control_enabled"; /** * Name of a setting deciding whether the TV will automatically turn on upon reception * of the CEC command <Text View On> or <Image View On>. * - * @hide + * @see HdmiControlManager#setTvWakeOnOneTouchPlay(int) */ - @SystemApi public static final String CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY = "tv_wake_on_one_touch_play"; /** * Name of a setting deciding whether the TV will also turn off other CEC devices * when it goes to standby mode. * - * @hide + * @see HdmiControlManager#setTvSendStandbyOnSleep(int) */ - @SystemApi public static final String CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP = "tv_send_standby_on_sleep"; /** @@ -891,6 +859,111 @@ public final class HdmiControlManager { public static final String CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU = "rc_profile_source_handles_media_context_sensitive_menu"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the LPCM codec + * (0x1) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_LPCM = "query_sad_lpcm"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the DD codec + * (0x2) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_DD = "query_sad_dd"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the MPEG1 codec + * (0x3) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_MPEG1 = "query_sad_mpeg1"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the MP3 codec + * (0x4) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_MP3 = "query_sad_mp3"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the MPEG2 codec + * (0x5) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_MPEG2 = "query_sad_mpeg2"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the AAC codec + * (0x6) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_AAC = "query_sad_aac"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the DTS codec + * (0x7) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_DTS = "query_sad_dts"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the ATRAC codec + * (0x8) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_ATRAC = "query_sad_atrac"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the ONEBITAUDIO + * codec (0x9) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO = "query_sad_onebitaudio"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the DDP codec + * (0xA) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_DDP = "query_sad_ddp"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the DTSHD codec + * (0xB) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_DTSHD = "query_sad_dtshd"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the TRUEHD codec + * (0xC) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_TRUEHD = "query_sad_truehd"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the DST codec + * (0xD) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_DST = "query_sad_dst"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the WMAPRO codec + * (0xE) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_WMAPRO = "query_sad_wmapro"; + /** + * Name of a setting representing whether the Short Audio Descriptor (SAD) for the MAX codec + * (0xF) should be queried or not. + * + * @see HdmiControlManager#setSadPresenceInQuery(String, int) + */ + public static final String CEC_SETTING_NAME_QUERY_SAD_MAX = "query_sad_max"; /** * @hide */ @@ -910,9 +983,46 @@ public final class HdmiControlManager { 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, + CEC_SETTING_NAME_QUERY_SAD_LPCM, + CEC_SETTING_NAME_QUERY_SAD_DD, + CEC_SETTING_NAME_QUERY_SAD_MPEG1, + CEC_SETTING_NAME_QUERY_SAD_MP3, + CEC_SETTING_NAME_QUERY_SAD_MPEG2, + CEC_SETTING_NAME_QUERY_SAD_AAC, + CEC_SETTING_NAME_QUERY_SAD_DTS, + CEC_SETTING_NAME_QUERY_SAD_ATRAC, + CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO, + CEC_SETTING_NAME_QUERY_SAD_DDP, + CEC_SETTING_NAME_QUERY_SAD_DTSHD, + CEC_SETTING_NAME_QUERY_SAD_TRUEHD, + CEC_SETTING_NAME_QUERY_SAD_DST, + CEC_SETTING_NAME_QUERY_SAD_WMAPRO, + CEC_SETTING_NAME_QUERY_SAD_MAX, }) public @interface CecSettingName {} + /** + * @hide + */ + @StringDef(prefix = { "CEC_SETTING_NAME_QUERY_SAD_" }, value = { + CEC_SETTING_NAME_QUERY_SAD_LPCM, + CEC_SETTING_NAME_QUERY_SAD_DD, + CEC_SETTING_NAME_QUERY_SAD_MPEG1, + CEC_SETTING_NAME_QUERY_SAD_MP3, + CEC_SETTING_NAME_QUERY_SAD_MPEG2, + CEC_SETTING_NAME_QUERY_SAD_AAC, + CEC_SETTING_NAME_QUERY_SAD_DTS, + CEC_SETTING_NAME_QUERY_SAD_ATRAC, + CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO, + CEC_SETTING_NAME_QUERY_SAD_DDP, + CEC_SETTING_NAME_QUERY_SAD_DTSHD, + CEC_SETTING_NAME_QUERY_SAD_TRUEHD, + CEC_SETTING_NAME_QUERY_SAD_DST, + CEC_SETTING_NAME_QUERY_SAD_WMAPRO, + CEC_SETTING_NAME_QUERY_SAD_MAX, + }) + public @interface CecSettingSad {} + // True if we have a logical device of type playback hosted in the system. private final boolean mHasPlaybackDevice; // True if we have a logical device of type TV hosted in the system. @@ -966,11 +1076,8 @@ public final class HdmiControlManager { * See {@link HdmiDeviceInfo#DEVICE_PLAYBACK} * See {@link HdmiDeviceInfo#DEVICE_TV} * See {@link HdmiDeviceInfo#DEVICE_AUDIO_SYSTEM} - * - * @hide */ @Nullable - @SystemApi @SuppressLint("RequiresPermission") public HdmiClient getClient(int type) { if (mService == null) { @@ -999,11 +1106,8 @@ public final class HdmiControlManager { * system if the system is configured to host more than one type of HDMI-CEC logical devices. * * @return {@link HdmiPlaybackClient} instance. {@code null} on failure. - * - * @hide */ @Nullable - @SystemApi @SuppressLint("RequiresPermission") public HdmiPlaybackClient getPlaybackClient() { return (HdmiPlaybackClient) getClient(HdmiDeviceInfo.DEVICE_PLAYBACK); @@ -1017,11 +1121,8 @@ public final class HdmiControlManager { * system if the system is configured to host more than one type of HDMI-CEC logical devices. * * @return {@link HdmiTvClient} instance. {@code null} on failure. - * - * @hide */ @Nullable - @SystemApi @SuppressLint("RequiresPermission") public HdmiTvClient getTvClient() { return (HdmiTvClient) getClient(HdmiDeviceInfo.DEVICE_TV); @@ -1067,11 +1168,8 @@ public final class HdmiControlManager { * * @return a list of {@link HdmiDeviceInfo} of the connected CEC devices on the CEC bus. An * empty list will be returned if there is none. - * - * @hide */ @NonNull - @SystemApi public List getConnectedDevices() { try { return mService.getDeviceList(); @@ -1082,11 +1180,9 @@ public final class HdmiControlManager { /** * @removed - * @hide * @deprecated Please use {@link #getConnectedDevices()} instead. */ @Deprecated - @SystemApi public List getConnectedDevicesList() { try { return mService.getDeviceList(); @@ -1102,10 +1198,7 @@ public final class HdmiControlManager { *

The target device info can be obtained by calling {@link #getConnectedDevicesList()}. * * @param deviceInfo {@link HdmiDeviceInfo} of the device to be powered off. - * - * @hide */ - @SystemApi public void powerOffDevice(@NonNull HdmiDeviceInfo deviceInfo) { Objects.requireNonNull(deviceInfo); try { @@ -1118,11 +1211,9 @@ public final class HdmiControlManager { /** * @removed - * @hide * @deprecated Please use {@link #powerOffDevice(deviceInfo)} instead. */ @Deprecated - @SystemApi public void powerOffRemoteDevice(@NonNull HdmiDeviceInfo deviceInfo) { Objects.requireNonNull(deviceInfo); try { @@ -1155,11 +1246,9 @@ public final class HdmiControlManager { /** * @removed - * @hide * @deprecated Please use {@link #powerOnDevice(deviceInfo)} instead. */ @Deprecated - @SystemApi public void powerOnRemoteDevice(HdmiDeviceInfo deviceInfo) { Objects.requireNonNull(deviceInfo); try { @@ -1180,10 +1269,7 @@ public final class HdmiControlManager { * streaming on their TVs. * * @param deviceInfo HdmiDeviceInfo of the target device - * - * @hide */ - @SystemApi public void setActiveSource(@NonNull HdmiDeviceInfo deviceInfo) { Objects.requireNonNull(deviceInfo); try { @@ -1195,11 +1281,9 @@ public final class HdmiControlManager { /** * @removed - * @hide * @deprecated Please use {@link #setActiveSource(deviceInfo)} instead. */ @Deprecated - @SystemApi public void requestRemoteDeviceToBecomeActiveSource(@NonNull HdmiDeviceInfo deviceInfo) { Objects.requireNonNull(deviceInfo); try { @@ -1292,9 +1376,7 @@ public final class HdmiControlManager { * * @param hdmiCecVolumeControlEnabled target state of HDMI CEC volume control. * @see HdmiControlManager#CEC_SETTING_NAME_VOLUME_CONTROL_MODE - * @hide */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setHdmiCecVolumeControlEnabled( @VolumeControl int hdmiCecVolumeControlEnabled) { @@ -1308,9 +1390,9 @@ public final class HdmiControlManager { /** * Returns whether volume changes via HDMI CEC are enabled. - * @hide + * + * @see HdmiControlManager#CEC_SETTING_NAME_VOLUME_CONTROL_MODE */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) @VolumeControl public int getHdmiCecVolumeControlEnabled() { @@ -1340,10 +1422,7 @@ public final class HdmiControlManager { *

Physical address needs to be automatically adjusted when devices are phyiscally or * electrically added or removed from the device tree. Please see HDMI Specification Version * 1.4b 8.7 Physical Address for more details on the address discovery proccess. - * - * @hide */ - @SystemApi public int getPhysicalAddress() { try { return mService.getPhysicalAddress(); @@ -1360,10 +1439,7 @@ public final class HdmiControlManager { * @param targetDevice {@link HdmiDeviceInfo} of the target device. * @return true if {@code targetDevice} is directly or indirectly * connected to the current device. - * - * @hide */ - @SystemApi public boolean isDeviceConnected(@NonNull HdmiDeviceInfo targetDevice) { Objects.requireNonNull(targetDevice); int physicalAddress = getPhysicalAddress(); @@ -1380,11 +1456,9 @@ public final class HdmiControlManager { /** * @removed - * @hide * @deprecated Please use {@link #isDeviceConnected(targetDevice)} instead. */ @Deprecated - @SystemApi public boolean isRemoteDeviceConnected(@NonNull HdmiDeviceInfo targetDevice) { Objects.requireNonNull(targetDevice); int physicalAddress = getPhysicalAddress(); @@ -1401,10 +1475,7 @@ public final class HdmiControlManager { /** * Listener used to get hotplug event from HDMI port. - * - * @hide */ - @SystemApi public interface HotplugEventListener { void onReceived(HdmiHotplugEvent event); } @@ -1456,10 +1527,7 @@ public final class HdmiControlManager { /** * Listener used to get vendor-specific commands. - * - * @hide */ - @SystemApi public interface VendorCommandListener { /** * Called when a vendor command is received. @@ -1503,10 +1571,7 @@ public final class HdmiControlManager { * * @param listener {@link HotplugEventListener} instance * @see HdmiControlManager#removeHotplugEventListener(HotplugEventListener) - * - * @hide */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHotplugEventListener(HotplugEventListener listener) { addHotplugEventListener(ConcurrentUtils.DIRECT_EXECUTOR, listener); @@ -1520,10 +1585,7 @@ public final class HdmiControlManager { * * @param listener {@link HotplugEventListener} instance * @see HdmiControlManager#removeHotplugEventListener(HotplugEventListener) - * - * @hide */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHotplugEventListener(@NonNull @CallbackExecutor Executor executor, @NonNull HotplugEventListener listener) { @@ -1549,10 +1611,7 @@ public final class HdmiControlManager { * Removes a listener to stop getting informed of {@link HdmiHotplugEvent}. * * @param listener {@link HotplugEventListener} instance to be removed - * - * @hide */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHotplugEventListener(HotplugEventListener listener) { if (mService == null) { @@ -1761,10 +1820,7 @@ public final class HdmiControlManager { /** * Listener used to get setting change notification. - * - * @hide */ - @SystemApi public interface CecSettingChangeListener { /** * Called when value of a setting changes. @@ -1845,10 +1901,7 @@ public final class HdmiControlManager { * * @return a set of user-modifiable settings. * @throws RuntimeException when the HdmiControlService is not available. - * - * @hide */ - @SystemApi @NonNull @CecSettingName @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -1872,10 +1925,7 @@ public final class HdmiControlManager { * @throws IllegalArgumentException when setting {@code name} does not exist. * @throws IllegalArgumentException when setting {@code name} value type is invalid. * @throws RuntimeException when the HdmiControlService is not available. - * - * @hide */ - @SystemApi @NonNull @RequiresPermission(android.Manifest.permission.HDMI_CEC) public List getAllowedCecSettingStringValues(@NonNull @CecSettingName String name) { @@ -1898,10 +1948,7 @@ public final class HdmiControlManager { * @throws IllegalArgumentException when setting {@code name} does not exist. * @throws IllegalArgumentException when setting {@code name} value type is invalid. * @throws RuntimeException when the HdmiControlService is not available. - * - * @hide */ - @SystemApi @NonNull @RequiresPermission(android.Manifest.permission.HDMI_CEC) public List getAllowedCecSettingIntValues(@NonNull @CecSettingName String name) { @@ -1921,10 +1968,7 @@ public final class HdmiControlManager { * Set the global status of HDMI CEC. * *

This allows to enable/disable HDMI CEC on the device. - * - * @hide */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setHdmiCecEnabled(@NonNull @HdmiCecControl int value) { if (mService == null) { @@ -1942,10 +1986,7 @@ public final class HdmiControlManager { * Get the current global status of HDMI CEC. * *

Reflects whether HDMI CEC is currently enabled on the device. - * - * @hide */ - @SystemApi @NonNull @HdmiCecControl @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -1971,10 +2012,7 @@ public final class HdmiControlManager { * Binder thread. This means that all callback implementations must be * thread safe. To specify the execution thread, use * {@link addHdmiCecEnabledChangeListener(Executor, CecSettingChangeListener)}. - * - * @hide */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHdmiCecEnabledChangeListener(@NonNull CecSettingChangeListener listener) { addHdmiCecEnabledChangeListener(ConcurrentUtils.DIRECT_EXECUTOR, listener); @@ -1985,10 +2023,7 @@ public final class HdmiControlManager { * *

To stop getting the notification, * use {@link #removeHdmiCecEnabledChangeListener(CecSettingChangeListener)}. - * - * @hide */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHdmiCecEnabledChangeListener( @NonNull @CallbackExecutor Executor executor, @@ -1998,10 +2033,7 @@ public final class HdmiControlManager { /** * Remove change listener for global status of HDMI CEC. - * - * @hide */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHdmiCecEnabledChangeListener( @NonNull CecSettingChangeListener listener) { @@ -2013,9 +2045,8 @@ public final class HdmiControlManager { * *

Allows to select either CEC 1.4b or 2.0 to be used by the device. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_HDMI_CEC_VERSION */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setHdmiCecVersion(@NonNull @HdmiCecVersion int value) { if (mService == null) { @@ -2034,9 +2065,8 @@ public final class HdmiControlManager { * *

Reflects which CEC version 1.4b or 2.0 is currently used by the device. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_HDMI_CEC_VERSION */ - @SystemApi @NonNull @HdmiCecVersion @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -2060,9 +2090,8 @@ public final class HdmiControlManager { * receiving Routing Control related messages. If disabled, you can only * switch the input via controls on this device. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_ROUTING_CONTROL */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setRoutingControl(@NonNull @RoutingControl int value) { if (mService == null) { @@ -2084,9 +2113,8 @@ public final class HdmiControlManager { * receiving Routing Control related messages. If disabled, you can only * switch the input via controls on this device. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_ROUTING_CONTROL */ - @SystemApi @NonNull @RoutingControl @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -2108,9 +2136,8 @@ public final class HdmiControlManager { *

Specifies to which devices Power Control messages should be sent: * only to the TV, broadcast to all devices, no power control messages. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_CONTROL_MODE */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setPowerControlMode(@NonNull @PowerControlMode String value) { if (mService == null) { @@ -2130,9 +2157,8 @@ public final class HdmiControlManager { *

Reflects to which devices Power Control messages should be sent: * only to the TV, broadcast to all devices, no power control messages. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_CONTROL_MODE */ - @SystemApi @NonNull @PowerControlMode @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -2153,9 +2179,8 @@ public final class HdmiControlManager { * *

Sets the action taken: do nothing or go to sleep immediately. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setPowerStateChangeOnActiveSourceLost( @NonNull @ActiveSourceLostBehavior String value) { @@ -2176,9 +2201,8 @@ public final class HdmiControlManager { * *

Reflects the action taken: do nothing or go to sleep immediately. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST */ - @SystemApi @NonNull @ActiveSourceLostBehavior @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -2204,9 +2228,8 @@ public final class HdmiControlManager { * the AVR instead of TV speaker or Audio System speakers. If disabled, the * System Audio Mode will never be activated. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setSystemAudioControl(@NonNull @SystemAudioControl int value) { if (mService == null) { @@ -2229,9 +2252,8 @@ public final class HdmiControlManager { * the AVR instead of TV speaker or Audio System speakers. If disabled, the * System Audio Mode will never be activated. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL */ - @SystemApi @NonNull @SystemAudioControl @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -2252,9 +2274,8 @@ public final class HdmiControlManager { * *

Sets whether the device should be muted when System Audio Mode is turned off. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setSystemAudioModeMuting(@NonNull @SystemAudioModeMuting int value) { if (mService == null) { @@ -2273,9 +2294,8 @@ public final class HdmiControlManager { * *

Reflects whether the device should be muted when System Audio Mode is turned off. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING */ - @SystemApi @NonNull @SystemAudioModeMuting @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -2297,9 +2317,8 @@ public final class HdmiControlManager { *

Sets whether the TV should wake up upon reception of <Text View On> * or <Image View On>. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setTvWakeOnOneTouchPlay(@NonNull @TvWakeOnOneTouchPlay int value) { if (mService == null) { @@ -2319,9 +2338,8 @@ public final class HdmiControlManager { *

Reflects whether the TV should wake up upon reception of <Text View On> * or <Image View On>. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY */ - @SystemApi @NonNull @TvWakeOnOneTouchPlay @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -2343,9 +2361,8 @@ public final class HdmiControlManager { *

Sets whether the device will also turn off other CEC devices * when it goes to standby mode. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP */ - @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setTvSendStandbyOnSleep(@NonNull @TvSendStandbyOnSleep int value) { if (mService == null) { @@ -2365,9 +2382,8 @@ public final class HdmiControlManager { *

Reflects whether the device will also turn off other CEC devices * when it goes to standby mode. * - * @hide + * @see HdmiControlManager#CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP */ - @SystemApi @NonNull @TvSendStandbyOnSleep @RequiresPermission(android.Manifest.permission.HDMI_CEC) @@ -2382,4 +2398,102 @@ public final class HdmiControlManager { throw e.rethrowFromSystemServer(); } } + + /** + * Set presence of one Short Audio Descriptor (SAD) in the query. + * + *

Allows the caller to specify whether the SAD for a specific audio codec should be + * present in the <Request Short Audio Descriptor> query. Each <Request Short Audio + * Descriptor> message can carry at most 4 SADs at a time. This method allows the caller to + * limit the amount of SADs queried and therefore limit the amount of CEC messages on the bus. + * + *

When an ARC connection is established, the TV sends a + * <Request Short Audio Descriptor> query to the Audio System that it's connected to. If + * an SAD is queried and the Audio System reports that it supports that SAD, the TV can send + * audio in that format to be output on the Audio System via ARC. + * If a codec is not queried, the TV doesn't know if the connected Audio System supports this + * SAD and doesn't send audio in that format to the Audio System. + * + * @param setting SAD to set. + * @param value Presence to set the SAD to. + */ + @RequiresPermission(android.Manifest.permission.HDMI_CEC) + public void setSadPresenceInQuery(@NonNull @CecSettingSad String setting, + @SadPresenceInQuery int value) { + if (mService == null) { + Log.e(TAG, "HdmiControlService is not available"); + throw new RuntimeException("HdmiControlService is not available"); + } + try { + mService.setCecSettingIntValue(setting, value); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Set presence of multiple Short Audio Descriptors (SADs) in the query. + * + *

Allows the caller to specify whether the SADs for specific audio codecs should be present + * in the <Request Short Audio Descriptor> query. For audio codecs that are not specified, + * the SAD's presence remains at its previous value. Each <Request Short Audio Descriptor> + * message can carry at most 4 SADs at a time. This method allows the caller to limit the amount + * of SADs queried and therefore limit the amount of CEC messages on the bus. + * + *

When an ARC connection is established, the TV sends a + * <Request Short Audio Descriptor> query to the Audio System that it's connected to. If + * an SAD is queried and the Audio System reports that it supports that SAD, the TV can send + * audio in that format to be output on the Audio System via ARC. + * If a codec is not queried, the TV doesn't know if the connected Audio System supports this + * SAD and doesn't send audio in that format to the Audio System. + * + * + * @param settings SADs to set. + * @param value Presence to set all specified SADs to. + */ + @RequiresPermission(android.Manifest.permission.HDMI_CEC) + public void setSadsPresenceInQuery(@NonNull @CecSettingSad List settings, + @SadPresenceInQuery int value) { + if (mService == null) { + Log.e(TAG, "HdmiControlService is not available"); + throw new RuntimeException("HdmiControlService is not available"); + } + try { + for (String sad : settings) { + mService.setCecSettingIntValue(sad, value); + } + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Get presence of one Short Audio Descriptor (SAD) in the query. + * + *

Reflects whether the SAD for a specific audio codec should be present in the + * <Request Short Audio Descriptor> query. + * + *

When an ARC connection is established, the TV sends a + * <Request Short Audio Descriptor> query to the Audio System that it's connected to. If + * an SAD is queried and the Audio System reports that it supports that SAD, the TV can send + * audio in that format to be output on the Audio System via ARC. + * If a codec is not queried, the TV doesn't know if the connected Audio System supports this + * SAD and doesn't send audio in that format to the Audio System. + * + * @param setting SAD to get. + * @return Current presence of the specified SAD. + */ + @SadPresenceInQuery + @RequiresPermission(android.Manifest.permission.HDMI_CEC) + public int getSadPresenceInQuery(@NonNull @CecSettingSad String setting) { + if (mService == null) { + Log.e(TAG, "HdmiControlService is not available"); + throw new RuntimeException("HdmiControlService is not available"); + } + try { + return mService.getCecSettingIntValue(setting); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 2eb32b02b3950..489a79f5f5e73 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -5104,6 +5104,97 @@ true true + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + + true + true + true + true + false + true diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 253cd47d1b3e5..d96b1de32c82e 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4432,6 +4432,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java index 550f1b92f6b98..65ec1c07c4a18 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java @@ -408,11 +408,11 @@ public class HdmiCecConfig { HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU, R.bool.config_cecRcProfileSourceRootMenu_userConfigurable); rcProfileSourceRootMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_ROOT_MENU_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED, R.bool.config_cecRcProfileSourceRootMenuHandled_allowed, R.bool.config_cecRcProfileSourceRootMenuHandled_default); rcProfileSourceRootMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_ROOT_MENU_NOT_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED, R.bool.config_cecRcProfileSourceRootMenuNotHandled_allowed, R.bool.config_cecRcProfileSourceRootMenuNotHandled_default); @@ -420,11 +420,11 @@ public class HdmiCecConfig { HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_SETUP_MENU, R.bool.config_cecRcProfileSourceSetupMenu_userConfigurable); rcProfileSourceSetupMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_SETUP_MENU_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED, R.bool.config_cecRcProfileSourceSetupMenuHandled_allowed, R.bool.config_cecRcProfileSourceSetupMenuHandled_default); rcProfileSourceSetupMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_SETUP_MENU_NOT_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED, R.bool.config_cecRcProfileSourceSetupMenuNotHandled_allowed, R.bool.config_cecRcProfileSourceSetupMenuNotHandled_default); @@ -432,11 +432,11 @@ public class HdmiCecConfig { HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU, R.bool.config_cecRcProfileSourceContentsMenu_userConfigurable); rcProfileSourceContentsMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_CONTENTS_MENU_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED, R.bool.config_cecRcProfileSourceContentsMenuHandled_allowed, R.bool.config_cecRcProfileSourceContentsMenuHandled_default); rcProfileSourceContentsMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_CONTENTS_MENU_NOT_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED, R.bool.config_cecRcProfileSourceContentsMenuNotHandled_allowed, R.bool.config_cecRcProfileSourceContentsMenuNotHandled_default); @@ -444,11 +444,11 @@ public class HdmiCecConfig { HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU, R.bool.config_cecRcProfileSourceTopMenu_userConfigurable); rcProfileSourceTopMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_TOP_MENU_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED, R.bool.config_cecRcProfileSourceTopMenuHandled_allowed, R.bool.config_cecRcProfileSourceTopMenuHandled_default); rcProfileSourceTopMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_TOP_MENU_NOT_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED, R.bool.config_cecRcProfileSourceTopMenuNotHandled_allowed, R.bool.config_cecRcProfileSourceTopMenuNotHandled_default); @@ -457,14 +457,194 @@ public class HdmiCecConfig { .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU, R.bool.config_cecRcProfileSourceMediaContextSensitiveMenu_userConfigurable); rcProfileSourceMediaContextSensitiveMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_MENU_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED, R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_allowed, R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_default); rcProfileSourceMediaContextSensitiveMenu.registerValue( - HdmiControlManager.RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_MENU_NOT_HANDLED, + HdmiControlManager.RC_PROFILE_SOURCE_MENU_NOT_HANDLED, R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed, R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default); + Setting querySadLpcm = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM, + R.bool.config_cecQuerySadLpcm_userConfigurable); + querySadLpcm.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadLpcmEnabled_allowed, + R.bool.config_cecQuerySadLpcmEnabled_default); + querySadLpcm.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadLpcmDisabled_allowed, + R.bool.config_cecQuerySadLpcmDisabled_default); + + Setting querySadDd = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD, + R.bool.config_cecQuerySadDd_userConfigurable); + querySadDd.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadDdEnabled_allowed, + R.bool.config_cecQuerySadDdEnabled_default); + querySadDd.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadDdDisabled_allowed, + R.bool.config_cecQuerySadDdDisabled_default); + + Setting querySadMpeg1 = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1, + R.bool.config_cecQuerySadMpeg1_userConfigurable); + querySadMpeg1.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadMpeg1Enabled_allowed, + R.bool.config_cecQuerySadMpeg1Enabled_default); + querySadMpeg1.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadMpeg1Disabled_allowed, + R.bool.config_cecQuerySadMpeg1Disabled_default); + + Setting querySadMp3 = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3, + R.bool.config_cecQuerySadMp3_userConfigurable); + querySadMp3.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadMp3Enabled_allowed, + R.bool.config_cecQuerySadMp3Enabled_default); + querySadMp3.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadMp3Disabled_allowed, + R.bool.config_cecQuerySadMp3Disabled_default); + + Setting querySadMpeg2 = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2, + R.bool.config_cecQuerySadMpeg2_userConfigurable); + querySadMpeg2.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadMpeg2Enabled_allowed, + R.bool.config_cecQuerySadMpeg2Enabled_default); + querySadMpeg2.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadMpeg2Disabled_allowed, + R.bool.config_cecQuerySadMpeg2Disabled_default); + + Setting querySadAac = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC, + R.bool.config_cecQuerySadAac_userConfigurable); + querySadAac.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadAacEnabled_allowed, + R.bool.config_cecQuerySadAacEnabled_default); + querySadAac.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadAacDisabled_allowed, + R.bool.config_cecQuerySadAacDisabled_default); + + Setting querySadDts = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS, + R.bool.config_cecQuerySadDts_userConfigurable); + querySadDts.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadDtsEnabled_allowed, + R.bool.config_cecQuerySadDtsEnabled_default); + querySadDts.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadDtsDisabled_allowed, + R.bool.config_cecQuerySadDtsDisabled_default); + + Setting querySadAtrac = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC, + R.bool.config_cecQuerySadAtrac_userConfigurable); + querySadAtrac.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadAtracEnabled_allowed, + R.bool.config_cecQuerySadAtracEnabled_default); + querySadAtrac.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadAtracDisabled_allowed, + R.bool.config_cecQuerySadAtracDisabled_default); + + Setting querySadOnebitaudio = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO, + R.bool.config_cecQuerySadOnebitaudio_userConfigurable); + querySadOnebitaudio.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadOnebitaudioEnabled_allowed, + R.bool.config_cecQuerySadOnebitaudioEnabled_default); + querySadOnebitaudio.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadOnebitaudioDisabled_allowed, + R.bool.config_cecQuerySadOnebitaudioDisabled_default); + + Setting querySadDdp = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP, + R.bool.config_cecQuerySadDdp_userConfigurable); + querySadDdp.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadDdpEnabled_allowed, + R.bool.config_cecQuerySadDdpEnabled_default); + querySadDdp.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadDdpDisabled_allowed, + R.bool.config_cecQuerySadDdpDisabled_default); + + Setting querySadDtshd = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD, + R.bool.config_cecQuerySadDtshd_userConfigurable); + querySadDtshd.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadDtshdEnabled_allowed, + R.bool.config_cecQuerySadDtshdEnabled_default); + querySadDtshd.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadDtshdDisabled_allowed, + R.bool.config_cecQuerySadDtshdDisabled_default); + + Setting querySadTruehd = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD, + R.bool.config_cecQuerySadTruehd_userConfigurable); + querySadTruehd.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadTruehdEnabled_allowed, + R.bool.config_cecQuerySadTruehdEnabled_default); + querySadTruehd.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadTruehdDisabled_allowed, + R.bool.config_cecQuerySadTruehdDisabled_default); + + Setting querySadDst = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST, + R.bool.config_cecQuerySadDst_userConfigurable); + querySadDst.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadDstEnabled_allowed, + R.bool.config_cecQuerySadDstEnabled_default); + querySadDst.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadDstDisabled_allowed, + R.bool.config_cecQuerySadDstDisabled_default); + + Setting querySadWmapro = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO, + R.bool.config_cecQuerySadWmapro_userConfigurable); + querySadWmapro.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadWmaproEnabled_allowed, + R.bool.config_cecQuerySadWmaproEnabled_default); + querySadWmapro.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadWmaproDisabled_allowed, + R.bool.config_cecQuerySadWmaproDisabled_default); + + Setting querySadMax = registerSetting( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX, + R.bool.config_cecQuerySadMax_userConfigurable); + querySadMax.registerValue( + HdmiControlManager.QUERY_SAD_ENABLED, + R.bool.config_cecQuerySadMaxEnabled_allowed, + R.bool.config_cecQuerySadMaxEnabled_default); + querySadMax.registerValue( + HdmiControlManager.QUERY_SAD_DISABLED, + R.bool.config_cecQuerySadMaxDisabled_allowed, + R.bool.config_cecQuerySadMaxDisabled_default); + verifySettings(); } @@ -530,6 +710,36 @@ public class HdmiCecConfig { case HdmiControlManager .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU: return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO: + return STORAGE_SHARED_PREFS; + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX: + return STORAGE_SHARED_PREFS; default: throw new VerificationException("Invalid CEC setting '" + setting.getName() + "' storage."); @@ -571,6 +781,36 @@ public class HdmiCecConfig { case HdmiControlManager .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU: return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO: + return setting.getName(); + case HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX: + return setting.getName(); default: throw new VerificationException("Invalid CEC setting '" + setting.getName() + "' storage key."); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index ab8217a9f9cd9..f356c36f7468b 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -151,6 +151,7 @@ abstract class HdmiCecLocalDevice { private int mActiveRoutingPath; protected final HdmiCecMessageCache mCecMessageCache = new HdmiCecMessageCache(); + @VisibleForTesting protected final Object mLock; // A collection of FeatureAction. diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index d4fa1df9dda75..4f5524948aa1e 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -332,27 +332,27 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { HdmiCecConfig hdmiCecConfig = mService.getHdmiCecConfig(); if (hdmiCecConfig.getIntValue( HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_ROOT_MENU) - == HdmiControlManager.RC_PROFILE_SOURCE_ROOT_MENU_HANDLED) { + == HdmiControlManager.RC_PROFILE_SOURCE_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) { + == HdmiControlManager.RC_PROFILE_SOURCE_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) { + == HdmiControlManager.RC_PROFILE_SOURCE_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) { + == HdmiControlManager.RC_PROFILE_SOURCE_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) { + == HdmiControlManager.RC_PROFILE_SOURCE_MENU_HANDLED) { features.add(Constants.RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU); } return features; diff --git a/services/core/java/com/android/server/hdmi/RequestSadAction.java b/services/core/java/com/android/server/hdmi/RequestSadAction.java index 4d36078e33596..702c0004cb91a 100644 --- a/services/core/java/com/android/server/hdmi/RequestSadAction.java +++ b/services/core/java/com/android/server/hdmi/RequestSadAction.java @@ -16,10 +16,10 @@ package com.android.server.hdmi; +import android.hardware.hdmi.HdmiControlManager; import android.util.Slog; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -35,27 +35,11 @@ final class RequestSadAction extends HdmiCecFeatureAction { // State in which the action is waiting for . private static final int STATE_WAITING_FOR_REPORT_SAD = 1; - - private static final List ALL_CEC_CODECS = new ArrayList(Arrays.asList( - Constants.AUDIO_CODEC_LPCM, - Constants.AUDIO_CODEC_DD, - Constants.AUDIO_CODEC_MPEG1, - Constants.AUDIO_CODEC_MP3, - Constants.AUDIO_CODEC_MPEG2, - Constants.AUDIO_CODEC_AAC, - Constants.AUDIO_CODEC_DTS, - Constants.AUDIO_CODEC_ATRAC, - Constants.AUDIO_CODEC_ONEBITAUDIO, - Constants.AUDIO_CODEC_DDP, - Constants.AUDIO_CODEC_DTSHD, - Constants.AUDIO_CODEC_TRUEHD, - Constants.AUDIO_CODEC_DST, - Constants.AUDIO_CODEC_WMAPRO, - Constants.AUDIO_CODEC_MAX)); private static final int MAX_SAD_PER_REQUEST = 4; private static final int RETRY_COUNTER_MAX = 1; private final int mTargetAddress; private final RequestSadCallback mCallback; + private final List mCecCodecsToQuery = new ArrayList<>(); // List of all valid SADs reported by the target device. Not parsed nor deduplicated. private final List mSupportedSads = new ArrayList<>(); private int mQueriedSadCount = 0; // Number of SADs queries that has already been completed @@ -71,9 +55,84 @@ final class RequestSadAction extends HdmiCecFeatureAction { super(source); mTargetAddress = targetAddress; mCallback = Objects.requireNonNull(callback); + HdmiCecConfig hdmiCecConfig = localDevice().mService.getHdmiCecConfig(); + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_LPCM); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_DD); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_MPEG1); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_MP3); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_MPEG2); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_AAC); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_DTS); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_ATRAC); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_ONEBITAUDIO); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_DDP); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_DTSHD); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_TRUEHD); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_DST); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_WMAPRO); + } + if (hdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX) + == HdmiControlManager.QUERY_SAD_ENABLED) { + mCecCodecsToQuery.add(Constants.AUDIO_CODEC_MAX); + } } - @Override boolean start() { querySad(); @@ -81,13 +140,13 @@ final class RequestSadAction extends HdmiCecFeatureAction { } private void querySad() { - if (mQueriedSadCount >= ALL_CEC_CODECS.size()) { + if (mQueriedSadCount >= mCecCodecsToQuery.size()) { wrapUpAndFinish(); return; } - int[] codecsToQuery = ALL_CEC_CODECS.subList(mQueriedSadCount, - Math.min(ALL_CEC_CODECS.size(), mQueriedSadCount + MAX_SAD_PER_REQUEST)) - .stream().mapToInt(i -> i).toArray(); + int[] codecsToQuery = mCecCodecsToQuery.subList(mQueriedSadCount, + Math.min(mCecCodecsToQuery.size(), mQueriedSadCount + MAX_SAD_PER_REQUEST)) + .stream().mapToInt(i -> i).toArray(); sendCommand(HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(getSourceAddress(), mTargetAddress, codecsToQuery)); mState = STATE_WAITING_FOR_REPORT_SAD; @@ -111,9 +170,10 @@ final class RequestSadAction extends HdmiCecFeatureAction { byte[] sad = new byte[]{cmd.getParams()[i], cmd.getParams()[i + 1], cmd.getParams()[i + 2]}; updateResult(sad); + } else { + // Don't include invalid codecs in the result. Don't query again. + Slog.w(TAG, "Dropped invalid codec " + cmd.getParams()[i] + "."); } - // Don't include invalid codecs in the result. Don't query again. - Slog.w(TAG, "Received invalid codec " + cmd.getParams()[i] + "."); } mQueriedSadCount += MAX_SAD_PER_REQUEST; mTimeoutRetry = 0; 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 abc1468e53bf7..d441143272d98 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeHdmiCecConfig.java @@ -242,6 +242,101 @@ final class FakeHdmiCecConfig extends HdmiCecConfig { doReturn(true).when(resources).getBoolean( R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadLpcm_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadLpcmEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadLpcmEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadLpcmDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadLpcmDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDd_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDdDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1Enabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1Enabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1Disabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1Disabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMp3_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMp3Enabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMp3Enabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMp3Disabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadMp3Disabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2Enabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2Enabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2Disabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2Disabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAac_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAacEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAacEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAacDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadAacDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDts_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtsEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtsEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtsDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDtsDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAtrac_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAtracEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAtracEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAtracDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadAtracDisabled_default); + + doReturn(true).when(resources).getBoolean( + R.bool.config_cecQuerySadOnebitaudio_userConfigurable); + doReturn(true).when(resources).getBoolean( + R.bool.config_cecQuerySadOnebitaudioEnabled_allowed); + doReturn(true).when(resources).getBoolean( + R.bool.config_cecQuerySadOnebitaudioEnabled_default); + doReturn(true).when(resources).getBoolean( + R.bool.config_cecQuerySadOnebitaudioDisabled_allowed); + doReturn(false).when(resources).getBoolean( + R.bool.config_cecQuerySadOnebitaudioDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdp_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdpEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdpEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdpDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDdpDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtshd_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtshdEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtshdEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtshdDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDtshdDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadTruehd_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadTruehdEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadTruehdEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadTruehdDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadTruehdDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDst_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDstEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDstEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDstDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDstDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadWmapro_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadWmaproEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadWmaproEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadWmaproDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadWmaproDisabled_default); + + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMax_userConfigurable); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMaxEnabled_allowed); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMaxEnabled_default); + doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMaxDisabled_allowed); + doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadMaxDisabled_default); + return resources; } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java index f30750665e2d9..85d30a6dbc360 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecConfigTest.java @@ -89,7 +89,22 @@ public final class HdmiCecConfigTest { HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU, HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU, HdmiControlManager - .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU); + .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX); } @Test @@ -112,7 +127,22 @@ public final class HdmiCecConfigTest { HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU, HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU, HdmiControlManager - .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU); + .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX); } @Test @@ -135,7 +165,22 @@ public final class HdmiCecConfigTest { HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU, HdmiControlManager.CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_TOP_MENU, HdmiControlManager - .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU); + .CEC_SETTING_NAME_RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_LPCM, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DD, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MP3, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG2, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_AAC, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTS, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ATRAC, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DDP, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DTSHD, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_TRUEHD, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_DST, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO, + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MAX); } @Test diff --git a/services/tests/servicestests/src/com/android/server/hdmi/RequestSadActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/RequestSadActionTest.java index 823ed2acdea4d..2d81fc94e274f 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/RequestSadActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/RequestSadActionTest.java @@ -22,6 +22,7 @@ import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC import static com.google.common.truth.Truth.assertThat; import android.content.Context; +import android.hardware.hdmi.HdmiControlManager; import android.os.Looper; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; @@ -68,6 +69,7 @@ public class RequestSadActionTest { private Looper mMyLooper; private TestLooper mTestLooper = new TestLooper(); private ArrayList mLocalDevices = new ArrayList<>(); + private int mTvLogicalAddress; private List mSupportedSads; private RequestSadCallback mCallback = new RequestSadCallback() { @@ -94,7 +96,7 @@ public class RequestSadActionTest { mMyLooper = mTestLooper.getLooper(); mHdmiControlService = - new HdmiControlService(InstrumentationRegistry.getTargetContext(), + new HdmiControlService(context, Collections.emptyList()) { @Override boolean isControlEnabled() { @@ -129,6 +131,9 @@ public class RequestSadActionTest { mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mNativeWrapper.setPhysicalAddress(0x0000); mTestLooper.dispatchAll(); + synchronized (mHdmiCecLocalDeviceTv.mLock) { + mTvLogicalAddress = mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(); + } mNativeWrapper.clearResultMessages(); } @@ -140,8 +145,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray()); assertThat(mNativeWrapper.getResultMessages()).contains(expected1); mNativeWrapper.clearResultMessages(); @@ -153,8 +157,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray()); assertThat(mNativeWrapper.getResultMessages()).contains(expected2); mNativeWrapper.clearResultMessages(); @@ -166,8 +169,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray()); assertThat(mNativeWrapper.getResultMessages()).contains(expected3); mNativeWrapper.clearResultMessages(); @@ -179,8 +181,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray()); assertThat(mNativeWrapper.getResultMessages()).contains(expected4); mNativeWrapper.clearResultMessages(); @@ -200,14 +201,12 @@ public class RequestSadActionTest { action.start(); mTestLooper.dispatchAll(); HdmiCecMessage featureAbort = HdmiCecMessageBuilder.buildFeatureAbortCommand( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR, Constants.ABORT_INVALID_OPERAND); HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray()); assertThat(mNativeWrapper.getResultMessages()).contains(expected1); mNativeWrapper.clearResultMessages(); @@ -215,8 +214,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray()); assertThat(mNativeWrapper.getResultMessages()).contains(expected2); mNativeWrapper.clearResultMessages(); @@ -224,8 +222,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray()); assertThat(mNativeWrapper.getResultMessages()).contains(expected3); mNativeWrapper.clearResultMessages(); @@ -233,8 +230,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray()); assertThat(mNativeWrapper.getResultMessages()).contains(expected4); action.processCommand(featureAbort); @@ -251,8 +247,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_1 = new byte[]{ 0x01, 0x18, 0x4A, @@ -260,16 +255,14 @@ public class RequestSadActionTest { 0x03, 0x4B, 0x00, 0x04, 0x20, 0x0A}; HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_1); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1); assertThat(mNativeWrapper.getResultMessages()).contains(expected1); mNativeWrapper.clearResultMessages(); action.processCommand(response1); mTestLooper.dispatchAll(); HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_2 = new byte[]{ 0x05, 0x18, 0x4A, @@ -277,16 +270,14 @@ public class RequestSadActionTest { 0x07, 0x4B, 0x00, 0x08, 0x20, 0x0A}; HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_2); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2); assertThat(mNativeWrapper.getResultMessages()).contains(expected2); mNativeWrapper.clearResultMessages(); action.processCommand(response2); mTestLooper.dispatchAll(); HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_3 = new byte[]{ 0x09, 0x18, 0x4A, @@ -294,24 +285,21 @@ public class RequestSadActionTest { 0x0B, 0x4B, 0x00, 0x0C, 0x20, 0x0A}; HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_3); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3); assertThat(mNativeWrapper.getResultMessages()).contains(expected3); mNativeWrapper.clearResultMessages(); action.processCommand(response3); mTestLooper.dispatchAll(); HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_4 = new byte[]{ 0x0D, 0x18, 0x4A, 0x0E, 0x64, 0x5A, 0x0F, 0x4B, 0x00}; HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_4); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4); assertThat(mNativeWrapper.getResultMessages()).contains(expected4); action.processCommand(response4); mTestLooper.dispatchAll(); @@ -335,38 +323,33 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_1 = new byte[]{ 0x01, 0x18, 0x4A, 0x03, 0x4B, 0x00, 0x04, 0x20, 0x0A}; HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_1); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1); assertThat(mNativeWrapper.getResultMessages()).contains(expected1); mNativeWrapper.clearResultMessages(); action.processCommand(response1); mTestLooper.dispatchAll(); HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_2 = new byte[]{ 0x08, 0x20, 0x0A}; HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_2); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2); assertThat(mNativeWrapper.getResultMessages()).contains(expected2); mNativeWrapper.clearResultMessages(); action.processCommand(response2); mTestLooper.dispatchAll(); HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_3 = new byte[]{ 0x09, 0x18, 0x4A, @@ -374,22 +357,19 @@ public class RequestSadActionTest { 0x0B, 0x4B, 0x00, 0x0C, 0x20, 0x0A}; HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_3); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3); assertThat(mNativeWrapper.getResultMessages()).contains(expected3); mNativeWrapper.clearResultMessages(); action.processCommand(response3); mTestLooper.dispatchAll(); HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_4 = new byte[]{ 0x0F, 0x4B, 0x00}; HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_4); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4); assertThat(mNativeWrapper.getResultMessages()).contains(expected4); action.processCommand(response4); mTestLooper.dispatchAll(); @@ -413,8 +393,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_1 = new byte[]{ 0x20, 0x18, 0x4A, @@ -422,16 +401,14 @@ public class RequestSadActionTest { 0x22, 0x4B, 0x00, 0x23, 0x20, 0x0A}; HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_1); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1); assertThat(mNativeWrapper.getResultMessages()).contains(expected1); mNativeWrapper.clearResultMessages(); action.processCommand(response1); mTestLooper.dispatchAll(); HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_2 = new byte[]{ 0x24, 0x18, 0x4A, @@ -439,16 +416,14 @@ public class RequestSadActionTest { 0x26, 0x4B, 0x00, 0x27, 0x20, 0x0A}; HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_2); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2); assertThat(mNativeWrapper.getResultMessages()).contains(expected2); mNativeWrapper.clearResultMessages(); action.processCommand(response2); mTestLooper.dispatchAll(); HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_3 = new byte[]{ 0x28, 0x18, 0x4A, @@ -456,24 +431,21 @@ public class RequestSadActionTest { 0x2A, 0x4B, 0x00, 0x2B, 0x20, 0x0A}; HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_3); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3); assertThat(mNativeWrapper.getResultMessages()).contains(expected3); mNativeWrapper.clearResultMessages(); action.processCommand(response3); mTestLooper.dispatchAll(); HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_4 = new byte[]{ 0x2C, 0x18, 0x4A, 0x2D, 0x64, 0x5A, 0x2E, 0x4B, 0x00}; HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_4); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4); assertThat(mNativeWrapper.getResultMessages()).contains(expected4); action.processCommand(response4); mTestLooper.dispatchAll(); @@ -489,8 +461,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_1 = new byte[]{ 0x01, 0x18, @@ -498,8 +469,7 @@ public class RequestSadActionTest { 0x03, 0x4B, 0x00, 0x04, 0x20, 0x0A}; HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_1); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1); assertThat(mNativeWrapper.getResultMessages()).contains(expected1); mNativeWrapper.clearResultMessages(); action.processCommand(response1); @@ -512,8 +482,7 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_2 = new byte[]{ 0x05, 0x18, 0x4A, @@ -521,8 +490,7 @@ public class RequestSadActionTest { 0x07, 0x08, 0x20, 0x0A}; HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_2); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2); assertThat(mNativeWrapper.getResultMessages()).contains(expected2); mNativeWrapper.clearResultMessages(); action.processCommand(response2); @@ -535,13 +503,11 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_3 = new byte[0]; HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_3); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3); assertThat(mNativeWrapper.getResultMessages()).contains(expected3); mNativeWrapper.clearResultMessages(); action.processCommand(response3); @@ -554,16 +520,14 @@ public class RequestSadActionTest { mTestLooper.dispatchAll(); HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), - Constants.ADDR_AUDIO_SYSTEM, + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray()); byte[] sadsToRespond_4 = new byte[]{ 0x0D, 0x18, 0x4A, 0x0E, 0x64, 0x5A, 0x0F, 0x4B}; HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( - Constants.ADDR_AUDIO_SYSTEM, - mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(), sadsToRespond_4); + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4); assertThat(mNativeWrapper.getResultMessages()).contains(expected4); mNativeWrapper.clearResultMessages(); action.processCommand(response4); @@ -576,4 +540,77 @@ public class RequestSadActionTest { assertThat(mSupportedSads.size()).isEqualTo(0); } + + @Test + public void selectedSads_allSupported_completeResult() { + mHdmiControlService.getHdmiCecConfig().setIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_MPEG1, + HdmiControlManager.QUERY_SAD_DISABLED); + mHdmiControlService.getHdmiCecConfig().setIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_ONEBITAUDIO, + HdmiControlManager.QUERY_SAD_DISABLED); + mHdmiControlService.getHdmiCecConfig().setIntValue( + HdmiControlManager.CEC_SETTING_NAME_QUERY_SAD_WMAPRO, + HdmiControlManager.QUERY_SAD_DISABLED); + RequestSadAction action = new RequestSadAction(mHdmiCecLocalDeviceTv, ADDR_AUDIO_SYSTEM, + mCallback); + action.start(); + mTestLooper.dispatchAll(); + + HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, + new int[]{Constants.AUDIO_CODEC_LPCM, Constants.AUDIO_CODEC_DD, + Constants.AUDIO_CODEC_MP3, Constants.AUDIO_CODEC_MPEG2}); + byte[] sadsToRespond_1 = new byte[]{ + 0x01, 0x18, 0x4A, + 0x02, 0x64, 0x5A, + 0x04, 0x20, 0x0A, + 0x05, 0x18, 0x4A}; + HdmiCecMessage response1 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_1); + assertThat(mNativeWrapper.getResultMessages()).contains(expected1); + mNativeWrapper.clearResultMessages(); + action.processCommand(response1); + mTestLooper.dispatchAll(); + + HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, + new int[]{Constants.AUDIO_CODEC_AAC, Constants.AUDIO_CODEC_DTS, + Constants.AUDIO_CODEC_ATRAC, Constants.AUDIO_CODEC_DDP}); + byte[] sadsToRespond_2 = new byte[]{ + 0x06, 0x64, 0x5A, + 0x07, 0x4B, 0x00, + 0x08, 0x20, 0x0A, + 0x09, 0x18, 0x4A}; + HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2); + assertThat(mNativeWrapper.getResultMessages()).contains(expected2); + mNativeWrapper.clearResultMessages(); + action.processCommand(response2); + mTestLooper.dispatchAll(); + + HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( + mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, + new int[]{Constants.AUDIO_CODEC_DTSHD, Constants.AUDIO_CODEC_TRUEHD, + Constants.AUDIO_CODEC_DST, Constants.AUDIO_CODEC_MAX}); + byte[] sadsToRespond_3 = new byte[]{ + 0x0B, 0x4B, 0x00, + 0x0C, 0x20, 0x0A, + 0x0D, 0x18, 0x4A, + 0x0F, 0x4B, 0x00}; + HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( + Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3); + assertThat(mNativeWrapper.getResultMessages()).contains(expected3); + mNativeWrapper.clearResultMessages(); + action.processCommand(response3); + mTestLooper.dispatchAll(); + + assertThat(mSupportedSads.size()).isEqualTo(12); + assertThat(Arrays.equals(sadsToRespond_1, + concatenateSads(mSupportedSads.subList(0, 4)))).isTrue(); + assertThat(Arrays.equals(sadsToRespond_2, + concatenateSads(mSupportedSads.subList(4, 8)))).isTrue(); + assertThat(Arrays.equals(sadsToRespond_3, + concatenateSads(mSupportedSads.subList(8, 12)))).isTrue(); + } }