Add additional APIs and aidl for ambient backlight feature

Bug: 375472716
Test: atest VtsHalMediaQualityTargetTest
Flag: android.media.tv.flags.media_quality_fw

Change-Id: I2b67c6d6a13889331b5d053e2c118d5ce7f14bd2
diff --git a/tv/mediaquality/aidl/Android.bp b/tv/mediaquality/aidl/Android.bp
index 1f273eb..0084248 100644
--- a/tv/mediaquality/aidl/Android.bp
+++ b/tv/mediaquality/aidl/Android.bp
@@ -14,17 +14,25 @@
     srcs: [
         "android/hardware/tv/mediaquality/*.aidl",
     ],
+    imports: [
+        "android.hardware.graphics.common-V5",
+    ],
     stability: "vintf",
     backend: {
         java: {
-            sdk_version: "module_current",
+            enabled: true,
+            platform_apis: true,
         },
         ndk: {
             enabled: true,
+            min_sdk_version: "29",
         },
         rust: {
             enabled: true,
         },
+        cpp: {
+            enabled: false,
+        },
     },
     frozen: false,
 }
diff --git a/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightCompressAlgorithm.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightCompressAlgorithm.aidl
new file mode 100644
index 0000000..d441370
--- /dev/null
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightCompressAlgorithm.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+//     the interface (from the latest frozen version), the build system will
+//     prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.tv.mediaquality;
+@VintfStability
+enum AmbientBacklightCompressAlgorithm {
+  NONE = 0,
+  RLE = 1,
+}
diff --git a/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightEvent.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightEvent.aidl
new file mode 100644
index 0000000..2fc2cc6
--- /dev/null
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightEvent.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+//     the interface (from the latest frozen version), the build system will
+//     prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.tv.mediaquality;
+@VintfStability
+union AmbientBacklightEvent {
+  boolean enabled;
+  android.hardware.tv.mediaquality.AmbientBacklightMetadata metadata;
+}
diff --git a/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightMetadata.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightMetadata.aidl
new file mode 100644
index 0000000..bbdfd62
--- /dev/null
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightMetadata.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+//     the interface (from the latest frozen version), the build system will
+//     prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.tv.mediaquality;
+@VintfStability
+parcelable AmbientBacklightMetadata {
+  android.hardware.tv.mediaquality.AmbientBacklightSettings settings;
+  android.hardware.tv.mediaquality.AmbientBacklightCompressAlgorithm compressAlgorithm;
+  int[] zonesColors;
+}
diff --git a/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSettings.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSettings.aidl
new file mode 100644
index 0000000..ffbae26
--- /dev/null
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSettings.aidl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+//     the interface (from the latest frozen version), the build system will
+//     prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.tv.mediaquality;
+@VintfStability
+parcelable AmbientBacklightSettings {
+  String packageName;
+  android.hardware.tv.mediaquality.AmbientBacklightSource source;
+  int maxFramerate;
+  android.hardware.graphics.common.PixelFormat colorFormat;
+  int hZonesNumber;
+  int vZonesNumber;
+  boolean hasLetterbox;
+  int threshold;
+}
diff --git a/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSource.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSource.aidl
new file mode 100644
index 0000000..22912f4
--- /dev/null
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSource.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+//     the interface (from the latest frozen version), the build system will
+//     prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.tv.mediaquality;
+@VintfStability
+enum AmbientBacklightSource {
+  NONE = 0,
+  AUDIO = 1,
+  VIDEO = 2,
+}
diff --git a/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl
index 6e8b23a..d2b2bc3 100644
--- a/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl
@@ -34,6 +34,8 @@
 package android.hardware.tv.mediaquality;
 @VintfStability
 interface IMediaQuality {
-  void setAmbientLightDetectionEnabled(in boolean enabled);
-  boolean getAmbientLightDetectionEnabled();
+  void setCallback(in android.hardware.tv.mediaquality.IMediaQualityCallback callback);
+  void setAmbientBacklightDetector(in android.hardware.tv.mediaquality.AmbientBacklightSettings settings);
+  void setAmbientBacklightDetectionEnabled(in boolean enabled);
+  boolean getAmbientBacklightDetectionEnabled();
 }
