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/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);