Merge "Make list of SADs to query configurable"
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index d11c874..786b787 100755
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -3355,6 +3355,7 @@
     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 @@
     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<java.lang.String>, 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 @@
     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 @@
     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 0a5496e..5874385 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -115,8 +115,6 @@
     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 @@
     /**
      * 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 @@
     /**
      * 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 @@
     /**
      * 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 @@
      * Upon waking up, attempt to turn on the TV via {@code <One Touch Play>} but do not turn on the
      * Audio system via {@code <System Audio Mode Request>}.
      *
-     * @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 @@
      * Upon waking up, attempt to turn on the TV via {@code <One Touch Play>} and attempt to turn on
      * the Audio system via {@code <System Audio Mode Request>}.
      *
-     * @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 @@
      * Upon waking up, attempt to turn on the TV via {@code <One Touch Play>} and attempt to turn on
      * the Audio system via {@code <System Audio Mode Request>}.
      *
-     * @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 @@
      * Upon waking up, do not turn on the TV via {@code <One Touch Play>} and do not turn on the
      * Audio system via {@code <System Audio Mode Request>}.
      *
-     * @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 @@
     /**
      * 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 @@
     /**
      * 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 @@
     /**
      * 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 @@
      * 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 @@
     /**
      * 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 @@
     /**
      * Sending &lt;Standby&gt; 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 &lt;Standby&gt; 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 @@
     /**
      * 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 @@
     @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 @@
      *
      * <p> 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 &lt;Text View On&gt; or &lt;Image View On&gt;.
      *
-     * @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";
     /**
@@ -892,6 +860,111 @@
             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
      */
     @StringDef(prefix = { "CEC_SETTING_NAME_" }, value = {
@@ -910,9 +983,46 @@
         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 @@
      * 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 @@
      * 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 @@
      * 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 @@
      *
      * @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<HdmiDeviceInfo> getConnectedDevices() {
         try {
             return mService.getDeviceList();
@@ -1082,11 +1180,9 @@
 
     /**
      * @removed
-     * @hide
      * @deprecated Please use {@link #getConnectedDevices()} instead.
      */
     @Deprecated
-    @SystemApi
     public List<HdmiDeviceInfo> getConnectedDevicesList() {
         try {
             return mService.getDeviceList();
@@ -1102,10 +1198,7 @@
      * <p>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 @@
 
     /**
      * @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 @@
 
     /**
      * @removed
-     * @hide
      * @deprecated Please use {@link #powerOnDevice(deviceInfo)} instead.
      */
     @Deprecated
-    @SystemApi
     public void powerOnRemoteDevice(HdmiDeviceInfo deviceInfo) {
         Objects.requireNonNull(deviceInfo);
         try {
@@ -1180,10 +1269,7 @@
      * 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 @@
 
     /**
      * @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 @@
      *
      * @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 @@
 
     /**
      * 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 @@
      * <p>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 @@
      * @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 @@
 
     /**
      * @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 @@
 
     /**
      * Listener used to get hotplug event from HDMI port.
-     *
-     * @hide
      */
-    @SystemApi
     public interface HotplugEventListener {
         void onReceived(HdmiHotplugEvent event);
     }
@@ -1456,10 +1527,7 @@
 
     /**
      * Listener used to get vendor-specific commands.
-     *
-     * @hide
      */
-    @SystemApi
     public interface VendorCommandListener {
         /**
          * Called when a vendor command is received.
@@ -1503,10 +1571,7 @@
      *
      * @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 @@
      *
      * @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 @@
      * 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 @@
 
     /**
      * Listener used to get setting change notification.
-     *
-     * @hide
      */
-    @SystemApi
     public interface CecSettingChangeListener {
         /**
          * Called when value of a setting changes.
@@ -1845,10 +1901,7 @@
      *
      * @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 @@
      * @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<String> getAllowedCecSettingStringValues(@NonNull @CecSettingName String name) {
@@ -1898,10 +1948,7 @@
      * @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<Integer> getAllowedCecSettingIntValues(@NonNull @CecSettingName String name) {
@@ -1921,10 +1968,7 @@
      * Set the global status of HDMI CEC.
      *
      * <p>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 @@
      * Get the current global status of HDMI CEC.
      *
      * <p>Reflects whether HDMI CEC is currently enabled on the device.
-     *
-     * @hide
      */
-    @SystemApi
     @NonNull
     @HdmiCecControl
     @RequiresPermission(android.Manifest.permission.HDMI_CEC)
@@ -1971,10 +2012,7 @@
      * 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 @@
      *
      * <p>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 @@
 
     /**
      * 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 @@
      *
      * <p>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 @@
      *
      * <p>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 @@
      * 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 @@
      * 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 @@
      * <p>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 @@
      * <p>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 @@
      *
      * <p>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 @@
      *
      * <p>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 @@
      * 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 @@
      * 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 @@
      *
      * <p>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 @@
      *
      * <p>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 @@
      * <p>Sets whether the TV should wake up upon reception of &lt;Text View On&gt;
      * or &lt;Image View On&gt;.
      *
-     * @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 @@
      * <p>Reflects whether the TV should wake up upon reception of &lt;Text View On&gt;
      * or &lt;Image View On&gt;.
      *
-     * @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 @@
      * <p>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 @@
      * <p>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 @@
             throw e.rethrowFromSystemServer();
         }
     }
+
+    /**
+     * Set presence of one Short Audio Descriptor (SAD) in the query.
+     *
+     * <p>Allows the caller to specify whether the SAD for a specific audio codec should be
+     * present in the &lt;Request Short Audio Descriptor&gt; query. Each &lt;Request Short Audio
+     * Descriptor&gt; 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.
+     *
+     * <p>When an ARC connection is established, the TV sends a
+     * &lt;Request Short Audio Descriptor&gt; 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.
+     *
+     * <p>Allows the caller to specify whether the SADs for specific audio codecs should be present
+     * in the &lt;Request Short Audio Descriptor&gt; query. For audio codecs that are not specified,
+     * the SAD's presence remains at its previous value. Each &lt;Request Short Audio Descriptor&gt;
+     * 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.
+     *
+     * <p>When an ARC connection is established, the TV sends a
+     * &lt;Request Short Audio Descriptor&gt; 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<String> 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.
+     *
+     * <p>Reflects whether the SAD for a specific audio codec should be present in the
+     * &lt;Request Short Audio Descriptor&gt; query.
+     *
+     * <p>When an ARC connection is established, the TV sends a
+     * &lt;Request Short Audio Descriptor&gt; 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 2eb32b0..489a79f 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -5104,6 +5104,97 @@
     <bool name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed">true</bool>
     <bool name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default">true</bool>
 
+    <!-- Which Short Audio Descriptors a TV should query via CEC -->
+    <bool name="config_cecQuerySadLpcm_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadLpcmEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadLpcmEnabled_default">true</bool>
+    <bool name="config_cecQuerySadLpcmDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadLpcmDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadDd_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadDdEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDdEnabled_default">true</bool>
+    <bool name="config_cecQuerySadDdDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDdDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadMpeg1_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadMpeg1Enabled_allowed">true</bool>
+    <bool name="config_cecQuerySadMpeg1Enabled_default">true</bool>
+    <bool name="config_cecQuerySadMpeg1Disabled_allowed">true</bool>
+    <bool name="config_cecQuerySadMpeg1Disabled_default">false</bool>
+
+    <bool name="config_cecQuerySadMp3_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadMp3Enabled_allowed">true</bool>
+    <bool name="config_cecQuerySadMp3Enabled_default">true</bool>
+    <bool name="config_cecQuerySadMp3Disabled_allowed">true</bool>
+    <bool name="config_cecQuerySadMp3Disabled_default">false</bool>
+
+    <bool name="config_cecQuerySadMpeg2_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadMpeg2Enabled_allowed">true</bool>
+    <bool name="config_cecQuerySadMpeg2Enabled_default">true</bool>
+    <bool name="config_cecQuerySadMpeg2Disabled_allowed">true</bool>
+    <bool name="config_cecQuerySadMpeg2Disabled_default">false</bool>
+
+    <bool name="config_cecQuerySadAac_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadAacEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadAacEnabled_default">true</bool>
+    <bool name="config_cecQuerySadAacDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadAacDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadDts_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadDtsEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDtsEnabled_default">true</bool>
+    <bool name="config_cecQuerySadDtsDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDtsDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadAtrac_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadAtracEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadAtracEnabled_default">true</bool>
+    <bool name="config_cecQuerySadAtracDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadAtracDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadOnebitaudio_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadOnebitaudioEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadOnebitaudioEnabled_default">true</bool>
+    <bool name="config_cecQuerySadOnebitaudioDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadOnebitaudioDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadDdp_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadDdpEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDdpEnabled_default">true</bool>
+    <bool name="config_cecQuerySadDdpDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDdpDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadDtshd_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadDtshdEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDtshdEnabled_default">true</bool>
+    <bool name="config_cecQuerySadDtshdDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDtshdDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadTruehd_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadTruehdEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadTruehdEnabled_default">true</bool>
+    <bool name="config_cecQuerySadTruehdDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadTruehdDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadDst_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadDstEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDstEnabled_default">true</bool>
+    <bool name="config_cecQuerySadDstDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadDstDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadWmapro_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadWmaproEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadWmaproEnabled_default">true</bool>
+    <bool name="config_cecQuerySadWmaproDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadWmaproDisabled_default">false</bool>
+
+    <bool name="config_cecQuerySadMax_userConfigurable">true</bool>
+    <bool name="config_cecQuerySadMaxEnabled_allowed">true</bool>
+    <bool name="config_cecQuerySadMaxEnabled_default">true</bool>
+    <bool name="config_cecQuerySadMaxDisabled_allowed">true</bool>
+    <bool name="config_cecQuerySadMaxDisabled_default">false</bool>
+
     <!-- Whether app hibernation deletes OAT artifact files as part of global hibernation. -->
     <bool name="config_hibernationDeletesOatArtifactsEnabled">true</bool>
 
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 253cd47..d96b1de 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -4432,6 +4432,97 @@
   <java-symbol type="bool" name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed" />
   <java-symbol type="bool" name="config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default" />
 
+  <!-- Which Short Audio Descriptors a TV should query via CEC -->
+  <java-symbol type="bool" name="config_cecQuerySadLpcm_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadLpcmEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadLpcmEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadLpcmDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadLpcmDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadDd_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadDdEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDdEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadDdDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDdDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadMpeg1_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadMpeg1Enabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadMpeg1Enabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadMpeg1Disabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadMpeg1Disabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadMp3_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadMp3Enabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadMp3Enabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadMp3Disabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadMp3Disabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadMpeg2_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadMpeg2Enabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadMpeg2Enabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadMpeg2Disabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadMpeg2Disabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadAac_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadAacEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadAacEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadAacDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadAacDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadDts_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadDtsEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDtsEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadDtsDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDtsDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadAtrac_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadAtracEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadAtracEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadAtracDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadAtracDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadOnebitaudio_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadOnebitaudioEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadOnebitaudioEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadOnebitaudioDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadOnebitaudioDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadDdp_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadDdpEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDdpEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadDdpDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDdpDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadDtshd_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadDtshdEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDtshdEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadDtshdDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDtshdDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadTruehd_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadTruehdEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadTruehdEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadTruehdDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadTruehdDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadDst_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadDstEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDstEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadDstDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadDstDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadWmapro_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadWmaproEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadWmaproEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadWmaproDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadWmaproDisabled_default" />
+
+  <java-symbol type="bool" name="config_cecQuerySadMax_userConfigurable" />
+  <java-symbol type="bool" name="config_cecQuerySadMaxEnabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadMaxEnabled_default" />
+  <java-symbol type="bool" name="config_cecQuerySadMaxDisabled_allowed" />
+  <java-symbol type="bool" name="config_cecQuerySadMaxDisabled_default" />
+
   <!-- Ids for RemoteViews -->
   <java-symbol type="id" name="remote_views_next_child" />
   <java-symbol type="id" name="remote_views_stable_id" />
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java
index 550f1b9..65ec1c0 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 @@
                 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 @@
                 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 @@
                 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 @@
                 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 @@
                     .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 @@
             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 @@
             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 ab8217a..f356c36 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 @@
     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 d4fa1df..4f55249 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 @@
         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 4d36078..702c000 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 @@
 
     // State in which the action is waiting for <Report Short Audio Descriptor>.
     private static final int STATE_WAITING_FOR_REPORT_SAD = 1;
-
-    private static final List<Integer> ALL_CEC_CODECS = new ArrayList<Integer>(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<Integer> mCecCodecsToQuery = new ArrayList<>();
     // List of all valid SADs reported by the target device. Not parsed nor deduplicated.
     private final List<byte[]> mSupportedSads = new ArrayList<>();
     private int mQueriedSadCount = 0; // Number of SADs queries that has already been completed
@@ -71,9 +55,84 @@
         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 @@
     }
 
     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 @@
                     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 abc1468e..d441143 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 @@
         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 f307506..85d30a6 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 @@
                     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 @@
                     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 @@
                     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 823ed2a..2d81fc9 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.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 @@
     private Looper mMyLooper;
     private TestLooper mTestLooper = new TestLooper();
     private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
+    private int mTvLogicalAddress;
     private List<byte[]> mSupportedSads;
     private RequestSadCallback mCallback =
             new RequestSadCallback() {
@@ -94,7 +96,7 @@
         mMyLooper = mTestLooper.getLooper();
 
         mHdmiControlService =
-                new HdmiControlService(InstrumentationRegistry.getTargetContext(),
+                new HdmiControlService(context,
                         Collections.emptyList()) {
                     @Override
                     boolean isControlEnabled() {
@@ -129,6 +131,9 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
                 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 @@
                 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 @@
                 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 @@
         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 @@
                 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 @@
         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 @@
                 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 @@
                 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 @@
                 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 @@
         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 @@
                 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 @@
         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 @@
                 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 @@
         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 @@
         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 @@
 
         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();
+    }
 }