diff --git a/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQualityCallback.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQualityCallback.aidl
new file mode 100644
index 0000000..014bf58
--- /dev/null
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQualityCallback.aidl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+//     the interface (from the latest frozen version), the build system will
+//     prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.tv.mediaquality;
+@VintfStability
+interface IMediaQualityCallback {
+  oneway void notifyAmbientBacklightEvent(in android.hardware.tv.mediaquality.AmbientBacklightEvent event);
+}
diff --git a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightCompressAlgorithm.aidl b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightCompressAlgorithm.aidl
new file mode 100644
index 0000000..e1c68b3
--- /dev/null
+++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightCompressAlgorithm.aidl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.tv.mediaquality;
+
+@VintfStability
+enum AmbientBacklightCompressAlgorithm {
+    /**
+     * The compress algorithm is disabled.
+     */
+    NONE = 0,
+    /**
+     * The compress algorithm is enabled for RLE (Run-Length Encoding).
+     */
+    RLE = 1,
+}
diff --git a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightEvent.aidl b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightEvent.aidl
new file mode 100644
index 0000000..237e531
--- /dev/null
+++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightEvent.aidl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.tv.mediaquality;
+
+import android.hardware.tv.mediaquality.AmbientBacklightMetadata;
+
+@VintfStability
+union AmbientBacklightEvent {
+    /**
+     * This field is relevant when the event signifies that ambient backlight is enabled.
+     */
+    boolean enabled;
+
+    /**
+     * This field is relevant when the event includes ambient backlight metadata.
+     */
+    AmbientBacklightMetadata metadata;
+}
diff --git a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightMetadata.aidl b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightMetadata.aidl
new file mode 100644
index 0000000..49b3a28
--- /dev/null
+++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightMetadata.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.tv.mediaquality;
+
+import android.hardware.tv.mediaquality.AmbientBacklightCompressAlgorithm;
+import android.hardware.tv.mediaquality.AmbientBacklightSettings;
+
+@VintfStability
+parcelable AmbientBacklightMetadata {
+    /**
+     * The settings which are used to generate the colors.
+     */
+    AmbientBacklightSettings settings;
+
+    /**
+     * The compress algorithm of the ambient backlight colors.
+     */
+    AmbientBacklightCompressAlgorithm compressAlgorithm;
+
+    /**
+     * The colors for the zones. Format of the color will be indicated in the
+     * AmbientBacklightSettings::colorFormat.
+     */
+    int[] zonesColors;
+}
diff --git a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightSettings.aidl b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightSettings.aidl
new file mode 100644
index 0000000..b6a26ee
--- /dev/null
+++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightSettings.aidl
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.tv.mediaquality;
+
+import android.hardware.graphics.common.PixelFormat;
+import android.hardware.tv.mediaquality.AmbientBacklightSource;
+
+@VintfStability
+parcelable AmbientBacklightSettings {
+    /**
+     * The package name of the ambient backlight control application.
+     */
+    String packageName;
+
+    /**
+     * The source of the ambient backlight.
+     */
+    AmbientBacklightSource source;
+
+    /**
+     * The maximum framerate for the ambient backlight.
+     */
+    int maxFramerate;
+
+    /**
+     * The color format for the ambient backlight.
+     */
+    PixelFormat colorFormat;
+
+    /**
+     * The number of zones in horizontal direction.
+     */
+    int hZonesNumber;
+
+    /**
+     * The number of zones in vertical direction.
+     */
+    int vZonesNumber;
+
+    /**
+     * When a video has a different aspect ratio than the display people
+     * watching it on, they often get black bars at the top and bottom
+     * (or sometimes the sides). These black bars are called "letterboxing".
+     * It's a way to show the entire video without distortion, but it means
+     * some of the screen space is unused. This configuration determines
+     * whether to ignore the black bar used for padding.
+     */
+    boolean hasLetterbox;
+
+    /**
+     * The color threshold for the ambient backlight. The units of the color deopends on
+     * the colorFormat. For example, RGB888, where the values of R/G/B range from 0 to 255,
+     * and the threshold is a positive number within the same range.
+     */
+    int threshold;
+}
diff --git a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightSource.aidl b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightSource.aidl
new file mode 100644
index 0000000..8051fb6
--- /dev/null
+++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/AmbientBacklightSource.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.tv.mediaquality;
+
+@VintfStability
+enum AmbientBacklightSource {
+    /**
+     * The detection is disabled.
+     */
+    NONE = 0,
+    /**
+     * The detection is enabled for audio.
+     */
+    AUDIO = 1,
+    /**
+     * The detection is enabled for video.
+     */
+    VIDEO = 2,
+}
diff --git a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl
index f75d6d1..def9e39 100644
--- a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl
+++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl
@@ -16,27 +16,44 @@
 
 package android.hardware.tv.mediaquality;
 
