diff --git a/compatibility_matrices/compatibility_matrix.202504.xml b/compatibility_matrices/compatibility_matrix.202504.xml index aee1d38eac..01e3a692a5 100644 --- a/compatibility_matrices/compatibility_matrix.202504.xml +++ b/compatibility_matrices/compatibility_matrix.202504.xml @@ -676,6 +676,14 @@ default + + android.hardware.tv.mediaquality + 1 + + IMediaQuality + default + + mapper diff --git a/tv/mediaquality/OWNERS b/tv/mediaquality/OWNERS new file mode 100644 index 0000000000..35ca732bb8 --- /dev/null +++ b/tv/mediaquality/OWNERS @@ -0,0 +1,3 @@ +quxiangfang@google.com +shubang@google.com +haofanw@google.com \ No newline at end of file diff --git a/tv/mediaquality/aidl/Android.bp b/tv/mediaquality/aidl/Android.bp new file mode 100644 index 0000000000..1f273eb29b --- /dev/null +++ b/tv/mediaquality/aidl/Android.bp @@ -0,0 +1,30 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +aidl_interface { + name: "android.hardware.tv.mediaquality", + vendor_available: true, + owner: "haofanw", + srcs: [ + "android/hardware/tv/mediaquality/*.aidl", + ], + stability: "vintf", + backend: { + java: { + sdk_version: "module_current", + }, + ndk: { + enabled: true, + }, + rust: { + enabled: true, + }, + }, + frozen: false, +} 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 new file mode 100644 index 0000000000..6e8b23a3ed --- /dev/null +++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.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 -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 IMediaQuality { + void setAmbientLightDetectionEnabled(in boolean enabled); + boolean getAmbientLightDetectionEnabled(); +} diff --git a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl new file mode 100644 index 0000000000..f75d6d1736 --- /dev/null +++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl @@ -0,0 +1,42 @@ +/* + * 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; + +/** + * Interface for the media quality service + */ +@VintfStability +interface IMediaQuality { + /** + * 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. + */ + void setAmbientLightDetectionEnabled(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. + * + * @return True if the ambient light detection is enabled, false otherwise. + */ + boolean getAmbientLightDetectionEnabled(); +} diff --git a/tv/mediaquality/aidl/default/Android.bp b/tv/mediaquality/aidl/default/Android.bp new file mode 100644 index 0000000000..e25b01fdc5 --- /dev/null +++ b/tv/mediaquality/aidl/default/Android.bp @@ -0,0 +1,24 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +rust_binary { + name: "android.hardware.tv.mediaquality-service.example", + relative_install_path: "hw", + init_rc: ["mediaquality-default.rc"], + vintf_fragments: ["mediaquality-default.xml"], + vendor: true, + rustlibs: [ + "libandroid_logger", + "liblogger", + "liblog_rust", + "libbinder_rs", + "android.hardware.tv.mediaquality-V1-rust", + ], + srcs: ["main.rs"], +} diff --git a/tv/mediaquality/aidl/default/hal/media_quality_hal_impl.rs b/tv/mediaquality/aidl/default/hal/media_quality_hal_impl.rs new file mode 100644 index 0000000000..c739ac8c34 --- /dev/null +++ b/tv/mediaquality/aidl/default/hal/media_quality_hal_impl.rs @@ -0,0 +1,52 @@ +/* + * 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 module implements the IMediaQuality AIDL interface. + +use android_hardware_tv_mediaquality::aidl::android::hardware::tv::mediaquality::{ + IMediaQuality::IMediaQuality, +}; +use binder::Interface; +use std::sync::{Arc, Mutex}; +/// Defined so we can implement the IMediaQuality AIDL interface. +pub struct MediaQualityService { + ambient_light_enabled: Arc> +} + +impl MediaQualityService { + + /// Create a new instance of the MediaQualityService. + pub fn new() -> Self { + Self { + ambient_light_enabled: Arc::new(Mutex::new(false)), + } + } +} + +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; + Ok(()) + } + + fn getAmbientLightDetectionEnabled(&self) -> binder::Result { + let ambient_light_enabled = self.ambient_light_enabled.lock().unwrap(); + Ok(*ambient_light_enabled) + } +} diff --git a/tv/mediaquality/aidl/default/hal/mod.rs b/tv/mediaquality/aidl/default/hal/mod.rs new file mode 100644 index 0000000000..5b5d4ac18f --- /dev/null +++ b/tv/mediaquality/aidl/default/hal/mod.rs @@ -0,0 +1,17 @@ +/* + * 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. + */ + +pub mod media_quality_hal_impl; \ No newline at end of file diff --git a/tv/mediaquality/aidl/default/main.rs b/tv/mediaquality/aidl/default/main.rs new file mode 100644 index 0000000000..f0cccb439c --- /dev/null +++ b/tv/mediaquality/aidl/default/main.rs @@ -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 implements the MediaQuality Example Service. +use android_hardware_tv_mediaquality::aidl::android::hardware::tv::mediaquality::IMediaQuality::{BnMediaQuality, IMediaQuality}; +use binder::BinderFeatures; + +mod hal; +use hal::media_quality_hal_impl::MediaQualityService; + +const LOG_TAG: &str = "mediaquality_service_example_rust"; + +use log::LevelFilter; + +fn main() { + + android_logger::init_once( + android_logger::Config::default() + .with_tag(LOG_TAG) + .with_max_level(LevelFilter::Info), + ); + + let media_quality_service = MediaQualityService::new(); + let media_quality_service_binder = BnMediaQuality::new_binder(media_quality_service, BinderFeatures::default()); + + let service_name = format!("{}/default", MediaQualityService::get_descriptor()); + binder::add_service(&service_name, media_quality_service_binder.as_binder()) + .expect("Failed to register service"); + + log::info!("MediaQualityHal service is running..."); + + binder::ProcessState::join_thread_pool(); +} diff --git a/tv/mediaquality/aidl/default/mediaquality-default.rc b/tv/mediaquality/aidl/default/mediaquality-default.rc new file mode 100644 index 0000000000..5a103a9909 --- /dev/null +++ b/tv/mediaquality/aidl/default/mediaquality-default.rc @@ -0,0 +1,4 @@ +service vendor.mediaquality-default /vendor/bin/hw/android.hardware.tv.mediaquality-service.example + class hal + user nobody + group nobody diff --git a/tv/mediaquality/aidl/default/mediaquality-default.xml b/tv/mediaquality/aidl/default/mediaquality-default.xml new file mode 100644 index 0000000000..865f663f27 --- /dev/null +++ b/tv/mediaquality/aidl/default/mediaquality-default.xml @@ -0,0 +1,6 @@ + + + android.hardware.tv.mediaquality + IMediaQuality/default + + \ No newline at end of file diff --git a/tv/mediaquality/aidl/vts/functional/Android.bp b/tv/mediaquality/aidl/vts/functional/Android.bp new file mode 100644 index 0000000000..b44740fe5a --- /dev/null +++ b/tv/mediaquality/aidl/vts/functional/Android.bp @@ -0,0 +1,41 @@ +// 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 { + default_team: "trendy_team_tv_os", + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +cc_test { + name: "VtsHalMediaQualityTargetTest", + defaults: [ + "VtsHalTargetTestDefaults", + "use_libaidlvintf_gtest_helper_static", + ], + srcs: ["VtsHalMediaQualityTest.cpp"], + shared_libs: [ + "libbinder", + ], + static_libs: [ + "android.hardware.tv.mediaquality-V1-cpp", + ], + test_suites: [ + "vts", + ], +} diff --git a/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp b/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp new file mode 100644 index 0000000000..331e76d12a --- /dev/null +++ b/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp @@ -0,0 +1,73 @@ +/* + * 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. + */ + +#define LOG_TAG "ambient_intelligence_light_aidl_hal_test" + +#include +#include +#include +#include +#include +#include +#include +#include + +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; + +#define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk()) +#define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk()) + +class MediaQualityAidl : public testing::TestWithParam { + public: + void SetUp() override { + mediaquality = android::waitForDeclaredService(String16(GetParam().c_str())); + ASSERT_NE(mediaquality, nullptr); + } + + sp mediaquality; + + void TearDown() override {} +}; + +TEST_P(MediaQualityAidl, TestSetAmbientLightDetectionEnabled) { + ASSERT_OK(mediaquality->setAmbientLightDetectionEnabled(true)); +} + +TEST_P(MediaQualityAidl, TestGetAmbientLightDetectionEnabled) { + bool enabled; + Status status = mediaquality->getAmbientLightDetectionEnabled(&enabled); + ASSERT_TRUE(status.isOk()); + ASSERT_TRUE(enabled); +} + +INSTANTIATE_TEST_SUITE_P( + PerInstance, MediaQualityAidl, + testing::ValuesIn(android::getAidlHalInstanceNames(IMediaQuality::descriptor)), + android::PrintInstanceNameToString); + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + ProcessState::self()->setThreadPoolMaxThreadCount(1); + ProcessState::self()->startThreadPool(); + return RUN_ALL_TESTS(); +}