+import android.hardware.tv.mediaquality.AmbientBacklightSettings;
+import android.hardware.tv.mediaquality.IMediaQualityCallback;
+
 /**
  * Interface for the media quality service
  */
 @VintfStability
 interface IMediaQuality {
     /**
+     * Sets a callback for events.
+     *
+     * @param callback Callback object to pass events.
+     */
+    void setCallback(in IMediaQualityCallback callback);
+
+    /**
+     * Sets the ambient backlight detector settings.
+     *
+     * @param settings Ambient backlight detector settings.
+     */
+    void setAmbientBacklightDetector(in AmbientBacklightSettings settings);
+
+    /**
      * Sets the ambient backlight detection enabled or disabled. The ambient backlight is the
      * projection of light against the wall driven by the current content playing. Enable will
      * detects the Ambient backlight metadata and ambient control app can control the related
      * device as configured before.
      *
-     * @param enabled True to enable the ambient light detection, false to disable.
+     * @param enabled True to enable the ambient backlight detection, false to disable.
      */
-    void setAmbientLightDetectionEnabled(in boolean enabled);
+    void setAmbientBacklightDetectionEnabled(in boolean enabled);
 
     /**
-     * Gets the ambient light detection enabled status. The ambient light is enabled by
-     * calling setAmbientLightDetectionEnabled(in boolean enabled). True to enable the ambient
-     * light detection and False to disable the ambient light detection.
+     * Gets the ambient backlight detection enabled status. The ambient backlight is enabled by
+     * calling setAmbientBacklightDetectionEnabled(in boolean enabled). True to enable the
+     * ambient light detection and False to disable the ambient backlight detection.
      *
-     * @return True if the ambient light detection is enabled, false otherwise.
+     * @return True if the ambient backlight detection is enabled, false otherwise.
      */
-    boolean getAmbientLightDetectionEnabled();
+    boolean getAmbientBacklightDetectionEnabled();
 }
diff --git a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQualityCallback.aidl b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQualityCallback.aidl
new file mode 100644
index 0000000..31ab255
--- /dev/null
+++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQualityCallback.aidl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.tv.mediaquality;
+
+import android.hardware.tv.mediaquality.AmbientBacklightEvent;
+
+@VintfStability
+oneway interface IMediaQualityCallback {
+    /**
+     * Notifies the client that an ambient backlight event has occurred. For possible
+     * event types, check AmbientBacklightEventType.
+     *
+     * @param event Event passed to the client.
+     */
+    void notifyAmbientBacklightEvent(in AmbientBacklightEvent event);
+}
diff --git a/tv/mediaquality/aidl/default/hal/media_quality_hal_impl.rs b/tv/mediaquality/aidl/default/hal/media_quality_hal_impl.rs
index c739ac8..8769804 100644
--- a/tv/mediaquality/aidl/default/hal/media_quality_hal_impl.rs
+++ b/tv/mediaquality/aidl/default/hal/media_quality_hal_impl.rs
@@ -17,12 +17,20 @@
 
 use android_hardware_tv_mediaquality::aidl::android::hardware::tv::mediaquality::{
     IMediaQuality::IMediaQuality,
+    IMediaQualityCallback::IMediaQualityCallback,
+    AmbientBacklightEvent::AmbientBacklightEvent,
+    AmbientBacklightSettings::AmbientBacklightSettings,
 };
 use binder::Interface;
 use std::sync::{Arc, Mutex};
+use std::thread;
+use binder::Strong;
+
 /// Defined so we can implement the IMediaQuality AIDL interface.
 pub struct MediaQualityService {
-    ambient_light_enabled: Arc<Mutex<bool>>
+    callback: Arc<Mutex<Option<Strong<dyn IMediaQualityCallback>>>>,
+    ambient_backlight_enabled: Arc<Mutex<bool>>,
+    ambient_backlight_detector_settings: Arc<Mutex<AmbientBacklightSettings>>
 }
 
 impl MediaQualityService {
@@ -30,7 +38,10 @@
     /// Create a new instance of the MediaQualityService.
     pub fn new() -> Self {
         Self {
-            ambient_light_enabled: Arc::new(Mutex::new(false)),
+            callback: Arc::new(Mutex::new(None)),
+            ambient_backlight_enabled: Arc::new(Mutex::new(true)),
+            ambient_backlight_detector_settings:
+                    Arc::new(Mutex::new(AmbientBacklightSettings::default())),
         }
     }
 }
@@ -38,15 +49,66 @@
 impl Interface for MediaQualityService {}
 
 impl IMediaQuality for MediaQualityService {
-    fn setAmbientLightDetectionEnabled(&self, enabled: bool) -> binder::Result<()> {
-        println!("Received enabled: {}", enabled);
-        let mut ambient_light_enabled = self.ambient_light_enabled.lock().unwrap();
-        *ambient_light_enabled = enabled;
+
+    fn setCallback(
+        &self,
+        callback: &Strong<dyn IMediaQualityCallback>
+    ) -> binder::Result<()> {
+        println!("Received callback: {:?}", callback);
+        let mut cb = self.callback.lock().unwrap();
+        *cb = Some(callback.clone());
         Ok(())
     }
 
-    fn getAmbientLightDetectionEnabled(&self) -> binder::Result<bool> {
-        let ambient_light_enabled = self.ambient_light_enabled.lock().unwrap();
-        Ok(*ambient_light_enabled)
+    fn setAmbientBacklightDetector(
+        &self,
+        settings: &AmbientBacklightSettings
+    ) -> binder::Result<()> {
+        println!("Received settings: {:?}", settings);
+        let mut ambient_backlight_detector_settings = self.ambient_backlight_detector_settings.lock().unwrap();
+        ambient_backlight_detector_settings.packageName = settings.packageName.clone();
+        ambient_backlight_detector_settings.source = settings.source;
+        ambient_backlight_detector_settings.maxFramerate = settings.maxFramerate;
+        ambient_backlight_detector_settings.colorFormat = settings.colorFormat;
+        ambient_backlight_detector_settings.hZonesNumber = settings.hZonesNumber;
+        ambient_backlight_detector_settings.vZonesNumber = settings.vZonesNumber;
+        ambient_backlight_detector_settings.hasLetterbox = settings.hasLetterbox;
+        ambient_backlight_detector_settings.threshold = settings.threshold;
+        Ok(())
+    }
+
+    fn setAmbientBacklightDetectionEnabled(&self, enabled: bool) -> binder::Result<()> {
+        println!("Received enabled: {}", enabled);
+        let mut ambient_backlight_enabled = self.ambient_backlight_enabled.lock().unwrap();
+        *ambient_backlight_enabled = enabled;
+        if enabled {
+            println!("Enable Ambient Backlight detection");
+            thread::scope(|s| {
+                s.spawn(|| {
+                    let cb = self.callback.lock().unwrap();
+                    if let Some(cb) = &*cb {
+                        let enabled_event = AmbientBacklightEvent::Enabled(true);
+                        cb.notifyAmbientBacklightEvent(&enabled_event).unwrap();
+                    }
+                });
+            });
+        } else {
+            println!("Disable Ambient Backlight detection");
+            thread::scope(|s| {
+                s.spawn(|| {
+                    let cb = self.callback.lock().unwrap();
+                    if let Some(cb) = &*cb {
+                        let disabled_event = AmbientBacklightEvent::Enabled(false);
+                        cb.notifyAmbientBacklightEvent(&disabled_event).unwrap();
+                    }
+                });
+            });
+        }
+        Ok(())
+    }
+
+    fn getAmbientBacklightDetectionEnabled(&self) -> binder::Result<bool> {
+        let ambient_backlight_enabled = self.ambient_backlight_enabled.lock().unwrap();
+        Ok(*ambient_backlight_enabled)
     }
 }
diff --git a/tv/mediaquality/aidl/vts/functional/Android.bp b/tv/mediaquality/aidl/vts/functional/Android.bp
index b44740f..226569e 100644
--- a/tv/mediaquality/aidl/vts/functional/Android.bp
+++ b/tv/mediaquality/aidl/vts/functional/Android.bp
@@ -31,9 +31,10 @@
     srcs: ["VtsHalMediaQualityTest.cpp"],
     shared_libs: [
         "libbinder",
+        "libbinder_ndk",
     ],
     static_libs: [
-        "android.hardware.tv.mediaquality-V1-cpp",
+        "android.hardware.tv.mediaquality-V1-ndk",
     ],
     test_suites: [
         "vts",
diff --git a/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp b/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp
index 5934e14..c11ebcb 100644
--- a/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp
+++ b/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp
@@ -13,51 +13,96 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-#define LOG_TAG "ambient_intelligence_light_aidl_hal_test"
+#define LOG_TAG "ambient_backlight_aidl_hal_test"
 
 #include <aidl/Gtest.h>
 #include <aidl/Vintf.h>
-#include <android/hardware/tv/mediaquality/IMediaQuality.h>
+#include <aidl/android/hardware/tv/mediaquality/AmbientBacklightEvent.h>
+#include <aidl/android/hardware/tv/mediaquality/AmbientBacklightSettings.h>
+#include <aidl/android/hardware/tv/mediaquality/BnMediaQualityCallback.h>
+#include <aidl/android/hardware/tv/mediaquality/IMediaQuality.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_manager.h>
 #include <binder/IServiceManager.h>
 #include <binder/ProcessState.h>
-#include <gtest/gtest.h>
-#include <hidl/GtestPrinter.h>
-#include <hidl/ServiceManagement.h>
+#include <future>
 
+using aidl::android::hardware::graphics::common::PixelFormat;
+using aidl::android::hardware::tv::mediaquality::AmbientBacklightEvent;
+using aidl::android::hardware::tv::mediaquality::AmbientBacklightSettings;
+using aidl::android::hardware::tv::mediaquality::AmbientBacklightSource;
+using aidl::android::hardware::tv::mediaquality::BnMediaQualityCallback;
+using aidl::android::hardware::tv::mediaquality::IMediaQuality;
 using android::ProcessState;
-using android::sp;
 using android::String16;
-using android::binder::Status;
-using android::hardware::hidl_vec;
-using android::hardware::Return;
-using android::hardware::Void;
-using android::hardware::tv::mediaquality::IMediaQuality;
+using ndk::ScopedAStatus;
+using ndk::SpAIBinder;
 
 #define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk())
 #define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk())
 
-class MediaQualityAidl : public testing::TestWithParam<std::string> {
+class MediaQualityCallback : public BnMediaQualityCallback {
   public:
-    void SetUp() override {
-        mediaquality = android::waitForDeclaredService<IMediaQuality>(String16(GetParam().c_str()));
-        ASSERT_NE(mediaquality, nullptr);
+    explicit MediaQualityCallback(
+            const std::function<void(const AmbientBacklightEvent& event)>& on_hal_event_cb)
+        : on_hal_event_cb_(on_hal_event_cb) {}
+    ScopedAStatus notifyAmbientBacklightEvent(const AmbientBacklightEvent& event) override {
+        on_hal_event_cb_(event);
+        return ScopedAStatus::ok();
     }
 
-    sp<IMediaQuality> mediaquality;
-
-    void TearDown() override {}
+  private:
+    std::function<void(const AmbientBacklightEvent& event)> on_hal_event_cb_;
 };
 
-TEST_P(MediaQualityAidl, TestSetAmbientLightDetectionEnabled) {
-    ASSERT_OK(mediaquality->setAmbientLightDetectionEnabled(true));
+class MediaQualityAidl : public testing::TestWithParam<std::string> {
+  public:
+    virtual void SetUp() override {
+        mediaquality = IMediaQuality::fromBinder(
+                SpAIBinder(AServiceManager_waitForService(GetParam().c_str())));
+        ASSERT_NE(mediaquality, nullptr);
+    }
+    std::shared_ptr<IMediaQuality> mediaquality;
+};
+
+TEST_P(MediaQualityAidl, TestSetAmbientBacklightDetectionEnabled) {
+    std::promise<void> open_cb_promise;
+    std::future<void> open_cb_future{open_cb_promise.get_future()};
+    std::shared_ptr<MediaQualityCallback> callback =
+            ndk::SharedRefBase::make<MediaQualityCallback>([&open_cb_promise](auto event) {
+                EXPECT_EQ(event.getTag(), AmbientBacklightEvent::Tag::enabled);
+                EXPECT_EQ(event.template get<AmbientBacklightEvent::Tag::enabled>(), true);
+                open_cb_promise.set_value();
+                return ScopedAStatus::ok();
+            });
+    ASSERT_OK(mediaquality->setCallback(callback));
+    ASSERT_OK(mediaquality->setAmbientBacklightDetectionEnabled(true));
+    std::chrono::milliseconds timeout{10000};
+    EXPECT_EQ(open_cb_future.wait_for(timeout), std::future_status::ready);
 }
 
-TEST_P(MediaQualityAidl, TestGetAmbientLightDetectionEnabled) {
+TEST_P(MediaQualityAidl, TestGetAmbientBacklightDetectionEnabled) {
     bool enabled;
-    Status status = mediaquality->getAmbientLightDetectionEnabled(&enabled);
-    ASSERT_TRUE(status.isOk());
-    ASSERT_TRUE(enabled);
+    ASSERT_OK(mediaquality->getAmbientBacklightDetectionEnabled(&enabled));
+}
+
+TEST_P(MediaQualityAidl, TestSetMediaQualityCallback) {
+    std::shared_ptr<MediaQualityCallback> callback = ndk::SharedRefBase::make<MediaQualityCallback>(
+            [](auto /* event */) { return ScopedAStatus::ok(); });
+    ASSERT_OK(mediaquality->setCallback(callback));
+}
+
+TEST_P(MediaQualityAidl, TestSetAmbientBacklightDetector) {
+    AmbientBacklightSettings in_settings = {
+            .packageName = "com.android.mediaquality",
+            .source = AmbientBacklightSource::VIDEO,
+            .colorFormat = PixelFormat::RGB_888,
+            .hZonesNumber = 32,
+            .vZonesNumber = 20,
+            .hasLetterbox = true,
+            .threshold = 0,
+    };
+    ASSERT_OK(mediaquality->setAmbientBacklightDetector(in_settings));
 }
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MediaQualityAidl);