Merge "Specify the use of SHA-256 for the "verifiedBootHash"." into main am: 3ba252f1a2 am: 430feb2a7b
Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/3359913
Change-Id: Ica50ecda7b9611883f8228b37047371e5abc9d12
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/audio/aidl/Android.bp b/audio/aidl/Android.bp
index 4902497..1e6df46 100644
--- a/audio/aidl/Android.bp
+++ b/audio/aidl/Android.bp
@@ -303,6 +303,7 @@
"android.hardware.audio_defaults",
"latest_android_hardware_audio_common_import_interface",
"latest_android_media_audio_common_types_import_interface",
+ "latest_android_media_audio_eraser_types_import_interface",
],
srcs: [
"android/hardware/audio/effect/AcousticEchoCanceler.aidl",
@@ -317,6 +318,7 @@
"android/hardware/audio/effect/DynamicsProcessing.aidl",
"android/hardware/audio/effect/EnvironmentalReverb.aidl",
"android/hardware/audio/effect/Equalizer.aidl",
+ "android/hardware/audio/effect/Eraser.aidl",
"android/hardware/audio/effect/Flags.aidl",
"android/hardware/audio/effect/HapticGenerator.aidl",
"android/hardware/audio/effect/IEffect.aidl",
diff --git a/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Descriptor.aidl b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Descriptor.aidl
index 115da1d..36f22ae 100644
--- a/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Descriptor.aidl
+++ b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Descriptor.aidl
@@ -44,6 +44,7 @@
const String EFFECT_TYPE_UUID_DYNAMICS_PROCESSING = "7261676f-6d75-7369-6364-28e2fd3ac39e";
const String EFFECT_TYPE_UUID_ENV_REVERB = "c2e5d5f0-94bd-4763-9cac-4e234d06839e";
const String EFFECT_TYPE_UUID_EQUALIZER = "0bed4300-ddd6-11db-8f34-0002a5d5c51b";
+ const String EFFECT_TYPE_UUID_ERASER = "fa81a9ac-588b-11ed-9b6a-0242ac120002";
const String EFFECT_TYPE_UUID_HAPTIC_GENERATOR = "1411e6d6-aecd-4021-a1cf-a6aceb0d71e5";
const String EFFECT_TYPE_UUID_LOUDNESS_ENHANCER = "fe3199be-aed0-413f-87bb-11260eb63cf1";
const String EFFECT_TYPE_UUID_NS = "58b4b260-8e06-11e0-aa8e-0002a5d5c51b";
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Eraser.aidl
similarity index 81%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Eraser.aidl
index a5eda52..5d8abd5 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Eraser.aidl
@@ -31,9 +31,15 @@
// 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.vibrator;
+package android.hardware.audio.effect;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+union Eraser {
+ android.hardware.audio.effect.VendorExtension vendor;
+ android.media.audio.eraser.Capability capability;
+ android.media.audio.eraser.Configuration configuration;
+ @VintfStability
+ union Id {
+ android.hardware.audio.effect.VendorExtension vendorExtensionTag;
+ android.hardware.audio.effect.Eraser.Tag commonTag;
+ }
}
diff --git a/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Parameter.aidl b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Parameter.aidl
index ff33c42..40a49de 100644
--- a/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Parameter.aidl
+++ b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Parameter.aidl
@@ -63,6 +63,7 @@
android.hardware.audio.effect.Volume.Id volumeTag;
android.hardware.audio.effect.Parameter.Tag commonTag;
android.hardware.audio.effect.Spatializer.Id spatializerTag;
+ android.hardware.audio.effect.Eraser.Id eraserTag;
}
@VintfStability
parcelable Common {
@@ -95,5 +96,6 @@
android.hardware.audio.effect.Visualizer visualizer;
android.hardware.audio.effect.Volume volume;
android.hardware.audio.effect.Spatializer spatializer;
+ android.hardware.audio.effect.Eraser eraser;
}
}
diff --git a/audio/aidl/android/hardware/audio/effect/Descriptor.aidl b/audio/aidl/android/hardware/audio/effect/Descriptor.aidl
index b152f76..62e9bd4 100644
--- a/audio/aidl/android/hardware/audio/effect/Descriptor.aidl
+++ b/audio/aidl/android/hardware/audio/effect/Descriptor.aidl
@@ -70,6 +70,10 @@
*/
const String EFFECT_TYPE_UUID_EQUALIZER = "0bed4300-ddd6-11db-8f34-0002a5d5c51b";
/**
+ * UUID for Audio eraser effect type.
+ */
+ const String EFFECT_TYPE_UUID_ERASER = "fa81a9ac-588b-11ed-9b6a-0242ac120002";
+ /**
* UUID for Haptic Generator type.
*/
const String EFFECT_TYPE_UUID_HAPTIC_GENERATOR = "1411e6d6-aecd-4021-a1cf-a6aceb0d71e5";
diff --git a/audio/aidl/android/hardware/audio/effect/Eraser.aidl b/audio/aidl/android/hardware/audio/effect/Eraser.aidl
new file mode 100644
index 0000000..990c6c0
--- /dev/null
+++ b/audio/aidl/android/hardware/audio/effect/Eraser.aidl
@@ -0,0 +1,93 @@
+/*
+ * 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.audio.effect;
+
+import android.hardware.audio.effect.VendorExtension;
+import android.media.audio.eraser.Capability;
+import android.media.audio.eraser.Configuration;
+import android.media.audio.eraser.Mode;
+
+/**
+ * The Audio Eraser Effect is an audio effect that combines multiple capabilities to manipulate and
+ * enhance audio streams.
+ *
+ * The Audio Eraser Effect integrates three primary components:
+ *
+ * Sound Separator: Detects and splits the input audio into multiple sound sources.
+ * Sound Classifier: Classifies each separated sound source into predefined categories based on the
+ * AudioSet ontology.
+ * Remixer: Adjusts the gain factor (volume) of each classified sound source according to specified
+ * configurations, then recombines them into a single output audio stream.
+ *
+ * The Audio Eraser Effect operates in different modes, each leveraging a subset of these
+ * components to achieve specific functionalities as defined in `android.media.audio.eraser.Mode`.
+ *
+ * Flow Diagrams for each operation mode as below.
+ *
+ * ERASER:
+ * +-----------------+
+ * +-->| Sound Classifier|---+
+ * | +-----------------+ |
+ * | |
+ *+----------------+ +----------------+ | +-----------------+ | +----------------+
+ *| Input Audio |------>| Sound Separator|---+-->| Sound Classifier|---+-->| Remixer |
+ *+----------------+ +----------------+ | +-----------------+ | +--------+-------+
+ * | | |
+ * | +-----------------+ | |
+ * +-->| Sound Classifier|---+ |
+ * +-----------------+ |
+ * | v
+ * v +----------------+
+ * {Classification Metadata} | Output Audio |
+ * +----------------+
+ *
+ * CLASSIFIER:
+ *+----------------+ +-----------------+ +-----------------+
+ *| Input Audio |------>| Sound Classifier|------>| Original Audio |
+ *+----------------+ +-----------------+ +-----------------+
+ * |
+ * v
+ * {Classification Metadata}
+ *
+ */
+@VintfStability
+union Eraser {
+ /**
+ * Parameter Id with union tag to identify the parameters for getParameter().
+ */
+ @VintfStability
+ union Id {
+ VendorExtension vendorExtensionTag;
+ Eraser.Tag commonTag;
+ }
+
+ /**
+ * Vendor extension parameters which can be customized.
+ */
+ VendorExtension vendor;
+
+ /**
+ * Eraser capability, defines supported input/output data formats, available work modes, and
+ * the specific capabilities of the sound classifier and separator
+ */
+ Capability capability;
+
+ /**
+ * Eraser configuration, contains the list of configurations for the eraser effect.
+ */
+ Configuration configuration;
+}
diff --git a/audio/aidl/android/hardware/audio/effect/Parameter.aidl b/audio/aidl/android/hardware/audio/effect/Parameter.aidl
index 6fd9161..d57e67d 100644
--- a/audio/aidl/android/hardware/audio/effect/Parameter.aidl
+++ b/audio/aidl/android/hardware/audio/effect/Parameter.aidl
@@ -26,6 +26,7 @@
import android.hardware.audio.effect.DynamicsProcessing;
import android.hardware.audio.effect.EnvironmentalReverb;
import android.hardware.audio.effect.Equalizer;
+import android.hardware.audio.effect.Eraser;
import android.hardware.audio.effect.HapticGenerator;
import android.hardware.audio.effect.LoudnessEnhancer;
import android.hardware.audio.effect.NoiseSuppression;
@@ -111,6 +112,10 @@
* Parameter tag defined for Spatializer parameters.
*/
Spatializer.Id spatializerTag;
+ /**
+ * Parameter tag defined for eraser parameters.
+ */
+ Eraser.Id eraserTag;
}
/**
@@ -198,6 +203,8 @@
Visualizer visualizer;
Volume volume;
Spatializer spatializer;
+ // Eraser added at android.hardware.audio.effect.V3
+ Eraser eraser;
}
Specific specific;
diff --git a/audio/aidl/default/audio_effects_config.xml b/audio/aidl/default/audio_effects_config.xml
index a54f4db..2cef9eb 100644
--- a/audio/aidl/default/audio_effects_config.xml
+++ b/audio/aidl/default/audio_effects_config.xml
@@ -36,6 +36,7 @@
<library name="downmix" path="libdownmixaidl.so"/>
<library name="dynamics_processing" path="libdynamicsprocessingaidl.so"/>
<library name="equalizersw" path="libequalizersw.so"/>
+ <library name="erasersw" path="liberasersw.so"/>
<library name="haptic_generator" path="libhapticgeneratoraidl.so"/>
<library name="loudness_enhancer" path="libloudnessenhanceraidl.so"/>
<library name="nssw" path="libnssw.so"/>
diff --git a/audio/aidl/default/config/audioPolicy/api/current.txt b/audio/aidl/default/config/audioPolicy/api/current.txt
index e57c108..7fce8fb 100644
--- a/audio/aidl/default/config/audioPolicy/api/current.txt
+++ b/audio/aidl/default/config/audioPolicy/api/current.txt
@@ -144,6 +144,7 @@
enum_constant public static final android.audio.policy.configuration.AudioDevice AUDIO_DEVICE_OUT_HEARING_AID;
enum_constant public static final android.audio.policy.configuration.AudioDevice AUDIO_DEVICE_OUT_IP;
enum_constant public static final android.audio.policy.configuration.AudioDevice AUDIO_DEVICE_OUT_LINE;
+ enum_constant public static final android.audio.policy.configuration.AudioDevice AUDIO_DEVICE_OUT_MULTICHANNEL_GROUP;
enum_constant public static final android.audio.policy.configuration.AudioDevice AUDIO_DEVICE_OUT_PROXY;
enum_constant public static final android.audio.policy.configuration.AudioDevice AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
enum_constant public static final android.audio.policy.configuration.AudioDevice AUDIO_DEVICE_OUT_SPDIF;
diff --git a/audio/aidl/default/config/audioPolicy/audio_policy_configuration.xsd b/audio/aidl/default/config/audioPolicy/audio_policy_configuration.xsd
index 108a6a3..1f90313 100644
--- a/audio/aidl/default/config/audioPolicy/audio_policy_configuration.xsd
+++ b/audio/aidl/default/config/audioPolicy/audio_policy_configuration.xsd
@@ -262,6 +262,7 @@
<xs:enumeration value="AUDIO_DEVICE_OUT_AUX_LINE"/>
<xs:enumeration value="AUDIO_DEVICE_OUT_SPEAKER_SAFE"/>
<xs:enumeration value="AUDIO_DEVICE_OUT_IP"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_MULTICHANNEL_GROUP"/>
<xs:enumeration value="AUDIO_DEVICE_OUT_BUS"/>
<xs:enumeration value="AUDIO_DEVICE_OUT_PROXY"/>
<xs:enumeration value="AUDIO_DEVICE_OUT_USB_HEADSET"/>
diff --git a/audio/aidl/default/config/audioPolicy/engine/api/current.txt b/audio/aidl/default/config/audioPolicy/engine/api/current.txt
index 8e0e9a2..1ba91e6 100644
--- a/audio/aidl/default/config/audioPolicy/engine/api/current.txt
+++ b/audio/aidl/default/config/audioPolicy/engine/api/current.txt
@@ -227,6 +227,7 @@
enum_constant public static final android.audio.policy.engine.configuration.UsageEnumType AUDIO_USAGE_NOTIFICATION_EVENT;
enum_constant public static final android.audio.policy.engine.configuration.UsageEnumType AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
enum_constant public static final android.audio.policy.engine.configuration.UsageEnumType AUDIO_USAGE_SAFETY;
+ enum_constant public static final android.audio.policy.engine.configuration.UsageEnumType AUDIO_USAGE_SPEAKER_CLEANUP;
enum_constant public static final android.audio.policy.engine.configuration.UsageEnumType AUDIO_USAGE_UNKNOWN;
enum_constant public static final android.audio.policy.engine.configuration.UsageEnumType AUDIO_USAGE_VEHICLE_STATUS;
enum_constant public static final android.audio.policy.engine.configuration.UsageEnumType AUDIO_USAGE_VIRTUAL_SOURCE;
diff --git a/audio/aidl/default/config/audioPolicy/engine/audio_policy_engine_configuration.xsd b/audio/aidl/default/config/audioPolicy/engine/audio_policy_engine_configuration.xsd
index e2508ea..6422277 100644
--- a/audio/aidl/default/config/audioPolicy/engine/audio_policy_engine_configuration.xsd
+++ b/audio/aidl/default/config/audioPolicy/engine/audio_policy_engine_configuration.xsd
@@ -377,6 +377,7 @@
<xs:enumeration value="AUDIO_USAGE_SAFETY" />
<xs:enumeration value="AUDIO_USAGE_VEHICLE_STATUS" />
<xs:enumeration value="AUDIO_USAGE_ANNOUNCEMENT" />
+ <xs:enumeration value="AUDIO_USAGE_SPEAKER_CLEANUP" />
</xs:restriction>
</xs:simpleType>
diff --git a/audio/aidl/default/eraser/Android.bp b/audio/aidl/default/eraser/Android.bp
new file mode 100644
index 0000000..c495d8e
--- /dev/null
+++ b/audio/aidl/default/eraser/Android.bp
@@ -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.
+ */
+
+package {
+ default_team: "trendy_team_android_media_audio_framework",
+ // 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_library_shared {
+ name: "liberasersw",
+ defaults: [
+ "aidlaudioeffectservice_defaults",
+ ],
+ srcs: [
+ "Eraser.cpp",
+ ":effectCommonFile",
+ ],
+ relative_install_path: "soundfx",
+ visibility: [
+ "//hardware/interfaces/audio/aidl/default:__subpackages__",
+ ],
+}
diff --git a/audio/aidl/default/eraser/Eraser.cpp b/audio/aidl/default/eraser/Eraser.cpp
new file mode 100644
index 0000000..157ec79
--- /dev/null
+++ b/audio/aidl/default/eraser/Eraser.cpp
@@ -0,0 +1,187 @@
+/*
+ * 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 "AHAL_Eraser"
+
+#include "Eraser.h"
+
+#include <android-base/logging.h>
+#include <system/audio_effects/effect_uuid.h>
+
+#include <optional>
+
+using aidl::android::hardware::audio::common::getChannelCount;
+using aidl::android::hardware::audio::effect::Descriptor;
+using aidl::android::hardware::audio::effect::EraserSw;
+using aidl::android::hardware::audio::effect::getEffectImplUuidEraserSw;
+using aidl::android::hardware::audio::effect::getEffectTypeUuidEraser;
+using aidl::android::hardware::audio::effect::IEffect;
+using aidl::android::hardware::audio::effect::State;
+using aidl::android::media::audio::common::AudioChannelLayout;
+using aidl::android::media::audio::common::AudioUuid;
+
+extern "C" binder_exception_t createEffect(const AudioUuid* in_impl_uuid,
+ std::shared_ptr<IEffect>* instanceSpp) {
+ if (!in_impl_uuid || *in_impl_uuid != getEffectImplUuidEraserSw()) {
+ LOG(ERROR) << __func__ << "uuid not supported";
+ return EX_ILLEGAL_ARGUMENT;
+ }
+ if (!instanceSpp) {
+ LOG(ERROR) << __func__ << " invalid input parameter!";
+ return EX_ILLEGAL_ARGUMENT;
+ }
+
+ *instanceSpp = ndk::SharedRefBase::make<EraserSw>();
+ LOG(DEBUG) << __func__ << " instance " << instanceSpp->get() << " created";
+ return EX_NONE;
+}
+
+extern "C" binder_exception_t queryEffect(const AudioUuid* in_impl_uuid, Descriptor* _aidl_return) {
+ if (!in_impl_uuid || *in_impl_uuid != getEffectImplUuidEraserSw()) {
+ LOG(ERROR) << __func__ << "uuid not supported";
+ return EX_ILLEGAL_ARGUMENT;
+ }
+ *_aidl_return = EraserSw::kDescriptor;
+ return EX_NONE;
+}
+
+namespace aidl::android::hardware::audio::effect {
+
+const std::string EraserSw::kEffectName = "EraserSw";
+const Descriptor EraserSw::kDescriptor = {
+ .common = {.id = {.type = getEffectTypeUuidEraser(), .uuid = getEffectImplUuidEraserSw()},
+ .flags = {.type = Flags::Type::INSERT,
+ .insert = Flags::Insert::FIRST,
+ .hwAcceleratorMode = Flags::HardwareAccelerator::NONE},
+ .name = EraserSw::kEffectName,
+ .implementor = "The Android Open Source Project"}};
+
+ndk::ScopedAStatus EraserSw::getDescriptor(Descriptor* _aidl_return) {
+ LOG(DEBUG) << __func__ << kDescriptor.toString();
+ *_aidl_return = kDescriptor;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus EraserSw::setParameterSpecific(const Parameter::Specific& specific) {
+ RETURN_IF(Parameter::Specific::eraser != specific.getTag(), EX_ILLEGAL_ARGUMENT,
+ "EffectNotSupported");
+ RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
+
+ auto& param = specific.get<Parameter::Specific::eraser>();
+ return mContext->setParam(param.getTag(), param);
+}
+
+ndk::ScopedAStatus EraserSw::getParameterSpecific(const Parameter::Id& id,
+ Parameter::Specific* specific) {
+ RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
+
+ auto tag = id.getTag();
+ RETURN_IF(Parameter::Id::eraserTag != tag, EX_ILLEGAL_ARGUMENT, "wrongIdTag");
+ auto eraserId = id.get<Parameter::Id::eraserTag>();
+ auto eraserTag = eraserId.getTag();
+ switch (eraserTag) {
+ case Eraser::Id::commonTag: {
+ auto specificTag = eraserId.get<Eraser::Id::commonTag>();
+ std::optional<Eraser> param = mContext->getParam(specificTag);
+ if (!param.has_value()) {
+ return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "EraserTagNotSupported");
+ }
+ specific->set<Parameter::Specific::eraser>(param.value());
+ break;
+ }
+ default: {
+ LOG(ERROR) << __func__ << " unsupported tag: " << toString(tag);
+ return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "EraserTagNotSupported");
+ }
+ }
+ return ndk::ScopedAStatus::ok();
+}
+
+std::shared_ptr<EffectContext> EraserSw::createContext(const Parameter::Common& common) {
+ if (mContext) {
+ LOG(DEBUG) << __func__ << " context already exist";
+ } else {
+ mContext = std::make_shared<EraserSwContext>(1 /* statusFmqDepth */, common);
+ }
+ return mContext;
+}
+
+RetCode EraserSw::releaseContext() {
+ if (mContext) {
+ mContext.reset();
+ }
+ return RetCode::SUCCESS;
+}
+
+EraserSw::~EraserSw() {
+ cleanUp();
+ LOG(DEBUG) << __func__;
+}
+
+// Processing method running in EffectWorker thread.
+IEffect::Status EraserSw::effectProcessImpl(float* in, float* out, int samples) {
+ RETURN_VALUE_IF(!mContext, (IEffect::Status{EX_NULL_POINTER, 0, 0}), "nullContext");
+ return mContext->process(in, out, samples);
+}
+
+EraserSwContext::EraserSwContext(int statusDepth, const Parameter::Common& common)
+ : EffectContext(statusDepth, common) {
+ LOG(DEBUG) << __func__;
+}
+
+EraserSwContext::~EraserSwContext() {
+ LOG(DEBUG) << __func__;
+}
+
+template <typename TAG>
+std::optional<Eraser> EraserSwContext::getParam(TAG tag) {
+ if (mParamsMap.find(tag) != mParamsMap.end()) {
+ return mParamsMap.at(tag);
+ }
+ return std::nullopt;
+}
+
+template <typename TAG>
+ndk::ScopedAStatus EraserSwContext::setParam(TAG tag, Eraser eraser) {
+ mParamsMap[tag] = eraser;
+ return ndk::ScopedAStatus::ok();
+}
+
+IEffect::Status EraserSwContext::process(float* in, float* out, int samples) {
+ LOG(DEBUG) << __func__ << " in " << in << " out " << out << " samples " << samples;
+ IEffect::Status status = {EX_ILLEGAL_ARGUMENT, 0, 0};
+
+ const auto inputChannelCount = getChannelCount(mCommon.input.base.channelMask);
+ const auto outputChannelCount = getChannelCount(mCommon.output.base.channelMask);
+ if (inputChannelCount < outputChannelCount) {
+ LOG(ERROR) << __func__ << " invalid channel count, in: " << inputChannelCount
+ << " out: " << outputChannelCount;
+ return status;
+ }
+
+ int iFrames = samples / inputChannelCount;
+ for (int i = 0; i < iFrames; i++) {
+ std::memcpy(out, in, outputChannelCount);
+ in += inputChannelCount;
+ out += outputChannelCount;
+ }
+ return {STATUS_OK, static_cast<int32_t>(iFrames * inputChannelCount),
+ static_cast<int32_t>(iFrames * outputChannelCount)};
+}
+
+} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/eraser/Eraser.h b/audio/aidl/default/eraser/Eraser.h
new file mode 100644
index 0000000..0d4eb8f
--- /dev/null
+++ b/audio/aidl/default/eraser/Eraser.h
@@ -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.
+ */
+
+#pragma once
+
+#include "effect-impl/EffectContext.h"
+#include "effect-impl/EffectImpl.h"
+
+#include <fmq/AidlMessageQueue.h>
+
+#include <unordered_map>
+#include <vector>
+
+namespace aidl::android::hardware::audio::effect {
+
+class EraserSwContext final : public EffectContext {
+ public:
+ EraserSwContext(int statusDepth, const Parameter::Common& common);
+ ~EraserSwContext() final;
+
+ template <typename TAG>
+ std::optional<Eraser> getParam(TAG tag);
+ template <typename TAG>
+ ndk::ScopedAStatus setParam(TAG tag, Eraser eraser);
+
+ IEffect::Status process(float* in, float* out, int samples);
+
+ private:
+ std::unordered_map<Eraser::Tag, Eraser> mParamsMap;
+};
+
+class EraserSw final : public EffectImpl {
+ public:
+ static const std::string kEffectName;
+ static const Capability kCapability;
+ static const Descriptor kDescriptor;
+ ~EraserSw() final;
+
+ ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) final;
+ ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific)
+ REQUIRES(mImplMutex) final;
+ ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, Parameter::Specific* specific)
+ REQUIRES(mImplMutex) final;
+
+ std::shared_ptr<EffectContext> createContext(const Parameter::Common& common)
+ REQUIRES(mImplMutex) final;
+ RetCode releaseContext() REQUIRES(mImplMutex) final;
+
+ std::string getEffectName() final { return kEffectName; };
+ IEffect::Status effectProcessImpl(float* in, float* out, int samples)
+ REQUIRES(mImplMutex) final;
+
+ private:
+ static const std::vector<Range::SpatializerRange> kRanges;
+ std::shared_ptr<EraserSwContext> mContext GUARDED_BY(mImplMutex);
+};
+} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/vts/Android.bp b/audio/aidl/vts/Android.bp
index 85d400e..b025637 100644
--- a/audio/aidl/vts/Android.bp
+++ b/audio/aidl/vts/Android.bp
@@ -14,6 +14,7 @@
"latest_android_hardware_audio_common_ndk_static",
"latest_android_hardware_audio_effect_ndk_static",
"latest_android_media_audio_common_types_ndk_static",
+ "latest_android_media_audio_eraser_types_ndk_static",
"use_libaidlvintf_gtest_helper_static",
"VtsHalTargetTestDefaults",
],
@@ -30,6 +31,7 @@
],
header_libs: [
"libaudioaidl_headers",
+ "libaudioutils_headers",
"libexpectedutils_headers",
],
cflags: [
diff --git a/automotive/TEST_MAPPING b/automotive/TEST_MAPPING
index 483a85f..2b2f6b0 100644
--- a/automotive/TEST_MAPPING
+++ b/automotive/TEST_MAPPING
@@ -64,7 +64,82 @@
"name": "CarServiceTelemetryTest"
},
{
- "name": "CarServiceUnitTest"
+ "name": "CarServiceCarUnitTest"
+ },
+ {
+ "name": "CarServiceWifiUnitTest"
+ },
+ {
+ "name": "CarServiceWatchdogUnitTest"
+ },
+ {
+ "name": "CarServiceVmsUnitTest"
+ },
+ {
+ "name": "CarServiceUtilUnitTest"
+ },
+ {
+ "name": "CarServiceUserUnitTest"
+ },
+ {
+ "name": "CarServiceTelemetryUnitTest"
+ },
+ {
+ "name": "CarServiceSystemUiUnitTest"
+ },
+ {
+ "name": "CarServiceSystemInterfaceUnitTest"
+ },
+ {
+ "name": "CarServiceStorageMonitoringUnitTest"
+ },
+ {
+ "name": "CarServiceStatsUnitTest"
+ },
+ {
+ "name": "CarServiceRemoteAccessUnitTest"
+ },
+ {
+ "name": "CarServicePropertyUnitTest"
+ },
+ {
+ "name": "CarServicePowerUnitTest"
+ },
+ {
+ "name": "CarServicePmUnitTest"
+ },
+ {
+ "name": "CarServiceOsUnitTest"
+ },
+ {
+ "name": "CarServiceOemUnitTest"
+ },
+ {
+ "name": "CarServiceOccupantConnectionUnitTest"
+ },
+ {
+ "name": "CarServiceHalUnitTest"
+ },
+ {
+ "name": "CarServiceGarageModeUnitTest"
+ },
+ {
+ "name": "CarServiceEvsUnitTest"
+ },
+ {
+ "name": "CarServiceClusterUnitTest"
+ },
+ {
+ "name": "CarServiceBluetoothUnitTest"
+ },
+ {
+ "name": "CarServiceAudioUnitTest"
+ },
+ {
+ "name": "CarServiceAmUnitTest"
+ },
+ {
+ "name": "CarServiceAdminUnitTest"
},
{
"name": "CarServiceVmsTest"
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.aidl
similarity index 83%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.aidl
index a5eda52..2685f58 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.aidl
@@ -31,9 +31,11 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AudioDeviceConfiguration {
+ android.hardware.automotive.audiocontrol.RoutingDeviceConfiguration routingConfig;
+ boolean useCoreAudioVolume;
+ boolean useHalDuckingSignals;
+ boolean useCarVolumeGroupMuting;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFadeConfiguration.aidl
similarity index 62%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFadeConfiguration.aidl
index a5eda52..0a3c677 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFadeConfiguration.aidl
@@ -31,9 +31,20 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AudioFadeConfiguration {
+ String name;
+ android.hardware.automotive.audiocontrol.FadeState fadeState;
+ long fadeInDurationMs = DEFAULT_FADE_IN_DURATION_MS /* 1000 */;
+ long fadeOutDurationMs = DEFAULT_FADE_OUT_DURATION_MS /* 2000 */;
+ long fadeInDelayedForOffendersMs = DEFAULT_DELAY_FADE_IN_OFFENDERS_MS /* 2000 */;
+ android.media.audio.common.AudioUsage[] fadeableUsages;
+ @nullable android.media.audio.common.AudioContentType[] unfadeableContentTypes;
+ List<android.media.audio.common.AudioAttributes> unfadableAudioAttributes;
+ List<android.hardware.automotive.audiocontrol.FadeConfiguration> fadeOutConfigurations;
+ List<android.hardware.automotive.audiocontrol.FadeConfiguration> fadeInConfigurations;
+ const long DEFAULT_FADE_IN_DURATION_MS = 1000;
+ const long DEFAULT_FADE_OUT_DURATION_MS = 2000;
+ const long DEFAULT_DELAY_FADE_IN_OFFENDERS_MS = 2000;
}
diff --git a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFocusChange.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFocusChange.aidl
index 58a3667..8eab521 100644
--- a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFocusChange.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFocusChange.aidl
@@ -39,7 +39,7 @@
GAIN_TRANSIENT = 2,
GAIN_TRANSIENT_MAY_DUCK = 3,
GAIN_TRANSIENT_EXCLUSIVE = 4,
- LOSS = -1,
- LOSS_TRANSIENT = -2,
- LOSS_TRANSIENT_CAN_DUCK = -3,
+ LOSS = ((-1) * GAIN) /* -1 */,
+ LOSS_TRANSIENT = ((-1) * GAIN_TRANSIENT) /* -2 */,
+ LOSS_TRANSIENT_CAN_DUCK = ((-1) * GAIN_TRANSIENT_MAY_DUCK) /* -3 */,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZone.aidl
similarity index 76%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZone.aidl
index a5eda52..2cb1760 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZone.aidl
@@ -31,9 +31,15 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AudioZone {
+ String name;
+ int id;
+ int occupantZoneId = UNASSIGNED_OCCUPANT /* -1 */;
+ android.hardware.automotive.audiocontrol.AudioZoneContext audioZoneContext;
+ List<android.hardware.automotive.audiocontrol.AudioZoneConfig> audioZoneConfigs;
+ List<android.media.audio.common.AudioPort> inputAudioDevices;
+ const int PRIMARY_AUDIO_ZONE = 0;
+ const int UNASSIGNED_OCCUPANT = (-1) /* -1 */;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneConfig.aidl
similarity index 82%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneConfig.aidl
index a5eda52..3fd37bc 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneConfig.aidl
@@ -31,9 +31,11 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AudioZoneConfig {
+ String name;
+ boolean isDefault;
+ List<android.hardware.automotive.audiocontrol.VolumeGroupConfig> volumeGroups;
+ @nullable android.hardware.automotive.audiocontrol.AudioZoneFadeConfiguration fadeConfiguration;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContext.aidl
similarity index 87%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContext.aidl
index a5eda52..0f8b946 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContext.aidl
@@ -31,9 +31,8 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AudioZoneContext {
+ List<android.hardware.automotive.audiocontrol.AudioZoneContextInfo> audioContextInfos;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.aidl
similarity index 83%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.aidl
index a5eda52..01ab1be 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.aidl
@@ -31,9 +31,11 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AudioZoneContextInfo {
+ String name;
+ int id = UNASSIGNED_CONTEXT_ID /* -1 */;
+ List<android.media.audio.common.AudioAttributes> audioAttributes;
+ const int UNASSIGNED_CONTEXT_ID = (-1) /* -1 */;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneFadeConfiguration.aidl
similarity index 82%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneFadeConfiguration.aidl
index a5eda52..f3f32bf 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneFadeConfiguration.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AudioZoneFadeConfiguration {
+ android.hardware.automotive.audiocontrol.AudioFadeConfiguration defaultConfiguration;
+ List<android.hardware.automotive.audiocontrol.TransientFadeConfigurationEntry> transientConfiguration;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/DeviceToContextEntry.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/DeviceToContextEntry.aidl
index a5eda52..923b0bd 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/DeviceToContextEntry.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable DeviceToContextEntry {
+ List<String> contextNames;
+ android.media.audio.common.AudioPort device;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeConfiguration.aidl
similarity index 77%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeConfiguration.aidl
index a5eda52..2c978e7 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeConfiguration.aidl
@@ -31,9 +31,14 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable FadeConfiguration {
+ long fadeDurationMillis;
+ android.hardware.automotive.audiocontrol.FadeConfiguration.AudioAttributesOrUsage audioAttributesOrUsage;
+ @JavaDerive(equals=true, toString=true) @VintfStability
+ union AudioAttributesOrUsage {
+ android.media.audio.common.AudioAttributes fadeAttribute;
+ android.media.audio.common.AudioUsage usage;
+ }
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeState.aidl
similarity index 89%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeState.aidl
index a5eda52..9b25dfb 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeState.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@Backing(type="int") @JavaDerive(toString=true) @VintfStability
+enum FadeState {
+ FADE_STATE_DISABLED,
+ FADE_STATE_ENABLED_DEFAULT,
}
diff --git a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/IAudioControl.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/IAudioControl.aidl
index ffd575d..fe39f92 100644
--- a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/IAudioControl.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/IAudioControl.aidl
@@ -12,6 +12,34 @@
* 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.
+ *//**
+ * Important note on Metadata:
+ * Metadata qualifies a playback track for an output stream.
+ * This is highly closed to {@link android.media.AudioAttributes}.
+ * It allows to identify the audio stream rendered / requesting / abandonning the focus.
+ *
+ * AudioControl 1.0 was limited to identification through {@code AttributeUsage} listed as
+ * {@code audioUsage} in audio_policy_configuration.xsd.
+ *
+ * Any new OEM needs would not be possible without extension.
+ *
+ * Relying on {@link android.hardware.automotive.audiocontrol.PlaybackTrackMetadata} allows
+ * to use a combination of {@code AttributeUsage}, {@code AttributeContentType} and
+ * {@code AttributeTags} to identify the use case / routing thanks to
+ * {@link android.media.audiopolicy.AudioProductStrategy}.
+ * The belonging to a strategy is deduced by an AOSP logic (in sync at native and java layer).
+ *
+ * IMPORTANT NOTE ON TAGS:
+ * To limit the possibilies and prevent from confusion, we expect the String to follow
+ * a given formalism that will be enforced.
+ *
+ * 1 / By convention, tags shall be a "key=value" pair.
+ * Vendor must namespace their tag's key (for example com.google.strategy=VR) to avoid conflicts.
+ * vendor specific applications and must be prefixed by "VX_". Vendor must
+ *
+ * 2 / Tags reported here shall be the same as the tags used to define a given
+ * {@link android.media.audiopolicy.AudioProductStrategy} and so in
+ * audio_policy_engine_configuration.xml file.
*/
///////////////////////////////////////////////////////////////////////////////
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
@@ -48,4 +76,7 @@
oneway void registerGainCallback(in android.hardware.automotive.audiocontrol.IAudioGainCallback callback);
void setModuleChangeCallback(in android.hardware.automotive.audiocontrol.IModuleChangeCallback callback);
void clearModuleChangeCallback();
+ android.hardware.automotive.audiocontrol.AudioDeviceConfiguration getAudioDeviceConfiguration();
+ List<android.media.audio.common.AudioPort> getOutputMirroringDevices();
+ List<android.hardware.automotive.audiocontrol.AudioZone> getCarAudioZones();
}
diff --git a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/Reasons.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/Reasons.aidl
index c1e22d4..8d66985 100644
--- a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/Reasons.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/Reasons.aidl
@@ -34,14 +34,14 @@
package android.hardware.automotive.audiocontrol;
@Backing(type="int") @VintfStability
enum Reasons {
- FORCED_MASTER_MUTE = 1,
- REMOTE_MUTE = 2,
- TCU_MUTE = 4,
- ADAS_DUCKING = 8,
- NAV_DUCKING = 16,
- PROJECTION_DUCKING = 32,
- THERMAL_LIMITATION = 64,
- SUSPEND_EXIT_VOL_LIMITATION = 128,
- EXTERNAL_AMP_VOL_FEEDBACK = 256,
- OTHER = -2147483648,
+ FORCED_MASTER_MUTE = 0x1,
+ REMOTE_MUTE = 0x2,
+ TCU_MUTE = 0x4,
+ ADAS_DUCKING = 0x8,
+ NAV_DUCKING = 0x10,
+ PROJECTION_DUCKING = 0x20,
+ THERMAL_LIMITATION = 0x40,
+ SUSPEND_EXIT_VOL_LIMITATION = 0x80,
+ EXTERNAL_AMP_VOL_FEEDBACK = 0x100,
+ OTHER = 0x80000000,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.aidl
similarity index 87%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.aidl
index a5eda52..901078c 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+enum RoutingDeviceConfiguration {
+ DEFAULT_AUDIO_ROUTING,
+ DYNAMIC_AUDIO_ROUTING,
+ CONFIGURABLE_AUDIO_ENGINE_ROUTING,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/TransientFadeConfigurationEntry.aidl
similarity index 84%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/TransientFadeConfigurationEntry.aidl
index a5eda52..72b247b 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/TransientFadeConfigurationEntry.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable TransientFadeConfigurationEntry {
+ android.media.audio.common.AudioUsage[] transientUsages;
+ android.hardware.automotive.audiocontrol.AudioFadeConfiguration transientFadeConfiguration;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfiguration.aidl
similarity index 84%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfiguration.aidl
index a5eda52..50b76a1 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfiguration.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable VolumeActivationConfiguration {
+ @nullable String name;
+ List<android.hardware.automotive.audiocontrol.VolumeActivationConfigurationEntry> volumeActivationEntries;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfigurationEntry.aidl
similarity index 74%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfigurationEntry.aidl
index a5eda52..d457e57 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfigurationEntry.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable VolumeActivationConfigurationEntry {
+ android.hardware.automotive.audiocontrol.VolumeInvocationType type = android.hardware.automotive.audiocontrol.VolumeInvocationType.ON_PLAYBACK_CHANGED;
+ int maxActivationVolumePercentage = DEFAULT_MAX_ACTIVATION_VALUE /* 100 */;
+ int minActivationVolumePercentage = DEFAULT_MIN_ACTIVATION_VALUE /* 0 */;
+ const int DEFAULT_MAX_ACTIVATION_VALUE = 100;
+ const int DEFAULT_MIN_ACTIVATION_VALUE = 0;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeGroupConfig.aidl
similarity index 79%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeGroupConfig.aidl
index a5eda52..cc90bbe 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeGroupConfig.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable VolumeGroupConfig {
+ String name;
+ int id = UNASSIGNED_ID /* -1 */;
+ List<android.hardware.automotive.audiocontrol.DeviceToContextEntry> carAudioRoutes;
+ @nullable android.hardware.automotive.audiocontrol.VolumeActivationConfiguration activationConfiguration;
+ const int UNASSIGNED_ID = (-1) /* -1 */;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeInvocationType.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeInvocationType.aidl
index a5eda52..8ce8491 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeInvocationType.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.audiocontrol;
+@Backing(type="int") @JavaDerive(toString=true) @VintfStability
+enum VolumeInvocationType {
+ ON_PLAYBACK_CHANGED,
+ ON_SOURCE_CHANGED,
+ ON_BOOT,
}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.aidl
new file mode 100644
index 0000000..9b5e724
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.aidl
@@ -0,0 +1,48 @@
+/*
+ * 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.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.RoutingDeviceConfiguration;
+
+/**
+ * Use to configure audio configurations at boot up time.
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable AudioDeviceConfiguration {
+ /**
+ * Use to configure audio device routing mechanism
+ */
+ RoutingDeviceConfiguration routingConfig;
+
+ /**
+ * Use to configure core audio volume usage in car audio service
+ */
+ boolean useCoreAudioVolume;
+
+ /**
+ * Use to determine if HAL ducking signal should be sent to audio control HAL from car audio
+ * service
+ */
+ boolean useHalDuckingSignals;
+
+ /**
+ * Use to determine if HAL volume signal should be sent to audio control HAL from car audio
+ * service
+ */
+ boolean useCarVolumeGroupMuting;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioFadeConfiguration.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioFadeConfiguration.aidl
new file mode 100644
index 0000000..d3181da
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioFadeConfiguration.aidl
@@ -0,0 +1,118 @@
+/*
+ * 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.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.FadeConfiguration;
+import android.hardware.automotive.audiocontrol.FadeState;
+import android.media.audio.common.AudioAttributes;
+import android.media.audio.common.AudioContentType;
+import android.media.audio.common.AudioUsage;
+
+/**
+ * Encapsulates the audio fade configuration info
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable AudioFadeConfiguration {
+ /**
+ * Default fade in duration
+ */
+ const long DEFAULT_FADE_IN_DURATION_MS = 1000;
+
+ /**
+ * Default fade out duration
+ */
+ const long DEFAULT_FADE_OUT_DURATION_MS = 2000;
+
+ /**
+ * Default delay for fade in offenders
+ */
+ const long DEFAULT_DELAY_FADE_IN_OFFENDERS_MS = 2000;
+
+ /**
+ * Audio configuration name, use for debugging purposes
+ */
+ String name;
+
+ /**
+ * Audio configuration state
+ */
+ FadeState fadeState;
+
+ /**
+ * Fade in duration in milliseconds
+ *
+ * <p>Use to construct the default fade in configuration. This can be overwritten for different
+ * attributes/usages by passing a list of fade-in configuration,
+ * see {@code #fadeInConfigurations}
+ */
+ long fadeInDurationMs = DEFAULT_FADE_IN_DURATION_MS;
+
+ /**
+ * Fade out duration in milliseconds
+ *
+ * <p>Use to construct the default fade out configuration. This can be overwritten for different
+ * attributes/usages by passing a list of fade-out configuration,
+ * see {@code #fadeOutConfigurations}
+ */
+ long fadeOutDurationMs = DEFAULT_FADE_OUT_DURATION_MS;
+
+ /**
+ * Fade in delayed duration for audio focus offender in milliseconds
+ */
+ long fadeInDelayedForOffendersMs = DEFAULT_DELAY_FADE_IN_OFFENDERS_MS;
+
+ /**
+ * List of audio attribute usage that should be faded using the parameters in
+ * this configuration.
+ *
+ *<p>If the list is empty car audio service will overwrite the list for the confgiruation with
+ * default usages, e.g. {AudioUsage#MEDIA, AudioUsage#GAME}
+ */
+ AudioUsage[] fadeableUsages;
+
+ /**
+ * Optional list of audio attribute content types that should not be faded.
+ *
+ **<p>The list can be empty in cases where there are no unfadeable content types.
+ *
+ *<p>If the list is not set car audio service will overwrite the list for the confgiruation
+ * with default content type, e.g. {AudioContentType#SPEECH}.
+ */
+ @nullable AudioContentType[] unfadeableContentTypes;
+
+ /**
+ * List of audio attribute that should not be faded.
+ *
+ *<p>The list can be empty in cases where there are no unfadeable attributes
+ */
+ List<AudioAttributes> unfadableAudioAttributes;
+
+ /**
+ * List of fade out configutions which should apply to this audio fade configurations
+ *
+ *<p>The list can be empty in cases where there are no fade out configurations.
+ */
+ List<FadeConfiguration> fadeOutConfigurations;
+
+ /**
+ * List of fade in configutions which should apply to this audio fade configurations
+ *
+ *<p>The list can be empty in cases where there are no fade out configurations
+ */
+ List<FadeConfiguration> fadeInConfigurations;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZone.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZone.aidl
new file mode 100644
index 0000000..c90bcfd
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZone.aidl
@@ -0,0 +1,74 @@
+/*
+ * 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.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.AudioZoneConfig;
+import android.hardware.automotive.audiocontrol.AudioZoneContext;
+import android.media.audio.common.AudioPort;
+
+/**
+ * Encapsulates the audio configurations for each audio zone
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable AudioZone {
+ /**
+ * Value indicating the primary audio zone
+ */
+ const int PRIMARY_AUDIO_ZONE = 0;
+
+ /**
+ * Value indicating the occupant zone is not assigned.
+ */
+ const int UNASSIGNED_OCCUPANT = -1;
+
+ /**
+ * Audio zone name, only use for debug purposes.
+ *
+ * <p>If present it must be non-empty otherwise car audio service will construct a name
+ * based on audio zone id.
+ */
+ String name;
+
+ /**
+ * Audio zone id use to distiguish between the different audio zones for
+ * volume management, fade, and min/max activation management.
+ */
+ int id;
+
+ /**
+ * Occupant zone id that should be mapped to this audio zone.
+ *
+ * <p>For audio zones not mapped to an occupant zone use UNASSIGNED_OCCUPANT
+ */
+ int occupantZoneId = UNASSIGNED_OCCUPANT;
+
+ /**
+ * Car audio context which can be used in the audio zone
+ */
+ AudioZoneContext audioZoneContext;
+
+ /**
+ * List of car audio configurations
+ */
+ List<AudioZoneConfig> audioZoneConfigs;
+
+ /**
+ * List of input audio devices used for this zone
+ */
+ List<AudioPort> inputAudioDevices;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneConfig.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneConfig.aidl
new file mode 100644
index 0000000..6822da5
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneConfig.aidl
@@ -0,0 +1,51 @@
+/*
+ * 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.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.AudioZoneFadeConfiguration;
+import android.hardware.automotive.audiocontrol.VolumeGroupConfig;
+
+/**
+ * Encapsulates the audio zone config information
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable AudioZoneConfig {
+ /**
+ * Audio zone config name
+ *
+ * <p>Must be non-empty and unique among the configurations within a zone.
+ */
+ String name;
+
+ /**
+ * Determines if the audio configuration is the default configuration.
+ *
+ * <p>There can only be a single default configuration per zone.
+ */
+ boolean isDefault;
+
+ /**
+ * List car volume group that should be managed within this configuration
+ */
+ List<VolumeGroupConfig> volumeGroups;
+
+ /**
+ * Car audio zone fade configuration
+ */
+ @nullable AudioZoneFadeConfiguration fadeConfiguration;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneContext.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneContext.aidl
new file mode 100644
index 0000000..390cb09
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneContext.aidl
@@ -0,0 +1,34 @@
+/*
+ * 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.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.AudioZoneContextInfo;
+
+/**
+ * Encapsulates the list of car audio context info definitions
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable AudioZoneContext {
+ /**
+ * List of car audio context info.
+ *
+ * <p>The list must include all audio attributes usages currently supported so that all audio
+ * attribute usages can be routed for each car audio configuration.
+ */
+ List<AudioZoneContextInfo> audioContextInfos;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.aidl
new file mode 100644
index 0000000..0ca425c
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.aidl
@@ -0,0 +1,54 @@
+/*
+ * 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.automotive.audiocontrol;
+
+import android.media.audio.common.AudioAttributes;
+
+/**
+ * Encapsulates groups of audio attributes which should be managed together.
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable AudioZoneContextInfo {
+ /**
+ * Value indicating the context info id is not assigned.
+ */
+ const int UNASSIGNED_CONTEXT_ID = -1;
+
+ /**
+ * Context name which can be used to map the info to an audio route
+ * management as described in each audio configuration.
+ *
+ * <P>Name must be non-empty and unique among all audio context info within the same
+ * {@link android.hardware.automotive.audiocontrol.AudioZoneContext} container.
+ */
+ String name;
+
+ /**
+ * Used in car audio service to manage the info
+ *
+ * <P>Must be non-negative integer if assigned, or UNASSIGNED_CONTEXT_ID otherwise. If using
+ * configurable audio policy engine audio routing with multi-zone configurations the value must
+ * be assigned.
+ */
+ int id = UNASSIGNED_CONTEXT_ID;
+
+ /**
+ * List of audio attributes that belong to the context
+ */
+ List<AudioAttributes> audioAttributes;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneFadeConfiguration.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneFadeConfiguration.aidl
new file mode 100644
index 0000000..a604214
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/AudioZoneFadeConfiguration.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.
+ */
+
+package android.hardware.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.AudioFadeConfiguration;
+import android.hardware.automotive.audiocontrol.TransientFadeConfigurationEntry;
+
+/**
+ * Encapsulates the audio zone fade configuration
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable AudioZoneFadeConfiguration {
+ /**
+ * Defines the default fade configuration
+ */
+ AudioFadeConfiguration defaultConfiguration;
+
+ /**
+ * List of transient fade configurations.
+ *
+ * <p>The list can be empty if the fade configuration for the zone does not have transient fade
+ * configurations.
+ */
+ List<TransientFadeConfigurationEntry> transientConfiguration;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/DeviceToContextEntry.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/DeviceToContextEntry.aidl
new file mode 100644
index 0000000..bcb5ee7
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/DeviceToContextEntry.aidl
@@ -0,0 +1,47 @@
+/*
+ * 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.automotive.audiocontrol;
+
+import android.media.audio.common.AudioPort;
+
+/**
+ * Encapsulates the audio context that should be route to particular device
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable DeviceToContextEntry {
+ /**
+ * List of audio context names that should be routed to the audio device.
+ *
+ * <p>The names must match a {@link AudioZoneContextInfo#name} in the corresponding
+ * {@link AudioZone#audioZoneContext).
+ *
+ * <p>Within a {@link AudioZoneConfig} a context name must not repeat among the different
+ * {@link VolumeGroupConfig}. The value can repeat among different {@link AudioZoneConfig}
+ * within a {@link AudioZone}.
+ */
+ List<String> contextNames;
+
+ /**
+ * Audio port where contexts should be routed.
+ *
+ * <p>For dynamic devices (OUT_HEADSET, OUT_HEADPHONE, etc.) , the audio device address can be
+ * omitted since the information will be obtained at run time when the device is
+ * connected/enabled.
+ */
+ AudioPort device;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/FadeConfiguration.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/FadeConfiguration.aidl
new file mode 100644
index 0000000..e700d6c
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/FadeConfiguration.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.
+ */
+
+package android.hardware.automotive.audiocontrol;
+
+import android.media.audio.common.AudioAttributes;
+import android.media.audio.common.AudioUsage;
+
+/**
+ * Encapsulates the in/out fade configuration
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable FadeConfiguration {
+ /**
+ * Fade duration in milliseconds
+ */
+ long fadeDurationMillis;
+
+ @JavaDerive(equals=true, toString=true)
+ @VintfStability
+ union AudioAttributesOrUsage {
+ AudioAttributes fadeAttribute;
+ AudioUsage usage;
+ }
+
+ /**
+ * Audio attribute or usage that should be impacted by the fade out duration
+ * {@code #fadeDurationMillis}
+ */
+ AudioAttributesOrUsage audioAttributesOrUsage;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/FadeState.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/FadeState.aidl
new file mode 100644
index 0000000..346caae
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/FadeState.aidl
@@ -0,0 +1,34 @@
+/*
+ * 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.automotive.audiocontrol;
+
+/**
+ * Encapsulates the audio fade configuration state
+ */
+@VintfStability
+@Backing(type="int")
+@JavaDerive(toString=true)
+enum FadeState {
+ /**
+ * Fade configuration should be disabled
+ */
+ FADE_STATE_DISABLED,
+ /**
+ * Fade configuration should be enabled by default
+ */
+ FADE_STATE_ENABLED_DEFAULT,
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/IAudioControl.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/IAudioControl.aidl
index 9564efc..1202b4c 100644
--- a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/IAudioControl.aidl
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/IAudioControl.aidl
@@ -46,14 +46,17 @@
* audio_policy_engine_configuration.xml file.
*/
import android.hardware.audio.common.PlaybackTrackMetadata;
+import android.hardware.automotive.audiocontrol.AudioDeviceConfiguration;
import android.hardware.automotive.audiocontrol.AudioFocusChange;
import android.hardware.automotive.audiocontrol.AudioGainConfigInfo;
+import android.hardware.automotive.audiocontrol.AudioZone;
import android.hardware.automotive.audiocontrol.DuckingInfo;
import android.hardware.automotive.audiocontrol.IAudioGainCallback;
import android.hardware.automotive.audiocontrol.IFocusListener;
import android.hardware.automotive.audiocontrol.IModuleChangeCallback;
import android.hardware.automotive.audiocontrol.MutingInfo;
import android.hardware.automotive.audiocontrol.Reasons;
+import android.media.audio.common.AudioPort;
/**
* Interacts with the car's audio subsystem to manage audio sources and volumes
@@ -206,4 +209,41 @@
* @throws EX_UNSUPPORTED_OPERATION if dynamic audio configs are not supported.
*/
void clearModuleChangeCallback();
+
+ /**
+ * Returns the audio device configurations that should be used to configure
+ * the car audio service audio management.
+ *
+ * <p>If this method is not supported, car audio service will attempt to configure the car audio
+ * service properties based on previously supported mechanisms.
+ *
+ * <p>If the returned value contains the
+ * {@link RoutingDeviceConfiguration#DEFAULT_AUDIO_ROUTING} value, the car audio service will
+ * attempt to configure audio routing based on the mechanism previously supported by car audio
+ * service (e.g. car audio configuration file). Otherwise, the {@link #getCarAudioZones()}
+ * API must return valid audio zone(s) configuration(s) for the device.
+ *
+ */
+ AudioDeviceConfiguration getAudioDeviceConfiguration();
+
+ /**
+ * Returns the list of audio devices that can be used for mirroring between different audio
+ * zones.
+ *
+ * @throws EX_UNSUPPORTED_OPERATION if mirroring devices are not supported.
+ */
+ List<AudioPort> getOutputMirroringDevices();
+
+ /**
+ * List of audio zones used to configure car audio service at bootup.
+ *
+ * <p>If the returned value from {@link #getAudioDeviceConfiguration()} contains
+ * {@link RoutingDeviceConfiguration#DEFAULT_AUDIO_ROUTING} value, the car audio service will
+ * attempt to configure the audio routing based on the mechanism previously supported by
+ * car audio service (e.g. car audio configuration file). Otherwise, this method must return
+ * valid audio zone(s) configuration(s) for the device.
+ *
+ * @throws EX_UNSUPPORTED_OPERATION if audio zone configuration are not supported.
+ */
+ List<AudioZone> getCarAudioZones();
}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.aidl
new file mode 100644
index 0000000..2d17540
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.aidl
@@ -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.
+ */
+
+package android.hardware.automotive.audiocontrol;
+
+/**
+ * Use to configure audio device routing mechanism
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+enum RoutingDeviceConfiguration {
+ /**
+ * Use to indicate that audio should be managed based on previously supportec mechamisms in
+ * car audio service.
+ *
+ * <p>If this used then the API to setup the audio zones can just throw
+ * {@code EX_UNSUPPORTED_OPERATION} if called.
+ */
+ DEFAULT_AUDIO_ROUTING,
+ /**
+ * Use to indicate that audio should be managed using the dynamic audio
+ * policy as setup by car audio service using the setup configuration from
+ * the {@Link android.hardware.automotive.audiocontrol.AudioZone}'s info from audio control HAL.
+ *
+ * <p>If this used then the APIs to setup the audio zones must return a valid audio zone
+ * configuration for the device.
+ */
+ DYNAMIC_AUDIO_ROUTING,
+ /**
+ * Use to indicate that audio should be managed using the core audio
+ * routing as setup by car audio service using the setup configuration from
+ * the {@Link android.hardware.automotive.audiocontrol.AudioZone}'s info from audio control HAL
+ * and the information contained within the configurable audio policy engine.
+ *
+ * <p>If this used then the APIs to setup the audio zone(s) must return valid audio zone
+ * configuration(s) for the device.
+ */
+ CONFIGURABLE_AUDIO_ENGINE_ROUTING,
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/TransientFadeConfigurationEntry.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/TransientFadeConfigurationEntry.aidl
new file mode 100644
index 0000000..1984236
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/TransientFadeConfigurationEntry.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.
+ */
+
+package android.hardware.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.AudioFadeConfiguration;
+import android.media.audio.common.AudioUsage;
+
+/**
+ * Encapsulates the transient audio fade configuration entry.
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable TransientFadeConfigurationEntry {
+ /**
+ * List of audio usages gainers that should be used for this configuration entry.
+ */
+ AudioUsage[] transientUsages;
+
+ /**
+ * Defines the transient fade configuration that should be used for the focus interaction with
+ * the usages defined in {@link #transientUsages}
+ */
+ AudioFadeConfiguration transientFadeConfiguration;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeActivationConfiguration.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeActivationConfiguration.aidl
new file mode 100644
index 0000000..edc5f60
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeActivationConfiguration.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.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.VolumeActivationConfigurationEntry;
+
+/**
+ * Use to configure audio activiations, only used at boot up time.
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable VolumeActivationConfiguration {
+ /**
+ * Configuration name used for debugging purposes to identify config used.
+ *
+ * <p>Is present, it must be non-empty and unique for all volume acvitations, otherwise
+ * car audio service will construct one based on audio zone, configuration and volume group
+ * info.
+ */
+ @nullable String name;
+
+ /**
+ * List of activation configurations.
+ *
+ * <P>Car audio service currently only uses the first activation config on the list.
+ */
+ List<VolumeActivationConfigurationEntry> volumeActivationEntries;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeActivationConfigurationEntry.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeActivationConfigurationEntry.aidl
new file mode 100644
index 0000000..7072a2c
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeActivationConfigurationEntry.aidl
@@ -0,0 +1,63 @@
+/*
+ * 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.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.VolumeInvocationType;
+
+/**
+ * Audio activiation volume configuration entry.
+ *
+ * <p> The entry can defined both the minimum and maximum activation values or only one. The latter
+ * allows activations to occur only on the minimum value or maximum value as configured.
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable VolumeActivationConfigurationEntry {
+ /**
+ * Default maximum activation value.
+ */
+ const int DEFAULT_MAX_ACTIVATION_VALUE = 100;
+
+ /**
+ * Default minimum activation value.
+ */
+ const int DEFAULT_MIN_ACTIVATION_VALUE = 0;
+
+ /**
+ * Activation type, should be one of:
+ * ON_PLAYBACK_CHANGED, ON_SOURCE_CHANGED, ON_BOOT
+ */
+ VolumeInvocationType type = VolumeInvocationType.ON_PLAYBACK_CHANGED;
+
+ /**
+ * Max activation percentage between {@code DEFAULT_MIN_ACTIVATION_VALUE} to
+ * {@code DEFAULT_MAX_ACTIVATION_VALUE} percen.
+ *
+ * <p>The value should be {@code DEFAULT_MAX_ACTIVATION_VALUE} if max activation should not
+ * apply.
+ */
+ int maxActivationVolumePercentage = DEFAULT_MAX_ACTIVATION_VALUE;
+
+ /**
+ * Min activation percentage between {@code DEFAULT_MIN_ACTIVATION_VALUE} to
+ * {@code DEFAULT_MAX_ACTIVATION_VALUE} percent.
+ *
+ * <p>The value should be {@code DEFAULT_MIN_ACTIVATION_VALUE} if min activation should not
+ * apply.
+ */
+ int minActivationVolumePercentage = DEFAULT_MIN_ACTIVATION_VALUE;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeGroupConfig.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeGroupConfig.aidl
new file mode 100644
index 0000000..7e3bc60
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeGroupConfig.aidl
@@ -0,0 +1,59 @@
+/*
+ * 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.automotive.audiocontrol;
+
+import android.hardware.automotive.audiocontrol.DeviceToContextEntry;
+import android.hardware.automotive.audiocontrol.VolumeActivationConfiguration;
+
+/**
+ * Encapsulates the audio volume grouping for audio zone config.
+ */
+@JavaDerive(equals=true, toString=true)
+@VintfStability
+parcelable VolumeGroupConfig {
+ /**
+ * Value indicating the volume group is not assigned an ID.
+ */
+ const int UNASSIGNED_ID = -1;
+
+ /**
+ * Audio zone group name.
+ *
+ * <p>Must be non-empty if using configurable audio policy engine volume management, see
+ * {@code AudioDeviceConfiguration#useCoreAudioVolume} for details.
+ */
+ String name;
+
+ /**
+ * Audio zone group id.
+ *
+ * <p>Must be set if using configurable audio policy engine volume management, can be
+ * {@code #UNASSIGNED_ID} otherwise. See {@code AudioDeviceConfiguration#useCoreAudioVolume}
+ * for details.
+ */
+ int id = UNASSIGNED_ID;
+
+ /**
+ * Entries of audio device to audio context that are managed similarly for this volume group.
+ */
+ List<DeviceToContextEntry> carAudioRoutes;
+
+ /**
+ * Optional volume activation configuration that should be used for this volume group.
+ */
+ @nullable VolumeActivationConfiguration activationConfiguration;
+}
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeInvocationType.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeInvocationType.aidl
new file mode 100644
index 0000000..0323505
--- /dev/null
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/VolumeInvocationType.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.
+ */
+
+package android.hardware.automotive.audiocontrol;
+
+/**
+ * Audio activiation type which can be used to activate the min/max
+ * volume changes.
+ */
+@VintfStability
+@Backing(type="int")
+@JavaDerive(toString=true)
+enum VolumeInvocationType {
+ /**
+ * Invocation of volume group activation performed at every playback change.
+ */
+ ON_PLAYBACK_CHANGED,
+ /**
+ * Invocation of volume group activation performed only once at playback after first playback
+ * for a client (app/service UID).
+ */
+ ON_SOURCE_CHANGED,
+ /**
+ * Invocation of volume group activation in perform only at playback once after boot up.
+ */
+ ON_BOOT,
+}
diff --git a/automotive/audiocontrol/aidl/default/Android.bp b/automotive/audiocontrol/aidl/default/Android.bp
index fd7e167..1c11c989 100644
--- a/automotive/audiocontrol/aidl/default/Android.bp
+++ b/automotive/audiocontrol/aidl/default/Android.bp
@@ -31,13 +31,19 @@
"latest_android_hardware_audio_common_ndk_shared",
"latest_android_hardware_automotive_audiocontrol_ndk_shared",
"powerpolicyclient_defaults",
+ "car.audio.configuration.xsd.default",
+ "car.fade.configuration.xsd.default",
],
shared_libs: [
"android.hardware.audio.common@7.0-enums",
- "libbase",
"libbinder_ndk",
"libcutils",
"liblog",
+ "libbase",
+ "libxml2",
+ "libutils",
+ "android.hardware.audiocontrol.internal",
+ "libaudio_aidl_conversion_common_ndk",
],
srcs: [
"AudioControl.cpp",
diff --git a/automotive/audiocontrol/aidl/default/AudioControl.cpp b/automotive/audiocontrol/aidl/default/AudioControl.cpp
index 7e7e145..9ae422b 100644
--- a/automotive/audiocontrol/aidl/default/AudioControl.cpp
+++ b/automotive/audiocontrol/aidl/default/AudioControl.cpp
@@ -19,6 +19,7 @@
#include "AudioControl.h"
+#include <aidl/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.h>
#include <aidl/android/hardware/automotive/audiocontrol/AudioFocusChange.h>
#include <aidl/android/hardware/automotive/audiocontrol/DuckingInfo.h>
#include <aidl/android/hardware/automotive/audiocontrol/IFocusListener.h>
@@ -27,8 +28,8 @@
#include <android-base/parsebool.h>
#include <android-base/parseint.h>
#include <android-base/strings.h>
-
#include <android_audio_policy_configuration_V7_0-enums.h>
+
#include <private/android_filesystem_config.h>
#include <numeric>
@@ -41,16 +42,18 @@
using ::android::base::ParseBool;
using ::android::base::ParseBoolResult;
using ::android::base::ParseInt;
+using ::android::hardware::audiocontrol::internal::CarAudioConfigurationXmlConverter;
using ::std::shared_ptr;
using ::std::string;
-namespace xsd {
-using namespace ::android::audio::policy::configuration::V7_0;
+namespace converter {
+using namespace ::android::hardware::audiocontrol::internal;
}
+namespace api = aidl::android::hardware::automotive::audiocontrol;
+namespace xsd = ::android::audio::policy::configuration::V7_0;
+
namespace {
-const float kLowerBound = -1.0f;
-const float kUpperBound = 1.0f;
bool checkCallerHasWritePermissions(int fd) {
// Double check that's only called by root - it should be be blocked at debug() level,
// but it doesn't hurt to make sure...
@@ -62,7 +65,7 @@
}
bool isValidValue(float value) {
- return (value >= kLowerBound) && (value <= kUpperBound);
+ return (value >= -1.0f) && (value <= 1.0f);
}
bool safelyParseInt(string s, int* out) {
@@ -71,6 +74,53 @@
}
return true;
}
+
+std::string formatDump(const std::string& input) {
+ const char kSpacer = ' ';
+ std::string output;
+ int indentLevel = 0;
+ bool newLine = false;
+
+ for (char c : input) {
+ switch (c) {
+ case '{':
+ if (!newLine) {
+ output += '\n';
+ }
+ newLine = true;
+ indentLevel++;
+ for (int i = 0; i < indentLevel; ++i) {
+ output += kSpacer;
+ }
+ break;
+ case '}':
+ if (!newLine) {
+ output += '\n';
+ }
+ newLine = true;
+ indentLevel--;
+ for (int i = 0; i < indentLevel; ++i) {
+ output += kSpacer;
+ }
+ break;
+ case ',':
+ if (!newLine) {
+ output += '\n';
+ }
+ newLine = true;
+ for (int i = 0; i < indentLevel; ++i) {
+ output += kSpacer;
+ }
+ break;
+ default:
+ newLine = false;
+ output += c;
+ }
+ }
+
+ return output;
+}
+
} // namespace
namespace {
@@ -90,6 +140,9 @@
using ::aidl::android::media::audio::common::AudioProfile;
using ::aidl::android::media::audio::common::PcmType;
+const static std::string kAudioConfigFile = "/vendor/etc/car_audio_configuration.xml";
+const static std::string kFadeConfigFile = "/vendor/etc/car_audio_fade_configuration.xml";
+
// reuse common code artifacts
void fillProfile(const std::vector<int32_t>& channelLayouts,
const std::vector<int32_t>& sampleRates, AudioProfile* profile) {
@@ -162,6 +215,12 @@
}
} // namespace
+AudioControl::AudioControl() : AudioControl(kAudioConfigFile, kFadeConfigFile) {}
+
+AudioControl::AudioControl(const std::string& carAudioConfig, const std::string& audioFadeConfig)
+ : mCarAudioConfigurationConverter(std::make_shared<CarAudioConfigurationXmlConverter>(
+ carAudioConfig, audioFadeConfig)) {}
+
ndk::ScopedAStatus AudioControl::registerFocusListener(
const shared_ptr<IFocusListener>& in_listener) {
LOG(DEBUG) << "registering focus listener";
@@ -245,14 +304,23 @@
static inline std::string toString(const std::vector<aidl_type>& in_values) {
return std::accumulate(std::begin(in_values), std::end(in_values), std::string{},
[](const std::string& ls, const aidl_type& rs) {
- return ls + (ls.empty() ? "" : ",") + rs.toString();
+ return ls + (ls.empty() ? "" : ", ") + rs.toString();
});
}
template <typename aidl_enum_type>
static inline std::string toEnumString(const std::vector<aidl_enum_type>& in_values) {
return std::accumulate(std::begin(in_values), std::end(in_values), std::string{},
[](const std::string& ls, const aidl_enum_type& rs) {
- return ls + (ls.empty() ? "" : ",") + toString(rs);
+ return ls + (ls.empty() ? "" : ", ") + toString(rs);
+ });
+}
+
+template <typename aidl_type>
+static inline std::string toString(const std::vector<std::optional<aidl_type>>& in_values) {
+ return std::accumulate(std::begin(in_values), std::end(in_values), std::string{},
+ [](const std::string& ls, const std::optional<aidl_type>& rs) {
+ return ls + (ls.empty() ? "" : ", ") +
+ (rs.has_value() ? rs.value().toString() : "empty");
});
}
@@ -309,6 +377,50 @@
return ndk::ScopedAStatus::ok();
}
+ndk::ScopedAStatus AudioControl::getAudioDeviceConfiguration(
+ AudioDeviceConfiguration* audioDeviceConfig) {
+ if (!audioDeviceConfig) {
+ LOG(ERROR) << __func__ << "Audio device configuration must not be null";
+ return ndk::ScopedAStatus::fromStatus(STATUS_UNEXPECTED_NULL);
+ }
+ if (!mCarAudioConfigurationConverter) {
+ return ndk::ScopedAStatus::ok();
+ }
+ const auto& innerDeviceConfig = mCarAudioConfigurationConverter->getAudioDeviceConfiguration();
+ audioDeviceConfig->routingConfig = innerDeviceConfig.routingConfig;
+ audioDeviceConfig->useCoreAudioVolume = innerDeviceConfig.useCoreAudioVolume;
+ audioDeviceConfig->useCarVolumeGroupMuting = innerDeviceConfig.useCarVolumeGroupMuting;
+ audioDeviceConfig->useHalDuckingSignals = innerDeviceConfig.useHalDuckingSignals;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus AudioControl::getOutputMirroringDevices(
+ std::vector<AudioPort>* mirroringDevices) {
+ if (!mirroringDevices) {
+ LOG(ERROR) << __func__ << "Mirroring devices must not be null";
+ return ndk::ScopedAStatus::fromStatus(STATUS_UNEXPECTED_NULL);
+ }
+ if (!mCarAudioConfigurationConverter || !mCarAudioConfigurationConverter->getErrors().empty()) {
+ return ndk::ScopedAStatus::ok();
+ }
+ const auto& innerDevice = mCarAudioConfigurationConverter->getOutputMirroringDevices();
+ mirroringDevices->insert(mirroringDevices->end(), innerDevice.begin(), innerDevice.end());
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus AudioControl::getCarAudioZones(std::vector<AudioZone>* audioZones) {
+ if (!audioZones) {
+ LOG(ERROR) << __func__ << "Audio zones must not be null";
+ return ndk::ScopedAStatus::fromStatus(STATUS_UNEXPECTED_NULL);
+ }
+ if (!mCarAudioConfigurationConverter || !mCarAudioConfigurationConverter->getErrors().empty()) {
+ return ndk::ScopedAStatus::ok();
+ }
+ const auto& innerZones = mCarAudioConfigurationConverter->getAudioZones();
+ audioZones->insert(audioZones->end(), innerZones.begin(), innerZones.end());
+ return ndk::ScopedAStatus::ok();
+}
+
binder_status_t AudioControl::dump(int fd, const char** args, uint32_t numArgs) {
if (numArgs == 0) {
return dumpsys(fd);
@@ -342,6 +454,25 @@
dprintf(fd, "Focus listener registered\n");
}
dprintf(fd, "AudioGainCallback %sregistered\n", (mAudioGainCallback == nullptr ? "NOT " : ""));
+
+ AudioDeviceConfiguration configuration;
+ if (getAudioDeviceConfiguration(&configuration).isOk()) {
+ dprintf(fd, "AudioDeviceConfiguration: %s\n", configuration.toString().c_str());
+ }
+ std::vector<AudioZone> audioZones;
+ if (getCarAudioZones(&audioZones).isOk()) {
+ dprintf(fd, "Audio zones count: %zu\n", audioZones.size());
+ for (const auto& zone : audioZones) {
+ dprintf(fd, "AudioZone: %s\n", formatDump(zone.toString()).c_str());
+ }
+ }
+ std::vector<AudioPort> mirroringDevices;
+ if (getOutputMirroringDevices(&mirroringDevices).isOk()) {
+ dprintf(fd, "Mirroring devices count: %zu\n", mirroringDevices.size());
+ for (const auto& device : mirroringDevices) {
+ dprintf(fd, "Mirroring device: %s\n", formatDump(device.toString()).c_str());
+ }
+ }
return STATUS_OK;
}
diff --git a/automotive/audiocontrol/aidl/default/AudioControl.h b/automotive/audiocontrol/aidl/default/AudioControl.h
index 7eca446..0425570 100644
--- a/automotive/audiocontrol/aidl/default/AudioControl.h
+++ b/automotive/audiocontrol/aidl/default/AudioControl.h
@@ -35,13 +35,17 @@
#include <aidl/android/media/audio/common/AudioIoFlags.h>
#include <aidl/android/media/audio/common/AudioOutputFlags.h>
+#include "converter/include/CarAudioConfigurationXmlConverter.h"
+
namespace aidl::android::hardware::automotive::audiocontrol {
-namespace audiohalcommon = ::aidl::android::hardware::audio::common;
namespace audiomediacommon = ::aidl::android::media::audio::common;
+namespace audiohalcommon = ::aidl::android::hardware::audio::common;
class AudioControl : public BnAudioControl {
public:
+ AudioControl();
+ AudioControl(const std::string& carAudioConfig, const std::string& audioFadeConfig);
ndk::ScopedAStatus onAudioFocusChange(const std::string& in_usage, int32_t in_zoneId,
AudioFocusChange in_focusChange) override;
ndk::ScopedAStatus onDevicesToDuckChange(
@@ -63,6 +67,11 @@
ndk::ScopedAStatus setModuleChangeCallback(
const std::shared_ptr<IModuleChangeCallback>& in_callback) override;
ndk::ScopedAStatus clearModuleChangeCallback() override;
+ ndk::ScopedAStatus getAudioDeviceConfiguration(
+ AudioDeviceConfiguration* audioDeviceConfig) override;
+ ndk::ScopedAStatus getOutputMirroringDevices(
+ std::vector<::aidl::android::media::audio::common::AudioPort>* mirrorDevices) override;
+ ndk::ScopedAStatus getCarAudioZones(std::vector<AudioZone>* audioZones) override;
binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
@@ -81,6 +90,9 @@
std::shared_ptr<IModuleChangeCallback> mModuleChangeCallback = nullptr;
+ std::shared_ptr<::android::hardware::audiocontrol::internal::CarAudioConfigurationXmlConverter>
+ mCarAudioConfigurationConverter = nullptr;
+
binder_status_t cmdHelp(int fd) const;
binder_status_t cmdRequestFocus(int fd, const char** args, uint32_t numArgs);
binder_status_t cmdAbandonFocus(int fd, const char** args, uint32_t numArgs);
diff --git a/automotive/audiocontrol/aidl/default/audiocontrol-default.xml b/automotive/audiocontrol/aidl/default/audiocontrol-default.xml
index bcb5669..ffef7fc 100644
--- a/automotive/audiocontrol/aidl/default/audiocontrol-default.xml
+++ b/automotive/audiocontrol/aidl/default/audiocontrol-default.xml
@@ -1,7 +1,7 @@
<manifest version="2.0" type="device">
<hal format="aidl">
<name>android.hardware.automotive.audiocontrol</name>
- <version>4</version>
+ <version>5</version>
<fqname>IAudioControl/default</fqname>
</hal>
</manifest>
diff --git a/automotive/audiocontrol/aidl/default/converter/Android.bp b/automotive/audiocontrol/aidl/default/converter/Android.bp
new file mode 100644
index 0000000..c00afa2
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/Android.bp
@@ -0,0 +1,56 @@
+// 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 {
+ // 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_library {
+ name: "android.hardware.audiocontrol.internal",
+ vendor: true,
+ srcs: [
+ "src/CarAudioConfigurationXmlConverter.cpp",
+ "src/CarAudioConfigurationUtils.cpp",
+ ],
+ export_include_dirs: [
+ "include",
+ ],
+ defaults: [
+ "latest_android_hardware_audio_common_ndk_static",
+ "latest_android_hardware_automotive_audiocontrol_ndk_shared",
+ "car.audio.configuration.xsd.default",
+ "car.fade.configuration.xsd.default",
+ "aidlaudioservice_defaults",
+ "latest_android_media_audio_common_types_ndk_static",
+ ],
+ shared_libs: [
+ "libbase",
+ "libutils",
+ "libmedia_helper",
+ "car.audio.configuration.xsd.default",
+ "car.fade.configuration.xsd.default",
+ "liblog",
+ ],
+ static_libs: [
+ "libaudio_aidl_conversion_common_ndk_cpp",
+ ],
+ header_libs: [
+ "libaudio_system_headers",
+ ],
+}
diff --git a/automotive/audiocontrol/aidl/default/converter/include/CarAudioConfigurationUtils.h b/automotive/audiocontrol/aidl/default/converter/include/CarAudioConfigurationUtils.h
new file mode 100644
index 0000000..29fec0b
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/include/CarAudioConfigurationUtils.h
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+#ifndef ANDROID_HARDWARE_AUDIOCONTROL_INTERNAL_CONFIGURATION_UTILS_H
+#define ANDROID_HARDWARE_AUDIOCONTROL_INTERNAL_CONFIGURATION_UTILS_H
+
+#include <string>
+
+#include <aidl/android/hardware/automotive/audiocontrol/AudioZoneContext.h>
+#include <aidl/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.h>
+
+namespace android {
+namespace hardware {
+namespace audiocontrol {
+namespace internal {
+
+::aidl::android::hardware::automotive::audiocontrol::AudioZoneContext getDefaultCarAudioContext();
+
+} // namespace internal
+} // namespace audiocontrol
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_AUDIOCONTROL_INTERNAL_CONFIGURATION_UTILS_H
diff --git a/automotive/audiocontrol/aidl/default/converter/include/CarAudioConfigurationXmlConverter.h b/automotive/audiocontrol/aidl/default/converter/include/CarAudioConfigurationXmlConverter.h
new file mode 100644
index 0000000..ed29172
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/include/CarAudioConfigurationXmlConverter.h
@@ -0,0 +1,87 @@
+/*
+ * 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.
+ */
+
+#ifndef MAIN8_CARAUDIOCONFIGURATIONXMLCONVERTER_H
+#define MAIN8_CARAUDIOCONFIGURATIONXMLCONVERTER_H
+
+#include <string>
+
+#include "../include/CarAudioConfigurationUtils.h"
+
+#include <aidl/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.h>
+#include <aidl/android/hardware/automotive/audiocontrol/AudioZone.h>
+#include <aidl/android/hardware/automotive/audiocontrol/AudioZoneContext.h>
+
+namespace android::hardware::automotive::audiocontrol {
+class CarAudioConfigurationType;
+}
+
+namespace android {
+namespace hardware {
+namespace audiocontrol {
+namespace internal {
+
+class CarAudioConfigurationXmlConverter {
+ public:
+ explicit CarAudioConfigurationXmlConverter(const std::string& audioConfigFile,
+ const std::string& fadeConfigFile)
+ : mAudioConfigFile(audioConfigFile), mFadeConfigFile(fadeConfigFile) {
+ init();
+ }
+
+ ::aidl::android::hardware::automotive::audiocontrol::AudioDeviceConfiguration
+ getAudioDeviceConfiguration() const;
+
+ std::vector<::aidl::android::hardware::automotive::audiocontrol::AudioZone> getAudioZones()
+ const;
+ std::vector<::aidl::android::media::audio::common::AudioPort> getOutputMirroringDevices() const;
+
+ const std::string getErrors() const { return mParseErrors; }
+
+ private:
+ void init();
+ void initNonDynamicRouting();
+ void initFadeConfigurations();
+ void initAudioDeviceConfiguration(
+ const ::android::hardware::automotive::audiocontrol::CarAudioConfigurationType&
+ carAudioConfigurationType);
+ void initCarAudioConfigurations(
+ const ::android::hardware::automotive::audiocontrol::CarAudioConfigurationType&
+ carAudioConfigurationType);
+ void parseAudioDeviceConfigurations(
+ const ::android::hardware::automotive::audiocontrol::CarAudioConfigurationType&
+ carAudioConfigurationType);
+
+ const std::string mAudioConfigFile;
+ const std::string mFadeConfigFile;
+ ::aidl::android::hardware::automotive::audiocontrol::AudioDeviceConfiguration
+ mAudioDeviceConfiguration;
+ std::optional<::aidl::android::hardware::automotive::audiocontrol::AudioZoneContext>
+ mAudioZoneContext;
+ std::vector<::aidl::android::hardware::automotive::audiocontrol::AudioZone> mAudioZones;
+ std::vector<::aidl::android::media::audio::common::AudioPort> mOutputMirroringDevices;
+ std::string mParseErrors;
+ std::unordered_map<std::string,
+ ::aidl::android::hardware::automotive::audiocontrol::AudioFadeConfiguration>
+ mFadeConfigurations;
+};
+
+} // namespace internal
+} // namespace audiocontrol
+} // namespace hardware
+} // namespace android
+
+#endif // MAIN8_CARAUDIOCONFIGURATIONXMLCONVERTER_H
diff --git a/automotive/audiocontrol/aidl/default/converter/src/CarAudioConfigurationUtils.cpp b/automotive/audiocontrol/aidl/default/converter/src/CarAudioConfigurationUtils.cpp
new file mode 100644
index 0000000..e2f8191
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/src/CarAudioConfigurationUtils.cpp
@@ -0,0 +1,104 @@
+/*
+ * 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.
+ */
+
+#include <android-base/logging.h>
+
+#include "../include/CarAudioConfigurationUtils.h"
+
+#include <aidl/android/media/audio/common/AudioAttributes.h>
+#include <aidl/android/media/audio/common/AudioUsage.h>
+
+#include <tuple>
+#include <vector>
+
+using ::aidl::android::hardware::automotive::audiocontrol::AudioZoneContext;
+using ::aidl::android::hardware::automotive::audiocontrol::AudioZoneContextInfo;
+
+using aidl::android::media::audio::common::AudioAttributes;
+using aidl::android::media::audio::common::AudioUsage;
+using aidl::android::media::audio::common::AudioUsage::ALARM;
+using aidl::android::media::audio::common::AudioUsage::ANNOUNCEMENT;
+using aidl::android::media::audio::common::AudioUsage::ASSISTANCE_ACCESSIBILITY;
+using aidl::android::media::audio::common::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
+using aidl::android::media::audio::common::AudioUsage::ASSISTANCE_SONIFICATION;
+using aidl::android::media::audio::common::AudioUsage::ASSISTANT;
+using aidl::android::media::audio::common::AudioUsage::CALL_ASSISTANT;
+using aidl::android::media::audio::common::AudioUsage::EMERGENCY;
+using aidl::android::media::audio::common::AudioUsage::GAME;
+using aidl::android::media::audio::common::AudioUsage::MEDIA;
+using aidl::android::media::audio::common::AudioUsage::NOTIFICATION;
+using aidl::android::media::audio::common::AudioUsage::NOTIFICATION_EVENT;
+using aidl::android::media::audio::common::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
+using aidl::android::media::audio::common::AudioUsage::SAFETY;
+using aidl::android::media::audio::common::AudioUsage::UNKNOWN;
+using aidl::android::media::audio::common::AudioUsage::VEHICLE_STATUS;
+using aidl::android::media::audio::common::AudioUsage::VOICE_COMMUNICATION;
+using aidl::android::media::audio::common::AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
+
+namespace android {
+namespace hardware {
+namespace audiocontrol {
+namespace internal {
+
+std::vector<AudioAttributes> createAudioAttributes(const std::vector<AudioUsage>& usages) {
+ std::vector<AudioAttributes> audioAttributes;
+ for (const auto& usage : usages) {
+ AudioAttributes attributes;
+ attributes.usage = usage;
+ audioAttributes.push_back(attributes);
+ }
+ return audioAttributes;
+}
+
+AudioZoneContextInfo createAudioZoneContextInfo(const std::string& name, int id,
+ const std::vector<AudioUsage>& usages) {
+ AudioZoneContextInfo info;
+ info.name = name;
+ info.id = id;
+ info.audioAttributes = createAudioAttributes(usages);
+ return info;
+}
+
+AudioZoneContext createAudioZoneContextInfo(const std::vector<AudioZoneContextInfo>& info) {
+ AudioZoneContext context;
+ context.audioContextInfos.insert(context.audioContextInfos.begin(), info.begin(), info.end());
+ return context;
+}
+
+AudioZoneContext getDefaultCarAudioContext() {
+ // For legacy reasons, context names are lower case here.
+ static const AudioZoneContext kDefaultContext = createAudioZoneContextInfo(
+ {createAudioZoneContextInfo("music", 1, {UNKNOWN, MEDIA, GAME}),
+ createAudioZoneContextInfo("navigation", 2, {ASSISTANCE_NAVIGATION_GUIDANCE}),
+ createAudioZoneContextInfo("voice_command", 3, {ASSISTANCE_ACCESSIBILITY, ASSISTANT}),
+ createAudioZoneContextInfo("call_ring", 4, {NOTIFICATION_TELEPHONY_RINGTONE}),
+ createAudioZoneContextInfo(
+ "call", 5,
+ {VOICE_COMMUNICATION, CALL_ASSISTANT, VOICE_COMMUNICATION_SIGNALLING}),
+ createAudioZoneContextInfo("alarm", 6, {ALARM}),
+ createAudioZoneContextInfo("notification", 7, {NOTIFICATION, NOTIFICATION_EVENT}),
+ createAudioZoneContextInfo("system_sound", 8, {ASSISTANCE_SONIFICATION}),
+ createAudioZoneContextInfo("emergency", 9, {EMERGENCY}),
+ createAudioZoneContextInfo("safety", 10, {SAFETY}),
+ createAudioZoneContextInfo("vehicle_status", 11, {VEHICLE_STATUS}),
+ createAudioZoneContextInfo("announcement", 12, {ANNOUNCEMENT})});
+ return kDefaultContext;
+}
+
+} // namespace internal
+} // namespace audiocontrol
+} // namespace hardware
+} // namespace android
diff --git a/automotive/audiocontrol/aidl/default/converter/src/CarAudioConfigurationXmlConverter.cpp b/automotive/audiocontrol/aidl/default/converter/src/CarAudioConfigurationXmlConverter.cpp
new file mode 100644
index 0000000..d43b595
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/src/CarAudioConfigurationXmlConverter.cpp
@@ -0,0 +1,1134 @@
+/*
+ * 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 "AudioControl::XSD_Converter"
+
+#define LOG_NDEBUG 0
+#include <android-base/logging.h>
+
+#include "../include/CarAudioConfigurationXmlConverter.h"
+
+#include <aidl/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.h>
+#include <android-base/parsebool.h>
+#include <android_hardware_automotive_audiocontrol.h>
+#include <android_hardware_automotive_audiocontrol_fade.h>
+
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+#include <media/AidlConversionCppNdk.h>
+#include <media/TypeConverter.h>
+#include <media/convert.h>
+#include <system/audio.h>
+#include <unistd.h>
+#include <unordered_map>
+
+namespace android {
+namespace hardware {
+namespace audiocontrol {
+namespace internal {
+namespace xsd = ::android::hardware::automotive::audiocontrol;
+namespace fade = android::hardware::automotive::audiocontrol::fade;
+namespace api = ::aidl::android::hardware::automotive::audiocontrol;
+
+using aidl::android::media::audio::common::AudioAttributes;
+using aidl::android::media::audio::common::AudioContentType;
+using aidl::android::media::audio::common::AudioDevice;
+using aidl::android::media::audio::common::AudioDeviceAddress;
+using aidl::android::media::audio::common::AudioDeviceDescription;
+using aidl::android::media::audio::common::AudioDeviceType;
+using aidl::android::media::audio::common::AudioPort;
+using aidl::android::media::audio::common::AudioPortDeviceExt;
+using aidl::android::media::audio::common::AudioPortExt;
+using aidl::android::media::audio::common::AudioUsage;
+
+using namespace ::android::base;
+
+namespace {
+
+static const std::string kUseCoreRouting{"useCoreAudioRouting"};
+static const std::string kUseCoreVolume{"useCoreAudioVolume"};
+static const std::string kUseHalDuckingSignals{"useHalDuckingSignals"};
+static const std::string kUseCarVolumeGroupMuting{"useCarVolumeGroupMuting"};
+
+static constexpr char kOutBusType[] = "AUDIO_DEVICE_OUT_BUS";
+static constexpr char kInBusType[] = "AUDIO_DEVICE_IN_BUS";
+
+using ActivationMap = std::unordered_map<std::string, api::VolumeActivationConfiguration>;
+using FadeConfigurationMap = std::unordered_map<
+ std::string, ::aidl::android::hardware::automotive::audiocontrol::AudioFadeConfiguration>;
+
+inline bool isReadableConfigurationFile(const std::string& filePath) {
+ return !filePath.empty() && filePath.ends_with(".xml") && (access(filePath.c_str(), R_OK) == 0);
+}
+
+inline bool parseBoolOrDefaultIfFailed(const std::string& value, bool defaultValue) {
+ ParseBoolResult results = ParseBool(value);
+ return results == ParseBoolResult::kError ? defaultValue : results == ParseBoolResult::kTrue;
+}
+
+void parseCoreRoutingInfo(const std::string& value, api::AudioDeviceConfiguration& config) {
+ if (!parseBoolOrDefaultIfFailed(value, /* defaultValue= */ false)) {
+ return;
+ }
+ config.routingConfig = api::RoutingDeviceConfiguration::CONFIGURABLE_AUDIO_ENGINE_ROUTING;
+}
+
+void parseCoreVolumeInfo(const std::string& value, api::AudioDeviceConfiguration& config) {
+ config.useCoreAudioVolume = parseBoolOrDefaultIfFailed(value, config.useCoreAudioVolume);
+}
+
+void parseHalDuckingInfo(const std::string& value, api::AudioDeviceConfiguration& config) {
+ config.useHalDuckingSignals = parseBoolOrDefaultIfFailed(value, config.useHalDuckingSignals);
+}
+
+void parseHalMutingInfo(const std::string& value, api::AudioDeviceConfiguration& config) {
+ config.useCarVolumeGroupMuting =
+ parseBoolOrDefaultIfFailed(value, config.useCarVolumeGroupMuting);
+}
+
+bool parseAudioAttributeUsageString(const std::string& usageString, AudioUsage& usage) {
+ audio_usage_t legacyUsage;
+ if (!::android::UsageTypeConverter::fromString(usageString, legacyUsage)) {
+ LOG(ERROR) << __func__ << " could not parse usage from string " << usageString;
+ return false;
+ }
+ ConversionResult<AudioUsage> result =
+ ::aidl::android::legacy2aidl_audio_usage_t_AudioUsage(legacyUsage);
+ if (!result.ok()) {
+ LOG(ERROR) << __func__ << " could not parse usage legacy type " << legacyUsage;
+ return false;
+ }
+ usage = result.value();
+ return true;
+}
+
+bool parseAudioAttributeUsage(const xsd::UsageType& usageType, AudioAttributes& attributes) {
+ if (!usageType.hasValue()) {
+ LOG(ERROR) << __func__ << " usage does not have value";
+ return false;
+ }
+ if (!parseAudioAttributeUsageString(xsd::toString(usageType.getValue()), attributes.usage)) {
+ return false;
+ }
+ return true;
+}
+
+bool parseAudioAttributesUsages(const std::vector<xsd::UsageType>& usages,
+ std::vector<AudioAttributes>& audioAttributes) {
+ for (const auto& xsdUsage : usages) {
+ AudioAttributes attributes;
+ if (!parseAudioAttributeUsage(xsdUsage, attributes)) {
+ return false;
+ }
+ audioAttributes.push_back(attributes);
+ }
+ return true;
+}
+
+bool parseContentTypeString(const std::string& typeString, AudioContentType& type) {
+ audio_content_type_t legacyContentType;
+ if (!::android::AudioContentTypeConverter::fromString(typeString, legacyContentType)) {
+ LOG(ERROR) << __func__ << " could not parse content type from string " << typeString;
+ return false;
+ }
+ ConversionResult<AudioContentType> result =
+ ::aidl::android::legacy2aidl_audio_content_type_t_AudioContentType(legacyContentType);
+ if (!result.ok()) {
+ LOG(ERROR) << __func__ << " could not convert legacy content type " << legacyContentType;
+ return false;
+ }
+ type = result.value();
+ return true;
+}
+
+bool parseAudioAttribute(const xsd::AttributesType& attributesType, AudioAttributes& attributes) {
+ if (attributesType.hasUsage()) {
+ if (!parseAudioAttributeUsageString(xsd::toString(attributesType.getUsage()),
+ attributes.usage)) {
+ LOG(ERROR) << __func__ << " could not parse audio usage: "
+ << xsd::toString(attributesType.getUsage());
+ return false;
+ }
+ }
+
+ if (attributesType.hasContentType()) {
+ if (!parseContentTypeString(xsd::toString(attributesType.getContentType()),
+ attributes.contentType)) {
+ return false;
+ }
+ }
+
+ if (attributesType.hasTags()) {
+ attributes.tags.push_back(attributesType.getTags());
+ }
+ return true;
+}
+
+bool parseAudioAttributes(const std::vector<xsd::AttributesType>& xsdAttributes,
+ std::vector<AudioAttributes>& audioAttributes) {
+ for (const auto& xsdAttribute : xsdAttributes) {
+ AudioAttributes attribute;
+ if (!parseAudioAttribute(xsdAttribute, attribute)) {
+ return false;
+ }
+ audioAttributes.push_back(attribute);
+ }
+ return true;
+}
+
+bool parseAudioAttributes(const xsd::AudioAttributesUsagesType& xsdAttributeOrUsages,
+ std::vector<AudioAttributes>& audioAttributes) {
+ if (xsdAttributeOrUsages.hasUsage_optional()) {
+ if (!parseAudioAttributesUsages(xsdAttributeOrUsages.getUsage_optional(),
+ audioAttributes)) {
+ LOG(ERROR) << __func__ << " could not parse audio usages";
+ return false;
+ }
+ }
+
+ if (xsdAttributeOrUsages.hasAudioAttribute_optional()) {
+ if (!parseAudioAttributes(xsdAttributeOrUsages.getAudioAttribute_optional(),
+ audioAttributes)) {
+ LOG(ERROR) << __func__ << " could not parse audio attributes";
+ return false;
+ }
+ }
+ return true;
+}
+
+bool parseAudioContext(const xsd::OemContextType& xsdContextInfo,
+ api::AudioZoneContextInfo& contextInfo) {
+ if (!xsdContextInfo.hasName()) {
+ LOG(ERROR) << __func__ << " Audio context info missing name";
+ return false;
+ }
+
+ contextInfo.name = xsdContextInfo.getName();
+
+ if (xsdContextInfo.hasId()) {
+ ParseInt(xsdContextInfo.getId().c_str(), &contextInfo.id);
+ }
+
+ if (xsdContextInfo.hasAudioAttributes()) {
+ if (!parseAudioAttributes(*xsdContextInfo.getFirstAudioAttributes(),
+ contextInfo.audioAttributes)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool parseAudioContexts(const xsd::OemContextsType* xsdContexts, api::AudioZoneContext& context) {
+ if (!xsdContexts->hasOemContext()) {
+ return false;
+ }
+ const auto xsdContextInfos = xsdContexts->getOemContext();
+ for (const auto& xsdContextInfo : xsdContextInfos) {
+ api::AudioZoneContextInfo info;
+ if (!parseAudioContext(xsdContextInfo, info)) {
+ continue;
+ }
+ context.audioContextInfos.push_back(info);
+ }
+ return true;
+}
+
+bool createAudioDevice(const std::string& address, const std::string& type, AudioPort& port) {
+ audio_devices_t legacyDeviceType = AUDIO_DEVICE_NONE;
+ ::android::DeviceConverter::fromString(type, legacyDeviceType);
+ std::string tempString;
+ ::android::DeviceConverter::toString(legacyDeviceType, tempString);
+ ConversionResult<AudioDeviceDescription> result =
+ ::aidl::android::legacy2aidl_audio_devices_t_AudioDeviceDescription(legacyDeviceType);
+ if (legacyDeviceType == AUDIO_DEVICE_NONE || !result.ok()) {
+ LOG(ERROR) << __func__ << " could not parse legacy device type";
+ return false;
+ }
+ AudioDevice device;
+ if (!address.empty()) {
+ device.address = AudioDeviceAddress::make<AudioDeviceAddress::Tag::id>(address);
+ }
+ device.type = result.value();
+
+ port.ext = AudioPortExt::make<AudioPortExt::Tag::device>(device);
+
+ return true;
+}
+
+std::string outTypeToOutAudioDevice(const std::string& device) {
+ const static std::unordered_map<std::string, std::string> typeToOutDevice{
+ {"TYPE_BUILTIN_SPEAKER", "AUDIO_DEVICE_OUT_SPEAKER"},
+ {"TYPE_WIRED_HEADSET", "AUDIO_DEVICE_OUT_WIRED_HEADSET"},
+ {"TYPE_WIRED_HEADPHONES", "AUDIO_DEVICE_OUT_WIRED_HEADPHONE,"},
+ {"TYPE_BLUETOOTH_A2DP", "AUDIO_DEVICE_OUT_BLUETOOTH_A2DP"},
+ {"TYPE_HDMI", "AUDIO_DEVICE_OUT_HDMI"},
+ {"TYPE_USB_ACCESSORY", "AUDIO_DEVICE_OUT_USB_ACCESSORY"},
+ {"TYPE_USB_DEVICE", "AUDIO_DEVICE_OUT_USB_DEVICE,"},
+ {"TYPE_USB_HEADSET", "AUDIO_DEVICE_OUT_USB_HEADSET"},
+ {"TYPE_AUX_LINE", "AUDIO_DEVICE_OUT_AUX_LINE"},
+ {"TYPE_BUS", "AUDIO_DEVICE_OUT_BUS"},
+ {"TYPE_BLE_HEADSET", "AUDIO_DEVICE_OUT_BLE_HEADSET"},
+ {"TYPE_BLE_SPEAKER", "AUDIO_DEVICE_OUT_BLE_SPEAKER"},
+ {"TYPE_BLE_BROADCAST", "AUDIO_DEVICE_OUT_BLE_BROADCAST"},
+ };
+
+ if (!device.starts_with("TYPE_")) {
+ return device;
+ }
+
+ const auto it = typeToOutDevice.find(device);
+ return it != typeToOutDevice.end() ? it->second : device;
+}
+
+bool parseAudioDeviceToContexts(const xsd::DeviceRoutesType& deviceRoutesType,
+ api::DeviceToContextEntry& route) {
+ std::string address = deviceRoutesType.hasAddress() ? deviceRoutesType.getAddress() : "";
+ // Default type is bus for schema
+ std::string type = outTypeToOutAudioDevice(deviceRoutesType.hasType()
+ ? xsd::toString(deviceRoutesType.getType())
+ : std::string(kOutBusType));
+ // Address must be present for audio device bus
+ if (address.empty() && type == std::string(kOutBusType)) {
+ LOG(ERROR) << __func__ << " empty device address for bus device type";
+ return false;
+ }
+ if (!createAudioDevice(address, type, route.device)) {
+ return false;
+ }
+
+ if (!deviceRoutesType.hasContext()) {
+ LOG(ERROR) << __func__ << " empty device context mapping";
+ return false;
+ }
+
+ for (const auto& xsdContext : deviceRoutesType.getContext()) {
+ if (!xsdContext.hasContext()) {
+ LOG(ERROR) << __func__ << " audio device route missing context info";
+ return false;
+ }
+ route.contextNames.push_back(xsdContext.getContext());
+ }
+
+ return true;
+}
+
+bool parseAudioDeviceRoutes(const std::vector<xsd::DeviceRoutesType> deviceRoutesTypes,
+ std::vector<api::DeviceToContextEntry>& routes) {
+ for (const auto& deviceRouteType : deviceRoutesTypes) {
+ api::DeviceToContextEntry entry;
+ if (!parseAudioDeviceToContexts(deviceRouteType, entry)) {
+ return false;
+ }
+ routes.push_back(entry);
+ }
+ return true;
+}
+
+void parseVolumeGroupActivation(const std::string& activationConfigName,
+ const ActivationMap& activations,
+ api::VolumeGroupConfig& volumeGroup) {
+ if (activationConfigName.empty()) {
+ LOG(ERROR) << __func__ << " Volume group " << volumeGroup.name
+ << " has empty volume group activation name";
+ return;
+ }
+ const auto& it = activations.find(activationConfigName);
+ if (it == activations.end()) {
+ LOG(ERROR) << __func__ << " Volume group " << volumeGroup.name
+ << " has non-existing volume group activation name " << activationConfigName;
+ return;
+ }
+ volumeGroup.activationConfiguration = it->second;
+}
+
+bool parseVolumeGroup(const xsd::VolumeGroupType& volumeGroupType, const ActivationMap& activations,
+ api::VolumeGroupConfig& volumeGroup) {
+ if (!volumeGroupType.hasDevice()) {
+ LOG(ERROR) << __func__ << " no device found";
+ return false;
+ }
+
+ if (volumeGroupType.hasName()) {
+ volumeGroup.name = volumeGroupType.getName();
+ }
+
+ if (!parseAudioDeviceRoutes(volumeGroupType.getDevice(), volumeGroup.carAudioRoutes)) {
+ return false;
+ }
+
+ if (volumeGroupType.hasActivationConfig()) {
+ parseVolumeGroupActivation(volumeGroupType.getActivationConfig(), activations, volumeGroup);
+ }
+
+ return true;
+}
+
+bool parseVolumeGroups(const xsd::VolumeGroupsType* volumeGroupsType,
+ const ActivationMap& activations,
+ std::vector<api::VolumeGroupConfig>& volumeGroups) {
+ if (!volumeGroupsType->hasGroup()) {
+ LOG(ERROR) << __func__ << " no volume groups found";
+ return false;
+ }
+ for (const auto& volumeGroupType : volumeGroupsType->getGroup()) {
+ api::VolumeGroupConfig volumeGroup;
+ if (!parseVolumeGroup(volumeGroupType, activations, volumeGroup)) {
+ return false;
+ }
+ volumeGroups.push_back(volumeGroup);
+ }
+ return true;
+}
+
+void parseFadeConfigurationUsages(const xsd::ApplyFadeConfigType& fadeConfigType,
+ std::vector<AudioUsage>& usages) {
+ if (!fadeConfigType.hasAudioAttributes()) {
+ return;
+ }
+ const xsd::AudioAttributeUsagesType* attributesOrUsagesType =
+ fadeConfigType.getFirstAudioAttributes();
+ if (!attributesOrUsagesType->hasUsage()) {
+ return;
+ }
+ for (const auto& usageType : attributesOrUsagesType->getUsage()) {
+ AudioUsage usage;
+ if (!usageType.hasValue() ||
+ !parseAudioAttributeUsageString(xsd::toString(usageType.getValue()), usage)) {
+ continue;
+ }
+ usages.push_back(usage);
+ }
+}
+
+void parseZoneFadeConfiguration(const xsd::ApplyFadeConfigType& fadeConfigType,
+ const FadeConfigurationMap& fadeConfigurations,
+ api::AudioZoneFadeConfiguration& zoneFadeConfiguration) {
+ if (!fadeConfigType.hasName()) {
+ LOG(ERROR) << __func__ << " Found a fade config without a name, skipping assignment";
+ return;
+ }
+
+ const auto it = fadeConfigurations.find(fadeConfigType.getName());
+ if (it == fadeConfigurations.end()) {
+ LOG(ERROR) << __func__ << " Config name " << fadeConfigType.getName()
+ << " not found, skipping assignment";
+ return;
+ }
+ // Return for default since default configurations do not have any audio attributes mapping
+ if (fadeConfigType.hasIsDefault()) {
+ zoneFadeConfiguration.defaultConfiguration = it->second;
+ return;
+ }
+
+ api::TransientFadeConfigurationEntry entry;
+ entry.transientFadeConfiguration = it->second;
+ parseFadeConfigurationUsages(fadeConfigType, entry.transientUsages);
+ zoneFadeConfiguration.transientConfiguration.push_back(entry);
+}
+
+void parseZoneFadeConfigurations(const xsd::ZoneConfigType& zoneConfigType,
+ const FadeConfigurationMap& fadeConfigurations,
+ std::optional<api::AudioZoneFadeConfiguration>& zoneFadeConfig) {
+ if (!zoneConfigType.hasApplyFadeConfigs()) {
+ return;
+ }
+ const xsd::ApplyFadeConfigsType* applyFadeConfigs = zoneConfigType.getFirstApplyFadeConfigs();
+ if (!applyFadeConfigs->hasFadeConfig()) {
+ return;
+ }
+ api::AudioZoneFadeConfiguration zoneFadeConfiguration;
+ for (const auto& fadeConfigType : applyFadeConfigs->getFadeConfig()) {
+ parseZoneFadeConfiguration(fadeConfigType, fadeConfigurations, zoneFadeConfiguration);
+ }
+ zoneFadeConfig = zoneFadeConfiguration;
+}
+
+bool parseAudioZoneConfig(const xsd::ZoneConfigType& zoneConfigType,
+ const ActivationMap& activations,
+ const FadeConfigurationMap& fadeConfigurations,
+ api::AudioZoneConfig& config) {
+ if (!zoneConfigType.hasVolumeGroups()) {
+ LOG(ERROR) << __func__ << " no volume groups found";
+ return false;
+ }
+
+ if (zoneConfigType.hasName()) {
+ config.name = zoneConfigType.getName();
+ }
+ if (!parseVolumeGroups(zoneConfigType.getFirstVolumeGroups(), activations,
+ config.volumeGroups)) {
+ return false;
+ }
+
+ parseZoneFadeConfigurations(zoneConfigType, fadeConfigurations, config.fadeConfiguration);
+
+ config.isDefault = zoneConfigType.hasIsDefault() && zoneConfigType.getIsDefault();
+
+ return true;
+}
+
+bool parseAudioZoneConfigs(const xsd::ZoneConfigsType* zoneConfigsType,
+ const ActivationMap& activations,
+ const FadeConfigurationMap& fadeConfigurations,
+ std::vector<api::AudioZoneConfig>& configs) {
+ if (!zoneConfigsType->hasZoneConfig()) {
+ LOG(ERROR) << __func__ << " No zone configs found";
+ return false;
+ }
+
+ if (zoneConfigsType->getZoneConfig().empty()) {
+ LOG(ERROR) << __func__ << " Empty list of audio configurations";
+ return false;
+ }
+
+ for (const auto& zoneConfigType : zoneConfigsType->getZoneConfig()) {
+ api::AudioZoneConfig config;
+ if (!parseAudioZoneConfig(zoneConfigType, activations, fadeConfigurations, config)) {
+ return false;
+ }
+ configs.push_back(config);
+ }
+
+ return true;
+}
+
+bool parseInputDevice(const xsd::InputDeviceType& xsdInputDevice, AudioPort& inputDevice) {
+ // Input device must have a non-empty address
+ if (!xsdInputDevice.hasAddress() || xsdInputDevice.getAddress().empty()) {
+ LOG(ERROR) << __func__ << " missing device address";
+ return false;
+ }
+ // By default a device is bus type, unless specified
+ std::string inputDeviceType =
+ xsdInputDevice.hasType() ? xsd::toString(xsdInputDevice.getType()) : kInBusType;
+ if (!createAudioDevice(xsdInputDevice.getAddress(), inputDeviceType, inputDevice)) {
+ return false;
+ }
+ return true;
+}
+
+void parseInputDevices(const xsd::InputDevicesType* xsdInputDevices,
+ std::vector<AudioPort>& inputDevices) {
+ if (!xsdInputDevices->hasInputDevice()) {
+ return;
+ }
+ for (const auto& xsdInputDevice : xsdInputDevices->getInputDevice()) {
+ AudioPort inputDevice;
+ if (!parseInputDevice(xsdInputDevice, inputDevice)) {
+ continue;
+ }
+ inputDevices.push_back(inputDevice);
+ }
+}
+
+bool parseAudioZone(const xsd::ZoneType& zone, const ActivationMap& activations,
+ const FadeConfigurationMap& fadeConfigurations, api::AudioZone& audioZone) {
+ if (zone.hasName()) {
+ audioZone.name = zone.getName();
+ }
+
+ if (zone.hasOccupantZoneId()) {
+ ParseInt(zone.getOccupantZoneId().c_str(), &audioZone.occupantZoneId);
+ }
+
+ if (zone.hasInputDevices()) {
+ parseInputDevices(zone.getFirstInputDevices(), audioZone.inputAudioDevices);
+ }
+
+ // Audio zone id is required
+ if (!zone.hasAudioZoneId()) {
+ LOG(ERROR) << __func__ << " Audio zone id required for each zone";
+ return false;
+ }
+
+ bool isPrimary = zone.hasIsPrimary() && zone.getIsPrimary();
+
+ if (isPrimary) {
+ audioZone.id = api::AudioZone::PRIMARY_AUDIO_ZONE;
+ }
+
+ // ID not required in XML for primary zone
+ if (!ParseInt(zone.getAudioZoneId().c_str(), &audioZone.id) && !isPrimary) {
+ LOG(ERROR) << __func__
+ << " Could not parse audio zone id, must be a non-negative integer or isPrimary "
+ "must be specify as true for primary zone";
+ return false;
+ }
+
+ if (isPrimary && audioZone.id != api::AudioZone::PRIMARY_AUDIO_ZONE) {
+ LOG(ERROR) << __func__ << " Audio zone is primary but has zone id "
+ << std::to_string(audioZone.id) << " instead of primary zone id "
+ << std::to_string(api::AudioZone::PRIMARY_AUDIO_ZONE);
+ return false;
+ }
+
+ if (!zone.hasZoneConfigs()) {
+ LOG(ERROR) << __func__ << " Missing audio zone configs for audio zone id " << audioZone.id;
+ return false;
+ }
+ if (!parseAudioZoneConfigs(zone.getFirstZoneConfigs(), activations, fadeConfigurations,
+ audioZone.audioZoneConfigs)) {
+ LOG(ERROR) << __func__ << " Could not parse zone configs for audio zone id " << audioZone.id
+ << ", name " << audioZone.name;
+ return false;
+ }
+
+ return true;
+}
+
+std::string parseAudioZones(const xsd::ZonesType* zones, const api::AudioZoneContext& context,
+ const ActivationMap& activations,
+ const FadeConfigurationMap& fadeConfigurations,
+ std::vector<api::AudioZone>& audioZones) {
+ if (!zones->hasZone()) {
+ return "audio zones are missing";
+ }
+ const auto& xsdZones = zones->getZone();
+ for (const auto& xsdZone : xsdZones) {
+ api::AudioZone audioZone;
+ audioZone.audioZoneContext = context;
+ if (!parseAudioZone(xsdZone, activations, fadeConfigurations, audioZone)) {
+ continue;
+ }
+ audioZones.push_back(audioZone);
+ }
+ return "";
+}
+
+std::unordered_map<std::string,
+ std::function<void(const std::string&, api::AudioDeviceConfiguration&)>>
+getConfigsParsers() {
+ static const std::unordered_map<
+ std::string, std::function<void(const std::string&, api::AudioDeviceConfiguration&)>>
+ parsers{
+ {kUseCoreRouting, parseCoreRoutingInfo},
+ {kUseCoreVolume, parseCoreVolumeInfo},
+ {kUseHalDuckingSignals, parseHalDuckingInfo},
+ {kUseCarVolumeGroupMuting, parseHalMutingInfo},
+ };
+
+ return parsers;
+}
+
+bool parseVolumeActivationType(const xsd::ActivationType& xsdType,
+ api::VolumeInvocationType& activationType) {
+ switch (xsdType) {
+ case xsd::ActivationType::onBoot:
+ activationType = api::VolumeInvocationType::ON_BOOT;
+ break;
+ case xsd::ActivationType::onSourceChanged:
+ activationType = api::VolumeInvocationType::ON_SOURCE_CHANGED;
+ break;
+ case xsd::ActivationType::onPlaybackChanged:
+ activationType = api::VolumeInvocationType::ON_PLAYBACK_CHANGED;
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
+bool parseVolumeGroupActivationEntry(const xsd::ActivationVolumeConfigEntryType& xsdEntry,
+ api::VolumeActivationConfigurationEntry& entry) {
+ if (!xsdEntry.hasInvocationType()) {
+ LOG(ERROR) << __func__ << " Activation config entry missing invocation type";
+ return false;
+ }
+
+ if (!parseVolumeActivationType(xsdEntry.getInvocationType(), entry.type)) {
+ LOG(ERROR) << __func__ << " Could not parse configuration entry type";
+ return false;
+ }
+
+ if (xsdEntry.hasMaxActivationVolumePercentage()) {
+ // Parse int ranges are not inclusive
+ ParseInt(xsdEntry.getMaxActivationVolumePercentage().c_str(),
+ &entry.maxActivationVolumePercentage,
+ api::VolumeActivationConfigurationEntry::DEFAULT_MIN_ACTIVATION_VALUE - 1,
+ api::VolumeActivationConfigurationEntry::DEFAULT_MAX_ACTIVATION_VALUE + 1);
+ }
+
+ if (xsdEntry.hasMinActivationVolumePercentage()) {
+ // Parse int ranges are not inclusive
+ ParseInt(xsdEntry.getMinActivationVolumePercentage().c_str(),
+ &entry.minActivationVolumePercentage,
+ api::VolumeActivationConfigurationEntry::DEFAULT_MIN_ACTIVATION_VALUE - 1,
+ api::VolumeActivationConfigurationEntry::DEFAULT_MAX_ACTIVATION_VALUE + 1);
+ }
+
+ return true;
+}
+
+bool parseVolumeGroupActivationEntries(
+ const std::vector<xsd::ActivationVolumeConfigEntryType>& xsdEntries,
+ std::vector<api::VolumeActivationConfigurationEntry>& entries) {
+ for (const auto& xsdEntry : xsdEntries) {
+ api::VolumeActivationConfigurationEntry entry;
+ if (!parseVolumeGroupActivationEntry(xsdEntry, entry)) {
+ LOG(ERROR) << __func__ << " Could not parse volume group activation entries";
+ return false;
+ }
+ entries.push_back(entry);
+ }
+ return true;
+}
+
+bool parseVolumeGroupActivation(const xsd::ActivationVolumeConfigType& xsdActivationConfig,
+ api::VolumeActivationConfiguration& activation) {
+ if (!xsdActivationConfig.hasName()) {
+ LOG(ERROR) << __func__ << " Activation config missing volume activation name";
+ return false;
+ }
+ if (!xsdActivationConfig.hasActivationVolumeConfigEntry()) {
+ LOG(ERROR) << __func__ << " Activation config missing volume activation entries";
+ return false;
+ }
+ if (!parseVolumeGroupActivationEntries(xsdActivationConfig.getActivationVolumeConfigEntry(),
+ activation.volumeActivationEntries)) {
+ LOG(ERROR) << __func__ << " Could not parse volume activation name";
+ return false;
+ }
+ activation.name = xsdActivationConfig.getName();
+ return true;
+}
+
+void parseVolumeGroupActivations(const xsd::ActivationVolumeConfigsType* xsdActivationConfigs,
+ ActivationMap& activations) {
+ if (!xsdActivationConfigs->hasActivationVolumeConfig()) {
+ LOG(ERROR) << __func__ << " No volume group activations found";
+ return;
+ }
+ for (const auto& xsdActivationConfig : xsdActivationConfigs->getActivationVolumeConfig()) {
+ api::VolumeActivationConfiguration activationConfiguration;
+ if (!parseVolumeGroupActivation(xsdActivationConfig, activationConfiguration)) {
+ continue;
+ }
+ std::string name = xsdActivationConfig.getName();
+ activations.emplace(name, activationConfiguration);
+ }
+}
+
+void parseOutputMirroringDevices(const xsd::MirroringDevicesType* mirroringDevicesType,
+ std::vector<AudioPort>& mirroringDevices) {
+ if (!mirroringDevicesType->hasMirroringDevice()) {
+ LOG(ERROR) << __func__ << " Missing audio mirroring devices";
+ return;
+ }
+ for (const auto& xsdMirrorDevice : mirroringDevicesType->getMirroringDevice()) {
+ AudioPort mirrorDevicePort;
+ if (!xsdMirrorDevice.hasAddress()) {
+ LOG(ERROR) << __func__ << " Missing audio mirroring device address";
+ continue;
+ }
+ if (!createAudioDevice(xsdMirrorDevice.getAddress(), kOutBusType, mirrorDevicePort)) {
+ LOG(ERROR) << __func__ << " Could not create mirror device with address "
+ << xsdMirrorDevice.getAddress();
+ continue;
+ }
+ mirroringDevices.push_back(mirrorDevicePort);
+ }
+}
+
+api::FadeState getFadeState(const fade::FadeStateType& xsdFadeState) {
+ // Return default value if missing
+ if (!xsdFadeState.hasValue()) {
+ return api::FadeState::FADE_STATE_ENABLED_DEFAULT;
+ }
+ // For legacy files, "0" and "1 " need to be supported.
+ switch (xsdFadeState.getValue()) {
+ case fade::FadeStateEnumType::_0:
+ // Fallthrough
+ case fade::FadeStateEnumType::FADE_STATE_DISABLED:
+ return api::FadeState::FADE_STATE_DISABLED;
+ case fade::FadeStateEnumType::_1:
+ // Fallthrough
+ case fade::FadeStateEnumType::FADE_STATE_ENABLED_DEFAULT:
+ // Fallthrough
+ default:
+ return api::FadeState::FADE_STATE_ENABLED_DEFAULT;
+ }
+}
+
+void parseFadeableUsages(const fade::FadeableUsagesType& fadeUsages,
+ std::vector<AudioUsage>& usages) {
+ if (!fadeUsages.hasUsage()) {
+ return;
+ }
+ for (const auto& fadeUsage : fadeUsages.getUsage()) {
+ AudioUsage audioUsage;
+ if (!fadeUsage.hasValue() ||
+ !parseAudioAttributeUsageString(fade::toString(fadeUsage.getValue()), audioUsage)) {
+ continue;
+ }
+ usages.push_back(audioUsage);
+ }
+}
+
+void parseFadeAudioAttribute(const fade::AttributesType& fadeAttributes,
+ AudioAttributes& attributes) {
+ if (fadeAttributes.hasUsage()) {
+ parseAudioAttributeUsageString(fade::toString(fadeAttributes.getUsage()), attributes.usage);
+ }
+ if (fadeAttributes.hasContentType()) {
+ parseContentTypeString(fade::toString(fadeAttributes.getContentType()),
+ attributes.contentType);
+ }
+ if (fadeAttributes.hasTags()) {
+ attributes.tags.push_back(fadeAttributes.getTags());
+ }
+}
+
+bool parseFadeAudioAttribute(const fade::AudioAttributesUsagesType& fadeAttributes,
+ std::vector<AudioAttributes>& audioAttributes) {
+ if (fadeAttributes.hasUsage_optional()) {
+ for (const auto& usage : fadeAttributes.getUsage_optional()) {
+ AudioAttributes attributes;
+ if (!usage.hasValue() || !parseAudioAttributeUsageString(
+ fade::toString(usage.getValue()), attributes.usage)) {
+ continue;
+ }
+ audioAttributes.push_back(attributes);
+ }
+ }
+ if (fadeAttributes.hasAudioAttribute_optional()) {
+ for (const auto& fadeAttribute : fadeAttributes.getAudioAttribute_optional()) {
+ AudioAttributes attribute;
+ parseFadeAudioAttribute(fadeAttribute, attribute);
+ audioAttributes.push_back(attribute);
+ }
+ }
+ return true;
+}
+
+void parseUnfadeableAudioAttributes(const fade::UnfadeableAudioAttributesType& fadeAttributes,
+ std::vector<AudioAttributes>& audioAttributes) {
+ if (!fadeAttributes.hasAudioAttributes()) {
+ return;
+ }
+ parseFadeAudioAttribute(*fadeAttributes.getFirstAudioAttributes(), audioAttributes);
+}
+
+void parseUnfadeableContentType(const fade::UnfadeableContentTypesType& fadeTypes,
+ std::optional<std::vector<AudioContentType>>& contentTypes) {
+ if (!fadeTypes.hasContentType()) {
+ return;
+ }
+ std::vector<AudioContentType> contents;
+ for (const auto& fadeContentType : fadeTypes.getContentType()) {
+ AudioContentType contentType;
+ if (!fadeContentType.hasValue() ||
+ !parseContentTypeString(fade::toString(fadeContentType.getValue()), contentType)) {
+ continue;
+ }
+ contents.push_back(contentType);
+ }
+ contentTypes = contents;
+}
+
+void parseFadeConfigAudioAttributes(const fade::AudioAttributesUsagesType& fadeAudioAttributesType,
+ const int64_t fadeDurationMillins,
+ std::vector<api::FadeConfiguration>& fadeInConfigurations) {
+ if (fadeAudioAttributesType.hasAudioAttribute_optional()) {
+ for (const auto& fadeAudioAttribute :
+ fadeAudioAttributesType.getAudioAttribute_optional()) {
+ api::FadeConfiguration fadeConfiguration;
+ AudioAttributes attributes;
+ parseFadeAudioAttribute(fadeAudioAttribute, attributes);
+ fadeConfiguration.fadeDurationMillis = fadeDurationMillins;
+ fadeConfiguration.audioAttributesOrUsage
+ .set<api::FadeConfiguration::AudioAttributesOrUsage::fadeAttribute>(attributes);
+ fadeInConfigurations.push_back(fadeConfiguration);
+ }
+ }
+
+ if (fadeAudioAttributesType.hasUsage_optional()) {
+ for (const auto& fadeAudioUsage : fadeAudioAttributesType.getUsage_optional()) {
+ api::FadeConfiguration fadeConfiguration;
+ AudioUsage usage;
+ if (!fadeAudioUsage.hasValue() ||
+ !parseAudioAttributeUsageString(fade::toString(fadeAudioUsage.getValue()), usage)) {
+ continue;
+ }
+ fadeConfiguration.fadeDurationMillis = fadeDurationMillins;
+ fadeConfiguration.audioAttributesOrUsage
+ .set<api::FadeConfiguration::AudioAttributesOrUsage::usage>(usage);
+ fadeInConfigurations.push_back(fadeConfiguration);
+ }
+ }
+}
+void parseFadeConfiguration(const fade::FadeConfigurationType& fadeConfigurationType,
+ std::vector<api::FadeConfiguration>& fadeConfigurations) {
+ if (!fadeConfigurationType.hasFadeDurationMillis() ||
+ !fadeConfigurationType.hasAudioAttributes() ||
+ fadeConfigurationType.getAudioAttributes().empty()) {
+ return;
+ }
+
+ int64_t fadeDurationMillis = 0L;
+
+ if (!ParseInt(fadeConfigurationType.getFadeDurationMillis().c_str(), &fadeDurationMillis,
+ static_cast<int64_t>(0))) {
+ return;
+ }
+ parseFadeConfigAudioAttributes(*fadeConfigurationType.getFirstAudioAttributes(),
+ fadeDurationMillis, fadeConfigurations);
+}
+
+void parseFadeInConfigurations(const fade::FadeInConfigurationsType& fadeInConfigurationsType,
+ std::vector<api::FadeConfiguration>& fadeInConfigurations) {
+ if (!fadeInConfigurationsType.hasFadeConfiguration()) {
+ return;
+ }
+ for (const auto& fadeConfigurationType : fadeInConfigurationsType.getFadeConfiguration()) {
+ parseFadeConfiguration(fadeConfigurationType, fadeInConfigurations);
+ }
+}
+
+void parseFadeOutConfigurations(const fade::FadeOutConfigurationsType& fadeOutConfigurationsType,
+ std::vector<api::FadeConfiguration>& fadeOutConfigurations) {
+ if (!fadeOutConfigurationsType.hasFadeConfiguration()) {
+ return;
+ }
+ for (const auto& fadeConfigurationType : fadeOutConfigurationsType.getFadeConfiguration()) {
+ parseFadeConfiguration(fadeConfigurationType, fadeOutConfigurations);
+ }
+}
+
+bool parseFadeConfig(const fade::FadeConfigurationConfig& fadeConfig,
+ api::AudioFadeConfiguration& configuration) {
+ // Fade configuration must have a name for zone association. Fade state is also needed to
+ // determine accurate usage.
+ if (!fadeConfig.hasName()) {
+ LOG(ERROR) << __func__ << " Fade configuration missing name";
+ return false;
+ }
+ if (!fadeConfig.hasFadeState()) {
+ LOG(ERROR) << __func__ << " Fade configuration missing fade state";
+ return false;
+ }
+ configuration.name = fadeConfig.getName();
+ configuration.fadeState = getFadeState(*fadeConfig.getFirstFadeState());
+ if (fadeConfig.hasDefaultFadeOutDurationInMillis()) {
+ ParseInt(fadeConfig.getDefaultFadeOutDurationInMillis().c_str(),
+ &configuration.fadeOutDurationMs, static_cast<int64_t>(0));
+ }
+ if (fadeConfig.hasDefaultFadeInDurationInMillis()) {
+ ParseInt(fadeConfig.getDefaultFadeInDurationInMillis().c_str(),
+ &configuration.fadeInDurationMs, static_cast<int64_t>(0));
+ }
+ if (fadeConfig.hasDefaultFadeInDelayForOffenders()) {
+ ParseInt(fadeConfig.getDefaultFadeInDelayForOffenders().c_str(),
+ &configuration.fadeInDelayedForOffendersMs, static_cast<int64_t>(0));
+ }
+
+ if (fadeConfig.hasFadeableUsages()) {
+ parseFadeableUsages(*fadeConfig.getFirstFadeableUsages(), configuration.fadeableUsages);
+ }
+
+ if (fadeConfig.hasUnfadeableContentTypes()) {
+ parseUnfadeableContentType(*fadeConfig.getFirstUnfadeableContentTypes(),
+ configuration.unfadeableContentTypes);
+ }
+
+ if (fadeConfig.hasUnfadeableAudioAttributes()) {
+ parseUnfadeableAudioAttributes(*fadeConfig.getFirstUnfadeableAudioAttributes(),
+ configuration.unfadableAudioAttributes);
+ }
+ if (fadeConfig.hasFadeInConfigurations()) {
+ parseFadeInConfigurations(*fadeConfig.getFirstFadeInConfigurations(),
+ configuration.fadeInConfigurations);
+ }
+ if (fadeConfig.hasFadeOutConfigurations()) {
+ parseFadeOutConfigurations(*fadeConfig.getFirstFadeOutConfigurations(),
+ configuration.fadeOutConfigurations);
+ }
+
+ return true;
+}
+
+void parseFadeConfigs(const std::vector<fade::FadeConfigurationConfig>& fadeConfigTypes,
+ std::vector<api::AudioFadeConfiguration>& fadeConfigs) {
+ for (const auto& fadeConfig : fadeConfigTypes) {
+ api::AudioFadeConfiguration configuration;
+ if (!parseFadeConfig(fadeConfig, configuration)) {
+ continue;
+ }
+ fadeConfigs.push_back(configuration);
+ }
+}
+
+void parseFadeConfigs(const fade::FadeConfigurationConfigs& fadeConfigsType,
+ std::vector<api::AudioFadeConfiguration>& fadeConfigs) {
+ if (!fadeConfigsType.hasConfig()) {
+ LOG(ERROR) << __func__ << " Fade config file does not contains any fade configs";
+ return;
+ }
+ parseFadeConfigs(fadeConfigsType.getConfig(), fadeConfigs);
+}
+} // namespace
+
+void CarAudioConfigurationXmlConverter::init() {
+ if (!isReadableConfigurationFile(mAudioConfigFile)) {
+ mParseErrors = "Configuration file " + mAudioConfigFile + " is not readable";
+ initNonDynamicRouting();
+ return;
+ }
+
+ // Supports loading legacy fade configurations from a different file
+ if (isReadableConfigurationFile(mFadeConfigFile)) {
+ initFadeConfigurations();
+ }
+
+ const auto& configOptional = xsd::read(mAudioConfigFile.c_str());
+
+ if (!configOptional.has_value()) {
+ mParseErrors =
+ "Configuration file " + mAudioConfigFile + " , does not have any configurations";
+ initNonDynamicRouting();
+ return;
+ }
+
+ const auto& configurations = configOptional.value();
+ initAudioDeviceConfiguration(configurations);
+ initCarAudioConfigurations(configurations);
+}
+
+void CarAudioConfigurationXmlConverter::initFadeConfigurations() {
+ const auto& fadeConfigOptional = fade::read(mFadeConfigFile.c_str());
+ if (!fadeConfigOptional.has_value() || !fadeConfigOptional.value().hasConfigs()) {
+ LOG(ERROR) << __func__ << " Fade config file " << mFadeConfigFile.c_str()
+ << " does not contains fade configuration";
+ return;
+ }
+
+ const auto& fadeConfigs = fadeConfigOptional.value().getConfigs();
+
+ if (fadeConfigs.empty()) {
+ LOG(ERROR) << __func__ << " Fade config file " << mFadeConfigFile.c_str()
+ << " does not contains fade configs";
+ }
+ std::vector<api::AudioFadeConfiguration> fadeConfigurations;
+ parseFadeConfigs(fadeConfigs.front(), fadeConfigurations);
+ for (const auto& fadeConfiguration : fadeConfigurations) {
+ mFadeConfigurations.emplace(fadeConfiguration.name, fadeConfiguration);
+ }
+}
+
+void CarAudioConfigurationXmlConverter::initNonDynamicRouting() {
+ mAudioDeviceConfiguration.routingConfig =
+ api::RoutingDeviceConfiguration::DEFAULT_AUDIO_ROUTING;
+}
+
+void CarAudioConfigurationXmlConverter::initAudioDeviceConfiguration(
+ const xsd::CarAudioConfigurationType& carAudioConfigurationType) {
+ parseAudioDeviceConfigurations(carAudioConfigurationType);
+}
+
+void CarAudioConfigurationXmlConverter::parseAudioDeviceConfigurations(
+ const xsd::CarAudioConfigurationType& carAudioConfigurationType) {
+ if (!carAudioConfigurationType.hasDeviceConfigurations()) {
+ return;
+ }
+
+ mAudioDeviceConfiguration.routingConfig =
+ api::RoutingDeviceConfiguration::DYNAMIC_AUDIO_ROUTING;
+
+ const auto deviceConfigs = carAudioConfigurationType.getFirstDeviceConfigurations();
+ if (!deviceConfigs->hasDeviceConfiguration()) {
+ return;
+ }
+
+ std::vector<::android::hardware::automotive::audiocontrol::DeviceConfigurationType> configs =
+ deviceConfigs->getDeviceConfiguration();
+ const auto& parsers = getConfigsParsers();
+ for (const auto& deviceConfig : configs) {
+ if (!deviceConfig.hasName() || !deviceConfig.hasValue()) {
+ continue;
+ }
+ const auto& parser = parsers.find(deviceConfig.getName());
+ if (parser == parsers.end()) {
+ continue;
+ }
+ const auto& method = parser->second;
+ method(deviceConfig.getValue(), mAudioDeviceConfiguration);
+ }
+}
+
+void CarAudioConfigurationXmlConverter::initCarAudioConfigurations(
+ const automotive::audiocontrol::CarAudioConfigurationType& carAudioConfigurationType) {
+ if (!carAudioConfigurationType.hasZones()) {
+ mParseErrors = "Audio zones not found in file " + mAudioConfigFile;
+ initNonDynamicRouting();
+ return;
+ }
+
+ api::AudioZoneContext context;
+ if (!carAudioConfigurationType.hasOemContexts() ||
+ !parseAudioContexts(carAudioConfigurationType.getFirstOemContexts(), context)) {
+ context = getDefaultCarAudioContext();
+ }
+
+ ActivationMap activations;
+ if (carAudioConfigurationType.hasActivationVolumeConfigs()) {
+ parseVolumeGroupActivations(carAudioConfigurationType.getFirstActivationVolumeConfigs(),
+ activations);
+ }
+
+ if (carAudioConfigurationType.hasMirroringDevices()) {
+ parseOutputMirroringDevices(carAudioConfigurationType.getFirstMirroringDevices(),
+ mOutputMirroringDevices);
+ }
+
+ const auto audioZones = carAudioConfigurationType.getFirstZones();
+
+ std::string message =
+ parseAudioZones(audioZones, context, activations, mFadeConfigurations, mAudioZones);
+
+ // Assign dynamic configuration if not assigned
+ if (!mAudioZones.empty() && mAudioDeviceConfiguration.routingConfig ==
+ api::RoutingDeviceConfiguration::DEFAULT_AUDIO_ROUTING) {
+ mAudioDeviceConfiguration.routingConfig =
+ api::RoutingDeviceConfiguration::DYNAMIC_AUDIO_ROUTING;
+ }
+
+ if (message.empty()) {
+ return;
+ }
+ mParseErrors =
+ "Error parsing audio zone(s) in file " + mAudioConfigFile + ", message: " + message;
+ LOG(ERROR) << __func__ << " Error parsing zones: " << message;
+ initNonDynamicRouting();
+}
+
+api::AudioDeviceConfiguration CarAudioConfigurationXmlConverter::getAudioDeviceConfiguration()
+ const {
+ return mAudioDeviceConfiguration;
+}
+
+std::vector<api::AudioZone> CarAudioConfigurationXmlConverter::getAudioZones() const {
+ return mAudioZones;
+}
+
+std::vector<::aidl::android::media::audio::common::AudioPort>
+CarAudioConfigurationXmlConverter::getOutputMirroringDevices() const {
+ return mOutputMirroringDevices;
+}
+
+} // namespace internal
+} // namespace audiocontrol
+} // namespace hardware
+} // namespace android
\ No newline at end of file
diff --git a/automotive/audiocontrol/aidl/default/converter/test/Android.bp b/automotive/audiocontrol/aidl/default/converter/test/Android.bp
new file mode 100644
index 0000000..70d4a20
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/Android.bp
@@ -0,0 +1,63 @@
+// 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_aaos_framework",
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+filegroup {
+ name: "simple_car_audio_configuration_xml",
+ srcs: [
+ "simple_car_audio_configuration.xml",
+ "simple_car_audio_configuration_with_device_type.xml",
+ "multi_zone_car_audio_configuration.xml",
+ "car_audio_configuration_without_configuration.xml",
+ "car_audio_configuration_with_default_context.xml",
+ "car_audio_configuration_with_missing_zones.xml",
+ "car_audio_configuration_without_audio_zone.xml",
+ "car_audio_fade_configuration.xml",
+ ],
+}
+
+cc_test {
+ name: "AudioControlConverterUnitTest",
+ vendor: true,
+ require_root: true,
+ srcs: ["*.cpp"],
+ stl: "libc++_static",
+ static_libs: [
+ "libbase",
+ "android.hardware.audiocontrol.internal",
+ "libgtest",
+ "libgmock",
+ "libutils",
+ "libaudio_aidl_conversion_common_ndk",
+ ],
+ shared_libs: ["liblog"],
+ defaults: [
+ "latest_android_hardware_audio_common_ndk_static",
+ "car.audio.configuration.xsd.default",
+ "car.fade.configuration.xsd.default",
+ "latest_android_hardware_automotive_audiocontrol_ndk_static",
+ "latest_android_media_audio_common_types_ndk_static",
+ ],
+ data: [
+ ":simple_car_audio_configuration_xml",
+ ],
+ test_suites: ["device-tests"],
+ exclude_shared_libs: [
+ "android.hardware.automotive.audiocontrol-V5-ndk",
+ ],
+}
diff --git a/automotive/audiocontrol/aidl/default/converter/test/AudioControlConverterUnitTest.cpp b/automotive/audiocontrol/aidl/default/converter/test/AudioControlConverterUnitTest.cpp
new file mode 100644
index 0000000..b6bebe5
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/AudioControlConverterUnitTest.cpp
@@ -0,0 +1,834 @@
+/*
+ * 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.
+ */
+
+#include <android-base/file.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+#include <memory>
+#include <string>
+#include <utility>
+
+#include <CarAudioConfigurationXmlConverter.h>
+#include <aidl/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.h>
+
+namespace converter = ::android::hardware::audiocontrol::internal;
+namespace api = ::aidl::android::hardware::automotive::audiocontrol;
+
+using ::testing::ContainsRegex;
+using ::testing::UnorderedElementsAreArray;
+
+namespace {
+
+using ::aidl::android::media::audio::common::AudioAttributes;
+using ::aidl::android::media::audio::common::AudioContentType;
+using ::aidl::android::media::audio::common::AudioDevice;
+using ::aidl::android::media::audio::common::AudioDeviceAddress;
+using ::aidl::android::media::audio::common::AudioDeviceDescription;
+using ::aidl::android::media::audio::common::AudioDeviceType;
+using ::aidl::android::media::audio::common::AudioPort;
+using ::aidl::android::media::audio::common::AudioPortDeviceExt;
+using ::aidl::android::media::audio::common::AudioPortExt;
+using ::aidl::android::media::audio::common::AudioUsage;
+
+std::string getTestFilePath(const std::string& filename) {
+ static std::string baseDir = android::base::GetExecutableDirectory();
+ return baseDir + "/" + filename;
+}
+
+AudioAttributes createAudioAttributes(const AudioUsage& usage,
+ const AudioContentType& type = AudioContentType::UNKNOWN,
+ const std::string tags = "") {
+ AudioAttributes attributes;
+ attributes.usage = usage;
+ attributes.contentType = type;
+ if (!tags.empty()) {
+ attributes.tags.push_back(tags);
+ }
+ return attributes;
+}
+
+api::AudioZoneContextInfo createContextInfo(const std::string& name,
+ const std::vector<AudioAttributes>& attributes,
+ const int id = -1) {
+ api::AudioZoneContextInfo info;
+ info.name = name;
+ if (id != -1) {
+ info.id = id;
+ }
+ for (const auto& attribute : attributes) {
+ info.audioAttributes.push_back(attribute);
+ }
+ return info;
+}
+
+api::AudioZoneContextInfo createContextInfo(const std::string& name,
+ const std::vector<AudioUsage>& usages,
+ const int id = -1) {
+ std::vector<AudioAttributes> attributes;
+ attributes.reserve(usages.size());
+ for (const auto& usage : usages) {
+ attributes.push_back(createAudioAttributes(usage));
+ }
+ return createContextInfo(name, attributes, id);
+}
+
+AudioPort createAudioPort(const std::string& address, const AudioDeviceType& type,
+ const std::string& connection = "") {
+ AudioPort port;
+ AudioDevice device;
+ device.address = AudioDeviceAddress::make<AudioDeviceAddress::Tag::id>(address);
+
+ AudioDeviceDescription description;
+ description.type = type;
+ description.connection = connection;
+ device.type = description;
+
+ port.ext = AudioPortExt::make<AudioPortExt::Tag::device>(device);
+
+ return port;
+}
+
+api::DeviceToContextEntry createRoutes(const AudioPort& port,
+ const std::vector<std::string>& contexts) {
+ api::DeviceToContextEntry entry;
+ entry.device = port;
+ entry.contextNames = contexts;
+ return entry;
+}
+
+api::VolumeGroupConfig createVolumeGroup(const std::string& name,
+ const api::VolumeActivationConfiguration& activation,
+ const std::vector<api::DeviceToContextEntry>& routes) {
+ api::VolumeGroupConfig config;
+ config.name = name;
+ config.activationConfiguration = activation;
+ config.carAudioRoutes = routes;
+ return config;
+}
+
+api::AudioZoneConfig createAudioZoneConfig(const std::string& name,
+ const api::AudioZoneFadeConfiguration& fadeConfiguration,
+ const std::vector<api::VolumeGroupConfig>& groups,
+ bool isDefault = false) {
+ api::AudioZoneConfig config;
+ config.name = name;
+ config.isDefault = isDefault;
+ config.volumeGroups = groups;
+ config.fadeConfiguration = fadeConfiguration;
+ return config;
+}
+
+api::VolumeActivationConfiguration createVolumeActivation(const std::string& name,
+ const api::VolumeInvocationType& type,
+ int minVolume, int maxVolume) {
+ api::VolumeActivationConfiguration activation;
+ activation.name = name;
+ api::VolumeActivationConfigurationEntry entry;
+ entry.maxActivationVolumePercentage = maxVolume;
+ entry.minActivationVolumePercentage = minVolume;
+ entry.type = type;
+ activation.volumeActivationEntries.push_back(entry);
+
+ return activation;
+}
+
+api::FadeConfiguration createFadeConfiguration(const long& fadeDurationsMillis,
+ const AudioAttributes& audioAttributes) {
+ api::FadeConfiguration configuration;
+ configuration.fadeDurationMillis = fadeDurationsMillis;
+ configuration.audioAttributesOrUsage
+ .set<api::FadeConfiguration::AudioAttributesOrUsage::Tag::fadeAttribute>(
+ audioAttributes);
+ return configuration;
+}
+
+api::FadeConfiguration createFadeConfiguration(const long& fadeDurationsMillis,
+ const AudioUsage& audioUsage) {
+ api::FadeConfiguration configuration;
+ configuration.fadeDurationMillis = fadeDurationsMillis;
+ configuration.audioAttributesOrUsage
+ .set<api::FadeConfiguration::AudioAttributesOrUsage::Tag::usage>(audioUsage);
+ return configuration;
+}
+
+api::AudioFadeConfiguration createAudioFadeConfiguration(
+ const std::string& name, const api::FadeState& state,
+ const std::vector<AudioUsage>& fadeableUsages = std::vector<AudioUsage>(),
+ const std::optional<std::vector<AudioContentType>>& unfadeableContentTypes = std::nullopt,
+ const std::vector<AudioAttributes> unfadeableAudioAttributes =
+ std::vector<AudioAttributes>(),
+ const std::vector<api::FadeConfiguration> fadeOutConfigurations =
+ std::vector<api::FadeConfiguration>(),
+ const std::vector<api::FadeConfiguration> fadeInConfigurations =
+ std::vector<api::FadeConfiguration>(),
+ const long& fadeOutDurationMs = api::AudioFadeConfiguration::DEFAULT_FADE_OUT_DURATION_MS,
+ const long& fadeInDurationMs = api::AudioFadeConfiguration::DEFAULT_FADE_IN_DURATION_MS,
+ const long& fadeInDelayedForOffendersMs =
+ api::AudioFadeConfiguration::DEFAULT_DELAY_FADE_IN_OFFENDERS_MS) {
+ api::AudioFadeConfiguration audioZoneFadeConfiguration;
+ audioZoneFadeConfiguration.name = name;
+ audioZoneFadeConfiguration.fadeInDurationMs = fadeInDurationMs;
+ audioZoneFadeConfiguration.fadeOutDurationMs = fadeOutDurationMs;
+ audioZoneFadeConfiguration.fadeInDelayedForOffendersMs = fadeInDelayedForOffendersMs;
+ audioZoneFadeConfiguration.fadeState = state;
+ audioZoneFadeConfiguration.fadeableUsages = fadeableUsages;
+ audioZoneFadeConfiguration.unfadeableContentTypes = unfadeableContentTypes;
+ audioZoneFadeConfiguration.unfadableAudioAttributes = unfadeableAudioAttributes;
+ audioZoneFadeConfiguration.fadeOutConfigurations = fadeOutConfigurations;
+ audioZoneFadeConfiguration.fadeInConfigurations = fadeInConfigurations;
+
+ return audioZoneFadeConfiguration;
+}
+
+api::TransientFadeConfigurationEntry createTransientFadeConfiguration(
+ const api::AudioFadeConfiguration& fadeConfig, const std::vector<AudioUsage>& usages) {
+ api::TransientFadeConfigurationEntry entry;
+ entry.transientFadeConfiguration = fadeConfig;
+ entry.transientUsages = usages;
+ return entry;
+}
+
+api::AudioZoneFadeConfiguration createAudioZoneFadeConfiguration(
+ const api::AudioFadeConfiguration& defaultConfig,
+ const std::vector<api::TransientFadeConfigurationEntry>& transientConfigs) {
+ api::AudioZoneFadeConfiguration zoneFadeConfiguration;
+ zoneFadeConfiguration.defaultConfiguration = defaultConfig;
+ zoneFadeConfiguration.transientConfiguration = transientConfigs;
+ return zoneFadeConfiguration;
+}
+
+api::AudioZone createAudioZone(const std::string& name, const int zoneId,
+ const std::vector<api::AudioZoneContextInfo>& contexts,
+ const std::vector<api::AudioZoneConfig>& configs) {
+ api::AudioZone zone;
+ zone.name = name;
+ zone.id = zoneId;
+ zone.occupantZoneId = zoneId;
+ zone.audioZoneContext.audioContextInfos = contexts;
+ zone.audioZoneConfigs = configs;
+ return zone;
+}
+
+const std::vector<AudioUsage> kFadeableUsages = {AudioUsage::MEDIA,
+ AudioUsage::GAME,
+ AudioUsage::ASSISTANCE_SONIFICATION,
+ AudioUsage::ASSISTANCE_ACCESSIBILITY,
+ AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE,
+ AudioUsage::ASSISTANT,
+ AudioUsage::NOTIFICATION,
+ AudioUsage::ANNOUNCEMENT};
+
+const std::vector<AudioAttributes> kUnfadeableAudioAttributes = {
+ createAudioAttributes(AudioUsage::MEDIA, AudioContentType::UNKNOWN, "oem_specific_tag1")};
+
+const std::vector<api::FadeConfiguration> kFadeOutConfigurations = {
+ createFadeConfiguration(
+ 500, createAudioAttributes(AudioUsage::ASSISTANT, AudioContentType::UNKNOWN,
+ "oem_specific_tag2")),
+ createFadeConfiguration(500, AudioUsage::MEDIA),
+ createFadeConfiguration(500, AudioUsage::GAME),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_SONIFICATION),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_ACCESSIBILITY),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE),
+ createFadeConfiguration(800, AudioUsage::ASSISTANT),
+ createFadeConfiguration(800, AudioUsage::ANNOUNCEMENT),
+};
+
+const std::vector<api::FadeConfiguration> kFadeInConfigurations = {
+ createFadeConfiguration(
+ 1000, createAudioAttributes(AudioUsage::ASSISTANT, AudioContentType::UNKNOWN,
+ "oem_specific_tag2")),
+ createFadeConfiguration(1000, AudioUsage::MEDIA),
+ createFadeConfiguration(1000, AudioUsage::GAME),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_SONIFICATION),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_ACCESSIBILITY),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE),
+ createFadeConfiguration(800, AudioUsage::ASSISTANT),
+ createFadeConfiguration(800, AudioUsage::ANNOUNCEMENT),
+};
+
+const api::AudioFadeConfiguration kRelaxedFading = createAudioFadeConfiguration(
+ "relaxed fading", api::FadeState::FADE_STATE_ENABLED_DEFAULT, kFadeableUsages,
+ std::optional<std::vector<AudioContentType>>(
+ {AudioContentType::SPEECH, AudioContentType::SONIFICATION}),
+ kUnfadeableAudioAttributes, kFadeOutConfigurations, kFadeInConfigurations, 800, 500, 10000);
+
+const std::vector<AudioAttributes> kAggressiveUnfadeableAudioAttributes = {
+ createAudioAttributes(AudioUsage::MEDIA, AudioContentType::UNKNOWN, "oem_specific_tag1"),
+ createAudioAttributes(AudioUsage::ASSISTANT, AudioContentType::UNKNOWN,
+ "oem_projection_service"),
+};
+
+const std::vector<api::FadeConfiguration> kAggressiveFadeOutConfigurations = {
+ createFadeConfiguration(150, AudioUsage::MEDIA),
+ createFadeConfiguration(150, AudioUsage::GAME),
+ createFadeConfiguration(400, AudioUsage::ASSISTANCE_SONIFICATION),
+ createFadeConfiguration(400, AudioUsage::ASSISTANCE_ACCESSIBILITY),
+ createFadeConfiguration(400, AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE),
+ createFadeConfiguration(400, AudioUsage::ASSISTANT),
+ createFadeConfiguration(400, AudioUsage::ANNOUNCEMENT),
+};
+
+const std::vector<api::FadeConfiguration> kAggressiveFadeInConfigurations = {
+ createFadeConfiguration(300, AudioUsage::MEDIA),
+ createFadeConfiguration(300, AudioUsage::GAME),
+ createFadeConfiguration(550, AudioUsage::ASSISTANCE_SONIFICATION),
+ createFadeConfiguration(550, AudioUsage::ASSISTANCE_ACCESSIBILITY),
+ createFadeConfiguration(550, AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE),
+ createFadeConfiguration(550, AudioUsage::ASSISTANT),
+ createFadeConfiguration(550, AudioUsage::ANNOUNCEMENT),
+};
+
+const api::AudioFadeConfiguration kAggressiveFading = createAudioFadeConfiguration(
+ "aggressive fading", api::FadeState::FADE_STATE_ENABLED_DEFAULT, kFadeableUsages,
+ std::optional<std::vector<AudioContentType>>(
+ {AudioContentType::SPEECH, AudioContentType::MUSIC}),
+ kAggressiveUnfadeableAudioAttributes, kAggressiveFadeOutConfigurations,
+ kAggressiveFadeInConfigurations);
+
+const api::AudioFadeConfiguration kDisabledFading =
+ createAudioFadeConfiguration("disabled fading", api::FadeState::FADE_STATE_DISABLED);
+
+const std::vector<api::FadeConfiguration> kDynamicFadeOutConfigurations = {
+ createFadeConfiguration(
+ 500, createAudioAttributes(AudioUsage::ASSISTANT, AudioContentType::UNKNOWN,
+ "oem_specific_tag2")),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_SONIFICATION),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_ACCESSIBILITY),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE),
+ createFadeConfiguration(800, AudioUsage::ASSISTANT),
+ createFadeConfiguration(800, AudioUsage::ANNOUNCEMENT),
+};
+
+const std::vector<api::FadeConfiguration> kDynamicFadeInConfigurations = {
+ createFadeConfiguration(
+ 1000, createAudioAttributes(AudioUsage::ASSISTANT, AudioContentType::UNKNOWN,
+ "oem_specific_tag2")),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_SONIFICATION),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_ACCESSIBILITY),
+ createFadeConfiguration(800, AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE),
+ createFadeConfiguration(800, AudioUsage::ASSISTANT),
+ createFadeConfiguration(800, AudioUsage::ANNOUNCEMENT),
+};
+
+const api::AudioFadeConfiguration kDynamicFading = createAudioFadeConfiguration(
+ "dynamic fading", api::FadeState::FADE_STATE_ENABLED_DEFAULT, kFadeableUsages,
+ std::optional<std::vector<AudioContentType>>(
+ {AudioContentType::SPEECH, AudioContentType::MOVIE}),
+ kUnfadeableAudioAttributes, kDynamicFadeOutConfigurations, kDynamicFadeInConfigurations,
+ 800, 500);
+
+const api::AudioZoneFadeConfiguration kDefaultAudioConfigFading = createAudioZoneFadeConfiguration(
+ kRelaxedFading,
+ {createTransientFadeConfiguration(
+ kAggressiveFading, {AudioUsage::VOICE_COMMUNICATION, AudioUsage::ANNOUNCEMENT,
+ AudioUsage::VEHICLE_STATUS, AudioUsage::SAFETY}),
+ createTransientFadeConfiguration(kDisabledFading, {AudioUsage::EMERGENCY})});
+
+const api::AudioZoneFadeConfiguration kDynamicDeviceAudioConfigFading =
+ createAudioZoneFadeConfiguration(
+ kDynamicFading,
+ {createTransientFadeConfiguration(
+ kAggressiveFading,
+ {AudioUsage::VOICE_COMMUNICATION, AudioUsage::ANNOUNCEMENT,
+ AudioUsage::VEHICLE_STATUS, AudioUsage::SAFETY}),
+ createTransientFadeConfiguration(kDisabledFading, {AudioUsage::EMERGENCY})});
+
+const api::AudioZoneContextInfo kMusicContextInfo =
+ createContextInfo("oem_music", {AudioUsage::MEDIA, AudioUsage::GAME, AudioUsage::UNKNOWN});
+const api::AudioZoneContextInfo kNotificationContextInfo = createContextInfo(
+ "oem_notification", {AudioUsage::NOTIFICATION, AudioUsage::NOTIFICATION_EVENT});
+const api::AudioZoneContextInfo kVoiceContextInfo = createContextInfo(
+ "oem_voice_command", {AudioUsage::ASSISTANT, AudioUsage::ASSISTANCE_ACCESSIBILITY,
+ AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE});
+const api::AudioZoneContextInfo kCallContextInfo =
+ createContextInfo("oem_call", {AudioUsage::VOICE_COMMUNICATION, AudioUsage::CALL_ASSISTANT,
+ AudioUsage::VOICE_COMMUNICATION_SIGNALLING});
+const api::AudioZoneContextInfo kRingContextInfo =
+ createContextInfo("oem_call_ring", {AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE});
+const api::AudioZoneContextInfo kAlarmContextInfo =
+ createContextInfo("oem_alarm", {AudioUsage::ALARM});
+const api::AudioZoneContextInfo kSystemContextInfo = createContextInfo(
+ "oem_system_sound",
+ {AudioUsage::ASSISTANCE_SONIFICATION, AudioUsage::EMERGENCY, AudioUsage::SAFETY,
+ AudioUsage::VEHICLE_STATUS, AudioUsage::ANNOUNCEMENT});
+const api::AudioZoneContextInfo kOemContextInfo = createContextInfo(
+ "oem_context", {createAudioAttributes(AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE,
+ AudioContentType::SPEECH, "oem=extension_8675309")});
+
+const std::vector<api::AudioZoneContextInfo> kSimpleCarAudioConfigurationContext = {
+ kOemContextInfo, kMusicContextInfo, kNotificationContextInfo, kVoiceContextInfo,
+ kCallContextInfo, kRingContextInfo, kAlarmContextInfo, kSystemContextInfo};
+
+const api::AudioZoneContextInfo kDefaultMusicContextInfo =
+ createContextInfo("music", {AudioUsage::UNKNOWN, AudioUsage::MEDIA, AudioUsage::GAME}, 1);
+const api::AudioZoneContextInfo kDefaultNavContextInfo =
+ createContextInfo("navigation", {AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE}, 2);
+const api::AudioZoneContextInfo kDefaultVoiceContextInfo = createContextInfo(
+ "voice_command", {AudioUsage::ASSISTANCE_ACCESSIBILITY, AudioUsage::ASSISTANT}, 3);
+const api::AudioZoneContextInfo kDefaultRingContextInfo =
+ createContextInfo("call_ring", {AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE}, 4);
+const api::AudioZoneContextInfo kDefaultCallContextInfo =
+ createContextInfo("call",
+ {AudioUsage::VOICE_COMMUNICATION, AudioUsage::CALL_ASSISTANT,
+ AudioUsage::VOICE_COMMUNICATION_SIGNALLING},
+ 5);
+const api::AudioZoneContextInfo kDefaultAlarmContextInfo =
+ createContextInfo("alarm", {AudioUsage::ALARM}, 6);
+const api::AudioZoneContextInfo kDefaultNotificationContextInfo = createContextInfo(
+ "notification", {AudioUsage::NOTIFICATION, AudioUsage::NOTIFICATION_EVENT}, 7);
+const api::AudioZoneContextInfo kDefaultSystemContextInfo =
+ createContextInfo("system_sound", {AudioUsage::ASSISTANCE_SONIFICATION}, 8);
+const api::AudioZoneContextInfo kDefaultEmergencyContextInfo =
+ createContextInfo("emergency", {AudioUsage::EMERGENCY}, 9);
+const api::AudioZoneContextInfo kDefaultSafetyContextInfo =
+ createContextInfo("safety", {AudioUsage::SAFETY}, 10);
+const api::AudioZoneContextInfo kDefaultVehicleStatusContextInfo =
+ createContextInfo("vehicle_status", {AudioUsage::VEHICLE_STATUS}, 11);
+const api::AudioZoneContextInfo kDefaultAnnouncementContextInfo =
+ createContextInfo("announcement", {AudioUsage::ANNOUNCEMENT}, 12);
+
+const std::vector<api::AudioZoneContextInfo> kDefaultCarAudioConfigurationContext = {
+ kDefaultMusicContextInfo, kDefaultNavContextInfo,
+ kDefaultVoiceContextInfo, kDefaultRingContextInfo,
+ kDefaultCallContextInfo, kDefaultAlarmContextInfo,
+ kDefaultNotificationContextInfo, kDefaultSystemContextInfo,
+ kDefaultEmergencyContextInfo, kDefaultSafetyContextInfo,
+ kDefaultVehicleStatusContextInfo, kDefaultAnnouncementContextInfo};
+
+const api::VolumeActivationConfiguration kOnBootVolumeActivation =
+ createVolumeActivation("on_boot_config", api::VolumeInvocationType::ON_BOOT, 0, 80);
+const api::VolumeActivationConfiguration kOnSourceVolumeActivation = createVolumeActivation(
+ "on_source_changed_config", api::VolumeInvocationType::ON_SOURCE_CHANGED, 20, 80);
+const api::VolumeActivationConfiguration kOnPlayVolumeActivation = createVolumeActivation(
+ "on_playback_changed_config", api::VolumeInvocationType::ON_PLAYBACK_CHANGED, 10, 90);
+
+const AudioPort kBusMediaDevice = createAudioPort("BUS00_MEDIA", AudioDeviceType::OUT_BUS);
+const AudioPort kBTMediaDevice = createAudioPort("temp", AudioDeviceType::OUT_DEVICE, "bt-a2dp");
+const AudioPort kUSBMediaDevice = createAudioPort("", AudioDeviceType::OUT_HEADSET, "usb");
+
+const AudioPort kBusNavDevice = createAudioPort("BUS02_NAV_GUIDANCE", AudioDeviceType::OUT_BUS);
+const AudioPort kBusPhoneDevice = createAudioPort("BUS03_PHONE", AudioDeviceType::OUT_BUS);
+const AudioPort kBusSysDevice = createAudioPort("BUS01_SYS_NOTIFICATION", AudioDeviceType::OUT_BUS);
+
+const AudioPort kMirrorDevice1 = createAudioPort("mirror_bus_device_1", AudioDeviceType::OUT_BUS);
+const AudioPort kMirrorDevice2 = createAudioPort("mirror_bus_device_2", AudioDeviceType::OUT_BUS);
+const std::vector<AudioPort> kMirroringDevices = {kMirrorDevice1, kMirrorDevice2};
+
+const AudioPort kMirrorDeviceThree =
+ createAudioPort("mirror_bus_device_three", AudioDeviceType::OUT_BUS);
+const AudioPort kMirrorDeviceFour =
+ createAudioPort("mirror_bus_device_four", AudioDeviceType::OUT_BUS);
+const std::vector<AudioPort> kMultiZoneMirroringDevices = {kMirrorDeviceThree, kMirrorDeviceFour};
+
+const AudioPort kInFMTunerDevice = createAudioPort("fm_tuner", AudioDeviceType::IN_FM_TUNER);
+const AudioPort kInMicDevice = createAudioPort("built_in_mic", AudioDeviceType::IN_MICROPHONE);
+const AudioPort kInBusDevice = createAudioPort("in_bus_device", AudioDeviceType::IN_BUS);
+const std::vector<AudioPort> kInputDevices{kInFMTunerDevice, kInMicDevice, kInBusDevice};
+
+const api::VolumeGroupConfig kBusMediaVolumeGroup = createVolumeGroup(
+ "entertainment", kOnBootVolumeActivation, {createRoutes(kBusMediaDevice, {"oem_music"})});
+const api::VolumeGroupConfig kUSBMediaVolumeGroup = createVolumeGroup(
+ "entertainment", kOnBootVolumeActivation, {createRoutes(kUSBMediaDevice, {"oem_music"})});
+const api::VolumeGroupConfig kBTMediaVolumeGroup = createVolumeGroup(
+ "entertainment", kOnBootVolumeActivation, {createRoutes(kBTMediaDevice, {"oem_music"})});
+const api::VolumeGroupConfig kBusNavVolumeGroup =
+ createVolumeGroup("navvoicecommand", kOnSourceVolumeActivation,
+ {createRoutes(kBusNavDevice, {"oem_voice_command"})});
+const api::VolumeGroupConfig kBusCallVolumeGroup =
+ createVolumeGroup("telringvol", kOnPlayVolumeActivation,
+ {createRoutes(kBusPhoneDevice, {"oem_call", "oem_call_ring"})});
+const api::VolumeGroupConfig kBusSysVolumeGroup = createVolumeGroup(
+ "systemalarm", kOnSourceVolumeActivation,
+ {createRoutes(kBusSysDevice, {"oem_alarm", "oem_system_sound", "oem_notification"})});
+
+const api::AudioZoneConfig kAllBusZoneConfig = createAudioZoneConfig(
+ "primary zone config 0", kDefaultAudioConfigFading,
+ {kBusMediaVolumeGroup, kBusNavVolumeGroup, kBusCallVolumeGroup, kBusSysVolumeGroup}, true);
+const api::AudioZoneConfig kBTMediaZoneConfig = createAudioZoneConfig(
+ "primary zone BT media", kDynamicDeviceAudioConfigFading,
+ {kBTMediaVolumeGroup, kBusNavVolumeGroup, kBusCallVolumeGroup, kBusSysVolumeGroup});
+const api::AudioZoneConfig kUsBMediaZoneConfig = createAudioZoneConfig(
+ "primary zone USB media", kDynamicDeviceAudioConfigFading,
+ {kUSBMediaVolumeGroup, kBusNavVolumeGroup, kBusCallVolumeGroup, kBusSysVolumeGroup});
+
+const std::unordered_map<std::string, api::AudioZoneConfig> kConfigNameToZoneConfig = {
+ {kAllBusZoneConfig.name, kAllBusZoneConfig},
+ {kBTMediaZoneConfig.name, kBTMediaZoneConfig},
+ {kUsBMediaZoneConfig.name, kUsBMediaZoneConfig},
+};
+
+const api::AudioZoneConfig kDriverZoneConfig = createAudioZoneConfig(
+ "driver zone config 0", kDefaultAudioConfigFading,
+ {kBusMediaVolumeGroup, kBusNavVolumeGroup, kBusCallVolumeGroup, kBusSysVolumeGroup}, true);
+
+const api::AudioZone kDriverZone =
+ createAudioZone("driver zone", api::AudioZone::PRIMARY_AUDIO_ZONE,
+ kSimpleCarAudioConfigurationContext, {kDriverZoneConfig});
+
+const api::AudioZoneFadeConfiguration kZoneAudioConfigFading = createAudioZoneFadeConfiguration(
+ kRelaxedFading,
+ {createTransientFadeConfiguration(kDisabledFading, {AudioUsage::EMERGENCY})});
+
+const AudioPort kBusFrontDevice = createAudioPort("BUS_FRONT", AudioDeviceType::OUT_BUS);
+const api::VolumeGroupConfig kFrontVolumeGroup = createVolumeGroup(
+ "entertainment", kOnBootVolumeActivation,
+ {createRoutes(kBusFrontDevice,
+ {"oem_music", "oem_voice_command", "oem_call", "oem_call_ring", "oem_alarm",
+ "oem_system_sound", "oem_notification"})});
+const api::AudioZoneConfig kFrontZoneConfig = createAudioZoneConfig(
+ "front passenger config 0", kZoneAudioConfigFading, {kFrontVolumeGroup}, true);
+const api::AudioZone kFrontZone =
+ createAudioZone("front passenger zone", api::AudioZone::PRIMARY_AUDIO_ZONE + 1,
+ kSimpleCarAudioConfigurationContext, {kFrontZoneConfig});
+
+const AudioPort kBusRearDevice = createAudioPort("BUS_REAR", AudioDeviceType::OUT_BUS);
+const api::VolumeGroupConfig kRearVolumeGroup =
+ createVolumeGroup("entertainment", kOnBootVolumeActivation,
+ {createRoutes(kBusRearDevice, {"oem_music", "oem_voice_command",
+ "oem_call", "oem_call_ring", "oem_alarm",
+ "oem_system_sound", "oem_notification"})});
+const api::AudioZoneConfig kRearZoneConfig = createAudioZoneConfig(
+ "rear seat config 0", kZoneAudioConfigFading, {kRearVolumeGroup}, true);
+const api::AudioZone kRearZone =
+ createAudioZone("rear seat zone", api::AudioZone::PRIMARY_AUDIO_ZONE + 2,
+ kSimpleCarAudioConfigurationContext, {kRearZoneConfig});
+
+std::vector<api::AudioZone> kMultiZones = {kDriverZone, kFrontZone, kRearZone};
+
+void expectSameFadeConfiguration(const api::AudioFadeConfiguration& actual,
+ const api::AudioFadeConfiguration& expected,
+ const std::string& configName) {
+ EXPECT_EQ(actual.name, expected.name) << "Audio fade configuration for config " << configName;
+ const std::string fadeConfigInfo =
+ "fade config " + actual.name + " in config name " + configName;
+ EXPECT_EQ(actual.fadeState, expected.fadeState)
+ << "Audio fade config state for " << fadeConfigInfo;
+ EXPECT_EQ(actual.fadeInDurationMs, expected.fadeInDurationMs)
+ << "Audio fade in duration for " << fadeConfigInfo;
+ EXPECT_EQ(actual.fadeOutDurationMs, expected.fadeOutDurationMs)
+ << "Audio fade out duration for " << fadeConfigInfo;
+ EXPECT_EQ(actual.fadeInDelayedForOffendersMs, expected.fadeInDelayedForOffendersMs)
+ << "Audio fade in delayed for offenders duration for " << fadeConfigInfo;
+ EXPECT_THAT(actual.fadeableUsages, UnorderedElementsAreArray(expected.fadeableUsages))
+ << "Fadeable usages for " << fadeConfigInfo;
+ EXPECT_TRUE(actual.unfadeableContentTypes.has_value() ==
+ expected.unfadeableContentTypes.has_value())
+ << "Optional unfadeable for " << fadeConfigInfo;
+ if (actual.unfadeableContentTypes.has_value() && expected.unfadeableContentTypes.has_value()) {
+ EXPECT_THAT(actual.unfadeableContentTypes.value(),
+ UnorderedElementsAreArray(expected.unfadeableContentTypes.value()))
+ << "Unfadeable content type for " << fadeConfigInfo;
+ }
+ EXPECT_THAT(actual.unfadableAudioAttributes,
+ UnorderedElementsAreArray(expected.unfadableAudioAttributes))
+ << "Unfadeable audio attributes type for " << fadeConfigInfo;
+ EXPECT_THAT(actual.fadeOutConfigurations,
+ UnorderedElementsAreArray(expected.fadeOutConfigurations))
+ << "Fade-out configurations for " << fadeConfigInfo;
+ EXPECT_THAT(actual.fadeInConfigurations,
+ UnorderedElementsAreArray(expected.fadeInConfigurations))
+ << "Fade-in configurations for " << fadeConfigInfo;
+}
+
+void expectSameAudioZoneFadeConfiguration(
+ const std::optional<api::AudioZoneFadeConfiguration>& actual,
+ const std::optional<api::AudioZoneFadeConfiguration>& expected,
+ const std::string& configName) {
+ if (!actual.has_value() || !expected.has_value()) {
+ EXPECT_EQ(actual.has_value(), expected.has_value())
+ << "Audio zone config " << configName << " fade configuration missing";
+ return;
+ }
+ const api::AudioZoneFadeConfiguration& actualConfig = actual.value();
+ const api::AudioZoneFadeConfiguration& expectedConfig = expected.value();
+ expectSameFadeConfiguration(actualConfig.defaultConfiguration,
+ expectedConfig.defaultConfiguration, configName);
+ EXPECT_THAT(actualConfig.transientConfiguration,
+ UnorderedElementsAreArray(expectedConfig.transientConfiguration))
+ << "Transient fade configuration for config " << configName;
+}
+
+void expectSameAudioZoneConfiguration(const api::AudioZoneConfig& actual,
+ const api::AudioZoneConfig& expected) {
+ EXPECT_EQ(actual.isDefault, expected.isDefault)
+ << "Zone default's status do not match for config " << actual.name;
+ EXPECT_THAT(actual.volumeGroups, UnorderedElementsAreArray(expected.volumeGroups))
+ << "Volume groups for config " << actual.name;
+ expectSameAudioZoneFadeConfiguration(actual.fadeConfiguration, expected.fadeConfiguration,
+ actual.name);
+}
+
+class CarAudioConfigurationTest : public testing::Test {
+ protected:
+ void SetUp() override;
+ void TearDown() override;
+
+ std::unique_ptr<converter::CarAudioConfigurationXmlConverter> converter;
+
+ protected:
+ virtual std::string getCarAudioConfiguration() = 0;
+ virtual std::string getCarFadeConfiguration() = 0;
+};
+
+void CarAudioConfigurationTest::SetUp() {
+ converter = std::make_unique<converter::CarAudioConfigurationXmlConverter>(
+ getTestFilePath(getCarAudioConfiguration()),
+ getTestFilePath(getCarFadeConfiguration()));
+}
+
+void CarAudioConfigurationTest::TearDown() {
+ converter.reset();
+}
+
+class SimpleCarAudioConfigurationTest : public CarAudioConfigurationTest {
+ virtual std::string getCarAudioConfiguration() { return "simple_car_audio_configuration.xml"; }
+
+ virtual std::string getCarFadeConfiguration() { return "car_audio_fade_configuration.xml"; }
+};
+
+TEST_F(SimpleCarAudioConfigurationTest, TestLoadSimpleConfiguration) {
+ EXPECT_EQ(converter->getErrors(), "");
+
+ const auto audioDeviceConfigs = converter->getAudioDeviceConfiguration();
+ EXPECT_EQ(audioDeviceConfigs.routingConfig,
+ api::RoutingDeviceConfiguration::DYNAMIC_AUDIO_ROUTING);
+ EXPECT_FALSE(audioDeviceConfigs.useCoreAudioVolume);
+ EXPECT_TRUE(audioDeviceConfigs.useHalDuckingSignals);
+ EXPECT_TRUE(audioDeviceConfigs.useCarVolumeGroupMuting);
+
+ const auto& mirroringDevices = converter->getOutputMirroringDevices();
+
+ EXPECT_EQ(mirroringDevices.size(), 2) << "Mirroring device size";
+ for (const auto& mirroringDevice : mirroringDevices) {
+ const auto& it =
+ std::find(kMirroringDevices.begin(), kMirroringDevices.end(), mirroringDevice);
+ EXPECT_TRUE(it != kMirroringDevices.end())
+ << "Mirroring device not found " << mirroringDevice.toString();
+ }
+
+ const auto zones = converter->getAudioZones();
+ EXPECT_EQ(zones.size(), 1);
+
+ const auto& zone = zones.front();
+ EXPECT_EQ(zone.id, api::AudioZone::PRIMARY_AUDIO_ZONE);
+ EXPECT_EQ(zone.occupantZoneId, 0);
+ EXPECT_EQ(zone.name, "primary zone");
+
+ EXPECT_EQ(zone.audioZoneContext.audioContextInfos.size(),
+ kSimpleCarAudioConfigurationContext.size());
+ for (const auto& info : zone.audioZoneContext.audioContextInfos) {
+ const auto iterator = std::find(kSimpleCarAudioConfigurationContext.begin(),
+ kSimpleCarAudioConfigurationContext.end(), info);
+ EXPECT_TRUE(iterator != kSimpleCarAudioConfigurationContext.end())
+ << "Context name " << info.toString() << kMusicContextInfo.toString();
+ }
+
+ for (const auto& config : zone.audioZoneConfigs) {
+ const auto& iterator = kConfigNameToZoneConfig.find(config.name);
+ EXPECT_TRUE(iterator != kConfigNameToZoneConfig.end())
+ << "Zone config not found " << config.name;
+ expectSameAudioZoneConfiguration(config, iterator->second);
+ }
+
+ const auto& inputDevices = zone.inputAudioDevices;
+ EXPECT_EQ(inputDevices.size(), 3) << "Input devices";
+ for (const auto& inputDevice : inputDevices) {
+ const auto& it = std::find(kInputDevices.begin(), kInputDevices.end(), inputDevice);
+ EXPECT_TRUE(it != kInputDevices.end())
+ << "Input device " << inputDevice.toString() << " not found";
+ }
+}
+
+class TypeDeviceCarAudioConfigurationTest : public CarAudioConfigurationTest {
+ virtual std::string getCarAudioConfiguration() {
+ return "simple_car_audio_configuration_with_device_type.xml";
+ }
+
+ virtual std::string getCarFadeConfiguration() { return "car_audio_fade_configuration.xml"; }
+};
+
+TEST_F(TypeDeviceCarAudioConfigurationTest, TestLoadConfigurationWithDeviceType) {
+ EXPECT_EQ(converter->getErrors(), "");
+
+ const auto audioDeviceConfigs = converter->getAudioDeviceConfiguration();
+ EXPECT_EQ(audioDeviceConfigs.routingConfig,
+ api::RoutingDeviceConfiguration::DYNAMIC_AUDIO_ROUTING);
+ EXPECT_FALSE(audioDeviceConfigs.useCoreAudioVolume);
+ EXPECT_TRUE(audioDeviceConfigs.useHalDuckingSignals);
+ EXPECT_TRUE(audioDeviceConfigs.useCarVolumeGroupMuting);
+
+ const auto& mirroringDevices = converter->getOutputMirroringDevices();
+
+ EXPECT_EQ(mirroringDevices.size(), 2) << "Mirroring device size";
+ for (const auto& mirroringDevice : mirroringDevices) {
+ const auto& it =
+ std::find(kMirroringDevices.begin(), kMirroringDevices.end(), mirroringDevice);
+ EXPECT_TRUE(it != kMirroringDevices.end())
+ << "Mirroring device not found " << mirroringDevice.toString();
+ }
+
+ const auto zones = converter->getAudioZones();
+ EXPECT_EQ(zones.size(), 1);
+
+ const auto& zone = zones.front();
+ EXPECT_EQ(zone.id, api::AudioZone::PRIMARY_AUDIO_ZONE);
+ EXPECT_EQ(zone.occupantZoneId, 0);
+ EXPECT_EQ(zone.name, "primary zone");
+
+ EXPECT_EQ(zone.audioZoneContext.audioContextInfos.size(),
+ kSimpleCarAudioConfigurationContext.size());
+ for (const auto& info : zone.audioZoneContext.audioContextInfos) {
+ const auto iterator = std::find(kSimpleCarAudioConfigurationContext.begin(),
+ kSimpleCarAudioConfigurationContext.end(), info);
+ EXPECT_TRUE(iterator != kSimpleCarAudioConfigurationContext.end())
+ << "Context name " << info.toString() << kMusicContextInfo.toString();
+ }
+
+ for (const auto& config : zone.audioZoneConfigs) {
+ const auto& iterator = kConfigNameToZoneConfig.find(config.name);
+ EXPECT_TRUE(iterator != kConfigNameToZoneConfig.end())
+ << "Zone config not found " << config.name;
+ expectSameAudioZoneConfiguration(config, iterator->second);
+ }
+
+ const auto& inputDevices = zone.inputAudioDevices;
+ EXPECT_EQ(inputDevices.size(), 3) << "Input devices";
+ for (const auto& inputDevice : inputDevices) {
+ const auto& it = std::find(kInputDevices.begin(), kInputDevices.end(), inputDevice);
+ EXPECT_TRUE(it != kInputDevices.end())
+ << "Input device " << inputDevice.toString() << " not found";
+ }
+}
+
+class CarAudioConfigurationWithDefaultContextTest : public CarAudioConfigurationTest {
+ virtual std::string getCarAudioConfiguration() {
+ return "car_audio_configuration_with_default_context.xml";
+ }
+
+ virtual std::string getCarFadeConfiguration() { return ""; }
+};
+
+TEST_F(CarAudioConfigurationWithDefaultContextTest, TestLoadConfiguration) {
+ EXPECT_EQ(converter->getErrors(), "");
+ const auto& zones = converter->getAudioZones();
+ EXPECT_EQ(zones.size(), 1) << "Default audio context zones";
+ const auto& zone = zones.front();
+ const auto& context = zone.audioZoneContext;
+ EXPECT_THAT(context.audioContextInfos,
+ UnorderedElementsAreArray(kDefaultCarAudioConfigurationContext))
+ << "Default audio contexts";
+}
+
+class MultiZoneCarAudioConfigurationTest : public CarAudioConfigurationTest {
+ std::string getCarAudioConfiguration() override {
+ return "multi_zone_car_audio_configuration.xml";
+ }
+
+ std::string getCarFadeConfiguration() override { return "car_audio_fade_configuration.xml"; }
+};
+
+TEST_F(MultiZoneCarAudioConfigurationTest, TestLoadMultiZoneConfiguration) {
+ EXPECT_EQ(converter->getErrors(), "");
+
+ const auto audioDeviceConfigs = converter->getAudioDeviceConfiguration();
+ EXPECT_EQ(audioDeviceConfigs.routingConfig,
+ api::RoutingDeviceConfiguration::CONFIGURABLE_AUDIO_ENGINE_ROUTING);
+ EXPECT_TRUE(audioDeviceConfigs.useCoreAudioVolume);
+ EXPECT_FALSE(audioDeviceConfigs.useHalDuckingSignals);
+ EXPECT_FALSE(audioDeviceConfigs.useCarVolumeGroupMuting);
+
+ const auto& mirroringDevices = converter->getOutputMirroringDevices();
+
+ EXPECT_THAT(mirroringDevices, UnorderedElementsAreArray(kMultiZoneMirroringDevices));
+
+ const auto zones = converter->getAudioZones();
+ EXPECT_THAT(zones, UnorderedElementsAreArray(kMultiZones));
+}
+
+class MalformedCarAudioConfigurationTest : public testing::Test {
+ protected:
+ void TearDown() override;
+
+ std::unique_ptr<converter::CarAudioConfigurationXmlConverter> converter;
+};
+
+void MalformedCarAudioConfigurationTest::TearDown() {
+ converter.reset();
+}
+
+TEST_F(MalformedCarAudioConfigurationTest, TestLoadEmptyConfiguration) {
+ converter =
+ std::make_unique<converter::CarAudioConfigurationXmlConverter>(getTestFilePath(""), "");
+ EXPECT_THAT(converter->getErrors(), ContainsRegex("Configuration file .+ is not readable"))
+ << "Empty configuration file";
+
+ const auto audioDeviceConfigs = converter->getAudioDeviceConfiguration();
+ EXPECT_EQ(audioDeviceConfigs.routingConfig,
+ api::RoutingDeviceConfiguration::DEFAULT_AUDIO_ROUTING)
+ << "Default configuration for empty file";
+}
+
+TEST_F(MalformedCarAudioConfigurationTest, TestLoadNonExistingConfiguration) {
+ converter = std::make_unique<converter::CarAudioConfigurationXmlConverter>(
+ getTestFilePath("non_existing_file.xml"), "");
+ EXPECT_THAT(converter->getErrors(), ContainsRegex("Configuration file .+ is not readable"))
+ << "Empty configuration file";
+
+ const auto audioDeviceConfigs = converter->getAudioDeviceConfiguration();
+ EXPECT_EQ(audioDeviceConfigs.routingConfig,
+ api::RoutingDeviceConfiguration::DEFAULT_AUDIO_ROUTING)
+ << "Default configuration for empty file";
+}
+
+TEST_F(MalformedCarAudioConfigurationTest, TestLoadMalforedConfiguration) {
+ converter = std::make_unique<converter::CarAudioConfigurationXmlConverter>(
+ getTestFilePath("car_audio_configuration_without_configuration.xml"), "");
+ EXPECT_THAT(converter->getErrors(),
+ ContainsRegex("Configuration file .+ does not have any configurations"))
+ << "Configuration file without configurations";
+
+ const auto audioDeviceConfigs = converter->getAudioDeviceConfiguration();
+ EXPECT_EQ(audioDeviceConfigs.routingConfig,
+ api::RoutingDeviceConfiguration::DEFAULT_AUDIO_ROUTING)
+ << "Default configuration for malformed file";
+}
+
+TEST_F(MalformedCarAudioConfigurationTest, TestLoadConfigurationWithoutZones) {
+ converter = std::make_unique<converter::CarAudioConfigurationXmlConverter>(
+ getTestFilePath("car_audio_configuration_without_audio_zone.xml"), "");
+ EXPECT_THAT(converter->getErrors(), ContainsRegex("Audio zones not found in file"))
+ << "Configuration file without zones";
+
+ const auto audioDeviceConfigs = converter->getAudioDeviceConfiguration();
+ EXPECT_EQ(audioDeviceConfigs.routingConfig,
+ api::RoutingDeviceConfiguration::DEFAULT_AUDIO_ROUTING)
+ << "Default configuration for file without zones";
+}
+
+TEST_F(MalformedCarAudioConfigurationTest, TestLoadConfigurationWithMissingZones) {
+ converter = std::make_unique<converter::CarAudioConfigurationXmlConverter>(
+ getTestFilePath("car_audio_configuration_with_missing_zones.xml"), "");
+ EXPECT_THAT(converter->getErrors(), ContainsRegex("Error parsing audio zone"))
+ << "Configuration file with missing zones";
+
+ const auto audioDeviceConfigs = converter->getAudioDeviceConfiguration();
+ EXPECT_EQ(audioDeviceConfigs.routingConfig,
+ api::RoutingDeviceConfiguration::DEFAULT_AUDIO_ROUTING)
+ << "Default configuration for file with missing zones";
+}
+
+} // namespace
diff --git a/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_with_default_context.xml b/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_with_default_context.xml
new file mode 100644
index 0000000..80cb5cd
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_with_default_context.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<carAudioConfiguration version="4">
+ <zones>
+ <zone name="primary zone" isPrimary="true">
+ <zoneConfigs>
+ <zoneConfig name="primary zone config" isDefault="true">
+ <volumeGroups>
+ <group name="entertainment" >
+ <device address="BUS00_MEDIA">
+ <context context="MUSIC"/>
+ </device>
+ </group>
+ <group name="navvoicecommand" >
+ <device address="BUS02_NAV_GUIDANCE">
+ <context context="NAVIGATION"/>
+ <context context="VOICE_COMMAND"/>
+ </device>
+ </group>
+ <group name="telringvol" >
+ <device address="BUS03_PHONE">
+ <context context="CALL"/>
+ <context context="CALL_RING"/>
+ </device>
+ </group>
+ <group name="alarm" >
+ <device address="BUS01_NOTIFICATION">
+ <context context="ALARM"/>
+ <context context="NOTIFICATION"/>
+ </device>
+ </group>
+ <group name="system" >
+ <device address="BUS05_SYSTEM">
+ <context context="SYSTEM_SOUND"/>
+ <context context="EMERGENCY"/>
+ <context context="SAFETY"/>
+ <context context="VEHICLE_STATUS"/>
+ <context context="ANNOUNCEMENT"/>
+ </device>
+ </group>
+ </volumeGroups>
+ </zoneConfig>
+ </zoneConfigs>
+ </zone>
+ </zones>
+</carAudioConfiguration>
diff --git a/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_with_missing_zones.xml b/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_with_missing_zones.xml
new file mode 100644
index 0000000..a5880b3
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_with_missing_zones.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<carAudioConfiguration version="4">
+ <deviceConfigurations>
+ <deviceConfiguration name="useHalDuckingSignals" value="true" />
+ <deviceConfiguration name="useCoreAudioRouting" value="false" />
+ <deviceConfiguration name="useCoreAudioVolume" value="false" />
+ <deviceConfiguration name="useCarVolumeGroupMuting" value="true" />
+ </deviceConfigurations>
+ <oemContexts>
+ <oemContext name="oem_context">
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"
+ contentType="AUDIO_CONTENT_TYPE_SPEECH"
+ tags="oem=extension_8675309" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_music">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <usage value="AUDIO_USAGE_UNKNOWN" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_notification">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION" />
+ <usage value="AUDIO_USAGE_NOTIFICATION_EVENT" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_voice_command">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_CALL_ASSISTANT" />
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call_ring">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_alarm">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ALARM" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_system_sound">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ </audioAttributes>
+ </oemContext>
+ </oemContexts>
+ <activationVolumeConfigs>
+ <activationVolumeConfig name="on_boot_config">
+ <activationVolumeConfigEntry maxActivationVolumePercentage="80" invocationType="onBoot" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_source_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="20" maxActivationVolumePercentage="80" invocationType="onSourceChanged" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_playback_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90" invocationType="onPlaybackChanged" />
+ </activationVolumeConfig>
+ </activationVolumeConfigs>
+ <mirroringDevices>
+ <mirroringDevice address="mirror_bus_device_1"/>
+ <mirroringDevice address="mirror_bus_device_2"/>
+ </mirroringDevices>
+ <zones>
+ </zones>
+</carAudioConfiguration>
diff --git a/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_without_audio_zone.xml b/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_without_audio_zone.xml
new file mode 100644
index 0000000..1e50e6e
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_without_audio_zone.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<carAudioConfiguration version="4">
+ <deviceConfigurations>
+ <deviceConfiguration name="useHalDuckingSignals" value="true" />
+ <deviceConfiguration name="useCoreAudioRouting" value="false" />
+ <deviceConfiguration name="useCoreAudioVolume" value="false" />
+ <deviceConfiguration name="useCarVolumeGroupMuting" value="true" />
+ </deviceConfigurations>
+ <oemContexts>
+ <oemContext name="oem_context">
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"
+ contentType="AUDIO_CONTENT_TYPE_SPEECH"
+ tags="oem=extension_8675309" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_music">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <usage value="AUDIO_USAGE_UNKNOWN" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_notification">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION" />
+ <usage value="AUDIO_USAGE_NOTIFICATION_EVENT" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_voice_command">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_CALL_ASSISTANT" />
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call_ring">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_alarm">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ALARM" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_system_sound">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ </audioAttributes>
+ </oemContext>
+ </oemContexts>
+ <activationVolumeConfigs>
+ <activationVolumeConfig name="on_boot_config">
+ <activationVolumeConfigEntry maxActivationVolumePercentage="80" invocationType="onBoot" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_source_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="20" maxActivationVolumePercentage="80" invocationType="onSourceChanged" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_playback_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90" invocationType="onPlaybackChanged" />
+ </activationVolumeConfig>
+ </activationVolumeConfigs>
+ <mirroringDevices>
+ <mirroringDevice address="mirror_bus_device_1"/>
+ <mirroringDevice address="mirror_bus_device_2"/>
+ </mirroringDevices>
+</carAudioConfiguration>
diff --git a/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_without_configuration.xml b/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_without_configuration.xml
new file mode 100644
index 0000000..4f50ca2
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/car_audio_configuration_without_configuration.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<nonCarAudioConfiguration version="4">
+
+</nonCarAudioConfiguration>
diff --git a/automotive/audiocontrol/aidl/default/converter/test/car_audio_fade_configuration.xml b/automotive/audiocontrol/aidl/default/converter/test/car_audio_fade_configuration.xml
new file mode 100644
index 0000000..249f915
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/car_audio_fade_configuration.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<carAudioFadeConfiguration version="1">
+ <configs>
+ <config name="relaxed fading" defaultFadeOutDurationInMillis="800" defaultFadeInDurationInMillis="500" defaultFadeInDelayForOffenders="10000" >
+ <fadeState value="1" />
+ <fadeableUsages>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_NOTIFICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT"/>
+ </fadeableUsages>
+ <unfadeableContentTypes>
+ <contentType value="AUDIO_CONTENT_TYPE_SPEECH" />
+ <contentType value="AUDIO_CONTENT_TYPE_SONIFICATION" />
+ </unfadeableContentTypes>
+ <unfadeableAudioAttributes>
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_MEDIA" tags="oem_specific_tag1" />
+ </audioAttributes>
+ </unfadeableAudioAttributes>
+ <fadeOutConfigurations>
+ <fadeConfiguration fadeDurationMillis="500">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANT" tags="oem_specific_tag2" />
+ </audioAttributes>
+ </fadeConfiguration>
+ <fadeConfiguration fadeDurationMillis="800">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT"/>
+ </audioAttributes>
+ </fadeConfiguration>
+ </fadeOutConfigurations>
+ <fadeInConfigurations>
+ <fadeConfiguration fadeDurationMillis="1000">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANT" tags="oem_specific_tag2" />
+ </audioAttributes>
+ </fadeConfiguration>
+ <fadeConfiguration fadeDurationMillis="800">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT"/>
+ </audioAttributes>
+ </fadeConfiguration>
+ </fadeInConfigurations>
+ </config>
+ <config name="aggressive fading">
+ <fadeState value="FADE_STATE_ENABLED_DEFAULT" />
+ <fadeableUsages>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_NOTIFICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT"/>
+ </fadeableUsages>
+ <unfadeableContentTypes>
+ <contentType value="AUDIO_CONTENT_TYPE_SPEECH" />
+ <contentType value="AUDIO_CONTENT_TYPE_MUSIC" />
+ </unfadeableContentTypes>
+ <unfadeableAudioAttributes>
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_MEDIA" tags="oem_specific_tag1" />
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANT" tags="oem_projection_service" />
+ </audioAttributes>
+ </unfadeableAudioAttributes>
+ <fadeOutConfigurations>
+ <fadeConfiguration fadeDurationMillis="150">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ </audioAttributes>
+ </fadeConfiguration>
+ <fadeConfiguration fadeDurationMillis="400">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT"/>
+ </audioAttributes>
+ </fadeConfiguration>
+ </fadeOutConfigurations>
+ <fadeInConfigurations>
+ <fadeConfiguration fadeDurationMillis="300">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ </audioAttributes>
+ </fadeConfiguration>
+ <fadeConfiguration fadeDurationMillis="550">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT"/>
+ </audioAttributes>
+ </fadeConfiguration>
+ </fadeInConfigurations>
+ </config>
+ <config name="disabled fading">
+ <fadeState value="0" />
+ </config>
+ <config name="dynamic fading" defaultFadeOutDurationInMillis="800" defaultFadeInDurationInMillis="500">
+ <fadeState value="1" />
+ <fadeableUsages>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_NOTIFICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT"/>
+ </fadeableUsages>
+ <unfadeableContentTypes>
+ <contentType value="AUDIO_CONTENT_TYPE_SPEECH" />
+ <contentType value="AUDIO_CONTENT_TYPE_MOVIE" />
+ </unfadeableContentTypes>
+ <unfadeableAudioAttributes>
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_MEDIA" tags="oem_specific_tag1" />
+ </audioAttributes>
+ </unfadeableAudioAttributes>
+ <fadeOutConfigurations>
+ <fadeConfiguration fadeDurationMillis="500">
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANT" tags="oem_specific_tag2" />
+ </audioAttributes>
+ </fadeConfiguration>
+ <fadeConfiguration fadeDurationMillis="800">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT"/>
+ </audioAttributes>
+ </fadeConfiguration>
+ </fadeOutConfigurations>
+ <fadeInConfigurations>
+ <fadeConfiguration fadeDurationMillis="1000">
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANT" tags="oem_specific_tag2" />
+ </audioAttributes>
+ </fadeConfiguration>
+ <fadeConfiguration fadeDurationMillis="800">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT"/>
+ </audioAttributes>
+ </fadeConfiguration>
+ </fadeInConfigurations>
+ </config>
+ </configs>
+</carAudioFadeConfiguration>
diff --git a/automotive/audiocontrol/aidl/default/converter/test/multi_zone_car_audio_configuration.xml b/automotive/audiocontrol/aidl/default/converter/test/multi_zone_car_audio_configuration.xml
new file mode 100644
index 0000000..f0c9081
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/multi_zone_car_audio_configuration.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<carAudioConfiguration version="4">
+ <deviceConfigurations>
+ <deviceConfiguration name="useHalDuckingSignals" value="false" />
+ <deviceConfiguration name="useCoreAudioRouting" value="true" />
+ <deviceConfiguration name="useCoreAudioVolume" value="true" />
+ <deviceConfiguration name="useCarVolumeGroupMuting" value="false" />
+ </deviceConfigurations>
+ <oemContexts>
+ <oemContext name="oem_context">
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"
+ contentType="AUDIO_CONTENT_TYPE_SPEECH"
+ tags="oem=extension_8675309" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_music">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <usage value="AUDIO_USAGE_UNKNOWN" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_notification">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION" />
+ <usage value="AUDIO_USAGE_NOTIFICATION_EVENT" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_voice_command">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_CALL_ASSISTANT" />
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call_ring">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_alarm">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ALARM" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_system_sound">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ </audioAttributes>
+ </oemContext>
+ </oemContexts>
+ <activationVolumeConfigs>
+ <activationVolumeConfig name="on_boot_config">
+ <activationVolumeConfigEntry maxActivationVolumePercentage="80" invocationType="onBoot" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_source_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="20" maxActivationVolumePercentage="80" invocationType="onSourceChanged" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_playback_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90" invocationType="onPlaybackChanged" />
+ </activationVolumeConfig>
+ </activationVolumeConfigs>
+ <mirroringDevices>
+ <mirroringDevice address="mirror_bus_device_three"/>
+ <mirroringDevice address="mirror_bus_device_four"/>
+ </mirroringDevices>
+ <zones>
+ <zone name="driver zone" isPrimary="true" audioZoneId="0" occupantZoneId="0">
+ <zoneConfigs>
+ <zoneConfig name="driver zone config 0" isDefault="true">
+ <volumeGroups>
+ <group name="entertainment" activationConfig="on_boot_config">
+ <device address="BUS00_MEDIA">
+ <context context="oem_music"/>
+ </device>
+ </group>
+ <group name="navvoicecommand" activationConfig="on_source_changed_config">
+ <device address="BUS02_NAV_GUIDANCE">
+ <context context="oem_voice_command"/>
+ </device>
+ </group>
+ <group name="telringvol" activationConfig="on_playback_changed_config">
+ <device address="BUS03_PHONE">
+ <context context="oem_call"/>
+ <context context="oem_call_ring"/>
+ </device>
+ </group>
+ <group name="systemalarm" activationConfig="on_source_changed_config">
+ <device address="BUS01_SYS_NOTIFICATION">
+ <context context="oem_alarm"/>
+ <context context="oem_system_sound"/>
+ <context context="oem_notification"/>
+ </device>
+ </group>
+ </volumeGroups>
+ <applyFadeConfigs>
+ <fadeConfig name="relaxed fading" isDefault="true">
+ </fadeConfig>
+ <fadeConfig name="aggressive fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ </audioAttributes>
+ </fadeConfig>
+ <fadeConfig name="disabled fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ </audioAttributes>
+ </fadeConfig>
+ </applyFadeConfigs>
+ </zoneConfig>
+ </zoneConfigs>
+ </zone>
+ <zone name="front passenger zone" audioZoneId="1" occupantZoneId="1">
+ <zoneConfigs>
+ <zoneConfig name="front passenger config 0" isDefault="true">
+ <volumeGroups>
+ <group name="entertainment" activationConfig="on_boot_config">
+ <device address="BUS_FRONT">
+ <context context="oem_music"/>
+ <context context="oem_voice_command"/>
+ <context context="oem_call"/>
+ <context context="oem_call_ring"/>
+ <context context="oem_alarm"/>
+ <context context="oem_system_sound"/>
+ <context context="oem_notification"/>
+ </device>
+ </group>
+ </volumeGroups>
+ <applyFadeConfigs>
+ <fadeConfig name="relaxed fading" isDefault="true">
+ </fadeConfig>
+ <fadeConfig name="disabled fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ </audioAttributes>
+ </fadeConfig>
+ </applyFadeConfigs>
+ </zoneConfig>
+ </zoneConfigs>
+ </zone>
+ <zone name="rear seat zone" audioZoneId="2" occupantZoneId="2">
+ <zoneConfigs>
+ <zoneConfig name="rear seat config 0" isDefault="true">
+ <volumeGroups>
+ <group name="entertainment" activationConfig="on_boot_config">
+ <device address="BUS_REAR">
+ <context context="oem_music"/>
+ <context context="oem_voice_command"/>
+ <context context="oem_call"/>
+ <context context="oem_call_ring"/>
+ <context context="oem_alarm"/>
+ <context context="oem_system_sound"/>
+ <context context="oem_notification"/>
+ </device>
+ </group>
+ </volumeGroups>
+ <applyFadeConfigs>
+ <fadeConfig name="relaxed fading" isDefault="true">
+ </fadeConfig>
+ <fadeConfig name="disabled fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ </audioAttributes>
+ </fadeConfig>
+ </applyFadeConfigs>
+ </zoneConfig>
+ </zoneConfigs>
+ </zone>
+ </zones>
+</carAudioConfiguration>
diff --git a/automotive/audiocontrol/aidl/default/converter/test/simple_car_audio_configuration.xml b/automotive/audiocontrol/aidl/default/converter/test/simple_car_audio_configuration.xml
new file mode 100644
index 0000000..a6f5317
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/simple_car_audio_configuration.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<carAudioConfiguration version="4">
+ <deviceConfigurations>
+ <deviceConfiguration name="useHalDuckingSignals" value="true" />
+ <deviceConfiguration name="useCoreAudioRouting" value="false" />
+ <deviceConfiguration name="useCoreAudioVolume" value="false" />
+ <deviceConfiguration name="useCarVolumeGroupMuting" value="true" />
+ </deviceConfigurations>
+ <oemContexts>
+ <oemContext name="oem_context">
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"
+ contentType="AUDIO_CONTENT_TYPE_SPEECH"
+ tags="oem=extension_8675309" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_music">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <usage value="AUDIO_USAGE_UNKNOWN" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_notification">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION" />
+ <usage value="AUDIO_USAGE_NOTIFICATION_EVENT" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_voice_command">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_CALL_ASSISTANT" />
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call_ring">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_alarm">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ALARM" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_system_sound">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ </audioAttributes>
+ </oemContext>
+ </oemContexts>
+ <activationVolumeConfigs>
+ <activationVolumeConfig name="on_boot_config">
+ <activationVolumeConfigEntry maxActivationVolumePercentage="80" invocationType="onBoot" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_source_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="20" maxActivationVolumePercentage="80" invocationType="onSourceChanged" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_playback_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90" invocationType="onPlaybackChanged" />
+ </activationVolumeConfig>
+ </activationVolumeConfigs>
+ <mirroringDevices>
+ <mirroringDevice address="mirror_bus_device_1"/>
+ <mirroringDevice address="mirror_bus_device_2"/>
+ </mirroringDevices>
+ <zones>
+ <zone name="primary zone" isPrimary="true" audioZoneId="0" occupantZoneId="0">
+ <inputDevices>
+ <inputDevice address="fm_tuner" type="AUDIO_DEVICE_IN_FM_TUNER" />
+ <inputDevice address="built_in_mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" />
+ <inputDevice address="in_bus_device" type="AUDIO_DEVICE_IN_BUS" />
+ </inputDevices>
+ <zoneConfigs>
+ <zoneConfig name="primary zone config 0" isDefault="true">
+ <volumeGroups>
+ <group name="entertainment" activationConfig="on_boot_config">
+ <device address="BUS00_MEDIA">
+ <context context="oem_music"/>
+ </device>
+ </group>
+ <group name="navvoicecommand" activationConfig="on_source_changed_config">
+ <device address="BUS02_NAV_GUIDANCE">
+ <context context="oem_voice_command"/>
+ </device>
+ </group>
+ <group name="telringvol" activationConfig="on_playback_changed_config">
+ <device address="BUS03_PHONE">
+ <context context="oem_call"/>
+ <context context="oem_call_ring"/>
+ </device>
+ </group>
+ <group name="systemalarm" activationConfig="on_source_changed_config">
+ <device address="BUS01_SYS_NOTIFICATION">
+ <context context="oem_alarm"/>
+ <context context="oem_system_sound"/>
+ <context context="oem_notification"/>
+ </device>
+ </group>
+ </volumeGroups>
+ <applyFadeConfigs>
+ <fadeConfig name="relaxed fading" isDefault="true">
+ </fadeConfig>
+ <fadeConfig name="aggressive fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ </audioAttributes>
+ </fadeConfig>
+ <fadeConfig name="disabled fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ </audioAttributes>
+ </fadeConfig>
+ </applyFadeConfigs>
+ </zoneConfig>
+ <zoneConfig name="primary zone BT media">
+ <volumeGroups>
+ <group name="entertainment" activationConfig="on_boot_config">
+ <device type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP" address="temp">
+ <context context="oem_music"/>
+ </device>
+ </group>
+ <group name="navvoicecommand" activationConfig="on_source_changed_config">
+ <device address="BUS02_NAV_GUIDANCE">
+ <context context="oem_voice_command"/>
+ </device>
+ </group>
+ <group name="telringvol" activationConfig="on_playback_changed_config">
+ <device address="BUS03_PHONE">
+ <context context="oem_call"/>
+ <context context="oem_call_ring"/>
+ </device>
+ </group>
+ <group name="systemalarm" activationConfig="on_source_changed_config">
+ <device address="BUS01_SYS_NOTIFICATION">
+ <context context="oem_alarm"/>
+ <context context="oem_system_sound"/>
+ <context context="oem_notification"/>
+ </device>
+ </group>
+ </volumeGroups>
+ <applyFadeConfigs>
+ <fadeConfig name="dynamic fading" isDefault="true">
+ </fadeConfig>
+ <fadeConfig name="aggressive fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ </audioAttributes>
+ </fadeConfig>
+ <fadeConfig name="disabled fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ </audioAttributes>
+ </fadeConfig>
+ </applyFadeConfigs>
+ </zoneConfig>
+ <zoneConfig name="primary zone USB media">
+ <volumeGroups>
+ <group name="entertainment" activationConfig="on_boot_config">
+ <device type="AUDIO_DEVICE_OUT_USB_HEADSET">
+ <context context="oem_music"/>
+ </device>
+ </group>
+ <group name="navvoicecommand" activationConfig="on_source_changed_config">
+ <device address="BUS02_NAV_GUIDANCE">
+ <context context="oem_voice_command"/>
+ </device>
+ </group>
+ <group name="telringvol" activationConfig="on_playback_changed_config">
+ <device address="BUS03_PHONE">
+ <context context="oem_call"/>
+ <context context="oem_call_ring"/>
+ </device>
+ </group>
+ <group name="systemalarm" activationConfig="on_source_changed_config">
+ <device address="BUS01_SYS_NOTIFICATION">
+ <context context="oem_alarm"/>
+ <context context="oem_system_sound"/>
+ <context context="oem_notification"/>
+ </device>
+ </group>
+ </volumeGroups>
+ <applyFadeConfigs>
+ <fadeConfig name="dynamic fading" isDefault="true">
+ </fadeConfig>
+ <fadeConfig name="aggressive fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ </audioAttributes>
+ </fadeConfig>
+ <fadeConfig name="disabled fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ </audioAttributes>
+ </fadeConfig>
+ </applyFadeConfigs>
+ </zoneConfig>
+ </zoneConfigs>
+ </zone>
+ </zones>
+</carAudioConfiguration>
diff --git a/automotive/audiocontrol/aidl/default/converter/test/simple_car_audio_configuration_with_device_type.xml b/automotive/audiocontrol/aidl/default/converter/test/simple_car_audio_configuration_with_device_type.xml
new file mode 100644
index 0000000..eec9db9
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/converter/test/simple_car_audio_configuration_with_device_type.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<carAudioConfiguration version="4">
+ <deviceConfigurations>
+ <deviceConfiguration name="useHalDuckingSignals" value="true" />
+ <deviceConfiguration name="useCoreAudioRouting" value="false" />
+ <deviceConfiguration name="useCoreAudioVolume" value="false" />
+ <deviceConfiguration name="useCarVolumeGroupMuting" value="true" />
+ </deviceConfigurations>
+ <oemContexts>
+ <oemContext name="oem_context">
+ <audioAttributes>
+ <audioAttribute usage="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"
+ contentType="AUDIO_CONTENT_TYPE_SPEECH"
+ tags="oem=extension_8675309" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_music">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_MEDIA" />
+ <usage value="AUDIO_USAGE_GAME" />
+ <usage value="AUDIO_USAGE_UNKNOWN" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_notification">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION" />
+ <usage value="AUDIO_USAGE_NOTIFICATION_EVENT" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_voice_command">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANT" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <usage value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_CALL_ASSISTANT" />
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_call_ring">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_alarm">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ALARM" />
+ </audioAttributes>
+ </oemContext>
+ <oemContext name="oem_system_sound">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ </audioAttributes>
+ </oemContext>
+ </oemContexts>
+ <activationVolumeConfigs>
+ <activationVolumeConfig name="on_boot_config">
+ <activationVolumeConfigEntry maxActivationVolumePercentage="80" invocationType="onBoot" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_source_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="20" maxActivationVolumePercentage="80" invocationType="onSourceChanged" />
+ </activationVolumeConfig>
+ <activationVolumeConfig name="on_playback_changed_config">
+ <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90" invocationType="onPlaybackChanged" />
+ </activationVolumeConfig>
+ </activationVolumeConfigs>
+ <mirroringDevices>
+ <mirroringDevice address="mirror_bus_device_1"/>
+ <mirroringDevice address="mirror_bus_device_2"/>
+ </mirroringDevices>
+ <zones>
+ <zone name="primary zone" isPrimary="true" audioZoneId="0" occupantZoneId="0">
+ <inputDevices>
+ <inputDevice address="fm_tuner" type="AUDIO_DEVICE_IN_FM_TUNER" />
+ <inputDevice address="built_in_mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" />
+ <inputDevice address="in_bus_device" type="AUDIO_DEVICE_IN_BUS" />
+ </inputDevices>
+ <zoneConfigs>
+ <zoneConfig name="primary zone config 0" isDefault="true">
+ <volumeGroups>
+ <group name="entertainment" activationConfig="on_boot_config">
+ <device address="BUS00_MEDIA">
+ <context context="oem_music"/>
+ </device>
+ </group>
+ <group name="navvoicecommand" activationConfig="on_source_changed_config">
+ <device address="BUS02_NAV_GUIDANCE">
+ <context context="oem_voice_command"/>
+ </device>
+ </group>
+ <group name="telringvol" activationConfig="on_playback_changed_config">
+ <device address="BUS03_PHONE">
+ <context context="oem_call"/>
+ <context context="oem_call_ring"/>
+ </device>
+ </group>
+ <group name="systemalarm" activationConfig="on_source_changed_config">
+ <device address="BUS01_SYS_NOTIFICATION">
+ <context context="oem_alarm"/>
+ <context context="oem_system_sound"/>
+ <context context="oem_notification"/>
+ </device>
+ </group>
+ </volumeGroups>
+ <applyFadeConfigs>
+ <fadeConfig name="relaxed fading" isDefault="true">
+ </fadeConfig>
+ <fadeConfig name="aggressive fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ </audioAttributes>
+ </fadeConfig>
+ <fadeConfig name="disabled fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ </audioAttributes>
+ </fadeConfig>
+ </applyFadeConfigs>
+ </zoneConfig>
+ <zoneConfig name="primary zone BT media">
+ <volumeGroups>
+ <group name="entertainment" activationConfig="on_boot_config">
+ <device type="TYPE_BLUETOOTH_A2DP" address="temp">
+ <context context="oem_music"/>
+ </device>
+ </group>
+ <group name="navvoicecommand" activationConfig="on_source_changed_config">
+ <device address="BUS02_NAV_GUIDANCE">
+ <context context="oem_voice_command"/>
+ </device>
+ </group>
+ <group name="telringvol" activationConfig="on_playback_changed_config">
+ <device address="BUS03_PHONE">
+ <context context="oem_call"/>
+ <context context="oem_call_ring"/>
+ </device>
+ </group>
+ <group name="systemalarm" activationConfig="on_source_changed_config">
+ <device address="BUS01_SYS_NOTIFICATION">
+ <context context="oem_alarm"/>
+ <context context="oem_system_sound"/>
+ <context context="oem_notification"/>
+ </device>
+ </group>
+ </volumeGroups>
+ <applyFadeConfigs>
+ <fadeConfig name="dynamic fading" isDefault="true">
+ </fadeConfig>
+ <fadeConfig name="aggressive fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ </audioAttributes>
+ </fadeConfig>
+ <fadeConfig name="disabled fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ </audioAttributes>
+ </fadeConfig>
+ </applyFadeConfigs>
+ </zoneConfig>
+ <zoneConfig name="primary zone USB media">
+ <volumeGroups>
+ <group name="entertainment" activationConfig="on_boot_config">
+ <device type="TYPE_USB_HEADSET">
+ <context context="oem_music"/>
+ </device>
+ </group>
+ <group name="navvoicecommand" activationConfig="on_source_changed_config">
+ <device address="BUS02_NAV_GUIDANCE">
+ <context context="oem_voice_command"/>
+ </device>
+ </group>
+ <group name="telringvol" activationConfig="on_playback_changed_config">
+ <device address="BUS03_PHONE">
+ <context context="oem_call"/>
+ <context context="oem_call_ring"/>
+ </device>
+ </group>
+ <group name="systemalarm" activationConfig="on_source_changed_config">
+ <device address="BUS01_SYS_NOTIFICATION">
+ <context context="oem_alarm"/>
+ <context context="oem_system_sound"/>
+ <context context="oem_notification"/>
+ </device>
+ </group>
+ </volumeGroups>
+ <applyFadeConfigs>
+ <fadeConfig name="dynamic fading" isDefault="true">
+ </fadeConfig>
+ <fadeConfig name="aggressive fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_VOICE_COMMUNICATION" />
+ <usage value="AUDIO_USAGE_ANNOUNCEMENT" />
+ <usage value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <usage value="AUDIO_USAGE_SAFETY" />
+ </audioAttributes>
+ </fadeConfig>
+ <fadeConfig name="disabled fading">
+ <audioAttributes>
+ <usage value="AUDIO_USAGE_EMERGENCY" />
+ </audioAttributes>
+ </fadeConfig>
+ </applyFadeConfigs>
+ </zoneConfig>
+ </zoneConfigs>
+ </zone>
+ </zones>
+</carAudioConfiguration>
diff --git a/automotive/audiocontrol/aidl/default/loaders/config/Android.bp b/automotive/audiocontrol/aidl/default/loaders/config/Android.bp
new file mode 100644
index 0000000..0d5eb81
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/config/Android.bp
@@ -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.
+
+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"],
+}
+
+xsd_config {
+ name: "car_audio_configuration_xsd",
+ srcs: ["car_audio_configuration.xsd"],
+ package_name: "android.hardware.automotive.audiocontrol",
+ nullability: true,
+}
+
+cc_defaults {
+ name: "car.audio.configuration.xsd.default",
+ static_libs: [
+ "libxml2",
+ ],
+ generated_sources: [
+ "car_audio_configuration_xsd",
+ ],
+ generated_headers: [
+ "car_audio_configuration_xsd",
+ ],
+ header_libs: [
+ "libxsdc-utils",
+ ],
+}
diff --git a/automotive/audiocontrol/aidl/default/loaders/config/api/current.txt b/automotive/audiocontrol/aidl/default/loaders/config/api/current.txt
new file mode 100644
index 0000000..c87b8c6
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/config/api/current.txt
@@ -0,0 +1,331 @@
+// Signature format: 2.0
+package android.hardware.automotive.audiocontrol {
+
+ public enum ActivationType {
+ method @NonNull public String getRawName();
+ enum_constant public static final android.hardware.automotive.audiocontrol.ActivationType onBoot;
+ enum_constant public static final android.hardware.automotive.audiocontrol.ActivationType onPlaybackChanged;
+ enum_constant public static final android.hardware.automotive.audiocontrol.ActivationType onSourceChanged;
+ }
+
+ public class ActivationVolumeConfigEntryType {
+ ctor public ActivationVolumeConfigEntryType();
+ method @Nullable public android.hardware.automotive.audiocontrol.ActivationType getInvocationType();
+ method @Nullable public String getMaxActivationVolumePercentage();
+ method @Nullable public String getMinActivationVolumePercentage();
+ method public void setInvocationType(@Nullable android.hardware.automotive.audiocontrol.ActivationType);
+ method public void setMaxActivationVolumePercentage(@Nullable String);
+ method public void setMinActivationVolumePercentage(@Nullable String);
+ }
+
+ public class ActivationVolumeConfigType {
+ ctor public ActivationVolumeConfigType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.ActivationVolumeConfigEntryType> getActivationVolumeConfigEntry();
+ method @Nullable public String getName();
+ method public void setName(@Nullable String);
+ }
+
+ public class ActivationVolumeConfigsType {
+ ctor public ActivationVolumeConfigsType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.ActivationVolumeConfigType> getActivationVolumeConfig();
+ }
+
+ public class ApplyFadeConfigType {
+ ctor public ApplyFadeConfigType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.AudioAttributeUsagesType> getAudioAttributes();
+ method @Nullable public boolean getIsDefault();
+ method @Nullable public String getName();
+ method public void setIsDefault(@Nullable boolean);
+ method public void setName(@Nullable String);
+ }
+
+ public class ApplyFadeConfigsType {
+ ctor public ApplyFadeConfigsType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.ApplyFadeConfigType> getFadeConfig();
+ }
+
+ public class AttributesType {
+ ctor public AttributesType();
+ method @Nullable public android.hardware.automotive.audiocontrol.ContentTypeEnum getContentType();
+ method @Nullable public String getTags();
+ method @Nullable public android.hardware.automotive.audiocontrol.UsageEnumType getUsage();
+ method public void setContentType(@Nullable android.hardware.automotive.audiocontrol.ContentTypeEnum);
+ method public void setTags(@Nullable String);
+ method public void setUsage(@Nullable android.hardware.automotive.audiocontrol.UsageEnumType);
+ }
+
+ public class AudioAttributeUsagesType {
+ ctor public AudioAttributeUsagesType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.UsageType> getUsage();
+ }
+
+ public class AudioAttributesUsagesType {
+ ctor public AudioAttributesUsagesType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.AttributesType> getAudioAttribute_optional();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.UsageType> getUsage_optional();
+ }
+
+ public class CarAudioConfigurationType {
+ ctor public CarAudioConfigurationType();
+ method @Nullable public android.hardware.automotive.audiocontrol.ActivationVolumeConfigsType getActivationVolumeConfigs();
+ method @Nullable public android.hardware.automotive.audiocontrol.DeviceConfigurationsType getDeviceConfigurations();
+ method @Nullable public android.hardware.automotive.audiocontrol.MirroringDevicesType getMirroringDevices();
+ method @Nullable public android.hardware.automotive.audiocontrol.OemContextsType getOemContexts();
+ method @Nullable public String getVersion();
+ method @Nullable public android.hardware.automotive.audiocontrol.ZonesType getZones();
+ method public void setActivationVolumeConfigs(@Nullable android.hardware.automotive.audiocontrol.ActivationVolumeConfigsType);
+ method public void setDeviceConfigurations(@Nullable android.hardware.automotive.audiocontrol.DeviceConfigurationsType);
+ method public void setMirroringDevices(@Nullable android.hardware.automotive.audiocontrol.MirroringDevicesType);
+ method public void setOemContexts(@Nullable android.hardware.automotive.audiocontrol.OemContextsType);
+ method public void setVersion(@Nullable String);
+ method public void setZones(@Nullable android.hardware.automotive.audiocontrol.ZonesType);
+ }
+
+ public class ContentType {
+ ctor public ContentType();
+ method @Nullable public android.hardware.automotive.audiocontrol.ContentTypeEnum getValue();
+ method public void setValue(@Nullable android.hardware.automotive.audiocontrol.ContentTypeEnum);
+ }
+
+ public enum ContentTypeEnum {
+ method @NonNull public String getRawName();
+ enum_constant public static final android.hardware.automotive.audiocontrol.ContentTypeEnum AUDIO_CONTENT_TYPE_MOVIE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.ContentTypeEnum AUDIO_CONTENT_TYPE_MUSIC;
+ enum_constant public static final android.hardware.automotive.audiocontrol.ContentTypeEnum AUDIO_CONTENT_TYPE_SONIFICATION;
+ enum_constant public static final android.hardware.automotive.audiocontrol.ContentTypeEnum AUDIO_CONTENT_TYPE_SPEECH;
+ enum_constant public static final android.hardware.automotive.audiocontrol.ContentTypeEnum AUDIO_CONTENT_TYPE_UNKNOWN;
+ }
+
+ public class ContextNameType {
+ ctor public ContextNameType();
+ method @Nullable public String getContext();
+ method public void setContext(@Nullable String);
+ }
+
+ public class DeviceConfigurationType {
+ ctor public DeviceConfigurationType();
+ method @Nullable public String getName();
+ method @Nullable public String getValue();
+ method public void setName(@Nullable String);
+ method public void setValue(@Nullable String);
+ }
+
+ public class DeviceConfigurationsType {
+ ctor public DeviceConfigurationsType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.DeviceConfigurationType> getDeviceConfiguration();
+ }
+
+ public class DeviceRoutesType {
+ ctor public DeviceRoutesType();
+ method @Nullable public String getAddress();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.ContextNameType> getContext();
+ method @Nullable public android.hardware.automotive.audiocontrol.OutDeviceType getType();
+ method public void setAddress(@Nullable String);
+ method public void setType(@Nullable android.hardware.automotive.audiocontrol.OutDeviceType);
+ }
+
+ public enum InDeviceType {
+ method @NonNull public String getRawName();
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_AMBIENT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_AUX_DIGITAL;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_BACK_MIC;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_BLUETOOTH_A2DP;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_BLUETOOTH_BLE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_BUILTIN_MIC;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_BUS;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_COMMUNICATION;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_DEFAULT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_ECHO_REFERENCE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_FM_TUNER;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_HDMI;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_HDMI_ARC;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_IP;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_LINE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_LOOPBACK;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_PROXY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_REMOTE_SUBMIX;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_SPDIF;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_STUB;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_TELEPHONY_RX;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_TV_TUNER;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_USB_ACCESSORY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_USB_DEVICE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_USB_HEADSET;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_VOICE_CALL;
+ enum_constant public static final android.hardware.automotive.audiocontrol.InDeviceType AUDIO_DEVICE_IN_WIRED_HEADSET;
+ }
+
+ public class InputDeviceType {
+ ctor public InputDeviceType();
+ method @Nullable public String getAddress();
+ method @Nullable public android.hardware.automotive.audiocontrol.InDeviceType getType();
+ method public void setAddress(@Nullable String);
+ method public void setType(@Nullable android.hardware.automotive.audiocontrol.InDeviceType);
+ }
+
+ public class InputDevicesType {
+ ctor public InputDevicesType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.InputDeviceType> getInputDevice();
+ }
+
+ public class MirroringDevice {
+ ctor public MirroringDevice();
+ method @Nullable public String getAddress();
+ method public void setAddress(@Nullable String);
+ }
+
+ public class MirroringDevicesType {
+ ctor public MirroringDevicesType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.MirroringDevice> getMirroringDevice();
+ }
+
+ public class OemContextType {
+ ctor public OemContextType();
+ method @Nullable public android.hardware.automotive.audiocontrol.AudioAttributesUsagesType getAudioAttributes();
+ method @Nullable public String getId();
+ method @Nullable public String getName();
+ method public void setAudioAttributes(@Nullable android.hardware.automotive.audiocontrol.AudioAttributesUsagesType);
+ method public void setId(@Nullable String);
+ method public void setName(@Nullable String);
+ }
+
+ public class OemContextsType {
+ ctor public OemContextsType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.OemContextType> getOemContext();
+ }
+
+ public enum OutDeviceType {
+ method @NonNull public String getRawName();
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_AUX_DIGITAL;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_AUX_LINE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_BLE_BROADCAST;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_BLE_HEADSET;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_BLE_SPEAKER;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_BLUETOOTH_A2DP;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_BUS;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_DEFAULT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_HDMI;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_HDMI_ARC;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_HDMI_EARC;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_LINE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_SPEAKER;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_SPEAKER_SAFE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_USB_ACCESSORY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_USB_DEVICE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_USB_HEADSET;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_WIRED_HEADPHONE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType AUDIO_DEVICE_OUT_WIRED_HEADSET;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_AUX_LINE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_BLE_BROADCAST;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_BLE_HEADSET;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_BLE_SPEAKER;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_BLUETOOTH_A2DP;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_BUILTIN_SPEAKER;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_BUS;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_HDMI;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_USB_ACCESSORY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_USB_DEVICE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_USB_HEADSET;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_WIRED_HEADPHONES;
+ enum_constant public static final android.hardware.automotive.audiocontrol.OutDeviceType TYPE_WIRED_HEADSET;
+ }
+
+ public enum UsageEnumType {
+ method @NonNull public String getRawName();
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_ALARM;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_ANNOUNCEMENT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_ASSISTANCE_SONIFICATION;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_ASSISTANT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_CALL_ASSISTANT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_EMERGENCY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_GAME;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_MEDIA;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_NOTIFICATION;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_NOTIFICATION_EVENT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_SAFETY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_UNKNOWN;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_VEHICLE_STATUS;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_VIRTUAL_SOURCE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_VOICE_COMMUNICATION;
+ enum_constant public static final android.hardware.automotive.audiocontrol.UsageEnumType AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
+ }
+
+ public class UsageType {
+ ctor public UsageType();
+ method @Nullable public android.hardware.automotive.audiocontrol.UsageEnumType getValue();
+ method public void setValue(@Nullable android.hardware.automotive.audiocontrol.UsageEnumType);
+ }
+
+ public class VolumeGroupType {
+ ctor public VolumeGroupType();
+ method @Nullable public String getActivationConfig();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.DeviceRoutesType> getDevice();
+ method @Nullable public String getName();
+ method public void setActivationConfig(@Nullable String);
+ method public void setName(@Nullable String);
+ }
+
+ public class VolumeGroupsType {
+ ctor public VolumeGroupsType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.VolumeGroupType> getGroup();
+ }
+
+ public class XmlParser {
+ ctor public XmlParser();
+ method @Nullable public static android.hardware.automotive.audiocontrol.CarAudioConfigurationType read(@NonNull java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @Nullable public static String readText(@NonNull org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static void skip(@NonNull org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ }
+
+ public class ZoneConfigType {
+ ctor public ZoneConfigType();
+ method @Nullable public android.hardware.automotive.audiocontrol.ApplyFadeConfigsType getApplyFadeConfigs();
+ method @Nullable public boolean getIsDefault();
+ method @Nullable public String getName();
+ method @Nullable public android.hardware.automotive.audiocontrol.VolumeGroupsType getVolumeGroups();
+ method public void setApplyFadeConfigs(@Nullable android.hardware.automotive.audiocontrol.ApplyFadeConfigsType);
+ method public void setIsDefault(@Nullable boolean);
+ method public void setName(@Nullable String);
+ method public void setVolumeGroups(@Nullable android.hardware.automotive.audiocontrol.VolumeGroupsType);
+ }
+
+ public class ZoneConfigsType {
+ ctor public ZoneConfigsType();
+ method @Nullable public android.hardware.automotive.audiocontrol.ZoneConfigType getZoneConfig();
+ method public void setZoneConfig(@Nullable android.hardware.automotive.audiocontrol.ZoneConfigType);
+ }
+
+ public class ZoneType {
+ ctor public ZoneType();
+ method @Nullable public String getAudioZoneId();
+ method @Nullable public android.hardware.automotive.audiocontrol.InputDevicesType getInputDevices();
+ method @Nullable public boolean getIsPrimary();
+ method @Nullable public String getName();
+ method @Nullable public String getOccupantZoneId();
+ method @Nullable public android.hardware.automotive.audiocontrol.ZoneConfigsType getZoneConfigs();
+ method public void setAudioZoneId(@Nullable String);
+ method public void setInputDevices(@Nullable android.hardware.automotive.audiocontrol.InputDevicesType);
+ method public void setIsPrimary(@Nullable boolean);
+ method public void setName(@Nullable String);
+ method public void setOccupantZoneId(@Nullable String);
+ method public void setZoneConfigs(@Nullable android.hardware.automotive.audiocontrol.ZoneConfigsType);
+ }
+
+ public class ZonesType {
+ ctor public ZonesType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.ZoneType> getZone();
+ }
+
+}
+
diff --git a/automotive/audiocontrol/aidl/default/loaders/config/api/last_current.txt b/automotive/audiocontrol/aidl/default/loaders/config/api/last_current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/config/api/last_current.txt
diff --git a/automotive/audiocontrol/aidl/default/loaders/config/api/last_removed.txt b/automotive/audiocontrol/aidl/default/loaders/config/api/last_removed.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/config/api/last_removed.txt
diff --git a/automotive/audiocontrol/aidl/default/loaders/config/api/removed.txt b/automotive/audiocontrol/aidl/default/loaders/config/api/removed.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/config/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/automotive/audiocontrol/aidl/default/loaders/config/car_audio_configuration.xsd b/automotive/audiocontrol/aidl/default/loaders/config/car_audio_configuration.xsd
new file mode 100644
index 0000000..634aeda
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/config/car_audio_configuration.xsd
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
+<xs:schema version="2.0" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:element name="carAudioConfiguration" type="CarAudioConfigurationType" minOccurs="1" maxOccurs="1" />
+ <xs:complexType name="CarAudioConfigurationType">
+ <xs:attribute name="version" type="xs:string" use="required" />
+ <xs:sequence>
+ <xs:element name="mirroringDevices" type="MirroringDevicesType" minOccurs="0" />
+ <xs:element name="deviceConfigurations" type="DeviceConfigurationsType" minOccurs="0" />
+ <xs:element name="oemContexts" type="OemContextsType" />
+ <xs:element name="activationVolumeConfigs" type="ActivationVolumeConfigsType" minOccurs="0" />
+ <xs:element name="zones" type="ZonesType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="ZonesType">
+ <xs:element name="zone" type="ZoneType" minOccurs="1" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="ActivationVolumeConfigsType">
+ <xs:element name="activationVolumeConfig" type="ActivationVolumeConfigType" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="OemContextsType">
+ <xs:element name="oemContext" type="OemContextType" minOccurs="1" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="DeviceConfigurationsType">
+ <xs:element name="deviceConfiguration" type="DeviceConfigurationType" minOccurs="0" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="ZoneType">
+ <xs:attribute name="name" type="xs:string" />
+ <xs:attribute name="audioZoneId" type="xs:string" use="required" />
+ <xs:attribute name="isPrimary" type="xs:boolean" />
+ <xs:attribute name="occupantZoneId" type="xs:string" />
+ <xs:element name="inputDevices" type="InputDevicesType" />
+ <xs:element name="zoneConfigs" type="ZoneConfigsType" />
+ </xs:complexType>
+ <xs:complexType name="ZoneConfigsType">
+ <xs:element name="zoneConfig" type="ZoneConfigType"/>
+ </xs:complexType>
+ <xs:complexType name="ZoneConfigType">
+ <xs:attribute name="name" type="xs:string" />
+ <xs:attribute name="isDefault" type="xs:boolean" />
+ <xs:element name="volumeGroups" type="VolumeGroupsType" />
+ <xs:element name="applyFadeConfigs" type="ApplyFadeConfigsType" />
+ </xs:complexType>
+ <xs:complexType name="ApplyFadeConfigsType">
+ <xs:element name="fadeConfig" type="ApplyFadeConfigType" minOccurs="0" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="ApplyFadeConfigType">
+ <xs:attribute name="name" type="xs:string" />
+ <xs:attribute name="isDefault" type="xs:boolean" />
+ <xs:element name="audioAttributes" type="AudioAttributeUsagesType" minOccurs="0" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="AudioAttributeUsagesType">
+ <xs:element name="usage" type="UsageType" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="VolumeGroupsType">
+ <xs:element name="group" type="VolumeGroupType" minOccurs="1" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="VolumeGroupType">
+ <xs:attribute name="name" type="xs:string" />
+ <xs:attribute name="activationConfig" type="xs:string" />
+ <xs:element name="device" type="DeviceRoutesType" minOccurts="1" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="DeviceRoutesType" >
+ <xs:attribute name="address" type="xs:string" />
+ <xs:attribute name="type" type="OutDeviceType" />
+ <xs:element name="context" type="ContextNameType" mixOccurs="1" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="ContextNameType">
+ <xs:attribute name="context" type="xs:string"/>
+ </xs:complexType>
+ <xs:complexType name="OemContextType">
+ <xs:attribute name="name" type="xs:string" />
+ <xs:attribute name="id" type="xs:string" />
+ <xs:element name="audioAttributes" type="AudioAttributesUsagesType" minOccurs="1" maxOccurs="1" />
+ </xs:complexType>
+ <xs:complexType name="AudioAttributesUsagesType" >
+ <xs:choice minOccurs="0" maxOccurs="unbounded" >
+ <xs:element name="audioAttribute" type="AttributesType" />
+ <xs:element name="usage" type="UsageType" />
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="AttributesType">
+ <xs:attribute name="contentType" type="contentTypeEnum" />
+ <xs:attribute name="usage" type="usageEnumType" />
+ <xs:attribute name="tags" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="DeviceConfigurationType">
+ <xs:attribute name="name" type="xs:string" />
+ <xs:attribute name="value" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="ContentType" >
+ <xs:attribute name="value" type="contentTypeEnum" use="required" />
+ </xs:complexType>
+ <xs:complexType name="UsageType">
+ <xs:attribute name="value" type="usageEnumType" use="required" />
+ </xs:complexType>
+ <xs:simpleType name="contentTypeEnum">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_UNKNOWN"/>
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_SPEECH"/>
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_MUSIC"/>
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_MOVIE"/>
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_SONIFICATION"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="usageEnumType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="AUDIO_USAGE_UNKNOWN"/>
+ <xs:enumeration value="AUDIO_USAGE_MEDIA"/>
+ <xs:enumeration value="AUDIO_USAGE_VOICE_COMMUNICATION"/>
+ <xs:enumeration value="AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING"/>
+ <xs:enumeration value="AUDIO_USAGE_ALARM"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE"/>
+ <!-- Note: the following 3 values were deprecated in Android T (13) SDK -->
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_EVENT"/>
+ <xs:enumeration value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY"/>
+ <xs:enumeration value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"/>
+ <xs:enumeration value="AUDIO_USAGE_ASSISTANCE_SONIFICATION"/>
+ <xs:enumeration value="AUDIO_USAGE_GAME"/>
+ <xs:enumeration value="AUDIO_USAGE_VIRTUAL_SOURCE"/>
+ <xs:enumeration value="AUDIO_USAGE_ASSISTANT"/>
+ <xs:enumeration value="AUDIO_USAGE_CALL_ASSISTANT"/>
+ <xs:enumeration value="AUDIO_USAGE_EMERGENCY" />
+ <xs:enumeration value="AUDIO_USAGE_SAFETY" />
+ <xs:enumeration value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <xs:enumeration value="AUDIO_USAGE_ANNOUNCEMENT" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="ActivationVolumeConfigType">
+ <xs:attribute name="name" type="xs:string" />
+ <xs:element name="activationVolumeConfigEntry" type="ActivationVolumeConfigEntryType" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="ActivationVolumeConfigEntryType">
+ <xs:attribute name="maxActivationVolumePercentage" type="xs:string" />
+ <xs:attribute name="minActivationVolumePercentage" type="xs:string" />
+ <xs:attribute name="invocationType" type="ActivationType" />
+ </xs:complexType>
+ <xs:simpleType name="ActivationType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="onBoot"/>
+ <xs:enumeration value="onSourceChanged"/>
+ <xs:enumeration value="onPlaybackChanged"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="OutDeviceType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="AUDIO_DEVICE_OUT_SPEAKER"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_WIRED_HEADSET"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_WIRED_HEADPHONE"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_HDMI"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_HDMI_EARC"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_AUX_DIGITAL"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_USB_ACCESSORY"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_USB_DEVICE"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_LINE"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_HDMI_ARC"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_AUX_LINE"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_SPEAKER_SAFE"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_BUS"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_USB_HEADSET"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_BLE_HEADSET"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_BLE_SPEAKER"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_BLE_BROADCAST"/>
+ <xs:enumeration value="AUDIO_DEVICE_OUT_DEFAULT"/>
+ <!-- Added to support legacy files -->
+ <xs:enumeration value="TYPE_BUILTIN_SPEAKER"/>
+ <xs:enumeration value="TYPE_WIRED_HEADSET"/>
+ <xs:enumeration value="TYPE_WIRED_HEADPHONES"/>
+ <xs:enumeration value="TYPE_BLUETOOTH_A2DP"/>
+ <xs:enumeration value="TYPE_HDMI"/>
+ <xs:enumeration value="TYPE_USB_ACCESSORY"/>
+ <xs:enumeration value="TYPE_USB_DEVICE"/>
+ <xs:enumeration value="TYPE_USB_HEADSET"/>
+ <xs:enumeration value="TYPE_AUX_LINE"/>
+ <xs:enumeration value="TYPE_BUS"/>
+ <xs:enumeration value="TYPE_BLE_HEADSET"/>
+ <xs:enumeration value="TYPE_BLE_SPEAKER"/>
+ <xs:enumeration value="TYPE_BLE_BROADCAST"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="MirroringDevicesType">
+ <xs:element name="mirroringDevice" type="MirroringDevice" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="MirroringDevice">
+ <xs:attribute name="address" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="InputDevicesType">
+ <xs:element name="inputDevice" type="InputDeviceType" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="InputDeviceType">
+ <xs:attribute name="address" type="xs:string" />
+ <xs:attribute name="type" type="InDeviceType" />
+ </xs:complexType>
+ <xs:simpleType name="InDeviceType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="AUDIO_DEVICE_IN_COMMUNICATION"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_AMBIENT"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_BUILTIN_MIC"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_WIRED_HEADSET"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_AUX_DIGITAL"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_HDMI"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_VOICE_CALL"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_TELEPHONY_RX"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_BACK_MIC"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_REMOTE_SUBMIX"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_USB_ACCESSORY"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_USB_DEVICE"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_FM_TUNER"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_TV_TUNER"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_LINE"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_SPDIF"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_BLUETOOTH_A2DP"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_LOOPBACK"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_IP"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_BUS"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_PROXY"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_USB_HEADSET"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_BLUETOOTH_BLE"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_HDMI_ARC"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_ECHO_REFERENCE"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_DEFAULT"/>
+ <xs:enumeration value="AUDIO_DEVICE_IN_STUB"/>
+ </xs:restriction>
+ </xs:simpleType>
+</xs:schema>
diff --git a/automotive/audiocontrol/aidl/default/loaders/fade/Android.bp b/automotive/audiocontrol/aidl/default/loaders/fade/Android.bp
new file mode 100644
index 0000000..3dbc2f1
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/fade/Android.bp
@@ -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.
+
+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"],
+}
+
+xsd_config {
+ name: "car_fade_audio_configuration_xsd",
+ srcs: ["car_fade_audio_configuration.xsd"],
+ package_name: "android.hardware.automotive.audiocontrol.fade",
+ nullability: true,
+}
+
+cc_defaults {
+ name: "car.fade.configuration.xsd.default",
+ static_libs: [
+ "libxml2",
+ ],
+ generated_sources: [
+ "car_fade_audio_configuration_xsd",
+ ],
+ generated_headers: [
+ "car_fade_audio_configuration_xsd",
+ ],
+ header_libs: [
+ "libxsdc-utils",
+ ],
+}
diff --git a/automotive/audiocontrol/aidl/default/loaders/fade/api/current.txt b/automotive/audiocontrol/aidl/default/loaders/fade/api/current.txt
new file mode 100644
index 0000000..f40f1be
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/fade/api/current.txt
@@ -0,0 +1,160 @@
+// Signature format: 2.0
+package android.hardware.automotive.audiocontrol.fade {
+
+ public class AttributesType {
+ ctor public AttributesType();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.ContentTypeEnum getContentType();
+ method @Nullable public String getTags();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.UsageEnumType getUsage();
+ method public void setContentType(@Nullable android.hardware.automotive.audiocontrol.fade.ContentTypeEnum);
+ method public void setTags(@Nullable String);
+ method public void setUsage(@Nullable android.hardware.automotive.audiocontrol.fade.UsageEnumType);
+ }
+
+ public class AudioAttributesUsagesType {
+ ctor public AudioAttributesUsagesType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.fade.AttributesType> getAudioAttribute_optional();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.fade.UsageType> getUsage_optional();
+ }
+
+ public class CarAudioFadeConfigurationType {
+ ctor public CarAudioFadeConfigurationType();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.FadeConfigurationConfigs getConfigs();
+ method public void setConfigs(@Nullable android.hardware.automotive.audiocontrol.fade.FadeConfigurationConfigs);
+ }
+
+ public class ContentType {
+ ctor public ContentType();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.ContentTypeEnum getValue();
+ method public void setValue(@Nullable android.hardware.automotive.audiocontrol.fade.ContentTypeEnum);
+ }
+
+ public enum ContentTypeEnum {
+ method @NonNull public String getRawName();
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.ContentTypeEnum AUDIO_CONTENT_TYPE_MOVIE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.ContentTypeEnum AUDIO_CONTENT_TYPE_MUSIC;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.ContentTypeEnum AUDIO_CONTENT_TYPE_SONIFICATION;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.ContentTypeEnum AUDIO_CONTENT_TYPE_SPEECH;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.ContentTypeEnum AUDIO_CONTENT_TYPE_UNKNOWN;
+ }
+
+ public class FadeConfigurationConfig {
+ ctor public FadeConfigurationConfig();
+ method @Nullable public String getDefaultFadeInDelayForOffenders();
+ method @Nullable public String getDefaultFadeInDurationInMillis();
+ method @Nullable public String getDefaultFadeOutDurationInMillis();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.FadeInConfigurationsType getFadeInConfigurations();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.FadeOutConfigurationsType getFadeOutConfigurations();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.FadeStateType getFadeState();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.FadeableUsagesType getFadeableUsages();
+ method @Nullable public String getName();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.UnfadeableAudioAttributesType getUnfadeableAudioAttributes();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.UnfadeableContentTypesType getUnfadeableContentTypes();
+ method public void setDefaultFadeInDelayForOffenders(@Nullable String);
+ method public void setDefaultFadeInDurationInMillis(@Nullable String);
+ method public void setDefaultFadeOutDurationInMillis(@Nullable String);
+ method public void setFadeInConfigurations(@Nullable android.hardware.automotive.audiocontrol.fade.FadeInConfigurationsType);
+ method public void setFadeOutConfigurations(@Nullable android.hardware.automotive.audiocontrol.fade.FadeOutConfigurationsType);
+ method public void setFadeState(@Nullable android.hardware.automotive.audiocontrol.fade.FadeStateType);
+ method public void setFadeableUsages(@Nullable android.hardware.automotive.audiocontrol.fade.FadeableUsagesType);
+ method public void setName(@Nullable String);
+ method public void setUnfadeableAudioAttributes(@Nullable android.hardware.automotive.audiocontrol.fade.UnfadeableAudioAttributesType);
+ method public void setUnfadeableContentTypes(@Nullable android.hardware.automotive.audiocontrol.fade.UnfadeableContentTypesType);
+ }
+
+ public class FadeConfigurationConfigs {
+ ctor public FadeConfigurationConfigs();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.fade.FadeConfigurationConfig> getConfig();
+ }
+
+ public class FadeConfigurationType {
+ ctor public FadeConfigurationType();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.AudioAttributesUsagesType getAudioAttributes();
+ method @Nullable public String getFadeDurationMillis();
+ method public void setAudioAttributes(@Nullable android.hardware.automotive.audiocontrol.fade.AudioAttributesUsagesType);
+ method public void setFadeDurationMillis(@Nullable String);
+ }
+
+ public class FadeInConfigurationsType {
+ ctor public FadeInConfigurationsType();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.FadeConfigurationType getFadeConfiguration();
+ method public void setFadeConfiguration(@Nullable android.hardware.automotive.audiocontrol.fade.FadeConfigurationType);
+ }
+
+ public class FadeOutConfigurationsType {
+ ctor public FadeOutConfigurationsType();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.FadeConfigurationType getFadeConfiguration();
+ method public void setFadeConfiguration(@Nullable android.hardware.automotive.audiocontrol.fade.FadeConfigurationType);
+ }
+
+ public enum FadeStateEnumType {
+ method @NonNull public String getRawName();
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.FadeStateEnumType FADE_STATE_DISABLED;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.FadeStateEnumType FADE_STATE_ENABLED_DEFAULT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.FadeStateEnumType _0;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.FadeStateEnumType _1;
+ }
+
+ public class FadeStateType {
+ ctor public FadeStateType();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.FadeStateEnumType getValue();
+ method public void setValue(@Nullable android.hardware.automotive.audiocontrol.fade.FadeStateEnumType);
+ }
+
+ public class FadeableUsagesType {
+ ctor public FadeableUsagesType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.fade.UsageType> getUsage();
+ }
+
+ public class UnfadeableAudioAttributesType {
+ ctor public UnfadeableAudioAttributesType();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.AudioAttributesUsagesType getAudioAttributes();
+ method public void setAudioAttributes(@Nullable android.hardware.automotive.audiocontrol.fade.AudioAttributesUsagesType);
+ }
+
+ public class UnfadeableContentTypesType {
+ ctor public UnfadeableContentTypesType();
+ method @Nullable public java.util.List<android.hardware.automotive.audiocontrol.fade.ContentType> getContentType();
+ }
+
+ public enum UsageEnumType {
+ method @NonNull public String getRawName();
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_ALARM;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_ANNOUNCEMENT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_ASSISTANCE_SONIFICATION;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_ASSISTANT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_CALL_ASSISTANT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_EMERGENCY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_GAME;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_MEDIA;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_NOTIFICATION;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_NOTIFICATION_EVENT;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_SAFETY;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_UNKNOWN;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_VEHICLE_STATUS;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_VIRTUAL_SOURCE;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_VOICE_COMMUNICATION;
+ enum_constant public static final android.hardware.automotive.audiocontrol.fade.UsageEnumType AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
+ }
+
+ public class UsageType {
+ ctor public UsageType();
+ method @Nullable public android.hardware.automotive.audiocontrol.fade.UsageEnumType getValue();
+ method public void setValue(@Nullable android.hardware.automotive.audiocontrol.fade.UsageEnumType);
+ }
+
+ public class XmlParser {
+ ctor public XmlParser();
+ method @Nullable public static android.hardware.automotive.audiocontrol.fade.CarAudioFadeConfigurationType read(@NonNull java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method @Nullable public static String readText(@NonNull org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static void skip(@NonNull org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ }
+
+}
+
diff --git a/automotive/audiocontrol/aidl/default/loaders/fade/api/last_current.txt b/automotive/audiocontrol/aidl/default/loaders/fade/api/last_current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/fade/api/last_current.txt
diff --git a/automotive/audiocontrol/aidl/default/loaders/fade/api/last_removed.txt b/automotive/audiocontrol/aidl/default/loaders/fade/api/last_removed.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/fade/api/last_removed.txt
diff --git a/automotive/audiocontrol/aidl/default/loaders/fade/api/removed.txt b/automotive/audiocontrol/aidl/default/loaders/fade/api/removed.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/fade/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/automotive/audiocontrol/aidl/default/loaders/fade/car_fade_audio_configuration.xsd b/automotive/audiocontrol/aidl/default/loaders/fade/car_fade_audio_configuration.xsd
new file mode 100644
index 0000000..051be7e
--- /dev/null
+++ b/automotive/audiocontrol/aidl/default/loaders/fade/car_fade_audio_configuration.xsd
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="2.0">
+ <xs:element name="carAudioFadeConfiguration" type="CarAudioFadeConfigurationType" />
+ <xs:complexType name="CarAudioFadeConfigurationType">
+ <xs:element name="configs" type="FadeConfigurationConfigs" />
+ </xs:complexType>
+ <xs:complexType name="FadeConfigurationConfigs">
+ <xs:element name="config" type="FadeConfigurationConfig" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="FadeConfigurationConfig">
+ <xs:attribute name="name" type="xs:string" />
+ <xs:attribute name="defaultFadeOutDurationInMillis" type="xs:string" />
+ <xs:attribute name="defaultFadeInDurationInMillis" type="xs:string" />
+ <xs:attribute name="defaultFadeInDelayForOffenders" type="xs:string" />
+ <xs:element name="fadeState" type="FadeStateType" />
+ <xs:element name="fadeableUsages" type="FadeableUsagesType" />
+ <xs:element name="unfadeableContentTypes" type="UnfadeableContentTypesType" />
+ <xs:element name="unfadeableAudioAttributes" type="UnfadeableAudioAttributesType" />
+ <xs:element name="fadeOutConfigurations" type="FadeOutConfigurationsType" />
+ <xs:element name="fadeInConfigurations" type="FadeInConfigurationsType" />
+ </xs:complexType>
+ <xs:complexType name="FadeStateType">
+ <xs:attribute name="value" type="fadeStateEnumType" />
+ </xs:complexType>
+ <xs:simpleType name="fadeStateEnumType" >
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="0" />
+ <xs:enumeration value="1" />
+ <xs:enumeration value="FADE_STATE_DISABLED" />
+ <xs:enumeration value="FADE_STATE_ENABLED_DEFAULT" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="FadeableUsagesType">
+ <xs:element name="usage" type="UsageType" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="UsageType">
+ <xs:attribute name="value" type="usageEnumType" />
+ </xs:complexType>
+ <xs:simpleType name="usageEnumType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="AUDIO_USAGE_UNKNOWN"/>
+ <xs:enumeration value="AUDIO_USAGE_MEDIA"/>
+ <xs:enumeration value="AUDIO_USAGE_VOICE_COMMUNICATION"/>
+ <xs:enumeration value="AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING"/>
+ <xs:enumeration value="AUDIO_USAGE_ALARM"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED"/>
+ <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_EVENT"/>
+ <xs:enumeration value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY"/>
+ <xs:enumeration value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"/>
+ <xs:enumeration value="AUDIO_USAGE_ASSISTANCE_SONIFICATION"/>
+ <xs:enumeration value="AUDIO_USAGE_GAME"/>
+ <xs:enumeration value="AUDIO_USAGE_VIRTUAL_SOURCE"/>
+ <xs:enumeration value="AUDIO_USAGE_ASSISTANT"/>
+ <xs:enumeration value="AUDIO_USAGE_CALL_ASSISTANT"/>
+ <xs:enumeration value="AUDIO_USAGE_EMERGENCY" />
+ <xs:enumeration value="AUDIO_USAGE_SAFETY" />
+ <xs:enumeration value="AUDIO_USAGE_VEHICLE_STATUS" />
+ <xs:enumeration value="AUDIO_USAGE_ANNOUNCEMENT" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="UnfadeableContentTypesType">
+ <xs:element name="contentType" type="ContentType" maxOccurs="unbounded" />
+ </xs:complexType>
+ <xs:complexType name="ContentType">
+ <xs:attribute name="value" type="contentTypeEnum" />
+ </xs:complexType>
+ <xs:simpleType name="contentTypeEnum">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_UNKNOWN"/>
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_SPEECH"/>
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_MUSIC"/>
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_MOVIE"/>
+ <xs:enumeration value="AUDIO_CONTENT_TYPE_SONIFICATION"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="UnfadeableAudioAttributesType">
+ <xs:element name="audioAttributes" type="AudioAttributesUsagesType" />
+ </xs:complexType>
+ <xs:complexType name="AudioAttributesUsagesType" >
+ <xs:choice minOccurs="0" maxOccurs="unbounded" >
+ <xs:element name="audioAttribute" type="AttributesType" />
+ <xs:element name="usage" type="UsageType" />
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="AttributesType">
+ <xs:attribute name="contentType" type="contentTypeEnum" />
+ <xs:attribute name="usage" type="usageEnumType" />
+ <xs:attribute name="tags" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="FadeOutConfigurationsType">
+ <xs:element name="fadeConfiguration" type="FadeConfigurationType" />
+ </xs:complexType>
+ <xs:complexType name="FadeConfigurationType">
+ <xs:attribute name="fadeDurationMillis" type="xs:string" />
+ <xs:element name="audioAttributes" type="AudioAttributesUsagesType" />
+ </xs:complexType>
+ <xs:complexType name="FadeInConfigurationsType">
+ <xs:element name="fadeConfiguration" type="FadeConfigurationType" />
+ </xs:complexType>
+</xs:schema>
diff --git a/automotive/audiocontrol/aidl/rust_impl/Android.bp b/automotive/audiocontrol/aidl/rust_impl/Android.bp
index 062d989..f9d07b2 100644
--- a/automotive/audiocontrol/aidl/rust_impl/Android.bp
+++ b/automotive/audiocontrol/aidl/rust_impl/Android.bp
@@ -15,7 +15,7 @@
*/
rust_binary {
- name: "android.hardware.automotive.audiocontrol-V4-rust-service",
+ name: "android.hardware.automotive.audiocontrol-rust-service",
relative_install_path: "hw",
vendor: true,
srcs: ["src/*.rs"],
@@ -23,6 +23,7 @@
defaults: [
"latest_android_hardware_automotive_audiocontrol_rust",
"latest_android_hardware_audio_common_rust",
+ "latest_android_media_audio_common_types_rust",
],
vintf_fragments: ["audiocontrol-rust-service.xml"],
init_rc: ["audiocontrol-rust-service.rc"],
diff --git a/automotive/audiocontrol/aidl/rust_impl/README.md b/automotive/audiocontrol/aidl/rust_impl/README.md
index ed22356..b68daf3 100644
--- a/automotive/audiocontrol/aidl/rust_impl/README.md
+++ b/automotive/audiocontrol/aidl/rust_impl/README.md
@@ -6,7 +6,7 @@
This folder contains a skeleton audio control HAL implementation in Rust to
demonstrate how vendor may implement a Rust audio control HAL. To run this
audio control HAL, include
-`android.hardware.automotive.audiocontrol-V4-rust-service` in your image.
+`android.hardware.automotive.audiocontrol-rust-service` in your image.
This implementation returns `StatusCode::UNKNOWN_ERROR` for all operations
and does not pass VTS/CTS. Vendor must replace the logic in
diff --git a/automotive/audiocontrol/aidl/rust_impl/src/default_audio_control_hal.rs b/automotive/audiocontrol/aidl/rust_impl/src/default_audio_control_hal.rs
index ba0ca23..8184c43 100644
--- a/automotive/audiocontrol/aidl/rust_impl/src/default_audio_control_hal.rs
+++ b/automotive/audiocontrol/aidl/rust_impl/src/default_audio_control_hal.rs
@@ -23,8 +23,15 @@
IModuleChangeCallback::IModuleChangeCallback,
MutingInfo::MutingInfo,
Reasons::Reasons,
+ AudioDeviceConfiguration::AudioDeviceConfiguration,
+ AudioZone::AudioZone
};
-use android_hardware_audio_common::aidl::android::hardware::audio::common::PlaybackTrackMetadata::PlaybackTrackMetadata;
+use android_hardware_audio_common::aidl::android::hardware::audio::common::{
+ PlaybackTrackMetadata::PlaybackTrackMetadata,
+};
+use android_media_audio_common_types::aidl::android::media::audio::common::{
+ AudioPort::AudioPort,
+};
use binder::{Interface, Result as BinderResult, StatusCode, Strong};
/// This struct is defined to implement IAudioControl AIDL interface.
@@ -81,4 +88,16 @@
fn clearModuleChangeCallback(&self) -> BinderResult<()> {
Err(StatusCode::UNKNOWN_ERROR.into())
}
+
+ fn getAudioDeviceConfiguration(&self) -> std::result::Result<AudioDeviceConfiguration, binder::Status> {
+ Err(binder::StatusCode::UNKNOWN_ERROR.into())
+ }
+
+ fn getOutputMirroringDevices(&self) -> std::result::Result<std::vec::Vec<AudioPort>, binder::Status> {
+ Err(binder::StatusCode::UNKNOWN_ERROR.into())
+ }
+
+ fn getCarAudioZones(&self) -> std::result::Result<std::vec::Vec<AudioZone>, binder::Status> {
+ Err(binder::StatusCode::UNKNOWN_ERROR.into())
+ }
}
diff --git a/automotive/audiocontrol/aidl/vts/Android.bp b/automotive/audiocontrol/aidl/vts/Android.bp
index d94ad55..57c6ae4 100644
--- a/automotive/audiocontrol/aidl/vts/Android.bp
+++ b/automotive/audiocontrol/aidl/vts/Android.bp
@@ -22,6 +22,25 @@
default_applicable_licenses: ["hardware_interfaces_license"],
}
+cc_library {
+ name: "AudioControlHalTestUtils",
+ srcs: [
+ "src/AudioControlTestUtils.cpp",
+ ],
+ export_include_dirs: [
+ "include",
+ ],
+ defaults: [
+ "latest_android_hardware_audio_common_cpp_static",
+ "latest_android_hardware_automotive_audiocontrol_cpp_static",
+ "latest_android_media_audio_common_types_cpp_static",
+ ],
+ shared_libs: [
+ "libbase",
+ "libutils",
+ ],
+}
+
cc_test {
name: "VtsAidlHalAudioControlTest",
defaults: [
@@ -39,9 +58,11 @@
"libbinder",
"libbase",
"libxml2",
+ "libutils",
],
static_libs: [
"libgmock",
+ "AudioControlHalTestUtils",
],
test_suites: [
"general-tests",
diff --git a/automotive/audiocontrol/aidl/vts/VtsHalAudioControlTargetTest.cpp b/automotive/audiocontrol/aidl/vts/VtsHalAudioControlTargetTest.cpp
index 4e7e963..c01c0d6 100644
--- a/automotive/audiocontrol/aidl/vts/VtsHalAudioControlTargetTest.cpp
+++ b/automotive/audiocontrol/aidl/vts/VtsHalAudioControlTargetTest.cpp
@@ -18,6 +18,8 @@
#include <aidl/Gtest.h>
#include <aidl/Vintf.h>
#include <gmock/gmock.h>
+#include <utils/String16.h>
+#include <set>
#include <android/hardware/automotive/audiocontrol/BnAudioGainCallback.h>
#include <android/hardware/automotive/audiocontrol/BnFocusListener.h>
@@ -26,24 +28,49 @@
#include <android/log.h>
#include <binder/IServiceManager.h>
#include <binder/ProcessState.h>
+#include <include/AudioControlTestUtils.h>
using android::ProcessState;
using android::sp;
using android::String16;
using android::binder::Status;
+using android::hardware::automotive::audiocontrol::AudioDeviceConfiguration;
+using android::hardware::automotive::audiocontrol::AudioFadeConfiguration;
using android::hardware::automotive::audiocontrol::AudioFocusChange;
using android::hardware::automotive::audiocontrol::AudioGainConfigInfo;
+using android::hardware::automotive::audiocontrol::AudioZone;
+using android::hardware::automotive::audiocontrol::AudioZoneConfig;
+using android::hardware::automotive::audiocontrol::AudioZoneContextInfo;
+using android::hardware::automotive::audiocontrol::AudioZoneFadeConfiguration;
using android::hardware::automotive::audiocontrol::BnAudioGainCallback;
using android::hardware::automotive::audiocontrol::BnFocusListener;
using android::hardware::automotive::audiocontrol::BnModuleChangeCallback;
+using android::hardware::automotive::audiocontrol::DeviceToContextEntry;
using android::hardware::automotive::audiocontrol::DuckingInfo;
+using android::hardware::automotive::audiocontrol::FadeConfiguration;
using android::hardware::automotive::audiocontrol::IAudioControl;
using android::hardware::automotive::audiocontrol::IModuleChangeCallback;
using android::hardware::automotive::audiocontrol::MutingInfo;
using android::hardware::automotive::audiocontrol::Reasons;
+using android::hardware::automotive::audiocontrol::VolumeActivationConfiguration;
+using android::hardware::automotive::audiocontrol::VolumeActivationConfigurationEntry;
+using android::hardware::automotive::audiocontrol::VolumeGroupConfig;
+using android::hardware::automotive::audiocontrol::RoutingDeviceConfiguration::
+ CONFIGURABLE_AUDIO_ENGINE_ROUTING;
+using android::hardware::automotive::audiocontrol::RoutingDeviceConfiguration::
+ DEFAULT_AUDIO_ROUTING;
+using android::hardware::automotive::audiocontrol::VolumeActivationConfigurationEntry::
+ DEFAULT_MAX_ACTIVATION_VALUE;
+using android::hardware::automotive::audiocontrol::VolumeActivationConfigurationEntry::
+ DEFAULT_MIN_ACTIVATION_VALUE;
using ::testing::AnyOf;
using ::testing::Eq;
+using ::testing::Not;
+using ::testing::UnorderedElementsAreArray;
+
+using android::internal::ToString;
+
#include "android_audio_policy_configuration_V7_0.h"
namespace xsd {
@@ -52,11 +79,219 @@
namespace audiohalcommon = android::hardware::audio::common;
namespace audiomediacommon = android::media::audio::common;
+namespace testutils = android::hardware::audiocontrol::testutils;
namespace {
constexpr int32_t kAidlVersionThree = 3;
+constexpr int32_t kAidlVersionFive = 5;
+
+bool hasValidVolumeGroupActivation(const VolumeActivationConfiguration& activation,
+ std::string& message) {
+ if (activation.volumeActivationEntries.empty()) {
+ message = "Volume group activation must have at least one volume activation entry";
+ return false;
+ }
+ for (const auto& entry : activation.volumeActivationEntries) {
+ int32_t max = entry.maxActivationVolumePercentage;
+ int32_t min = entry.minActivationVolumePercentage;
+ if (min > DEFAULT_MAX_ACTIVATION_VALUE || min < DEFAULT_MIN_ACTIVATION_VALUE) {
+ message = "Invalid minActivationVolumePercentage, must be between " +
+ std::to_string(DEFAULT_MIN_ACTIVATION_VALUE) + " and " +
+ std::to_string(DEFAULT_MAX_ACTIVATION_VALUE);
+ return false;
+ }
+ if (max > DEFAULT_MAX_ACTIVATION_VALUE || max < DEFAULT_MIN_ACTIVATION_VALUE) {
+ message = "Invalid maxActivationVolumePercentage, must be between " +
+ std::to_string(DEFAULT_MIN_ACTIVATION_VALUE) + " and " +
+ std::to_string(DEFAULT_MAX_ACTIVATION_VALUE);
+ return false;
+ }
+ if (min >= max) {
+ message =
+ "Invalid maxActivationVolumePercentage and minActivationVolumePercentage "
+ "combination, minActivationVolumePercentage must be less than "
+ "maxActivationVolumePercentage";
+ return false;
+ }
+ }
+ return true;
}
+bool hasValidAudioRoute(const DeviceToContextEntry& entry, std::string& message,
+ std::set<std::string>& groupDevices) {
+ if (entry.contextNames.empty()) {
+ message = " Contexts can not be empty for DeviceToContextEntry";
+ return false;
+ }
+ std::set<std::string> contextInRoute;
+ for (const auto& context : entry.contextNames) {
+ std::string contextString = ToString(context);
+ if (contextInRoute.contains(contextString)) {
+ message = " Context " + contextString + " repeats for DeviceToContextEntry";
+ return false;
+ }
+ groupDevices.insert(contextString);
+ }
+ audiomediacommon::AudioDeviceDescription description;
+ if (!testutils::getAudioPortDeviceDescriptor(entry.device, description)) {
+ message = " DeviceToContextEntry must have a valid device port";
+ return false;
+ }
+ // BUS type also has empty connection
+ // Note: OUT_BUS is also mapped to OUT_DEVICE
+ if (description.type != audiomediacommon::AudioDeviceType::OUT_BUS &&
+ !description.connection.empty()) {
+ return true;
+ }
+ std::string address;
+ if (!testutils::getAddressForAudioPort(entry.device, address) || address.empty()) {
+ message = " Address can not be empty for BUS devices";
+ return false;
+ }
+ if (groupDevices.contains(address)) {
+ message = " Audio device address can not repeat in the same volume group";
+ return false;
+ }
+ groupDevices.insert(address);
+ return true;
+}
+
+inline bool hasValidTimeout(int64_t timeout) {
+ return timeout > 0;
+}
+bool hasValidFadeConfiguration(const FadeConfiguration& fadeConfiguration,
+ const std::string& prefix, std::string& message) {
+ if (!hasValidTimeout(fadeConfiguration.fadeDurationMillis)) {
+ message = prefix + " duration must be greater than 0";
+ return false;
+ }
+ return true;
+}
+bool hadValidAudioFadeConfiguration(const AudioFadeConfiguration& fadeConfiguration,
+ std::string& message) {
+ if (!hasValidTimeout(fadeConfiguration.fadeInDurationMs)) {
+ message = "Fade-in duration must be greater than 0";
+ return false;
+ }
+ if (!hasValidTimeout(fadeConfiguration.fadeOutDurationMs)) {
+ message = "Fade-out duration must be greater than 0";
+ return false;
+ }
+ if (!hasValidTimeout(fadeConfiguration.fadeInDelayedForOffendersMs)) {
+ message = "Fade-in delayed for offenders duration must be greater than 0";
+ return false;
+ }
+ for (const auto& fadeOutConfig : fadeConfiguration.fadeOutConfigurations) {
+ if (!hasValidFadeConfiguration(fadeOutConfig, "Fade-out", message)) {
+ return false;
+ }
+ }
+ for (const auto& fadeOutConfig : fadeConfiguration.fadeInConfigurations) {
+ if (!hasValidFadeConfiguration(fadeOutConfig, "Fade-in", message)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void validateVolumeGroupInfo(const AudioZoneConfig& audioZoneConfig,
+ const VolumeGroupConfig& volumeGroupConfig,
+ const AudioDeviceConfiguration& deviceConfig) {
+ std::string zoneConfigName = testutils::toAlphaNumeric(ToString(audioZoneConfig.name));
+ std::string volumeGroupName = testutils::toAlphaNumeric(ToString(volumeGroupConfig.name));
+ std::string volumeGroupInfo =
+ "Audio zone config " + zoneConfigName + " volume group " + volumeGroupName;
+ ALOGI("%s test", volumeGroupInfo.c_str());
+
+ EXPECT_FALSE(volumeGroupConfig.carAudioRoutes.empty())
+ << volumeGroupInfo << " must have at least one audio route";
+ if (deviceConfig.routingConfig == CONFIGURABLE_AUDIO_ENGINE_ROUTING) {
+ EXPECT_FALSE(volumeGroupConfig.name.empty())
+ << volumeGroupInfo << " must have a non-empty volume name";
+ }
+ std::set<std::string> groupDevices;
+ for (const auto& audioRoute : volumeGroupConfig.carAudioRoutes) {
+ std::string routeMessage;
+ EXPECT_TRUE(hasValidAudioRoute(audioRoute, routeMessage, groupDevices))
+ << volumeGroupInfo << " Volume route message: " << routeMessage;
+ }
+ if (volumeGroupConfig.activationConfiguration.has_value()) {
+ std::string activationMessage;
+ EXPECT_TRUE(hasValidVolumeGroupActivation(volumeGroupConfig.activationConfiguration.value(),
+ activationMessage))
+ << volumeGroupInfo << " Activation message: " << activationMessage;
+ }
+}
+
+void validateAudioZoneFadeConfiguration(const AudioZoneFadeConfiguration& fadeConfiguration) {
+ ALOGI("Fade configuration test");
+ std::set<audiomediacommon::AudioUsage> usages;
+ std::string defaultValidationMessage;
+ EXPECT_TRUE(hadValidAudioFadeConfiguration(fadeConfiguration.defaultConfiguration,
+ defaultValidationMessage))
+ << "Default configuration validation failed: " << defaultValidationMessage;
+ for (const auto& entry : fadeConfiguration.transientConfiguration) {
+ ALOGI("Transient fade configuration test");
+ std::string transientFadeConfigurationMessage;
+ EXPECT_TRUE(hadValidAudioFadeConfiguration(entry.transientFadeConfiguration,
+ transientFadeConfigurationMessage))
+ << "Transient fade configuration validation failed: "
+ << transientFadeConfigurationMessage;
+ EXPECT_FALSE(entry.transientUsages.empty())
+ << "Transient fade configuration must have at least one audio usage";
+ for (const auto& usage : entry.transientUsages) {
+ EXPECT_FALSE(usages.contains(usage)) << "Audio usages " << ToString(usage)
+ << " repeat in transient fade configuration";
+ }
+ }
+}
+
+void validateAudioZoneConfiguration(const AudioZone& carAudioZone,
+ const AudioZoneConfig& audioZoneConfig,
+ const AudioDeviceConfiguration& deviceConfig) {
+ std::string zoneConfigName = testutils::toAlphaNumeric(ToString(audioZoneConfig.name));
+ ALOGI("Zone config name %s test", zoneConfigName.c_str());
+ std::set<std::string> contextInfoNames;
+ EXPECT_FALSE(audioZoneConfig.volumeGroups.empty())
+ << "Volume groups for zone config " << zoneConfigName.c_str();
+ for (const auto& volumeGroup : audioZoneConfig.volumeGroups) {
+ ALOGI("Zone config name %s volume group test %s", zoneConfigName.c_str(),
+ ToString(volumeGroup.name).c_str());
+ std::vector<std::string> groupContexts =
+ testutils::getContextInfoNamesForVolumeGroup(volumeGroup);
+ for (const auto& context : groupContexts) {
+ EXPECT_FALSE(contextInfoNames.contains(context))
+ << "Context " << context << " repeats in zone config " << zoneConfigName;
+ contextInfoNames.insert(context);
+ }
+ validateVolumeGroupInfo(audioZoneConfig, volumeGroup, deviceConfig);
+ }
+ const auto& audioZoneContexts = carAudioZone.audioZoneContext.audioContextInfos;
+ std::map<std::string, AudioZoneContextInfo> infoNameToInfo;
+ std::transform(audioZoneContexts.begin(), audioZoneContexts.end(),
+ std::inserter(infoNameToInfo, infoNameToInfo.end()),
+ [&](const AudioZoneContextInfo& context) {
+ return std::make_pair(ToString(context.name), context);
+ });
+ std::vector<AudioZoneContextInfo> configContextInfos;
+ for (const auto& contextName : contextInfoNames) {
+ const auto& pair = infoNameToInfo.find(contextName);
+ if (pair == infoNameToInfo.end()) {
+ continue;
+ }
+ configContextInfos.push_back(pair->second);
+ }
+ std::string message;
+ EXPECT_TRUE(testutils::contextInfosContainAllAudioAttributeUsages(configContextInfos, message))
+ << "Config " << zoneConfigName << " message: " << message;
+
+ if (audioZoneConfig.fadeConfiguration.has_value()) {
+ validateAudioZoneFadeConfiguration(audioZoneConfig.fadeConfiguration.value());
+ }
+}
+
+} // namespace
+
class AudioControlAidl : public testing::TestWithParam<std::string> {
public:
virtual void SetUp() override {
@@ -292,12 +527,193 @@
AnyOf(Eq(Status::EX_ILLEGAL_ARGUMENT), Eq(Status::EX_UNSUPPORTED_OPERATION)));
}
+class AudioControlVersionFiveAndAbove : public AudioControlAidl {
+ public:
+ virtual void SetUp() override {
+ AudioControlAidl::SetUp();
+ if (isAidlVersionAtleast(kAidlVersionFive)) {
+ return;
+ }
+ GTEST_SKIP() << " Version is lower than " << std::to_string(kAidlVersionFive);
+ }
+};
+
+class AudioControlWithAudioConfiguration : public AudioControlVersionFiveAndAbove {
+ public:
+ virtual void SetUp() override {
+ AudioControlVersionFiveAndAbove::SetUp();
+
+ if (IsSkipped()) {
+ return;
+ }
+
+ const auto& configStatus =
+ audioControl->getAudioDeviceConfiguration(&audioDeviceConfiguration);
+
+ EXPECT_THAT(configStatus.exceptionCode(),
+ AnyOf(Eq(Status::EX_NONE), Eq(Status::EX_UNSUPPORTED_OPERATION)));
+ if (!configStatus.isOk()) {
+ GTEST_SKIP() << "Device does not support audio configurations APIs";
+ }
+ ALOGD("Audio device info: %s", audioDeviceConfiguration.toString().c_str());
+ }
+
+ AudioDeviceConfiguration audioDeviceConfiguration;
+};
+
+TEST_P(AudioControlWithAudioConfiguration, DefaultAudioRoutingConfiguration) {
+ if (audioDeviceConfiguration.routingConfig != DEFAULT_AUDIO_ROUTING) {
+ GTEST_SKIP() << "Default audio routing not supported";
+ }
+ std::vector<AudioZone> zones;
+
+ const auto& zoneStatus = audioControl->getCarAudioZones(&zones);
+
+ EXPECT_THAT(zoneStatus.exceptionCode(),
+ AnyOf(Eq(Status::EX_NONE), Eq(Status::EX_UNSUPPORTED_OPERATION)))
+ << "Default routing can be implemented or unsupported";
+ if (!zoneStatus.isOk()) return;
+ EXPECT_TRUE(zones.empty()) << "Zones must be empty for default routing";
+}
+
+class AudioControlWithDynamicConfiguration : public AudioControlWithAudioConfiguration {
+ public:
+ virtual void SetUp() override {
+ AudioControlWithAudioConfiguration::SetUp();
+ if (IsSkipped()) {
+ return;
+ }
+ if (audioDeviceConfiguration.routingConfig == DEFAULT_AUDIO_ROUTING) {
+ GTEST_SKIP() << "Dynamic/core audio routing not supported";
+ }
+ const auto& zoneStatus = audioControl->getCarAudioZones(&audioZones);
+ EXPECT_EQ(zoneStatus.exceptionCode(), Status::EX_NONE)
+ << "Zones API must be supported for core/dynamic routing";
+ }
+
+ std::vector<AudioZone> audioZones;
+};
+
+TEST_P(AudioControlWithDynamicConfiguration, DynamicAudioRoutingConfiguration) {
+ EXPECT_FALSE(audioZones.empty()) << "Zones must not be empty for core/dynamic routing";
+}
+
+class AudioControlWithAudioZoneInfo : public AudioControlWithDynamicConfiguration {
+ public:
+ virtual void SetUp() override {
+ AudioControlWithDynamicConfiguration::SetUp();
+ if (IsSkipped()) {
+ return;
+ }
+ EXPECT_TRUE(!audioZones.empty()) << "Zones must exist for core/dynamic routing";
+ }
+};
+
+TEST_P(AudioControlWithAudioZoneInfo, AudioZonesRequirements) {
+ bool primaryZoneFound = false;
+ std::set<int> zoneIds;
+ std::set<int> occupantIds;
+ std::set<android::String16> zoneNames;
+ std::set<std::string> deviceAddresses;
+ for (const auto& zone : audioZones) {
+ if (zone.id == AudioZone::PRIMARY_AUDIO_ZONE) {
+ EXPECT_FALSE(primaryZoneFound) << "There can only be one primary zone";
+ primaryZoneFound = true;
+ }
+ EXPECT_FALSE(zoneIds.contains(zone.id)) << "Zone " << std::to_string(zone.id) << " repeats";
+ zoneIds.insert(zone.id);
+ if (!zone.name.empty()) {
+ EXPECT_FALSE(zoneNames.contains(zone.name)) << "Zone " << zone.name << " repeats";
+ zoneNames.insert(zone.name);
+ }
+ if (zone.occupantZoneId != AudioZone::UNASSIGNED_OCCUPANT) {
+ EXPECT_FALSE(occupantIds.contains(zone.occupantZoneId))
+ << "Occupant zone id " << zone.occupantZoneId << " repeats";
+ occupantIds.insert(zone.occupantZoneId);
+ }
+ const auto& zoneAddresses = testutils::getDeviceAddressesForZone(zone);
+ for (const auto& address : zoneAddresses) {
+ EXPECT_FALSE(deviceAddresses.contains(address))
+ << "Device address " << address << " in zone " << zone.name << " repeats";
+ }
+ // Add after zone comparison is done since devices may repeat within a zone for different
+ // configurations
+ deviceAddresses.insert(zoneAddresses.begin(), zoneAddresses.end());
+ }
+ EXPECT_TRUE(primaryZoneFound) << "Primary zone must exist";
+}
+
+TEST_P(AudioControlWithAudioZoneInfo, AudioZoneInfoRequirements) {
+ for (const auto& carAudioZone : audioZones) {
+ ALOGI("Zone id %d test", carAudioZone.id);
+ std::string missingContextMessage;
+ EXPECT_TRUE(testutils::contextContainsAllAudioAttributeUsages(carAudioZone.audioZoneContext,
+ missingContextMessage))
+ << "Audio zone context for zone id " << std::to_string(carAudioZone.id)
+ << missingContextMessage;
+ EXPECT_FALSE(carAudioZone.audioZoneConfigs.empty())
+ << "Audio zone zone id " << std::to_string(carAudioZone.id)
+ << " missing zone configs";
+ std::set<android::String16> configNames;
+ bool defaultConfigFound = false;
+ for (const auto& config : carAudioZone.audioZoneConfigs) {
+ ALOGI("Zone id %d config name %s test", carAudioZone.id, ToString(config.name).c_str());
+ if (config.isDefault) {
+ EXPECT_FALSE(defaultConfigFound)
+ << "Config name " << config.name
+ << " repeats default config value in zone id " << carAudioZone.id;
+ defaultConfigFound = true;
+ }
+ EXPECT_FALSE(configNames.contains(config.name))
+ << "Config name " << config.name << " repeats in " << carAudioZone.id;
+ }
+ EXPECT_TRUE(defaultConfigFound)
+ << "Audio zone " << carAudioZone.id << " must contain default config";
+ std::set<audiomediacommon::AudioPort> inputPorts;
+ ALOGI("Zone id %d input devices test", carAudioZone.id);
+ for (const auto& audioPort : carAudioZone.inputAudioDevices) {
+ std::string address;
+ const auto hasAddress = testutils::getAddressForAudioPort(audioPort, address);
+ EXPECT_FALSE(inputPorts.contains(audioPort))
+ << "Repeating input device for " << carAudioZone.id << ", device address "
+ << (hasAddress ? address : "empty address");
+ inputPorts.insert(audioPort);
+ }
+ }
+}
+
+TEST_P(AudioControlWithAudioZoneInfo, AudioZoneConfigInfoRequirements) {
+ for (const auto& carAudioZone : audioZones) {
+ for (const auto& audioZoneConfig : carAudioZone.audioZoneConfigs) {
+ validateAudioZoneConfiguration(carAudioZone, audioZoneConfig, audioDeviceConfiguration);
+ }
+ }
+}
+
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioControlAidl);
INSTANTIATE_TEST_SUITE_P(
Audiocontrol, AudioControlAidl,
testing::ValuesIn(android::getAidlHalInstanceNames(IAudioControl::descriptor)),
android::PrintInstanceNameToString);
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioControlWithAudioConfiguration);
+INSTANTIATE_TEST_SUITE_P(
+ Audiocontrol, AudioControlWithAudioConfiguration,
+ testing::ValuesIn(android::getAidlHalInstanceNames(IAudioControl::descriptor)),
+ android::PrintInstanceNameToString);
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioControlWithDynamicConfiguration);
+INSTANTIATE_TEST_SUITE_P(
+ Audiocontrol, AudioControlWithDynamicConfiguration,
+ testing::ValuesIn(android::getAidlHalInstanceNames(IAudioControl::descriptor)),
+ android::PrintInstanceNameToString);
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioControlWithAudioZoneInfo);
+INSTANTIATE_TEST_SUITE_P(
+ Audiocontrol, AudioControlWithAudioZoneInfo,
+ testing::ValuesIn(android::getAidlHalInstanceNames(IAudioControl::descriptor)),
+ android::PrintInstanceNameToString);
+
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
ProcessState::self()->setThreadPoolMaxThreadCount(1);
diff --git a/automotive/audiocontrol/aidl/vts/include/AudioControlTestUtils.h b/automotive/audiocontrol/aidl/vts/include/AudioControlTestUtils.h
new file mode 100644
index 0000000..46fdce2
--- /dev/null
+++ b/automotive/audiocontrol/aidl/vts/include/AudioControlTestUtils.h
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ */
+
+#ifndef MAIN8_AUDIOCONTROLTESTUTILS_H
+#define MAIN8_AUDIOCONTROLTESTUTILS_H
+
+#include <android/hardware/automotive/audiocontrol/IAudioControl.h>
+#include <string>
+#include <vector>
+
+namespace android {
+namespace hardware {
+namespace audiocontrol {
+namespace testutils {
+
+std::string toAlphaNumeric(const std::string& info);
+
+bool getAudioPortDeviceDescriptor(
+ const android::media::audio::common::AudioPort& audioPort,
+ android::media::audio::common::AudioDeviceDescription& description);
+
+bool getAddressForAudioPort(const android::media::audio::common::AudioPort& audioPort,
+ std::string& address);
+
+bool getAddressForAudioDevice(
+ const android::hardware::automotive::audiocontrol::DeviceToContextEntry& device,
+ std::string& address);
+
+std::vector<std::string> getDeviceAddressesForVolumeGroup(
+ const android::hardware::automotive::audiocontrol::VolumeGroupConfig& config);
+
+std::vector<std::string> getDeviceAddressesForZoneConfig(
+ const android::hardware::automotive::audiocontrol::AudioZoneConfig& config);
+
+std::vector<std::string> getDeviceAddressesForZone(
+ const android::hardware::automotive::audiocontrol::AudioZone& config);
+
+bool contextInfosContainAllAudioAttributeUsages(
+ const std::vector<android::hardware::automotive::audiocontrol::AudioZoneContextInfo>& infos,
+ std::string& message);
+
+bool contextContainsAllAudioAttributeUsages(
+ const android::hardware::automotive::audiocontrol::AudioZoneContext& context,
+ std::string& message);
+
+std::vector<std::string> getContextInfoNamesForVolumeGroup(
+ const android::hardware::automotive::audiocontrol::VolumeGroupConfig& group);
+
+} // namespace testutils
+} // namespace audiocontrol
+} // namespace hardware
+} // namespace android
+
+#endif // MAIN8_AUDIOCONTROLTESTUTILS_H
diff --git a/automotive/audiocontrol/aidl/vts/src/AudioControlTestUtils.cpp b/automotive/audiocontrol/aidl/vts/src/AudioControlTestUtils.cpp
new file mode 100644
index 0000000..7b7c896
--- /dev/null
+++ b/automotive/audiocontrol/aidl/vts/src/AudioControlTestUtils.cpp
@@ -0,0 +1,203 @@
+/*
+ * 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.
+ */
+
+#include "../include/AudioControlTestUtils.h"
+
+#include <set>
+
+using android::hardware::automotive::audiocontrol::AudioZone;
+using android::hardware::automotive::audiocontrol::AudioZoneConfig;
+using android::hardware::automotive::audiocontrol::AudioZoneContext;
+using android::hardware::automotive::audiocontrol::AudioZoneContextInfo;
+using android::hardware::automotive::audiocontrol::DeviceToContextEntry;
+using android::hardware::automotive::audiocontrol::VolumeGroupConfig;
+
+namespace audiomediacommon = android::media::audio::common;
+
+namespace android {
+namespace hardware {
+namespace audiocontrol {
+namespace testutils {
+
+std::string toAlphaNumeric(const std::string& info) {
+ std::string name = info;
+ for (size_t i = 0; i < name.size(); i++) {
+ // gtest test names must only contain alphanumeric characters
+ if (!std::isalnum(name[i])) name[i] = '_';
+ }
+
+ return name;
+}
+
+bool getAudioPortDeviceDescriptor(const audiomediacommon::AudioPort& audioPort,
+ audiomediacommon::AudioDeviceDescription& description) {
+ if (audioPort.ext.getTag() != audiomediacommon::AudioPortExt::Tag::device) {
+ return false;
+ }
+ const auto& audioDevice =
+ audioPort.ext.get<audiomediacommon::AudioPortExt::Tag::device>().device;
+ description = audioDevice.type;
+ return true;
+}
+
+bool getAddressForAudioPort(const android::media::audio::common::AudioPort& audioPort,
+ std::string& address) {
+ if (audioPort.ext.getTag() != audiomediacommon::AudioPortExt::Tag::device) {
+ return false;
+ }
+ const auto& audioDevice =
+ audioPort.ext.get<audiomediacommon::AudioPortExt::Tag::device>().device;
+
+ switch (audioDevice.address.getTag()) {
+ case audiomediacommon::AudioDeviceAddress::Tag::id:
+ address = audioDevice.address.get<audiomediacommon::AudioDeviceAddress::Tag::id>();
+ return true;
+ case audiomediacommon::AudioDeviceAddress::Tag::alsa:
+ address = android::internal::ToString(
+ audioDevice.address.get<audiomediacommon::AudioDeviceAddress::Tag::alsa>());
+ return true;
+ case audiomediacommon::AudioDeviceAddress::Tag::mac:
+ address = android::internal::ToString(
+ audioDevice.address.get<audiomediacommon::AudioDeviceAddress::Tag::mac>());
+ return true;
+ case audiomediacommon::AudioDeviceAddress::Tag::ipv4:
+ address = android::internal::ToString(
+ audioDevice.address.get<audiomediacommon::AudioDeviceAddress::Tag::ipv4>());
+ return true;
+ case audiomediacommon::AudioDeviceAddress::Tag::ipv6:
+ address = android::internal::ToString(
+ audioDevice.address.get<audiomediacommon::AudioDeviceAddress::Tag::ipv6>());
+ return true;
+ default:
+ address = audioDevice.address.toString();
+ return true;
+ }
+}
+
+bool getAddressForAudioDevice(const DeviceToContextEntry& device, std::string& address) {
+ if (device.device.flags.getTag() == audiomediacommon::AudioIoFlags::input ||
+ device.device.ext.getTag() != audiomediacommon::AudioPortExt::Tag::device) {
+ return false;
+ }
+ return getAddressForAudioPort(device.device, address);
+}
+
+std::vector<std::string> getDeviceAddressesForVolumeGroup(const VolumeGroupConfig& config) {
+ std::vector<std::string> addresses;
+ for (const auto& route : config.carAudioRoutes) {
+ std::string address;
+ if (!getAddressForAudioDevice(route, address)) {
+ continue;
+ }
+ addresses.push_back(address);
+ }
+ return addresses;
+}
+
+std::vector<std::string> getDeviceAddressesForZoneConfig(const AudioZoneConfig& config) {
+ std::vector<std::string> addresses;
+ for (const auto& volumeGroup : config.volumeGroups) {
+ const auto groupAddresses = getDeviceAddressesForVolumeGroup(volumeGroup);
+ addresses.insert(addresses.begin(), groupAddresses.begin(), groupAddresses.end());
+ }
+ return addresses;
+}
+
+std::vector<std::string> getDeviceAddressesForZone(const AudioZone& config) {
+ std::vector<std::string> addresses;
+ for (const auto& zoneConfig : config.audioZoneConfigs) {
+ const auto groupAddresses = getDeviceAddressesForZoneConfig(zoneConfig);
+ addresses.insert(addresses.begin(), groupAddresses.begin(), groupAddresses.end());
+ }
+ return addresses;
+}
+
+static void addContextUsages(const AudioZoneContextInfo& info,
+ std::set<audiomediacommon::AudioUsage>& contextUsages) {
+ for (const auto& audioAttribute : info.audioAttributes) {
+ contextUsages.insert(audioAttribute.usage);
+ }
+}
+
+bool contextInfosContainAllAudioAttributeUsages(const std::vector<AudioZoneContextInfo>& infos,
+ std::string& message) {
+ static const std::vector<audiomediacommon::AudioUsage> audioUsages{
+ audiomediacommon::AudioUsage::UNKNOWN,
+ audiomediacommon::AudioUsage::MEDIA,
+ audiomediacommon::AudioUsage::VOICE_COMMUNICATION,
+ audiomediacommon::AudioUsage::VOICE_COMMUNICATION_SIGNALLING,
+ audiomediacommon::AudioUsage::ALARM,
+ audiomediacommon::AudioUsage::NOTIFICATION,
+ audiomediacommon::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE,
+ audiomediacommon::AudioUsage::NOTIFICATION_EVENT,
+ audiomediacommon::AudioUsage::ASSISTANCE_ACCESSIBILITY,
+ audiomediacommon::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE,
+ audiomediacommon::AudioUsage::ASSISTANCE_SONIFICATION,
+ audiomediacommon::AudioUsage::GAME,
+ audiomediacommon::AudioUsage::ASSISTANT,
+ audiomediacommon::AudioUsage::CALL_ASSISTANT,
+ audiomediacommon::AudioUsage::EMERGENCY,
+ audiomediacommon::AudioUsage::SAFETY,
+ audiomediacommon::AudioUsage::VEHICLE_STATUS,
+ audiomediacommon::AudioUsage::ANNOUNCEMENT,
+ };
+
+ std::set<audiomediacommon::AudioUsage> contextUsages;
+ for (const auto& contextInfo : infos) {
+ addContextUsages(contextInfo, contextUsages);
+ }
+
+ bool allUsagesPresent = true;
+ for (const auto& usage : audioUsages) {
+ if (contextUsages.contains(usage)) {
+ continue;
+ }
+ if (message.empty()) {
+ message = " Missing usage(s): ";
+ }
+ message += audiomediacommon::toString(usage) + ", ";
+ allUsagesPresent = false;
+ }
+ return allUsagesPresent;
+}
+
+bool contextContainsAllAudioAttributeUsages(const AudioZoneContext& context, std::string& message) {
+ return contextInfosContainAllAudioAttributeUsages(context.audioContextInfos, message);
+}
+
+std::vector<std::string> getContextInfoNamesForAudioRoute(const DeviceToContextEntry& route) {
+ std::vector<std::string> contextInfoNames;
+ contextInfoNames.reserve(route.contextNames.size());
+ for (const auto& contextName : route.contextNames) {
+ contextInfoNames.push_back(android::internal::ToString(contextName));
+ }
+ return contextInfoNames;
+}
+
+std::vector<std::string> getContextInfoNamesForVolumeGroup(const VolumeGroupConfig& group) {
+ std::vector<std::string> contextInfoNames;
+ for (const auto& route : group.carAudioRoutes) {
+ std::vector<std::string> routeContexts = getContextInfoNamesForAudioRoute(route);
+ contextInfoNames.insert(contextInfoNames.begin(), routeContexts.begin(),
+ routeContexts.end());
+ }
+ return contextInfoNames;
+}
+
+} // namespace testutils
+} // namespace audiocontrol
+} // namespace hardware
+} // namespace android
\ No newline at end of file
diff --git a/automotive/can/1.0/default/libnetdevice/Android.bp b/automotive/can/1.0/default/libnetdevice/Android.bp
index b42893e..4131a65 100644
--- a/automotive/can/1.0/default/libnetdevice/Android.bp
+++ b/automotive/can/1.0/default/libnetdevice/Android.bp
@@ -25,6 +25,7 @@
cc_defaults {
name: "libnetdevice-common",
+ host_supported: true,
vendor_available: true,
cflags: [
"-Wall",
diff --git a/automotive/can/1.0/default/libnetdevice/can.cpp b/automotive/can/1.0/default/libnetdevice/can.cpp
index 2a0545a..9cf0253 100644
--- a/automotive/can/1.0/default/libnetdevice/can.cpp
+++ b/automotive/can/1.0/default/libnetdevice/can.cpp
@@ -33,7 +33,7 @@
static constexpr can_err_mask_t kErrMask = CAN_ERR_MASK;
-base::unique_fd socket(const std::string& ifname) {
+base::unique_fd socket(std::string_view ifname) {
sockaddr_can addr = {};
addr.can_family = AF_CAN;
addr.can_ifindex = nametoindex(ifname);
@@ -66,11 +66,11 @@
return sock;
}
-bool setBitrate(std::string ifname, uint32_t bitrate) {
+bool setBitrate(std::string_view ifname, uint32_t bitrate) {
can_bittiming bt = {};
bt.bitrate = bitrate;
- nl::MessageFactory<ifinfomsg> req(RTM_NEWLINK, NLM_F_REQUEST | NLM_F_ACK);
+ nl::MessageFactory<ifinfomsg> req(RTM_NEWLINK);
req->ifi_index = nametoindex(ifname);
if (req->ifi_index == 0) {
diff --git a/automotive/can/1.0/default/libnetdevice/common.cpp b/automotive/can/1.0/default/libnetdevice/common.cpp
index 28e50af..22add65 100644
--- a/automotive/can/1.0/default/libnetdevice/common.cpp
+++ b/automotive/can/1.0/default/libnetdevice/common.cpp
@@ -22,8 +22,8 @@
namespace android::netdevice {
-unsigned int nametoindex(const std::string& ifname) {
- const auto ifidx = if_nametoindex(ifname.c_str());
+unsigned int nametoindex(std::string_view ifname) {
+ const auto ifidx = if_nametoindex(std::string(ifname).c_str());
if (ifidx != 0) return ifidx;
if (errno != ENODEV) {
diff --git a/automotive/can/1.0/default/libnetdevice/common.h b/automotive/can/1.0/default/libnetdevice/common.h
index 661e3f8..e73c581 100644
--- a/automotive/can/1.0/default/libnetdevice/common.h
+++ b/automotive/can/1.0/default/libnetdevice/common.h
@@ -32,6 +32,6 @@
* \param ifname Interface to check
* \return Interface index, or 0 if the interface doesn't exist
*/
-unsigned int nametoindex(const std::string& ifname);
+unsigned int nametoindex(std::string_view ifname);
} // namespace android::netdevice
diff --git a/automotive/can/1.0/default/libnetdevice/ethtool.cpp b/automotive/can/1.0/default/libnetdevice/ethtool.cpp
index 762ef5c..b0f88c7 100644
--- a/automotive/can/1.0/default/libnetdevice/ethtool.cpp
+++ b/automotive/can/1.0/default/libnetdevice/ethtool.cpp
@@ -19,27 +19,28 @@
#include "ifreqs.h"
#include <linux/ethtool.h>
+#include <linux/sockios.h>
namespace android::netdevice::ethtool {
-std::optional<uint32_t> getValue(const std::string& ifname, uint32_t command) {
+std::optional<uint32_t> getValue(std::string_view ifname, uint32_t command) {
struct ethtool_value valueop = {};
valueop.cmd = command;
auto ifr = ifreqs::fromName(ifname);
- ifr.ifr_data = &valueop;
+ ifr.ifr_data = reinterpret_cast<caddr_t>(&valueop);
if (!ifreqs::send(SIOCETHTOOL, ifr)) return std::nullopt;
return valueop.data;
}
-bool setValue(const std::string& ifname, uint32_t command, uint32_t value) {
+bool setValue(std::string_view ifname, uint32_t command, uint32_t value) {
struct ethtool_value valueop = {};
valueop.cmd = command;
valueop.data = value;
auto ifr = ifreqs::fromName(ifname);
- ifr.ifr_data = &valueop;
+ ifr.ifr_data = reinterpret_cast<caddr_t>(&valueop);
return ifreqs::send(SIOCETHTOOL, ifr);
}
diff --git a/automotive/can/1.0/default/libnetdevice/ifreqs.cpp b/automotive/can/1.0/default/libnetdevice/ifreqs.cpp
index 8471173..2e6ad41 100644
--- a/automotive/can/1.0/default/libnetdevice/ifreqs.cpp
+++ b/automotive/can/1.0/default/libnetdevice/ifreqs.cpp
@@ -21,6 +21,8 @@
#include <android-base/logging.h>
#include <android-base/unique_fd.h>
+#include <sys/ioctl.h>
+
#include <map>
namespace android::netdevice::ifreqs {
@@ -68,9 +70,11 @@
return true;
}
-struct ifreq fromName(const std::string& ifname) {
+struct ifreq fromName(std::string_view ifname) {
struct ifreq ifr = {};
- strlcpy(ifr.ifr_name, ifname.c_str(), IF_NAMESIZE);
+ // memcpy: last \0 initialized with ifreq above
+ memcpy(ifr.ifr_name, ifname.data(),
+ std::min(ifname.size(), static_cast<size_t>(IF_NAMESIZE - 1)));
return ifr;
}
diff --git a/automotive/can/1.0/default/libnetdevice/ifreqs.h b/automotive/can/1.0/default/libnetdevice/ifreqs.h
index aa7030b..f9d8d3b 100644
--- a/automotive/can/1.0/default/libnetdevice/ifreqs.h
+++ b/automotive/can/1.0/default/libnetdevice/ifreqs.h
@@ -52,6 +52,6 @@
* \param ifname Interface to initialize request with
* \return Interface request with ifr_name field set to ifname
*/
-struct ifreq fromName(const std::string& ifname);
+struct ifreq fromName(std::string_view ifname);
} // namespace android::netdevice::ifreqs
diff --git a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/can.h b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/can.h
index 3886acf..6045733 100644
--- a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/can.h
+++ b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/can.h
@@ -28,7 +28,7 @@
* \param ifname Interface to open a socket against
* \return Socket's FD or -1 in case of failure
*/
-base::unique_fd socket(const std::string& ifname);
+base::unique_fd socket(std::string_view ifname);
/**
* Sets CAN interface bitrate.
@@ -36,6 +36,6 @@
* \param ifname Interface for which the bitrate is to be set
* \return true on success, false on failure
*/
-bool setBitrate(std::string ifname, uint32_t bitrate);
+bool setBitrate(std::string_view ifname, uint32_t bitrate);
} // namespace android::netdevice::can
diff --git a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/ethtool.h b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/ethtool.h
index 26bfdce..416108f 100644
--- a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/ethtool.h
+++ b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/ethtool.h
@@ -29,7 +29,7 @@
* \param command Fetch command (ETHTOOL_G*)
* \return value, or nullopt if fetch failed
*/
-std::optional<uint32_t> getValue(const std::string& ifname, uint32_t command);
+std::optional<uint32_t> getValue(std::string_view ifname, uint32_t command);
/**
* Set a single value with ethtool_value.
@@ -40,6 +40,6 @@
* \param value New value
* \return true if succeeded, false otherwise
*/
-bool setValue(const std::string& ifname, uint32_t command, uint32_t value);
+bool setValue(std::string_view ifname, uint32_t command, uint32_t value);
} // namespace android::netdevice::ethtool
diff --git a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/libnetdevice.h b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/libnetdevice.h
index 657f9b2..15ff491 100644
--- a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/libnetdevice.h
+++ b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/libnetdevice.h
@@ -43,7 +43,7 @@
* \param ifname Interface to check
* \return true if it exists, false otherwise
*/
-bool exists(std::string ifname);
+bool exists(std::string_view ifname);
/**
* Checks if network interface is up.
@@ -51,7 +51,7 @@
* \param ifname Interface to check
* \return true/false if the check succeeded, nullopt otherwise
*/
-std::optional<bool> isUp(std::string ifname);
+std::optional<bool> isUp(std::string_view ifname);
/**
* Interface condition to wait for.
@@ -101,7 +101,7 @@
* \param ifname Interface to bring up
* \return true in case of success, false otherwise
*/
-bool up(std::string ifname);
+bool up(std::string_view ifname);
/**
* Brings network interface down.
@@ -109,7 +109,39 @@
* \param ifname Interface to bring down
* \return true in case of success, false otherwise
*/
-bool down(std::string ifname);
+bool down(std::string_view ifname);
+
+/**
+ * Retrieves all IPv4 addresses of a given interface.
+ *
+ * \param ifname Interface to query
+ * \return list of IPv4 addresses of this interface
+ */
+std::set<std::string> getAllAddr4(std::string_view ifname);
+
+/**
+ * Set IPv4 address on a given interface.
+ *
+ * This function will overwrite any other existing IPv4 addresses.
+ *
+ * \param ifname Interface to modify
+ * \param addr IPv4 address to set
+ * \return true in case of success, false otherwise
+ */
+bool setAddr4(std::string_view ifname, std::string_view addr,
+ std::optional<uint8_t> prefixlen = std::nullopt);
+
+/**
+ * Add new IPv4 address to a given interface.
+ *
+ * Please note this doesn't remove existing IPv4 addresses.
+ *
+ * \param ifname Interface to modify
+ * \param addr IPv4 address to add
+ * \param prefixlen IPv4 netmask length
+ * \return true in case of success, false otherwise
+ */
+bool addAddr4(std::string_view ifname, std::string_view addr, uint8_t prefixlen = 24);
/**
* Adds virtual link.
@@ -118,7 +150,7 @@
* \param type the type of the new device
* \return true in case of success, false otherwise
*/
-bool add(std::string dev, std::string type);
+bool add(std::string_view dev, std::string_view type);
/**
* Deletes virtual link.
@@ -126,7 +158,7 @@
* \param dev the name of the device to remove
* \return true in case of success, false otherwise
*/
-bool del(std::string dev);
+bool del(std::string_view dev);
/**
* Fetches interface's hardware address.
@@ -134,7 +166,7 @@
* \param ifname Interface name
* \return Hardware address (MAC address) or nullopt if the lookup failed
*/
-std::optional<hwaddr_t> getHwAddr(const std::string& ifname);
+std::optional<hwaddr_t> getHwAddr(std::string_view ifname);
/**
* Changes interface's hardware address.
@@ -142,7 +174,7 @@
* \param ifname Interface name
* \param hwaddr New hardware address to set
*/
-bool setHwAddr(const std::string& ifname, hwaddr_t hwaddr);
+bool setHwAddr(std::string_view ifname, hwaddr_t hwaddr);
} // namespace android::netdevice
diff --git a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/vlan.h b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/vlan.h
index 3e1b736..884b704 100644
--- a/automotive/can/1.0/default/libnetdevice/include/libnetdevice/vlan.h
+++ b/automotive/can/1.0/default/libnetdevice/include/libnetdevice/vlan.h
@@ -20,6 +20,6 @@
namespace android::netdevice::vlan {
-bool add(const std::string& eth, const std::string& vlan, uint16_t id);
+bool add(std::string_view eth, std::string_view vlan, uint16_t id);
} // namespace android::netdevice::vlan
diff --git a/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp b/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
index 413b4b1..9bb1a57 100644
--- a/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
+++ b/automotive/can/1.0/default/libnetdevice/libnetdevice.cpp
@@ -23,9 +23,13 @@
#include <libnl++/MessageFactory.h>
#include <libnl++/Socket.h>
+#include <arpa/inet.h>
+#include <ifaddrs.h>
#include <linux/can.h>
#include <linux/rtnetlink.h>
#include <net/if.h>
+#include <netdb.h>
+#include <sys/ioctl.h>
#include <algorithm>
#include <iterator>
@@ -37,27 +41,102 @@
ifreqs::socketDomain = domain;
}
-bool exists(std::string ifname) {
+bool exists(std::string_view ifname) {
return nametoindex(ifname) != 0;
}
-bool up(std::string ifname) {
+bool up(std::string_view ifname) {
auto ifr = ifreqs::fromName(ifname);
if (!ifreqs::send(SIOCGIFFLAGS, ifr)) return false;
+ if (ifr.ifr_flags & IFF_UP) return true;
ifr.ifr_flags |= IFF_UP;
return ifreqs::send(SIOCSIFFLAGS, ifr);
}
-bool down(std::string ifname) {
+bool down(std::string_view ifname) {
auto ifr = ifreqs::fromName(ifname);
if (!ifreqs::send(SIOCGIFFLAGS, ifr)) return false;
+ if (!(ifr.ifr_flags & IFF_UP)) return true;
ifr.ifr_flags &= ~IFF_UP;
return ifreqs::send(SIOCSIFFLAGS, ifr);
}
-bool add(std::string dev, std::string type) {
- nl::MessageFactory<ifinfomsg> req(RTM_NEWLINK,
- NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK);
+static std::string toString(const sockaddr* addr) {
+ char host[NI_MAXHOST];
+ socklen_t addrlen = (addr->sa_family == AF_INET) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6);
+ auto res = getnameinfo(addr, addrlen, host, sizeof(host), nullptr, 0, NI_NUMERICHOST);
+ CHECK(res == 0) << "getnameinfo failed: " << gai_strerror(res);
+ return host;
+}
+
+static std::unique_ptr<ifaddrs, decltype(&freeifaddrs)> getifaddrs() {
+ ifaddrs* addrs = nullptr;
+ CHECK(getifaddrs(&addrs) == 0) << "getifaddrs failed: " << strerror(errno);
+ return {addrs, freeifaddrs};
+}
+
+std::set<std::string> getAllAddr4(std::string_view ifname) {
+ std::set<std::string> addresses;
+ auto addrs = getifaddrs();
+ for (ifaddrs* addr = addrs.get(); addr != nullptr; addr = addr->ifa_next) {
+ if (ifname != addr->ifa_name) continue;
+ if (addr->ifa_addr == nullptr) continue;
+ if (addr->ifa_addr->sa_family != AF_INET) continue;
+ addresses.insert(toString(addr->ifa_addr));
+ }
+ return addresses;
+}
+
+static in_addr_t inetAddr(std::string_view addr) {
+ auto addrn = inet_addr(std::string(addr).c_str());
+ CHECK(addrn != INADDR_NONE) << "Invalid address " << addr;
+ return addrn;
+}
+
+static in_addr_t prefixLengthToIpv4Netmask(uint8_t prefixlen) {
+ in_addr_t zero = 0;
+ return htonl(~zero << (32 - prefixlen));
+}
+
+bool setAddr4(std::string_view ifname, std::string_view addr, std::optional<uint8_t> prefixlen) {
+ auto ifr = ifreqs::fromName(ifname);
+ auto ifrAddr = reinterpret_cast<sockaddr_in*>(&ifr.ifr_addr);
+ ifrAddr->sin_family = AF_INET;
+ ifrAddr->sin_addr.s_addr = inetAddr(addr);
+ if (!ifreqs::send(SIOCSIFADDR, ifr)) return false;
+
+ if (prefixlen.has_value()) {
+ if (*prefixlen < 0 || *prefixlen > 32) {
+ LOG(ERROR) << "Invalid prefix length: " << *prefixlen;
+ return false;
+ }
+ ifr = ifreqs::fromName(ifname);
+ auto ifrNetmask = reinterpret_cast<sockaddr_in*>(&ifr.ifr_netmask);
+ ifrNetmask->sin_family = AF_INET;
+ ifrNetmask->sin_addr.s_addr = prefixLengthToIpv4Netmask(*prefixlen);
+ if (!ifreqs::send(SIOCSIFNETMASK, ifr)) return false;
+ }
+
+ return true;
+}
+
+bool addAddr4(std::string_view ifname, std::string_view addr, uint8_t prefixlen) {
+ nl::MessageFactory<ifaddrmsg> req(RTM_NEWADDR, nl::kCreateFlags);
+ req->ifa_family = AF_INET;
+ req->ifa_prefixlen = prefixlen;
+ req->ifa_flags = IFA_F_SECONDARY;
+ req->ifa_index = nametoindex(ifname);
+
+ auto addrn = inetAddr(addr);
+ req.add(IFLA_ADDRESS, addrn);
+ req.add(IFLA_BROADCAST, addrn);
+
+ nl::Socket sock(NETLINK_ROUTE);
+ return sock.send(req) && sock.receiveAck(req);
+}
+
+bool add(std::string_view dev, std::string_view type) {
+ nl::MessageFactory<ifinfomsg> req(RTM_NEWLINK, nl::kCreateFlags);
req.add(IFLA_IFNAME, dev);
{
@@ -69,15 +148,15 @@
return sock.send(req) && sock.receiveAck(req);
}
-bool del(std::string dev) {
- nl::MessageFactory<ifinfomsg> req(RTM_DELLINK, NLM_F_REQUEST | NLM_F_ACK);
+bool del(std::string_view dev) {
+ nl::MessageFactory<ifinfomsg> req(RTM_DELLINK);
req.add(IFLA_IFNAME, dev);
nl::Socket sock(NETLINK_ROUTE);
return sock.send(req) && sock.receiveAck(req);
}
-std::optional<hwaddr_t> getHwAddr(const std::string& ifname) {
+std::optional<hwaddr_t> getHwAddr(std::string_view ifname) {
auto ifr = ifreqs::fromName(ifname);
if (!ifreqs::send(SIOCGIFHWADDR, ifr)) return std::nullopt;
@@ -86,7 +165,7 @@
return hwaddr;
}
-bool setHwAddr(const std::string& ifname, hwaddr_t hwaddr) {
+bool setHwAddr(std::string_view ifname, hwaddr_t hwaddr) {
auto ifr = ifreqs::fromName(ifname);
// fetch sa_family
@@ -96,13 +175,13 @@
return ifreqs::send(SIOCSIFHWADDR, ifr);
}
-std::optional<bool> isUp(std::string ifname) {
+std::optional<bool> isUp(std::string_view ifname) {
auto ifr = ifreqs::fromName(ifname);
if (!ifreqs::send(SIOCGIFFLAGS, ifr)) return std::nullopt;
return ifr.ifr_flags & IFF_UP;
}
-static bool hasIpv4(std::string ifname) {
+static bool hasIpv4(std::string_view ifname) {
auto ifr = ifreqs::fromName(ifname);
switch (ifreqs::trySend(SIOCGIFADDR, ifr)) {
case 0:
diff --git a/automotive/can/1.0/default/libnetdevice/vlan.cpp b/automotive/can/1.0/default/libnetdevice/vlan.cpp
index 35b21b8..e5b5a61 100644
--- a/automotive/can/1.0/default/libnetdevice/vlan.cpp
+++ b/automotive/can/1.0/default/libnetdevice/vlan.cpp
@@ -26,15 +26,14 @@
namespace android::netdevice::vlan {
-bool add(const std::string& eth, const std::string& vlan, uint16_t id) {
+bool add(std::string_view eth, std::string_view vlan, uint16_t id) {
const auto ethidx = nametoindex(eth);
if (ethidx == 0) {
LOG(ERROR) << "Ethernet interface " << eth << " doesn't exist";
return false;
}
- nl::MessageFactory<ifinfomsg> req(RTM_NEWLINK,
- NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK);
+ nl::MessageFactory<ifinfomsg> req(RTM_NEWLINK, nl::kCreateFlags);
req.add(IFLA_IFNAME, vlan);
req.add<uint32_t>(IFLA_LINK, ethidx);
diff --git a/automotive/can/1.0/default/libnl++/Android.bp b/automotive/can/1.0/default/libnl++/Android.bp
index d929d84..ade4ae0 100644
--- a/automotive/can/1.0/default/libnl++/Android.bp
+++ b/automotive/can/1.0/default/libnl++/Android.bp
@@ -25,6 +25,7 @@
cc_library_static {
name: "libnl++",
+ host_supported: true,
vendor_available: true,
cflags: [
"-Wall",
diff --git a/automotive/can/1.0/default/libnl++/Socket.cpp b/automotive/can/1.0/default/libnl++/Socket.cpp
index 221063d..a5a782c 100644
--- a/automotive/can/1.0/default/libnl++/Socket.cpp
+++ b/automotive/can/1.0/default/libnl++/Socket.cpp
@@ -20,6 +20,9 @@
#include <android-base/logging.h>
+// Should be in sys/socket.h or linux/socket.h
+#define SOL_NETLINK 270
+
namespace android::nl {
/**
diff --git a/automotive/can/1.0/default/libnl++/include/libnl++/MessageFactory.h b/automotive/can/1.0/default/libnl++/include/libnl++/MessageFactory.h
index a5a425e..f65f055 100644
--- a/automotive/can/1.0/default/libnl++/include/libnl++/MessageFactory.h
+++ b/automotive/can/1.0/default/libnl++/include/libnl++/MessageFactory.h
@@ -26,6 +26,9 @@
namespace android::nl {
+static constexpr uint16_t kDefaultFlags = NLM_F_REQUEST | NLM_F_ACK;
+static constexpr uint16_t kCreateFlags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK;
+
class MessageFactoryBase {
protected:
static nlattr* add(nlmsghdr* msg, size_t maxLen, nlattrtype_t type, const void* data,
@@ -54,7 +57,7 @@
* \param type Message type (such as RTM_NEWLINK).
* \param flags Message flags (such as NLM_F_REQUEST).
*/
- MessageFactory(nlmsgtype_t type, uint16_t flags)
+ MessageFactory(nlmsgtype_t type, uint16_t flags = kDefaultFlags)
: header(mMessage.header), data(mMessage.data) {
mMessage.header.nlmsg_len = offsetof(Message, attributesBuffer);
mMessage.header.nlmsg_type = type;
diff --git a/automotive/can/1.0/default/libnl++/printer.cpp b/automotive/can/1.0/default/libnl++/printer.cpp
index d540482..8c7c476 100644
--- a/automotive/can/1.0/default/libnl++/printer.cpp
+++ b/automotive/can/1.0/default/libnl++/printer.cpp
@@ -26,6 +26,12 @@
#include <iomanip>
#include <sstream>
+// should be in linux/netlink.h
+#define NLM_F_DUMP_FILTERED 0x20
+#define NLM_F_NONREC 0x100
+#define NLM_F_CAPPED 0x100
+#define NLM_F_ACK_TLVS 0x200
+
namespace android::nl {
static void flagsToStream(std::stringstream& ss, __u16 nlmsg_flags, protocols::MessageGenre genre) {
diff --git a/automotive/can/1.0/default/libnl++/protocols/common/Error.cpp b/automotive/can/1.0/default/libnl++/protocols/common/Error.cpp
index 77451ed..277f19d 100644
--- a/automotive/can/1.0/default/libnl++/protocols/common/Error.cpp
+++ b/automotive/can/1.0/default/libnl++/protocols/common/Error.cpp
@@ -22,6 +22,17 @@
#include <map>
+#include <linux/netlink.h>
+#ifndef _UAPI__LINUX_NETLINK_H
+// linux_glibc (host) includes source headers instead of uapi headers
+enum nlmsgerr_attrs {
+ NLMSGERR_ATTR_UNUSED,
+ NLMSGERR_ATTR_MSG,
+ NLMSGERR_ATTR_OFFS,
+ NLMSGERR_ATTR_COOKIE,
+};
+#endif
+
namespace android::nl::protocols::base {
using DataType = AttributeDefinition::DataType;
diff --git a/automotive/can/1.0/default/libnl++/protocols/generic/FamilyTracker.cpp b/automotive/can/1.0/default/libnl++/protocols/generic/FamilyTracker.cpp
index 3ad101e..eebd1f1 100644
--- a/automotive/can/1.0/default/libnl++/protocols/generic/FamilyTracker.cpp
+++ b/automotive/can/1.0/default/libnl++/protocols/generic/FamilyTracker.cpp
@@ -18,6 +18,9 @@
#include <android-base/logging.h>
+// should be in linux/genetlink.h
+#define GENL_START_ALLOC (NLMSG_MIN_TYPE + 3)
+
namespace android::nl::generic {
bool FamilyTracker::track(const Buffer<nlmsghdr>& buffer) {
diff --git a/automotive/can/1.0/default/libnl++/protocols/route/Addr.cpp b/automotive/can/1.0/default/libnl++/protocols/route/Addr.cpp
index 024d389..5bd6262 100644
--- a/automotive/can/1.0/default/libnl++/protocols/route/Addr.cpp
+++ b/automotive/can/1.0/default/libnl++/protocols/route/Addr.cpp
@@ -20,6 +20,12 @@
#include "attributes.h"
#include "structs.h"
+// should be in linux/if_addr.h
+#define IFA_F_MANAGETEMPADDR 0x100
+#define IFA_F_NOPREFIXROUTE 0x200
+#define IFA_F_MCAUTOJOIN 0x400
+#define IFA_F_STABLE_PRIVACY 0x800
+
namespace android::nl::protocols::route {
using DataType = AttributeDefinition::DataType;
diff --git a/automotive/can/1.0/default/libnl++/protocols/route/attributes.cpp b/automotive/can/1.0/default/libnl++/protocols/route/attributes.cpp
index 69d9b81..c81ee27 100644
--- a/automotive/can/1.0/default/libnl++/protocols/route/attributes.cpp
+++ b/automotive/can/1.0/default/libnl++/protocols/route/attributes.cpp
@@ -22,6 +22,54 @@
#include <linux/rtnetlink.h>
#include <net/if.h>
+#include <linux/if_link.h>
+#ifndef _UAPI_LINUX_IF_LINK_H
+enum {
+ IFLA_INFO_SLAVE_KIND = IFLA_INFO_XSTATS + 1,
+ IFLA_INFO_SLAVE_DATA,
+};
+enum {
+ IFLA_INET6_TOKEN = IFLA_INET6_ICMP6STATS + 1,
+ IFLA_INET6_ADDR_GEN_MODE,
+ IFLA_INET6_RA_MTU,
+};
+enum {
+ IFLA_CARRIER = IFLA_NUM_RX_QUEUES + 1,
+ IFLA_PHYS_PORT_ID,
+ IFLA_CARRIER_CHANGES,
+ IFLA_PHYS_SWITCH_ID,
+ IFLA_LINK_NETNSID,
+ IFLA_PHYS_PORT_NAME,
+ IFLA_PROTO_DOWN,
+ IFLA_GSO_MAX_SEGS,
+ IFLA_GSO_MAX_SIZE,
+ IFLA_PAD,
+ IFLA_XDP,
+ IFLA_EVENT,
+ IFLA_NEW_NETNSID,
+ IFLA_TARGET_NETNSID,
+ IFLA_CARRIER_UP_COUNT,
+ IFLA_CARRIER_DOWN_COUNT,
+ IFLA_NEW_IFINDEX,
+ IFLA_MIN_MTU,
+ IFLA_MAX_MTU,
+ IFLA_PROP_LIST,
+ IFLA_ALT_IFNAME,
+ IFLA_PERM_ADDRESS,
+ IFLA_PROTO_DOWN_REASON,
+ IFLA_PARENT_DEV_NAME,
+ IFLA_PARENT_DEV_BUS_NAME,
+ IFLA_GRO_MAX_SIZE,
+ IFLA_TSO_MAX_SIZE,
+ IFLA_TSO_MAX_SEGS,
+ IFLA_ALLMULTI,
+ IFLA_DEVLINK_PORT,
+ IFLA_GSO_IPV4_MAX_SIZE,
+ IFLA_GRO_IPV4_MAX_SIZE,
+ IFLA_DPLL_PIN,
+};
+#endif
+
namespace android::nl::protocols::route {
using DataType = AttributeDefinition::DataType;
diff --git a/automotive/can/1.0/default/libnl++/protocols/route/structs.h b/automotive/can/1.0/default/libnl++/protocols/route/structs.h
index c969a6c..410c42e 100644
--- a/automotive/can/1.0/default/libnl++/protocols/route/structs.h
+++ b/automotive/can/1.0/default/libnl++/protocols/route/structs.h
@@ -64,8 +64,8 @@
<< data.tx_heartbeat_errors << ',' //
<< data.tx_window_errors << ',' //
<< data.rx_compressed << ',' //
- << data.tx_compressed << ',' //
- << data.rx_nohandler << '}';
+ << data.tx_compressed << '}';
+ // Not printed (due to portability): rx_nohandler, rx_otherhost_dropped
}
} // namespace android::nl::protocols::route
diff --git a/automotive/evs/aidl/Android.bp b/automotive/evs/aidl/Android.bp
index 75eb924..8983ae4 100644
--- a/automotive/evs/aidl/Android.bp
+++ b/automotive/evs/aidl/Android.bp
@@ -55,14 +55,14 @@
version: "1",
imports: [
"android.hardware.common-V2",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
{
version: "2",
imports: [
"android.hardware.common-V2",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
diff --git a/automotive/evs/aidl/impl/default/include/ConfigManager.h b/automotive/evs/aidl/impl/default/include/ConfigManager.h
index 37a17dc..f6ba2f2 100644
--- a/automotive/evs/aidl/impl/default/include/ConfigManager.h
+++ b/automotive/evs/aidl/impl/default/include/ConfigManager.h
@@ -50,6 +50,7 @@
class ConfigManager final {
public:
static std::unique_ptr<ConfigManager> Create();
+ static std::unique_ptr<ConfigManager> Create(const std::string path);
ConfigManager(const ConfigManager&) = delete;
ConfigManager& operator=(const ConfigManager&) = delete;
@@ -65,6 +66,15 @@
UNKNOWN = std::numeric_limits<std::underlying_type_t<DeviceType>>::max(),
};
+ enum class PixelFormat : std::int32_t {
+ NV12 = 0,
+ NV21 = 1,
+ YV12 = 2,
+ I420 = 3,
+
+ UNKNOWN = std::numeric_limits<std::underlying_type_t<DeviceType>>::max(),
+ };
+
CameraInfo() : characteristics(nullptr) {}
virtual ~CameraInfo();
@@ -82,6 +92,8 @@
static DeviceType deviceTypeFromSV(const std::string_view sv);
+ static PixelFormat pixelFormatFromSV(const std::string_view sv);
+
DeviceType deviceType{DeviceType::NONE};
/*
@@ -105,6 +117,11 @@
/* Camera module characteristics */
camera_metadata_t* characteristics;
+
+ /* Format of media in a given media container. This field is effective
+ * only for DeviceType::VIDEO.
+ */
+ PixelFormat format;
};
class CameraGroupInfo : public CameraInfo {
@@ -272,7 +289,7 @@
* @return bool
* True if it completes parsing a file successfully.
*/
- bool readConfigDataFromXML() noexcept;
+ bool readConfigDataFromXML(const std::string path) noexcept;
/*
* read the information of the vehicle
diff --git a/automotive/evs/aidl/impl/default/include/EvsCameraBase.h b/automotive/evs/aidl/impl/default/include/EvsCameraBase.h
index c3e9dfc..d9180e8 100644
--- a/automotive/evs/aidl/impl/default/include/EvsCameraBase.h
+++ b/automotive/evs/aidl/impl/default/include/EvsCameraBase.h
@@ -30,6 +30,7 @@
~EvsCameraBase() override = default;
+ virtual std::string getId() = 0;
virtual void shutdown() = 0;
protected:
diff --git a/automotive/evs/aidl/impl/default/include/EvsMockCamera.h b/automotive/evs/aidl/impl/default/include/EvsMockCamera.h
index cd68532..67de8dc 100644
--- a/automotive/evs/aidl/impl/default/include/EvsMockCamera.h
+++ b/automotive/evs/aidl/impl/default/include/EvsMockCamera.h
@@ -65,7 +65,9 @@
ndk::ScopedAStatus setPrimaryClient() override;
ndk::ScopedAStatus unsetPrimaryClient() override;
- const evs::CameraDesc& getDesc() { return mDescription; }
+ std::string getId() override { return mDescription.id; }
+
+ const CameraDesc& getDesc() { return mDescription; }
static std::shared_ptr<EvsMockCamera> Create(const char* deviceName);
static std::shared_ptr<EvsMockCamera> Create(
diff --git a/automotive/evs/aidl/impl/default/include/EvsVideoEmulatedCamera.h b/automotive/evs/aidl/impl/default/include/EvsVideoEmulatedCamera.h
index 9d1610a..dc70a43 100644
--- a/automotive/evs/aidl/impl/default/include/EvsVideoEmulatedCamera.h
+++ b/automotive/evs/aidl/impl/default/include/EvsVideoEmulatedCamera.h
@@ -27,7 +27,6 @@
#include <aidl/android/hardware/automotive/evs/ParameterRange.h>
#include <aidl/android/hardware/automotive/evs/Stream.h>
#include <media/NdkMediaExtractor.h>
-
#include <ui/GraphicBuffer.h>
#include <cstdint>
@@ -70,6 +69,8 @@
// Methods from EvsCameraBase follow.
void shutdown() override;
+ std::string getId() override { return mDescription.id; }
+
const evs::CameraDesc& getDesc() { return mDescription; }
static std::shared_ptr<EvsVideoEmulatedCamera> Create(const char* deviceName);
@@ -117,6 +118,10 @@
bool postVideoStreamStop_locked(ndk::ScopedAStatus& status,
std::unique_lock<std::mutex>& lck) override;
+ int (*mFillBuffer)(const uint8_t* src_y, int src_stride_y, const uint8_t* src_u,
+ int src_stride_u, const uint8_t* src_v, int src_stride_v, uint8_t* dst_argb,
+ int dst_stride_argb, int width, int height);
+
// The properties of this camera.
CameraDesc mDescription = {};
@@ -149,6 +154,10 @@
uint64_t mUsage = 0;
// Bytes per line in the buffers
uint32_t mStride = 0;
+ // Bytes per line in the output buffer
+ uint32_t mDstStride = 0;
+ // Bytes per line of U/V plane
+ uint32_t mUvStride = 0;
// Camera parameters.
std::unordered_map<CameraParam, std::shared_ptr<CameraParameterDesc>> mParams;
diff --git a/automotive/evs/aidl/impl/default/src/ConfigManager.cpp b/automotive/evs/aidl/impl/default/src/ConfigManager.cpp
index d8961d0..eea80f4 100644
--- a/automotive/evs/aidl/impl/default/src/ConfigManager.cpp
+++ b/automotive/evs/aidl/impl/default/src/ConfigManager.cpp
@@ -52,6 +52,25 @@
return search == nameToType.end() ? DeviceType::UNKNOWN : search->second;
}
+ConfigManager::CameraInfo::PixelFormat ConfigManager::CameraInfo::pixelFormatFromSV(
+ const std::string_view sv) {
+ using namespace std::string_view_literals;
+ static const std::unordered_map<std::string_view, PixelFormat> nameToFormat = {
+ // Full resolution Y plane followed by 2x2 subsampled U/V
+ // interleaved plane.
+ {"NV12"sv, PixelFormat::NV12},
+ // Full resolution Y plane followed by 2x2 subsampled V/U
+ // interleaved plane.
+ {"NV21"sv, PixelFormat::NV21},
+ // Full resolution Y plane followed by 2x2 subsampled V plane and then U plane.
+ {"YV12"sv, PixelFormat::YV12},
+ // Full resolution Y plane followed by 2x2 subsampled U plane and then V plane.
+ {"I420"sv, PixelFormat::I420},
+ };
+ const auto search = nameToFormat.find(sv);
+ return search == nameToFormat.end() ? PixelFormat::UNKNOWN : search->second;
+}
+
void ConfigManager::printElementNames(const XMLElement* rootElem, const std::string& prefix) const {
const XMLElement* curElem = rootElem;
@@ -144,6 +163,10 @@
aCamera->deviceType = CameraInfo::deviceTypeFromSV(typeAttr->Value());
}
+ if (const auto formatAttr = aDeviceElem->FindAttribute("format")) {
+ aCamera->format = CameraInfo::pixelFormatFromSV(formatAttr->Value());
+ }
+
/* size information to allocate camera_metadata_t */
size_t totalEntries = 0;
size_t totalDataSize = 0;
@@ -474,19 +497,16 @@
return;
}
-bool ConfigManager::readConfigDataFromXML() noexcept {
+bool ConfigManager::readConfigDataFromXML(const std::string path) noexcept {
XMLDocument xmlDoc;
const int64_t parsingStart = android::elapsedRealtimeNano();
/* load and parse a configuration file */
- xmlDoc.LoadFile(sConfigOverridePath.data());
+ xmlDoc.LoadFile(path.c_str());
if (xmlDoc.ErrorID() != tinyxml2::XML_SUCCESS) {
- xmlDoc.LoadFile(sConfigDefaultPath.data());
- if (xmlDoc.ErrorID() != tinyxml2::XML_SUCCESS) {
- LOG(ERROR) << "Failed to load and/or parse a configuration file, " << xmlDoc.ErrorStr();
- return false;
- }
+ LOG(ERROR) << "Failed to load and/or parse a configuration file, " << xmlDoc.ErrorStr();
+ return false;
}
/* retrieve the root element */
@@ -644,8 +664,7 @@
p += count * sizeof(camera_metadata_rational_t);
break;
default:
- LOG(WARNING) << "Type " << type << " is unknown; "
- << "data may be corrupted.";
+ LOG(WARNING) << "Type " << type << " is unknown; " << "data may be corrupted.";
break;
}
}
@@ -746,8 +765,7 @@
p += count * sizeof(camera_metadata_rational_t);
break;
default:
- LOG(WARNING) << "Type " << type << " is unknown; "
- << "data may be corrupted.";
+ LOG(WARNING) << "Type " << type << " is unknown; " << "data may be corrupted.";
break;
}
}
@@ -958,6 +976,16 @@
}
std::unique_ptr<ConfigManager> ConfigManager::Create() {
+ std::unique_ptr<ConfigManager> mgr = Create(std::string(sConfigOverridePath));
+ if (!mgr) {
+ LOG(DEBUG) << "A configuration override file does not exist. Use a default file instead.";
+ mgr = Create(std::string((sConfigDefaultPath)));
+ }
+
+ return mgr;
+}
+
+std::unique_ptr<ConfigManager> ConfigManager::Create(const std::string path) {
std::unique_ptr<ConfigManager> cfgMgr(new ConfigManager());
/*
@@ -968,7 +996,7 @@
* to the filesystem and construct CameraInfo instead; this was
* evaluated as 10x faster.
*/
- if (!cfgMgr->readConfigDataFromXML()) {
+ if (!cfgMgr->readConfigDataFromXML(path)) {
return nullptr;
} else {
return cfgMgr;
diff --git a/automotive/evs/aidl/impl/default/src/EvsCamera.cpp b/automotive/evs/aidl/impl/default/src/EvsCamera.cpp
index 005c71f..c28f86f 100644
--- a/automotive/evs/aidl/impl/default/src/EvsCamera.cpp
+++ b/automotive/evs/aidl/impl/default/src/EvsCamera.cpp
@@ -205,7 +205,8 @@
}
if ((!preVideoStreamStop_locked(status, lck) || !stopVideoStreamImpl_locked(status, lck) ||
- !postVideoStreamStop_locked(status, lck)) && !status.isOk()) {
+ !postVideoStreamStop_locked(status, lck)) &&
+ !status.isOk()) {
needShutdown = true;
}
}
diff --git a/automotive/evs/aidl/impl/default/src/EvsVideoEmulatedCamera.cpp b/automotive/evs/aidl/impl/default/src/EvsVideoEmulatedCamera.cpp
index 480c28d..7574a34 100644
--- a/automotive/evs/aidl/impl/default/src/EvsVideoEmulatedCamera.cpp
+++ b/automotive/evs/aidl/impl/default/src/EvsVideoEmulatedCamera.cpp
@@ -26,6 +26,7 @@
#include <utils/SystemClock.h>
#include <fcntl.h>
+#include <libyuv.h>
#include <sys/types.h>
#include <unistd.h>
@@ -35,12 +36,45 @@
#include <tuple>
#include <utility>
+// Uncomment below line to dump decoded frames.
+// #define DUMP_FRAMES (1)
+
namespace aidl::android::hardware::automotive::evs::implementation {
namespace {
+
struct FormatDeleter {
void operator()(AMediaFormat* format) const { AMediaFormat_delete(format); }
};
+
+int fillRGBAFromNv12(const uint8_t* src_y, int src_stride_y, const uint8_t* src_uv,
+ int src_stride_uv, const uint8_t*, int, uint8_t* dst_abgr, int dst_stride_abgr,
+ int width, int height) {
+ return libyuv::NV12ToABGR(src_y, src_stride_y, src_uv, src_stride_uv, dst_abgr, dst_stride_abgr,
+ width, height);
+}
+
+int fillRGBAFromNv21(const uint8_t* src_y, int src_stride_y, const uint8_t* src_vu,
+ int src_stride_vu, const uint8_t*, int, uint8_t* dst_abgr, int dst_stride_abgr,
+ int width, int height) {
+ return libyuv::NV21ToABGR(src_y, src_stride_y, src_vu, src_stride_vu, dst_abgr, dst_stride_abgr,
+ width, height);
+}
+
+int fillRGBAFromYv12(const uint8_t* src_y, int src_stride_y, const uint8_t* src_u, int src_stride_u,
+ const uint8_t* src_v, int src_stride_v, uint8_t* dst_abgr, int dst_stride_abgr,
+ int width, int height) {
+ return libyuv::I420ToABGR(src_y, src_stride_y, src_u, src_stride_u, src_v, src_stride_v,
+ dst_abgr, dst_stride_abgr, width, height);
+}
+
+int fillRGBAFromI420(const uint8_t* src_y, int src_stride_y, const uint8_t* src_u, int src_stride_u,
+ const uint8_t* src_v, int src_stride_v, uint8_t* dst_abgr, int dst_stride_abgr,
+ int width, int height) {
+ return libyuv::I420ToABGR(src_y, src_stride_y, src_u, src_stride_u, src_v, src_stride_v,
+ dst_abgr, dst_stride_abgr, width, height);
+}
+
} // namespace
EvsVideoEmulatedCamera::EvsVideoEmulatedCamera(Sigil, const char* deviceName,
@@ -123,7 +157,7 @@
mDescription.vendorFlags = 0xFFFFFFFF; // Arbitrary test value
mUsage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_CAMERA_WRITE |
GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_RARELY;
- mFormat = HAL_PIXEL_FORMAT_YCBCR_420_888;
+ mFormat = HAL_PIXEL_FORMAT_RGBA_8888;
AMediaFormat_setInt32(format.get(), AMEDIAFORMAT_KEY_COLOR_FORMAT, COLOR_FormatYUV420Flexible);
{
const media_status_t status =
@@ -137,6 +171,30 @@
format.reset(AMediaCodec_getOutputFormat(mVideoCodec.get()));
AMediaFormat_getInt32(format.get(), AMEDIAFORMAT_KEY_WIDTH, &mWidth);
AMediaFormat_getInt32(format.get(), AMEDIAFORMAT_KEY_HEIGHT, &mHeight);
+
+ switch (mCameraInfo->format) {
+ default:
+ case ConfigManager::CameraInfo::PixelFormat::NV12:
+ mFillBuffer = fillRGBAFromNv12;
+ mUvStride = mWidth;
+ mDstStride = mWidth * 4;
+ break;
+ case ConfigManager::CameraInfo::PixelFormat::NV21:
+ mFillBuffer = fillRGBAFromNv21;
+ mUvStride = mWidth;
+ mDstStride = mWidth * 4;
+ break;
+ case ConfigManager::CameraInfo::PixelFormat::YV12:
+ mFillBuffer = fillRGBAFromYv12;
+ mUvStride = mWidth / 2;
+ mDstStride = mWidth * 4;
+ break;
+ case ConfigManager::CameraInfo::PixelFormat::I420:
+ mFillBuffer = fillRGBAFromI420;
+ mUvStride = mWidth / 2;
+ mDstStride = mWidth * 4;
+ break;
+ }
return true;
}
@@ -190,6 +248,28 @@
uint8_t* const codecOutputBuffer =
AMediaCodec_getOutputBuffer(mVideoCodec.get(), index, &decodedOutSize) + info.offset;
+ int color_format = 0;
+ const auto outFormat = AMediaCodec_getOutputFormat(mVideoCodec.get());
+ if (!AMediaFormat_getInt32(outFormat, AMEDIAFORMAT_KEY_COLOR_FORMAT, &color_format)) {
+ LOG(ERROR) << "Failed to get the color format.";
+ return;
+ }
+
+ int stride = 0;
+ if (!AMediaFormat_getInt32(outFormat, AMEDIAFORMAT_KEY_STRIDE, &stride)) {
+ LOG(WARNING) << "Cannot find stride in format. Set as frame width.";
+ stride = mWidth;
+ }
+
+ int slice_height = 0;
+ if (!AMediaFormat_getInt32(outFormat, AMEDIAFORMAT_KEY_SLICE_HEIGHT, &slice_height)) {
+ LOG(WARNING) << "Cannot find slice-height in format. Set as frame height.";
+ slice_height = mHeight;
+ }
+
+ LOG(DEBUG) << "COLOR FORMAT: " << color_format << " stride: " << stride
+ << " height: " << slice_height;
+
std::size_t renderBufferId = static_cast<std::size_t>(-1);
buffer_handle_t renderBufferHandle = nullptr;
{
@@ -200,7 +280,7 @@
std::tie(renderBufferId, renderBufferHandle) = useBuffer_unsafe();
}
if (!renderBufferHandle) {
- LOG(ERROR) << __func__ << ": Camera failed to get an available render buffer.";
+ LOG(DEBUG) << __func__ << ": Camera failed to get an available render buffer.";
return;
}
std::vector<BufferDesc> renderBufferDescs;
@@ -236,19 +316,51 @@
return;
}
- std::size_t ySize = mHeight * mStride;
+ // Decoded output is in YUV4:2:0.
+ std::size_t ySize = mHeight * mWidth;
std::size_t uvSize = ySize / 4;
- std::memcpy(pixels, codecOutputBuffer, ySize);
- pixels += ySize;
-
uint8_t* u_head = codecOutputBuffer + ySize;
uint8_t* v_head = u_head + uvSize;
- for (size_t i = 0; i < uvSize; ++i) {
- *(pixels++) = *(u_head++);
- *(pixels++) = *(v_head++);
+#if DUMP_FRAMES
+ // TODO: We may want to keep this "dump" option.
+ static int dumpCount = 0;
+ static bool dumpData = ++dumpCount < 10;
+ if (dumpData) {
+ std::string path = "/data/vendor/dump/";
+ path += "dump_" + std::to_string(dumpCount) + ".bin";
+
+ ::android::base::unique_fd fd(
+ open(path.data(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP));
+ if (fd < 0) {
+ LOG(ERROR) << "Failed to open " << path;
+ } else {
+ auto len = write(fd.get(), codecOutputBuffer, info.size);
+ LOG(ERROR) << "Write " << len << " to " << path;
+ }
}
+#endif
+ if (auto result = mFillBuffer(codecOutputBuffer, mWidth, u_head, mUvStride, v_head, mUvStride,
+ pixels, mDstStride, mWidth, mHeight);
+ result != 0) {
+ LOG(ERROR) << "Failed to convert I420 to BGRA";
+ }
+#if DUMP_FRAMES
+ else if (dumpData) {
+ std::string path = "/data/vendor/dump/";
+ path += "dump_" + std::to_string(dumpCount) + "_rgba.bin";
+
+ ::android::base::unique_fd fd(
+ open(path.data(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP));
+ if (fd < 0) {
+ LOG(ERROR) << "Failed to open " << path;
+ } else {
+ auto len = write(fd.get(), pixels, mStride * mHeight * 4);
+ LOG(ERROR) << "Write " << len << " to " << path;
+ }
+ }
+#endif
// Release our output buffer
mapper.unlock(renderBufferHandle);
@@ -332,8 +444,8 @@
::android::status_t EvsVideoEmulatedCamera::allocateOneFrame(buffer_handle_t* handle) {
static auto& alloc = ::android::GraphicBufferAllocator::get();
unsigned pixelsPerLine = 0;
- const auto result = alloc.allocate(mWidth, mHeight, mFormat, 1, mUsage, handle, &pixelsPerLine,
- 0, "EvsVideoEmulatedCamera");
+ const auto result = alloc.allocate(mWidth, mHeight, HAL_PIXEL_FORMAT_RGBA_8888, 1, mUsage,
+ handle, &pixelsPerLine, 0, "EvsVideoEmulatedCamera");
if (mStride == 0) {
// Gralloc defines stride in terms of pixels per line
mStride = pixelsPerLine;
@@ -350,7 +462,7 @@
if (auto status = AMediaCodec_start(mVideoCodec.get()); status != AMEDIA_OK) {
LOG(INFO) << __func__ << ": Received error in starting decoder. "
- << "Trying again after resetting this emulated device.";
+ << "Trying again after resetting this emulated device.";
if (!initializeMediaCodec()) {
LOG(ERROR) << __func__ << ": Failed to re-configure the media codec.";
@@ -361,7 +473,7 @@
AMEDIAEXTRACTOR_SEEK_CLOSEST_SYNC);
AMediaCodec_flush(mVideoCodec.get());
- if(auto status = AMediaCodec_start(mVideoCodec.get()); status != AMEDIA_OK) {
+ if (auto status = AMediaCodec_start(mVideoCodec.get()); status != AMEDIA_OK) {
LOG(ERROR) << __func__ << ": Received error again in starting decoder. "
<< "Error code: " << status;
return false;
@@ -389,7 +501,9 @@
return false;
}
- EvsEventDesc event = { .aType = EvsEventType::STREAM_STOPPED, };
+ EvsEventDesc event = {
+ .aType = EvsEventType::STREAM_STOPPED,
+ };
if (auto result = mStream->notify(event); !result.isOk()) {
LOG(WARNING) << "Failed to notify the end of the stream.";
}
diff --git a/automotive/evs/aidl/impl/default/tests/EvsCameraBufferTest.cpp b/automotive/evs/aidl/impl/default/tests/EvsCameraBufferTest.cpp
index 8b4676e..ce0e776 100644
--- a/automotive/evs/aidl/impl/default/tests/EvsCameraBufferTest.cpp
+++ b/automotive/evs/aidl/impl/default/tests/EvsCameraBufferTest.cpp
@@ -92,6 +92,7 @@
(override));
MOCK_METHOD(bool, stopVideoStreamImpl_locked,
(ndk::ScopedAStatus & status, std::unique_lock<std::mutex>& lck), (override));
+ MOCK_METHOD(std::string, getId, (), (override));
};
TEST(EvsCameraBufferTest, ChangeBufferPoolSize) {
diff --git a/automotive/evs/aidl/impl/default/tests/EvsCameraStateTest.cpp b/automotive/evs/aidl/impl/default/tests/EvsCameraStateTest.cpp
index 1925c79..c517e34 100644
--- a/automotive/evs/aidl/impl/default/tests/EvsCameraStateTest.cpp
+++ b/automotive/evs/aidl/impl/default/tests/EvsCameraStateTest.cpp
@@ -141,6 +141,7 @@
(override));
MOCK_METHOD(::ndk::ScopedAStatus, setPrimaryClient, (), (override));
MOCK_METHOD(::ndk::ScopedAStatus, unsetPrimaryClient, (), (override));
+ MOCK_METHOD(std::string, getId, (), (override));
bool mStreamStarted = false;
bool mStreamStopped = false;
@@ -160,7 +161,7 @@
MOCK_METHOD(::ndk::ScopedAStatus, notify,
(const ::aidl::android::hardware::automotive::evs::EvsEventDesc& in_event),
(override));
- MOCK_METHOD(::ndk::ScopedAStatus, getInterfaceVersion, (int32_t * _aidl_return), (override));
+ MOCK_METHOD(::ndk::ScopedAStatus, getInterfaceVersion, (int32_t* _aidl_return), (override));
MOCK_METHOD(::ndk::ScopedAStatus, getInterfaceHash, (std::string * _aidl_return), (override));
};
diff --git a/automotive/vehicle/TEST_MAPPING b/automotive/vehicle/TEST_MAPPING
index d848774..56bc047 100644
--- a/automotive/vehicle/TEST_MAPPING
+++ b/automotive/vehicle/TEST_MAPPING
@@ -48,12 +48,7 @@
"name": "GRPCVehicleHardwareUnitTest"
},
{
- "name": "CarServiceUnitTest",
- "options" : [
- {
- "include-filter": "com.android.car.hal.fakevhal.FakeVehicleStubUnitTest"
- }
- ]
+ "name": "CarServiceHalUnitTest"
},
{
"name": "VehicleHalProtoMessageConverterTest"
diff --git a/automotive/vehicle/aidl/Android.bp b/automotive/vehicle/aidl/Android.bp
index ce9e7a1..4b2d2b8 100644
--- a/automotive/vehicle/aidl/Android.bp
+++ b/automotive/vehicle/aidl/Android.bp
@@ -27,7 +27,7 @@
srcs: [
"android/hardware/automotive/vehicle/*.aidl",
],
- frozen: true,
+ frozen: false,
stability: "vintf",
backend: {
cpp: {
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/HasSupportedValueInfo.aidl
similarity index 86%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/HasSupportedValueInfo.aidl
index a5eda52..e9633cc 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/HasSupportedValueInfo.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.vehicle;
+@JavaDerive(equals=true, toString=true) @RustDerive(Clone=true) @VintfStability
+parcelable HasSupportedValueInfo {
+ boolean hasMinSupportedValue;
+ boolean hasMaxSupportedValue;
+ boolean hasSupportedValuesList;
}
diff --git a/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/IVehicle.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/IVehicle.aidl
index b5f62aa..ee58416 100644
--- a/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/IVehicle.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/IVehicle.aidl
@@ -41,6 +41,10 @@
void subscribe(in android.hardware.automotive.vehicle.IVehicleCallback callback, in android.hardware.automotive.vehicle.SubscribeOptions[] options, int maxSharedMemoryFileCount);
void unsubscribe(in android.hardware.automotive.vehicle.IVehicleCallback callback, in int[] propIds);
void returnSharedMemory(in android.hardware.automotive.vehicle.IVehicleCallback callback, long sharedMemoryId);
+ android.hardware.automotive.vehicle.SupportedValuesListResults getSupportedValuesLists(in List<android.hardware.automotive.vehicle.PropIdAreaId> propIdAreaIds);
+ android.hardware.automotive.vehicle.MinMaxSupportedValueResults getMinMaxSupportedValue(in List<android.hardware.automotive.vehicle.PropIdAreaId> propIdAreaIds);
+ void registerSupportedValueChangeCallback(in android.hardware.automotive.vehicle.IVehicleCallback callback, in List<android.hardware.automotive.vehicle.PropIdAreaId> propIdAreaIds);
+ void unregisterSupportedValueChangeCallback(in android.hardware.automotive.vehicle.IVehicleCallback callback, in List<android.hardware.automotive.vehicle.PropIdAreaId> propIdAreaIds);
const long INVALID_MEMORY_ID = 0;
const int MAX_SHARED_MEMORY_FILES_PER_CLIENT = 3;
}
diff --git a/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/IVehicleCallback.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/IVehicleCallback.aidl
index 2c5a333..50a8e76 100644
--- a/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/IVehicleCallback.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/IVehicleCallback.aidl
@@ -38,4 +38,5 @@
oneway void onSetValues(in android.hardware.automotive.vehicle.SetValueResults responses);
oneway void onPropertyEvent(in android.hardware.automotive.vehicle.VehiclePropValues propValues, int sharedMemoryFileCount);
oneway void onPropertySetError(in android.hardware.automotive.vehicle.VehiclePropErrors errors);
+ oneway void onSupportedValueChange(in List<android.hardware.automotive.vehicle.PropIdAreaId> propIdAreaIds);
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/MinMaxSupportedValueResult.aidl
similarity index 79%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/MinMaxSupportedValueResult.aidl
index a5eda52..a004b79 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/MinMaxSupportedValueResult.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.vehicle;
+@JavaDerive(equals=true, toString=true) @RustDerive(Clone=true) @VintfStability
+parcelable MinMaxSupportedValueResult {
+ android.hardware.automotive.vehicle.StatusCode status = android.hardware.automotive.vehicle.StatusCode.OK;
+ @nullable android.hardware.automotive.vehicle.RawPropValues minSupportedValue;
+ @nullable android.hardware.automotive.vehicle.RawPropValues maxSupportedValue;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/MinMaxSupportedValueResults.aidl
similarity index 85%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/MinMaxSupportedValueResults.aidl
index a5eda52..914d9c6 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/MinMaxSupportedValueResults.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.vehicle;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable MinMaxSupportedValueResults {
+ android.hardware.automotive.vehicle.MinMaxSupportedValueResult[] payloads;
+ @nullable ParcelFileDescriptor sharedMemoryFd;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/PropIdAreaId.aidl
similarity index 90%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/PropIdAreaId.aidl
index a5eda52..83e9c15 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/PropIdAreaId.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.vehicle;
+@JavaDerive(equals=true, toString=true) @RustDerive(Clone=true) @VintfStability
+parcelable PropIdAreaId {
+ int propId;
+ int areaId;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/SupportedValuesListResult.aidl
similarity index 82%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/SupportedValuesListResult.aidl
index a5eda52..f348dcb 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/SupportedValuesListResult.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.vehicle;
+@JavaDerive(equals=true, toString=true) @RustDerive(Clone=true) @VintfStability
+parcelable SupportedValuesListResult {
+ android.hardware.automotive.vehicle.StatusCode status = android.hardware.automotive.vehicle.StatusCode.OK;
+ @nullable List<android.hardware.automotive.vehicle.RawPropValues> supportedValuesList;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/SupportedValuesListResults.aidl
similarity index 85%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/SupportedValuesListResults.aidl
index a5eda52..08af47c 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/SupportedValuesListResults.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.vehicle;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable SupportedValuesListResults {
+ android.hardware.automotive.vehicle.SupportedValuesListResult[] payloads;
+ @nullable ParcelFileDescriptor sharedMemoryFd;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/ValueRange.aidl
similarity index 81%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/ValueRange.aidl
index a5eda52..077652b 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/ValueRange.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.automotive.vehicle;
+@JavaDerive(equals=true, toString=true) @RustDerive(Clone=true) @VintfStability
+parcelable ValueRange {
+ @nullable android.hardware.automotive.vehicle.RawPropValues minValue;
+ @nullable android.hardware.automotive.vehicle.RawPropValues maxValue;
+ @nullable List<android.hardware.automotive.vehicle.RawPropValues> supportedValues;
}
diff --git a/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl
index eb3028e..465d9d4 100644
--- a/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl
+++ b/automotive/vehicle/aidl/aidl_api/android.hardware.automotive.vehicle/current/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl
@@ -44,4 +44,5 @@
@nullable long[] supportedEnumValues;
android.hardware.automotive.vehicle.VehiclePropertyAccess access = android.hardware.automotive.vehicle.VehiclePropertyAccess.NONE;
boolean supportVariableUpdateRate;
+ @nullable android.hardware.automotive.vehicle.HasSupportedValueInfo hasSupportedValueInfo;
}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/HasSupportedValueInfo.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/HasSupportedValueInfo.aidl
new file mode 100644
index 0000000..991631b
--- /dev/null
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/HasSupportedValueInfo.aidl
@@ -0,0 +1,84 @@
+/*
+ * 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.automotive.vehicle;
+
+/**
+ * Whether the [propId, areaId] has min/max supported value or supported values
+ * list specified.
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+@RustDerive(Clone=true)
+parcelable HasSupportedValueInfo {
+ /**
+ * Whether [propId, areaId] has min supported value specified.
+ *
+ * If this is {@code true}, the hardware specifies a min supported value.
+ * If {@code MinMaxSupportedValueResult}'s {@code status} is
+ * {@code StatusCode.OK}, its {@code minSupportedValue} must not be
+ * {@code null}.
+ *
+ * If this is {@code false}, {@code minSupportedValue} must be {@code null}.
+ *
+ * Unless otherwise specified, this field is set to {@code false} for any
+ * properties whose type is not int32, int64 or float.
+ *
+ * For certain properties, e.g. {@code EV_BRAKE_REGENERATION_LEVEL}, this
+ * must always be {@code true}. Check {@code VehicleProperty}
+ * documentation.
+ */
+ boolean hasMinSupportedValue;
+
+ /**
+ * Whether [propId, areaId] has max supported value specified.
+ *
+ * If this is {@code true}, the hardware specifies a max supported value.
+ * If {@code MinMaxSupportedValueResult}'s {@code status} is
+ * {@code StatusCode.OK}, its {@code maxSupportedValue} must not be
+ * {@code null}.
+ *
+ * If this is {@code false}, {@code maxSupportedValue} must be {@code null}.
+ *
+ * Unless otherwise specified, this field is set to {@code false} for any
+ * properties whose type is not int32, int64 or float.
+ *
+ * For certain properties, e.g. {@code EV_BRAKE_REGENERATION_LEVEL}, this
+ * must always be {@code true}. Check {@code VehicleProperty}
+ * documentation.
+ */
+ boolean hasMaxSupportedValue;
+
+ /**
+ * Whether [propId, areaId] has supported values list specified.
+ *
+ * If this is {@code true}, it means the hardware specifies supported
+ * values for this property.
+ * If {@code SupportedValueListResult}'s {@code status} is
+ * {@code StatusCode.OK}, its {@code supportedValuesList} must not be
+ * {@code null}.
+ *
+ * If this is {@code false}, {@code supportedValuesList} must always be
+ * {@code null}.
+ *
+ * The supported value is the superset for both the input value for writable
+ * property and the output value for readable property.
+ *
+ * For certain properties, e.g. {@code GEAR_SELECTION}, this must always be
+ * {@code true}. Check {@code VehicleProperty} documentation.
+ */
+ boolean hasSupportedValuesList;
+}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicle.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicle.aidl
index c896d14..220b1da 100644
--- a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicle.aidl
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicle.aidl
@@ -18,8 +18,11 @@
import android.hardware.automotive.vehicle.GetValueRequests;
import android.hardware.automotive.vehicle.IVehicleCallback;
+import android.hardware.automotive.vehicle.MinMaxSupportedValueResults;
+import android.hardware.automotive.vehicle.PropIdAreaId;
import android.hardware.automotive.vehicle.SetValueRequests;
import android.hardware.automotive.vehicle.SubscribeOptions;
+import android.hardware.automotive.vehicle.SupportedValuesListResults;
import android.hardware.automotive.vehicle.VehiclePropConfigs;
// Vehicle HAL interface.
@@ -260,4 +263,106 @@
* the used shared memory file to return.
*/
void returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId);
+
+ /**
+ * Gets the supported values lists for [propId, areaId]s.
+ *
+ * For a specific [propId, areaId], if the hardware currently specifies
+ * a list of supported values for it, then it is returned through the
+ * {@code supportedValuesList} field inside
+ * {@code SupportedValuesListResult}. If the hardware does not specify
+ * a list of supported values for it (indicated by
+ * {@code HasSupportedValueInfo.hasSupportedValuesList} being
+ * {@code false}), then {@code supportedValuesList} field will be
+ * {@code null}.
+ *
+ * The supported value list applies for both read/write operations. if
+ * it differs for read/write, this is the super-set.
+ *
+ * Must return a list of results, one for each requested [propId, areaId].
+ *
+ * The returned supported values list represents the currently supported
+ * values and may change dynamically. Caller should use
+ * {@code registerSupportedValueChangeCallback} to register for supported
+ * value range change.
+ *
+ * If unable to determine the supported values for some [propId, areaId] due
+ * to error cases, for example, unable to determine EV_CHARGE_PERCENT_LIMIT
+ * supported values due to battery in an error state,
+ * {@code SupportedValuesListResult.status} for that should be set to
+ * a non-okay {@code StatusCode}.
+ *
+ * If one of the [propId, areaId] is not supported,
+ * {@code SupportedValuesListResult.status} for that should be set to
+ * {@code StatusCode.INVALID_ARG}.
+ *
+ * This function should only return non-okay {@code StatusCode} if the whole
+ * operation failed and unable to get any results.
+ */
+ SupportedValuesListResults getSupportedValuesLists(in List<PropIdAreaId> propIdAreaIds);
+
+ /**
+ * Gets the min/max supported values for [propId, areaId]s.
+ *
+ * For a specific [propId, areaId], if the hardware currently specifies
+ * min/max supported value for it, then it is returned through the
+ * {@code minSupportedValue} or {@code maxSupportedValue} field inside
+ * {@code MinMaxSupportedValueResult}. If the hardware does not specify
+ * min/max supported value for it (indicated by
+ * {@code HasSupportedValueInfo.hasMinSupportedValue} or
+ * {@code HasSupportedValueInfo.hasMaxSupportedValue} being
+ * {@code false}), then {@code minSupportedValue} or
+ * {@code maxSupportedValue} is {@code null}.
+ *
+ * The min/max supported values apply for both read/write operations. if
+ * they differs for read/write, they are from the super-set.
+ *
+ * Must return a list of results, one for each requested [propId, areaId].
+ *
+ * The returned min/max supported values represent the currently supported
+ * values and may change dynamically. Caller should use
+ * {@code registerSupportedValueChangeCallback} to register for supported
+ * value range change.
+ *
+ * If unable to determine the supported values for some [propId, areaId] due
+ * to error cases, for example, unable to determine HVAC_FAN_SPEED
+ * max supported value due to HVAC in an error state,
+ * {@code MinMaxSupportedValueResult.status} for that should be set to
+ * a non-okay {@code StatusCode}.
+ *
+ * If one of the [propId, areaId] is not supported,
+ * {@code MinMaxSupportedValueResult.status} for that should be set to
+ * {@code StatusCode.INVALID_ARG}.
+ *
+ * This function should only return non-okay {@code StatusCode} if the whole
+ * operation failed and unable to get any results.
+ */
+ MinMaxSupportedValueResults getMinMaxSupportedValue(in List<PropIdAreaId> propIdAreaIds);
+
+ /**
+ * Registers the supported value change callback.
+ *
+ * For the specified [propId, areaId]s,
+ * {@code callback.onSupportedValueChange} must be invoked if change
+ * happens.
+ *
+ * This always registers a new callback for the specified [propId, areaId]s
+ * if the same callback was not previously registered for them.
+ *
+ * The list of [propId, areaId]s to register must not be empty.
+ *
+ * @param callback The callback for supported value change.
+ * @param propIdAreaIds A list of [propId, areaId]s to register.
+ */
+ void registerSupportedValueChangeCallback(
+ in IVehicleCallback callback, in List<PropIdAreaId> propIdAreaIds);
+
+ /**
+ * Unregisters the supported value change callback.
+ *
+ * @param callback The callback to unregister.
+ * @param propIdAreaIds A list of [propId, areaId]s to unregister.
+ */
+ void unregisterSupportedValueChangeCallback(
+ in IVehicleCallback callback, in List<PropIdAreaId> propIdAreaIds);
}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicleCallback.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicleCallback.aidl
index 2b50321..7230d09 100644
--- a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicleCallback.aidl
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicleCallback.aidl
@@ -17,6 +17,7 @@
package android.hardware.automotive.vehicle;
import android.hardware.automotive.vehicle.GetValueResults;
+import android.hardware.automotive.vehicle.PropIdAreaId;
import android.hardware.automotive.vehicle.SetValueResults;
import android.hardware.automotive.vehicle.StatusCode;
import android.hardware.automotive.vehicle.VehiclePropErrors;
@@ -96,4 +97,16 @@
* does not batch the errors, this may only contain one error.
*/
oneway void onPropertySetError(in VehiclePropErrors errors);
+
+ /**
+ * Called when the min/max supported value or supported value list for
+ * the registered [propId, areaId]s changes.
+ *
+ * The caller is supposed to call {@code getMinMaxSupportedValue} or
+ * {@code getSupportedValuesLists} to get the new supported value range.
+ *
+ * @param propIdAreaIds The list of [propId, areaId]s whose supported
+ * value range changes.
+ */
+ oneway void onSupportedValueChange(in List<PropIdAreaId> propIdAreaIds);
}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/MinMaxSupportedValueResult.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/MinMaxSupportedValueResult.aidl
new file mode 100644
index 0000000..f85ad3a
--- /dev/null
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/MinMaxSupportedValueResult.aidl
@@ -0,0 +1,48 @@
+/*
+ * 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.automotive.vehicle;
+
+import android.hardware.automotive.vehicle.RawPropValues;
+import android.hardware.automotive.vehicle.StatusCode;
+
+/**
+ * One result returned from {@code getMinMaxSupportedValue} for one request.
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+@RustDerive(Clone=true)
+parcelable MinMaxSupportedValueResult {
+ /**
+ * The status for result. If this is not OK, the operation failed for this
+ * [propId, areaId].
+ */
+ StatusCode status = StatusCode.OK;
+ /**
+ * The min supported value.
+ *
+ * If the [propId, areaId] does not specify a min supported value, this
+ * is {@code null}.
+ */
+ @nullable RawPropValues minSupportedValue;
+ /**
+ * The max supported value.
+ *
+ * If the [propId, areaId] does not specify a max supported value, this
+ * is {@code null}.
+ */
+ @nullable RawPropValues maxSupportedValue;
+}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/MinMaxSupportedValueResults.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/MinMaxSupportedValueResults.aidl
new file mode 100644
index 0000000..3579979
--- /dev/null
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/MinMaxSupportedValueResults.aidl
@@ -0,0 +1,55 @@
+/*
+ * 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.automotive.vehicle;
+
+import android.hardware.automotive.vehicle.MinMaxSupportedValueResult;
+import android.os.ParcelFileDescriptor;
+
+/**
+ * The result structure for {@code getMinMaxSupportedValue}.
+ *
+ * Contains a list of results, one for each [propId, areaId] request. The
+ * list must contain the same number of result as the {@code propIdAreaIds}.
+ * The result must be in the same order, e.g. the first result is for the first
+ * [propId, areaId].
+ *
+ * Java Client should use
+ * {@link LargeParcelable.reconstructStableAIDLParcelable} to convert this back
+ * to a regular parcelable and then use the converted parcelable's
+ * {@code payloads} field.
+ *
+ * Native client should use
+ * {@link LargeParcelable::stableLargeParcelableToParcelable}.
+ *
+ * VHAL implementation must store the results into {@link payloads} field and
+ * use {@link LargeParcelable::parcelableToStableLargeParcelable} before
+ * sending the converted large parcelable through binder.
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable MinMaxSupportedValueResults {
+ /**
+ * The list of responses if they fit the binder memory limitation.
+ */
+ MinMaxSupportedValueResult[] payloads;
+ /**
+ * Shared memory file to store responses if they exceed binder memory
+ * limitation. Created by VHAL, readable only for the client.
+ * The client must close it after reading.
+ */
+ @nullable ParcelFileDescriptor sharedMemoryFd;
+}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/PropIdAreaId.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/PropIdAreaId.aidl
new file mode 100644
index 0000000..ea47350
--- /dev/null
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/PropIdAreaId.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.automotive.vehicle;
+
+import android.hardware.automotive.vehicle.RawPropValues;
+
+/**
+ * A structure containing one propertyId and one areaId.
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+@RustDerive(Clone=true)
+parcelable PropIdAreaId {
+ /** The property Id. */
+ int propId;
+ /** The area Id. */
+ int areaId;
+}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SupportedValuesListResult.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SupportedValuesListResult.aidl
new file mode 100644
index 0000000..4524f4f
--- /dev/null
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SupportedValuesListResult.aidl
@@ -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 android.hardware.automotive.vehicle;
+
+import android.hardware.automotive.vehicle.RawPropValues;
+import android.hardware.automotive.vehicle.StatusCode;
+
+/**
+ * One result returned from {@code getSupportedValuesLists} for one request.
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+@RustDerive(Clone=true)
+parcelable SupportedValuesListResult {
+ /**
+ * The status for result. If this is not OK, the operation failed for this
+ * [propId, areaId].
+ */
+ StatusCode status = StatusCode.OK;
+ /**
+ * The supported values list.
+ *
+ * If the [propId, areaId] does not specify a supported values list, this
+ * is {@code null}.
+ */
+ @nullable List<RawPropValues> supportedValuesList;
+}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SupportedValuesListResults.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SupportedValuesListResults.aidl
new file mode 100644
index 0000000..da84871
--- /dev/null
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SupportedValuesListResults.aidl
@@ -0,0 +1,55 @@
+/*
+ * 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.automotive.vehicle;
+
+import android.hardware.automotive.vehicle.SupportedValuesListResult;
+import android.os.ParcelFileDescriptor;
+
+/**
+ * The result structure for {@code getSupportedValuesLists}.
+ *
+ * Contains a list of results, one for each [propId, areaId] request. The
+ * list must contain the same number of result as the {@code propIdAreaIds}.
+ * The result must be in the same order, e.g. the first result is for the first
+ * [propId, areaId].
+ *
+ * Java Client should use
+ * {@link LargeParcelable.reconstructStableAIDLParcelable} to convert this back
+ * to a regular parcelable and then use the converted parcelable's
+ * {@code payloads} field.
+ *
+ * Native client should use
+ * {@link LargeParcelable::stableLargeParcelableToParcelable}.
+ *
+ * VHAL implementation must store the results into {@link payloads} field and
+ * use {@link LargeParcelable::parcelableToStableLargeParcelable} before
+ * sending the converted large parcelable through binder.
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable SupportedValuesListResults {
+ /**
+ * The list of responses if they fit the binder memory limitation.
+ */
+ SupportedValuesListResult[] payloads;
+ /**
+ * Shared memory file to store responses if they exceed binder memory
+ * limitation. Created by VHAL, readable only for the client.
+ * The client must close it after reading.
+ */
+ @nullable ParcelFileDescriptor sharedMemoryFd;
+}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ValueRange.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ValueRange.aidl
new file mode 100644
index 0000000..816a6a8
--- /dev/null
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ValueRange.aidl
@@ -0,0 +1,55 @@
+/*
+ * 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.automotive.vehicle;
+
+import android.hardware.automotive.vehicle.RawPropValues;
+
+/**
+ * Represents the value range for a vehicle property.
+ *
+ * This applies for the values read from VHAL and the values sent to VHAL.
+ *
+ * If the value range differs, this is the super set.
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+@RustDerive(Clone=true)
+parcelable ValueRange {
+ /**
+ * The currently specified minimum value for the property.
+ *
+ * {@code null} if not specified.
+ */
+ @nullable RawPropValues minValue;
+
+ /**
+ * The currently specified maximum value for the property.
+ *
+ * {@code null} if not specified.
+ */
+ @nullable RawPropValues maxValue;
+
+ /**
+ * The currently specified supported values for the property.
+ *
+ * If the value type is int32, int64 or float, the returned list must be
+ * sorted in ascending order.
+ *
+ * {@code null} if not specified.
+ */
+ @nullable List<RawPropValues> supportedValues;
+}
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl
index 9387965..70a5566 100644
--- a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl
@@ -16,6 +16,7 @@
package android.hardware.automotive.vehicle;
+import android.hardware.automotive.vehicle.HasSupportedValueInfo;
import android.hardware.automotive.vehicle.VehiclePropertyAccess;
@VintfStability
@@ -83,6 +84,8 @@
/**
* Whether variable update rate is supported.
*
+ * This is always {@code false} for VHAL implementation < V3.
+ *
* This applies for continuous property only.
*
* It is HIGHLY RECOMMENDED to support variable update rate for all non-heartbeat continuous
@@ -109,4 +112,12 @@
* so this should be false if the property is large (e.g. a byte array of 1k in size).
*/
boolean supportVariableUpdateRate;
+
+ /**
+ * For VHAL implementation >= V4, this must not be {@code null}. This specifies whether
+ * this property may have min/max supported value or supported values list.
+ *
+ * For VHAL implementation < V4, this is always {@code null} and is not accessed.
+ */
+ @nullable HasSupportedValueInfo hasSupportedValueInfo;
}
diff --git a/automotive/vehicle/aidl/impl/vhal/test/DefaultVehicleHalTest.cpp b/automotive/vehicle/aidl/impl/vhal/test/DefaultVehicleHalTest.cpp
index 4891bf5..ad34a4c 100644
--- a/automotive/vehicle/aidl/impl/vhal/test/DefaultVehicleHalTest.cpp
+++ b/automotive/vehicle/aidl/impl/vhal/test/DefaultVehicleHalTest.cpp
@@ -1849,6 +1849,12 @@
std::this_thread::sleep_for(std::chrono::seconds(3));
auto maybeResults = getCallback()->nextOnPropertyEventResults();
+ size_t retryCount = 0;
+ // Add a 1s (100ms * 10) buffer time.
+ while (!maybeResults.has_value() && retryCount < 10) {
+ retryCount++;
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ }
ASSERT_TRUE(maybeResults.has_value()) << "no results in callback";
ASSERT_EQ(maybeResults.value().payloads.size(), static_cast<size_t>(1));
VehiclePropValue gotValue = maybeResults.value().payloads[0];
diff --git a/automotive/vehicle/tools/translate_aidl_enums.py b/automotive/vehicle/tools/translate_aidl_enums.py
index a7c1808..53afef3 100644
--- a/automotive/vehicle/tools/translate_aidl_enums.py
+++ b/automotive/vehicle/tools/translate_aidl_enums.py
@@ -21,14 +21,16 @@
ENUM_NAMETest.java files in cts/tests/tests/car/src/android/car/cts and
packages/services/Car/tests/android_car_api_test/src/android/car/apitest
+ Also needs a flag name e.g. FLAG_ANDROID_VIC_VEHICLE_PROPERTIES
+
Usage:
- $ python translate_aidl_enums.py ENUM_NAME.aidl
+ $ python translate_aidl_enums.py ENUM_NAME.aidl FLAG_NAME
"""
import os
import sys
LICENSE = """/*
- * Copyright (C) 2023 The Android Open Source Project
+ * 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.
@@ -45,15 +47,20 @@
"""
class EnumParser:
- def __init__(self, file_path, file_name):
+ def __init__(self, file_path, file_name, flag_name):
self.filePath = file_path
self.fileName = file_name
+ self.flagName = flag_name
self.lowerFileName = self.fileName[0].lower() + self.fileName[1:]
+ self.enumNames = []
self.enums = []
self.outputMsg = []
self.outputMsg.append(LICENSE)
self.outputMsg.append("\npackage android.car.hardware.property;\n")
self.outputMsg.append("""
+import static android.car.feature.Flags.{};
+
+import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -61,26 +68,61 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-""")
+""".format(self.flagName))
+
+ comment_block = []
+ in_comment = False
with open(self.filePath, 'r') as f:
- for line in f.readlines()[16:]:
- if line in ["package android.hardware.automotive.vehicle;\n",
- "@VintfStability\n",
- '@Backing(type="int")\n']:
+ lines = f.readlines()
+ for line in lines:
+ line = line.rstrip('\n')
+ if line.strip() in ["package android.hardware.automotive.vehicle;",
+ "@VintfStability",
+ '@Backing(type="int")']:
continue
- msg = line
+ if line.strip().startswith('/**') or line.strip().startswith('/*'):
+ in_comment = True
+ comment_block.append(line + '\n')
+ continue
+ elif in_comment:
+ comment_block.append(line + '\n')
+ if line.strip().endswith('*/'):
+ in_comment = False
+ continue
+ elif line.strip().startswith('*'):
+ comment_block.append(line + '\n')
+ continue
+
+ msg = line + '\n'
msgSplit = msg.strip().split()
if len(msgSplit) > 0 and msgSplit[0] == "enum":
+ if comment_block:
+ self.outputMsg.extend(comment_block)
+ comment_block = []
+ self.outputMsg.append("@FlaggedApi({})\n".format(self.flagName))
msgSplit[0] = "public final class"
msg = " ".join(msgSplit) + "\n"
+ self.outputMsg.append(msg)
elif len(msgSplit) > 1 and msgSplit[1] == '=':
+ if comment_block:
+ indented_comment_block = [line for line in comment_block]
+ self.outputMsg.extend(indented_comment_block)
+ comment_block = []
msgSplit.insert(0, " public static final int")
- self.enums.append(msgSplit[1])
- msgSplit[-1] = msgSplit[-1][:-1] + ";\n"
- msg = " ".join(msgSplit)
- elif msg == "}\n":
+ enum_name = msgSplit[1].strip()
+ self.enumNames.append(enum_name)
+ enum = msgSplit[3].strip(",")
+ self.enums.append(enum)
+ if msgSplit[-1].endswith(','):
+ msgSplit[-1] = msgSplit[-1][:-1] + ";"
+ msg = " ".join(msgSplit) + "\n"
+ self.outputMsg.append(msg)
+ elif line.strip() == '}':
+ if comment_block:
+ self.outputMsg.extend(comment_block)
+ comment_block = []
self.outputMsg.append("""
private {2}() {{}}
@@ -101,17 +143,23 @@
@Retention(RetentionPolicy.SOURCE)
public @interface {2}Int {{}}\n""".format(self.lowerFileName, "{" + ", ".join(self.enums) + "}",
self.fileName))
- self.outputMsg.append(msg)
- self.outputMsg.append("TODO: delete this line and manually update this file with app-facing documentation and necessary tags.\n")
+ self.outputMsg.append("}")
self.outputMsgApiTest = []
self.outputMsgApiTest.append(LICENSE)
self.outputMsgApiTest.append("""package android.car.apitest;
+import static android.car.feature.Flags.{1};
+
import static com.google.common.truth.Truth.assertWithMessage;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
import androidx.test.filters.SmallTest;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -122,6 +170,8 @@
@SmallTest
@RunWith(Parameterized.class)
public class {0}Test {{
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
private final int mJavaConstantValue;
private final int mHalConstantValue;
@@ -133,56 +183,68 @@
@Parameterized.Parameters
public static Collection constantValues() {{
return Arrays.asList(
- new Object[][] {{""".format(self.fileName))
- for enum in self.enums:
+ new Object[][] {{""".format(self.fileName, self.flagName))
+ for enum in self.enumNames:
self.outputMsgApiTest.append("""
{{
android.car.hardware.property.{0}.{1},
android.hardware.automotive.vehicle.{0}.{1}
}},""".format(self.fileName, enum))
self.outputMsgApiTest.append("""
- });
- }
+ }});
+ }}
@Test
- public void testMatchWithVehicleHal() {
+ @RequiresFlagsEnabled({})
+ public void testMatchWithVehicleHal() {{
assertWithMessage("Java constant")
.that(mJavaConstantValue)
.isEqualTo(mHalConstantValue);
- }
-}
-""")
+ }}
+}}
+""".format(self.flagName))
self.outputMsgCtsTest = []
self.outputMsgCtsTest.append(LICENSE)
self.outputMsgCtsTest.append("""
package android.car.cts;
+import static android.car.feature.Flags.{1};
+
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import android.car.cts.utils.VehiclePropertyUtils;
import android.car.hardware.property.{0};
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import org.junit.Rule;
import org.junit.Test;
import java.util.List;
public class {0}Test {{
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@Test
- public void testToString() {{""".format(self.fileName))
- for enum in self.enums:
+ @RequiresFlagsEnabled({1})
+ public void testToString() {{""".format(self.fileName, self.flagName))
+ for enum in self.enumNames:
self.outputMsgCtsTest.append("""
assertThat({0}.toString(
{0}.{1}))
.isEqualTo("{1}");""".format(self.fileName, enum))
+ max_enum_value = len(self.enums)
self.outputMsgCtsTest.append("""
assertThat({0}.toString({1})).isEqualTo("{2}");
assertThat({0}.toString(12)).isEqualTo("0xc");
}}
@Test
+ @RequiresFlagsEnabled({4})
public void testAll{0}sAreMappedInToString() {{
List<Integer> {3}s =
VehiclePropertyUtils.getIntegersFromDataEnums({0}.class);
@@ -194,11 +256,11 @@
}}
}}
}}
-""".format(self.fileName, len(self.enums), hex(len(self.enums)), self.lowerFileName))
+""".format(self.fileName, len(self.enums), hex(len(self.enums)), self.lowerFileName, self.flagName))
def main():
- if len(sys.argv) != 2:
- print("Usage: {} enum_aidl_file".format(sys.argv[0]))
+ if len(sys.argv) != 3:
+ print("Usage: {} enum_aidl_file ALL_CAPS_FLAG_NAME".format(sys.argv[0]))
sys.exit(1)
print("WARNING: This file only generates the base enum values in the framework layer. The "
+ "generated files must be reviewed by you and edited if any additional changes are "
@@ -207,12 +269,14 @@
+ "the new property is system API")
file_path = sys.argv[1]
file_name = file_path.split('/')[-1][:-5]
- parser = EnumParser(file_path, file_name)
+ flag_name = sys.argv[2]
+ parser = EnumParser(file_path, file_name, flag_name)
android_top = os.environ['ANDROID_BUILD_TOP']
if not android_top:
print('ANDROID_BUILD_TOP is not in environmental variable, please run source and lunch '
+ 'at the android root')
+ sys.exit(1)
with open(android_top + "/packages/services/Car/car-lib/src/android/car/hardware/property/"
+ file_name + ".java", 'w') as f:
diff --git a/broadcastradio/aidl/Android.bp b/broadcastradio/aidl/Android.bp
index 82ee949..081bae3 100644
--- a/broadcastradio/aidl/Android.bp
+++ b/broadcastradio/aidl/Android.bp
@@ -51,12 +51,12 @@
},
],
- frozen: true,
+ frozen: false,
}
// Note: This should always be one version ahead of the last frozen version
-latest_android_hardware_broadcastradio = "android.hardware.broadcastradio-V2"
+latest_android_hardware_broadcastradio = "android.hardware.broadcastradio-V3"
cc_defaults {
name: "latest_android_hardware_broadcastradio_ndk_static",
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Alert.aidl
similarity index 84%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Alert.aidl
index a5eda52..7e02f70 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Alert.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable Alert {
+ android.hardware.broadcastradio.AlertStatus status;
+ android.hardware.broadcastradio.AlertMessageType messageType;
+ android.hardware.broadcastradio.AlertInfo[] infoArray;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertArea.aidl
similarity index 87%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertArea.aidl
index a5eda52..aa828d0 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertArea.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AlertArea {
+ android.hardware.broadcastradio.Polygon[] polygons;
+ android.hardware.broadcastradio.Geocode[] geocodes;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertCategory.aidl
similarity index 86%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertCategory.aidl
index a5eda52..f493e75 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertCategory.aidl
@@ -31,9 +31,19 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@Backing(type="int") @JavaDerive(equals=true, toString=true) @VintfStability
+enum AlertCategory {
+ GEO,
+ MET,
+ SAFETY,
+ SECURITY,
+ RESCUE,
+ FIRE,
+ HEALTH,
+ ENV,
+ TRANSPORT,
+ INFRA,
+ CBRNE,
+ OTHER,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertCertainty.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertCertainty.aidl
index a5eda52..dcf283a 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertCertainty.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@Backing(type="int") @JavaDerive(equals=true, toString=true) @VintfStability
+enum AlertCertainty {
+ OBSERVED,
+ LIKELY,
+ POSSIBLE,
+ UNLIKELY,
+ UNKNOWN,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertInfo.aidl
similarity index 77%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertInfo.aidl
index a5eda52..da08c9a 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertInfo.aidl
@@ -31,9 +31,14 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AlertInfo {
+ android.hardware.broadcastradio.AlertCategory[] categoryArray;
+ android.hardware.broadcastradio.AlertUrgency urgency;
+ android.hardware.broadcastradio.AlertSeverity severity;
+ android.hardware.broadcastradio.AlertCertainty certainty;
+ String description;
+ android.hardware.broadcastradio.AlertArea[] areas;
+ @nullable String language;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertMessageType.aidl
similarity index 90%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertMessageType.aidl
index a5eda52..2b89c92 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertMessageType.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@Backing(type="int") @JavaDerive(equals=true, toString=true) @VintfStability
+enum AlertMessageType {
+ ALERT,
+ UPDATE,
+ CANCEL,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertSeverity.aidl
similarity index 89%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertSeverity.aidl
index a5eda52..5c91abd 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertSeverity.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@Backing(type="int") @JavaDerive(equals=true, toString=true) @VintfStability
+enum AlertSeverity {
+ EXTREME,
+ SEVERE,
+ MODERATE,
+ MINOR,
+ UNKNOWN,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertStatus.aidl
similarity index 90%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertStatus.aidl
index a5eda52..8ce69b5 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertStatus.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@Backing(type="int") @JavaDerive(equals=true, toString=true) @VintfStability
+enum AlertStatus {
+ ACTUAL,
+ EXERCISE,
+ TEST,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertUrgency.aidl
similarity index 89%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertUrgency.aidl
index a5eda52..fd0491d 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/AlertUrgency.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@Backing(type="int") @JavaDerive(equals=true, toString=true) @VintfStability
+enum AlertUrgency {
+ IMMEDIATE,
+ EXPECTED,
+ FUTURE,
+ PAST,
+ UNKNOWN,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Coordinate.aidl
similarity index 90%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Coordinate.aidl
index a5eda52..b303986 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Coordinate.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable Coordinate {
+ double latitude;
+ double longitude;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Geocode.aidl
similarity index 90%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Geocode.aidl
index a5eda52..a07e1c0 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Geocode.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable Geocode {
+ String valueName;
+ String value;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Polygon.aidl
similarity index 89%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Polygon.aidl
index a5eda52..4d4d78d 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/Polygon.aidl
@@ -31,9 +31,8 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.broadcastradio;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable Polygon {
+ android.hardware.broadcastradio.Coordinate[] coordinates;
}
diff --git a/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/ProgramInfo.aidl b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/ProgramInfo.aidl
index 997cdd7..dd57901 100644
--- a/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/ProgramInfo.aidl
+++ b/broadcastradio/aidl/aidl_api/android.hardware.broadcastradio/current/android/hardware/broadcastradio/ProgramInfo.aidl
@@ -42,6 +42,7 @@
int signalQuality;
android.hardware.broadcastradio.Metadata[] metadata;
android.hardware.broadcastradio.VendorKeyValue[] vendorInfo;
+ @nullable android.hardware.broadcastradio.Alert emergencyAlert;
const int FLAG_LIVE = (1 << 0) /* 1 */;
const int FLAG_MUTED = (1 << 1) /* 2 */;
const int FLAG_TRAFFIC_PROGRAM = (1 << 2) /* 4 */;
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/Alert.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/Alert.aidl
new file mode 100644
index 0000000..a307ccc
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/Alert.aidl
@@ -0,0 +1,46 @@
+/*
+ * 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.broadcastradio;
+
+import android.hardware.broadcastradio.AlertInfo;
+import android.hardware.broadcastradio.AlertMessageType;
+import android.hardware.broadcastradio.AlertStatus;
+
+/**
+ * Emergency Alert Message.
+ *
+ * <p>Alert message can be sent from a radio station of technologies such as HD radio to
+ * the radio users for some emergency events (see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable Alert {
+ /**
+ * The status of the alert message.
+ */
+ AlertStatus status;
+
+ /**
+ * The message type of the alert message.
+ */
+ AlertMessageType messageType;
+
+ /**
+ * Array of alert information.
+ */
+ AlertInfo[] infoArray;
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/AlertArea.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/AlertArea.aidl
new file mode 100644
index 0000000..b3f07b3
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/AlertArea.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.broadcastradio;
+
+import android.hardware.broadcastradio.Geocode;
+import android.hardware.broadcastradio.Polygon;
+
+/**
+ * The geographic area that delineates the affected area of the alert message
+ *
+ * <p>(see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable AlertArea {
+ /**
+ * Polygons that delineate the affected area of the alert message.
+ */
+ Polygon[] polygons;
+
+ /**
+ * Geographic code delineating the affected area of the alert message.
+ */
+ Geocode[] geocodes;
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/AlertCategory.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/AlertCategory.aidl
new file mode 100644
index 0000000..a24361a
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/AlertCategory.aidl
@@ -0,0 +1,88 @@
+/*
+ * 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.broadcastradio;
+
+/**
+ * The category of the subject event of the emergency alert message.
+ *
+ * <p>(see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@Backing(type="int")
+@JavaDerive(equals=true, toString=true)
+enum AlertCategory {
+ /**
+ * Alert category related to geophysical (inc. landslide).
+ */
+ GEO,
+
+ /**
+ * Alert category related to meteorological (inc. flood).
+ */
+ MET,
+
+ /**
+ * Alert category related to general emergency and public safety.
+ */
+ SAFETY,
+
+ /**
+ * Alert category related to law enforcement, military, homeland and local/private security.
+ */
+ SECURITY,
+
+ /**
+ * Alert category related to rescue and recovery.
+ */
+ RESCUE,
+
+ /**
+ * Alert category related to fire suppression and rescue.
+ */
+ FIRE,
+
+ /**
+ * Alert category related to medical and public health.
+ */
+ HEALTH,
+
+ /**
+ * Alert category related to pollution and other environmental.
+ */
+ ENV,
+
+ /**
+ * Alert category related to public and private transportation.
+ */
+ TRANSPORT,
+
+ /**
+ * Utility, telecommunication, other non-transport infrastructure.
+ */
+ INFRA,
+
+ /**
+ * Alert category related to chemical, biological, radiological, nuclear or high-yield
+ * explosive threat or attack.
+ */
+ CBRNE,
+
+ /**
+ * Alert category related to other events.
+ */
+ OTHER,
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/AlertCertainty.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/AlertCertainty.aidl
new file mode 100644
index 0000000..11f069e
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/AlertCertainty.aidl
@@ -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.
+ */
+
+package android.hardware.broadcastradio;
+
+/**
+ * The certainty of the subject event of the emergency alert message
+ *
+ * <p>(see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@Backing(type="int")
+@JavaDerive(equals=true, toString=true)
+enum AlertCertainty {
+ /**
+ * Certainty indicating that the event is determined to have occurred or to be ongoing.
+ */
+ OBSERVED,
+
+ /**
+ * Certainty indicating that the event is likely (probability > ~50%).
+ */
+ LIKELY,
+
+ /**
+ * Certainty indicating that the event is possible but not likely (probability <= ~50%).
+ */
+ POSSIBLE,
+
+ /**
+ * Certainty indicating that the event is not expected to occur (probability ~ 0).
+ */
+ UNLIKELY,
+
+ /**
+ * Unknown certainty.
+ */
+ UNKNOWN,
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/AlertInfo.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/AlertInfo.aidl
new file mode 100644
index 0000000..ab2e6f7
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/AlertInfo.aidl
@@ -0,0 +1,77 @@
+/*
+ * 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.broadcastradio;
+
+import android.hardware.broadcastradio.AlertArea;
+import android.hardware.broadcastradio.AlertCategory;
+import android.hardware.broadcastradio.AlertCertainty;
+import android.hardware.broadcastradio.AlertSeverity;
+import android.hardware.broadcastradio.AlertUrgency;
+
+/**
+ * Alert information.
+ *
+ * <p>(see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable AlertInfo {
+ /**
+ * Array of categories of the subject event of the alert info.
+ *
+ * <p>According to ITU-T X.1303, a single alert info block may contains multiple categories.
+ */
+ AlertCategory[] categoryArray;
+
+ /**
+ * The urgency of the subject event of the alert info.
+ *
+ * <p>Urgency represents the time available to prepare for the alert.
+ */
+ AlertUrgency urgency;
+
+ /**
+ * The severity of the subject event of the alert info.
+ *
+ * <p>Severity represents the intensity of impact.
+ */
+ AlertSeverity severity;
+
+ /**
+ * The certainty of the subject event of the alert info.
+ *
+ * <p>Certainty represents confidence in the observation or prediction.
+ */
+ AlertCertainty certainty;
+
+ /**
+ * Textual descriptions of the subject event.
+ */
+ String description;
+
+ /**
+ * The array of geographic areas to which the alert info segment in which it appears applies.
+ */
+ AlertArea[] areas;
+
+ /**
+ * The IETF RFC 3066 language code donating the language of the alert message.
+ *
+ * <p>This field is optional.
+ */
+ @nullable String language;
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/AlertMessageType.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/AlertMessageType.aidl
new file mode 100644
index 0000000..1dd4e2b
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/AlertMessageType.aidl
@@ -0,0 +1,43 @@
+/*
+ * 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.broadcastradio;
+
+/**
+ * The emergency alert message type
+ *
+ * <p>The message type indicates the emergency alert message nature.
+ * (see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@Backing(type="int")
+@JavaDerive(equals=true, toString=true)
+enum AlertMessageType {
+ /**
+ * Initial information requiring attention by targeted recipients.
+ */
+ ALERT,
+
+ /**
+ * Updates and supersedes the earlier message(s).
+ */
+ UPDATE,
+
+ /**
+ * Cancels the earlier message(s).
+ */
+ CANCEL,
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/AlertSeverity.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/AlertSeverity.aidl
new file mode 100644
index 0000000..acc11c4
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/AlertSeverity.aidl
@@ -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.
+ */
+
+package android.hardware.broadcastradio;
+
+/**
+ * The severity of the subject event of the emergency alert message
+ *
+ * <p>(see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@Backing(type="int")
+@JavaDerive(equals=true, toString=true)
+enum AlertSeverity {
+ /**
+ * Severity indicating extraordinary threat to life or property.
+ */
+ EXTREME,
+
+ /**
+ * Severity indicating significant threat to life or property.
+ */
+ SEVERE,
+
+ /**
+ * Severity indicating possible threat to life or property.
+ */
+ MODERATE,
+
+ /**
+ * Severity indicating minimal to no known threat to life or property.
+ */
+ MINOR,
+
+ /**
+ * Unknown severity.
+ */
+ UNKNOWN,
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/AlertStatus.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/AlertStatus.aidl
new file mode 100644
index 0000000..8b0c917
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/AlertStatus.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.broadcastradio;
+
+/**
+ * The status of the alert message
+ *
+ * <p>Status is the appropriate handling of the alert message (see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@Backing(type="int")
+@JavaDerive(equals=true, toString=true)
+enum AlertStatus {
+ /**
+ * Actionable by all targeted recipients.
+ */
+ ACTUAL,
+
+ /**
+ * Actionable only by designated exercise participants.
+ */
+ EXERCISE,
+
+ /**
+ * Technical testing only, all recipients disregard.
+ */
+ TEST,
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/AlertUrgency.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/AlertUrgency.aidl
new file mode 100644
index 0000000..a0ef4a9
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/AlertUrgency.aidl
@@ -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.
+ */
+
+package android.hardware.broadcastradio;
+
+/**
+ * The severity of the subject event of the emergency alert message.
+ *
+ * <p>(see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@Backing(type="int")
+@JavaDerive(equals=true, toString=true)
+enum AlertUrgency {
+ /**
+ * Urgency indicating that responsive action should be taken immediately.
+ */
+ IMMEDIATE,
+
+ /**
+ * Urgency indicating that responsive action should be taken soon.
+ */
+ EXPECTED,
+
+ /**
+ * Urgency indicating that responsive action should be taken in the near future.
+ */
+ FUTURE,
+
+ /**
+ * Urgency indicating that responsive action is no longer required.
+ */
+ PAST,
+
+ /**
+ * Unknown rgency.
+ */
+ UNKNOWN,
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/Coordinate.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/Coordinate.aidl
new file mode 100644
index 0000000..b881534
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/Coordinate.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.
+ */
+
+package android.hardware.broadcastradio;
+
+/**
+ * Coordinate reprensenting the geographic location in alert message
+ *
+ * <p>(see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable Coordinate {
+ /**
+ * Latitude of the cooridinate.
+ *
+ * <p>Latitude is in the range of -90 to 90.
+ */
+ double latitude;
+
+ /**
+ * Longitude of the cooridinate.
+ *
+ * <p>Longitude is in the range of -90 to 90.
+ */
+ double longitude;
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/Geocode.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/Geocode.aidl
new file mode 100644
index 0000000..f0162ca
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/Geocode.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.broadcastradio;
+
+/**
+ * Geographic code reprensenting location in alert message
+ *
+ * <p>(see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable Geocode {
+ /**
+ * Value name of a geographic code.
+ *
+ * <p>Value name are acronyms should be represented in all capital
+ * letters without periods (e.g., SAME, FIPS, ZIP).
+ */
+ String valueName;
+
+ /**
+ * Value of a geographic code.
+ */
+ String value;
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/Polygon.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/Polygon.aidl
new file mode 100644
index 0000000..12bd2cd
--- /dev/null
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/Polygon.aidl
@@ -0,0 +1,36 @@
+/*
+ * 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.broadcastradio;
+
+import android.hardware.broadcastradio.Coordinate;
+
+/**
+ * The array of coordinates defining a polygon
+ *
+ * <p>(see ITU-T X.1303 bis for more info).
+ */
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable Polygon {
+ /**
+ * Cooridinates of points defining a polygon.
+ *
+ * <p>A minimum of 4 coordinates MUST be present and the first and last
+ * coordinates must be the same. See WGS 84 for more information.
+ */
+ Coordinate[] coordinates;
+}
diff --git a/broadcastradio/aidl/android/hardware/broadcastradio/ProgramInfo.aidl b/broadcastradio/aidl/android/hardware/broadcastradio/ProgramInfo.aidl
index d4ccd01..0b5abe2 100644
--- a/broadcastradio/aidl/android/hardware/broadcastradio/ProgramInfo.aidl
+++ b/broadcastradio/aidl/android/hardware/broadcastradio/ProgramInfo.aidl
@@ -16,6 +16,7 @@
package android.hardware.broadcastradio;
+import android.hardware.broadcastradio.Alert;
import android.hardware.broadcastradio.Metadata;
import android.hardware.broadcastradio.ProgramIdentifier;
import android.hardware.broadcastradio.ProgramSelector;
@@ -192,4 +193,12 @@
* for example: paid-service=true; bitrate=320kbps.
*/
VendorKeyValue[] vendorInfo;
+
+ /**
+ * Emergency alert message.
+ *
+ * <p>Alert message can be sent from a radio station of technologies such as HD radio to
+ * the radio users for some emergency events.
+ */
+ @nullable Alert emergencyAlert;
}
diff --git a/broadcastradio/aidl/default/BroadcastRadio.cpp b/broadcastradio/aidl/default/BroadcastRadio.cpp
index 4d6d81d..015cae0 100644
--- a/broadcastradio/aidl/default/BroadcastRadio.cpp
+++ b/broadcastradio/aidl/default/BroadcastRadio.cpp
@@ -17,11 +17,9 @@
#include "BroadcastRadio.h"
#include <broadcastradio-utils-aidl/Utils.h>
#include <broadcastradio-utils-aidl/UtilsV2.h>
+#include <broadcastradio-utils-aidl/UtilsV3.h>
#include "resources.h"
-#include <aidl/android/hardware/broadcastradio/IdentifierType.h>
-#include <aidl/android/hardware/broadcastradio/Result.h>
-
#include <android-base/logging.h>
#include <android-base/strings.h>
@@ -47,6 +45,8 @@
inline constexpr std::chrono::milliseconds kTuneDelayTimeMs = 150ms;
inline constexpr std::chrono::seconds kListDelayTimeS = 1s;
+const string kAlertAreaDelimiter = "+";
+const string kAlertCoordinateGeocodeDelimiter = ",";
// clang-format off
const AmFmBandRange kFmFullBandRange = {65000, 108000, 10, 0};
const AmFmBandRange kAmFullBandRange = {150, 30000, 1, 0};
@@ -142,6 +142,30 @@
return info;
}
+static Alert createSampleAlert() {
+ Polygon polygon = {{{-38.47, -120.14},
+ {38.34, -119.95},
+ {38.52, -119.74},
+ {38.62, -119.89},
+ {-38.47, -120.14}}};
+ AlertArea alertArea1 = {{polygon}, {{"SAME", "006109"}, {"SAME", "006209"}}};
+ AlertArea alertArea2 = {{}, {{"SAME", "006009"}}};
+ AlertInfo alertInfo;
+ alertInfo.categoryArray = {AlertCategory::GEO, AlertCategory::TRANSPORT};
+ alertInfo.urgency = AlertUrgency::FUTURE;
+ alertInfo.severity = AlertSeverity::SEVERE;
+ alertInfo.certainty = AlertCertainty::POSSIBLE;
+ alertInfo.description = "Sample radio alert.";
+ alertInfo.language = "en-US";
+ alertInfo.areas.push_back(alertArea1);
+ alertInfo.areas.push_back(alertArea2);
+ Alert alert;
+ alert.status = AlertStatus::ACTUAL;
+ alert.messageType = AlertMessageType::ALERT;
+ alert.infoArray.push_back(alertInfo);
+ return alert;
+}
+
static bool checkDumpCallerHasWritePermissions(int fd) {
uid_t uid = AIBinder_getCallingUid();
if (uid == AID_ROOT || uid == AID_SHELL || uid == AID_SYSTEM) {
@@ -151,6 +175,87 @@
return false;
}
+static bool parseGeocode(int fd, const string& geocodeString, Geocode& parsedGeocode) {
+ vector<string> geocodeStringPair =
+ ::android::base::Split(geocodeString, kAlertCoordinateGeocodeDelimiter);
+ if (geocodeStringPair.size() != 2) {
+ dprintf(fd, "Geocode is not of \"VALUE_NAME,VALUE\" format: %s\n", geocodeString.c_str());
+ return false;
+ }
+ parsedGeocode.valueName = geocodeStringPair[0];
+ parsedGeocode.value = geocodeStringPair[1];
+ return true;
+}
+
+static bool parsePolygon(int fd, const string& polygonString, Polygon& parsedPolygon) {
+ vector<Coordinate> coordinates;
+ vector<string> coordinateStrings =
+ ::android::base::Split(polygonString, kAlertCoordinateGeocodeDelimiter);
+ if (coordinateStrings.size() % 2) {
+ dprintf(fd, "Incomplete \"LATITUDE,LONGITUDE\" coordinate pairs separated by \",\": %s\n",
+ polygonString.c_str());
+ return false;
+ }
+ for (size_t i = 0; i < coordinateStrings.size(); i += 2) {
+ double latitude;
+ double longitude;
+ if (!utils::parseArgDouble(coordinateStrings[i], &latitude) ||
+ !utils::parseArgDouble(coordinateStrings[i + 1], &longitude)) {
+ dprintf(fd, "Value of \"LATITUDE,LONGITUDE\" coordinate pair is not double-type: %s\n",
+ coordinateStrings[i].c_str());
+ return false;
+ }
+ coordinates.push_back(Coordinate(latitude, longitude));
+ }
+ parsedPolygon.coordinates = coordinates;
+ return true;
+}
+
+static bool parseAreaString(int fd, const string& areaString, AlertArea& parsedAlertArea) {
+ vector<string> areaEntryStrings = ::android::base::Split(areaString, "_");
+ for (const auto& areaEntryString : areaEntryStrings) {
+ vector<string> areaTypeValuePair = ::android::base::Split(areaEntryString, ":");
+ if (areaTypeValuePair.size() != 2) {
+ dprintf(fd, "Area is not of \"<TYPE>:<VALUE>\" format: %s\n", areaEntryString.c_str());
+ return false;
+ }
+ if (EqualsIgnoreCase(areaTypeValuePair[0], "polygon")) {
+ Polygon parsedPolygon;
+ if (!parsePolygon(fd, areaTypeValuePair[1], parsedPolygon)) {
+ return false;
+ }
+ parsedAlertArea.polygons.push_back(parsedPolygon);
+ } else if (EqualsIgnoreCase(areaTypeValuePair[0], "geocode")) {
+ Geocode parsedGeocode;
+ if (!parseGeocode(fd, areaTypeValuePair[1], parsedGeocode)) {
+ return false;
+ }
+ parsedAlertArea.geocodes.push_back(parsedGeocode);
+ } else {
+ dprintf(fd, "Invalid area <TYPE> other than \"polygon\" and \"geocode\": %s\n",
+ areaTypeValuePair[0].c_str());
+ return false;
+ }
+ }
+ return true;
+}
+
+static bool parseAreaListString(int fd, const string& areaListString,
+ vector<AlertArea>& parsedAlertAreas) {
+ if (EqualsIgnoreCase(areaListString, kAlertAreaDelimiter)) {
+ return true;
+ }
+ vector<string> areaStrings = ::android::base::Split(areaListString, kAlertAreaDelimiter);
+ for (const auto& areaString : areaStrings) {
+ AlertArea parsedArea;
+ if (!parseAreaString(fd, areaString, parsedArea)) {
+ return false;
+ }
+ parsedAlertAreas.push_back(parsedArea);
+ }
+ return true;
+}
+
} // namespace
BroadcastRadio::BroadcastRadio(const VirtualRadio& virtualRadio)
@@ -162,9 +267,9 @@
ProgramSelector sel = utils::makeSelectorAmfm(ranges[0].lowerBound);
VirtualProgram virtualProgram = {};
if (mVirtualRadio.getProgram(sel, &virtualProgram)) {
- mCurrentProgram = virtualProgram.selector;
+ mCurrentProgramSelector = virtualProgram.selector;
} else {
- mCurrentProgram = sel;
+ mCurrentProgramSelector = sel;
}
adjustAmFmRangeLocked();
}
@@ -230,13 +335,13 @@
isDigitalProgramAllowed(sel, isConfigFlagSetLocked(ConfigFlag::FORCE_ANALOG_FM),
isConfigFlagSetLocked(ConfigFlag::FORCE_ANALOG_AM));
if (isProgramAllowed && mVirtualRadio.getProgram(sel, &virtualProgram)) {
- mCurrentProgram = virtualProgram.selector;
+ mCurrentProgramSelector = virtualProgram.selector;
programInfo = virtualProgram;
} else {
if (!isProgramAllowed) {
- mCurrentProgram = utils::makeSelectorAmfm(utils::getAmFmFrequency(sel));
+ mCurrentProgramSelector = utils::makeSelectorAmfm(utils::getAmFmFrequency(sel));
} else {
- mCurrentProgram = sel;
+ mCurrentProgramSelector = sel;
}
programInfo = makeSampleProgramInfo(sel);
}
@@ -277,6 +382,10 @@
void BroadcastRadio::handleProgramInfoUpdateRadioCallback(
ProgramInfo programInfo, const std::shared_ptr<ITunerCallback>& callback) {
callback->onCurrentProgramInfoChanged(programInfo);
+ {
+ lock_guard<mutex> lk(mMutex);
+ mCurrentProgramInfo = programInfo;
+ }
if (programInfo.selector.primaryId.type != IdentifierType::HD_STATION_ID_EXT) {
return;
}
@@ -285,12 +394,14 @@
programInfo.infoFlags |= ProgramInfo::FLAG_HD_SIS_ACQUISITION;
auto sisAcquiredTask = [this, callback, programInfo, cancelTask]() {
callback->onCurrentProgramInfoChanged(programInfo);
+ mCurrentProgramInfo = programInfo;
auto audioAcquiredTask = [this, callback, programInfo]() {
ProgramInfo hdProgramInfoWithAudio = programInfo;
hdProgramInfoWithAudio.infoFlags |= ProgramInfo::FLAG_HD_AUDIO_ACQUISITION;
callback->onCurrentProgramInfoChanged(hdProgramInfoWithAudio);
lock_guard<mutex> lk(mMutex);
mIsTuneCompleted = true;
+ mCurrentProgramInfo = hdProgramInfoWithAudio;
};
lock_guard<mutex> lk(mMutex);
mTuningThread->schedule(audioAcquiredTask, cancelTask, kTuneDelayTimeMs);
@@ -481,7 +592,8 @@
auto cancelTask = [callback]() { callback->onTuneFailed(Result::CANCELED, {}); };
VirtualProgram nextProgram = {};
- bool foundNext = findNextLocked(mCurrentProgram, directionUp, skipSubChannel, &nextProgram);
+ bool foundNext =
+ findNextLocked(mCurrentProgramSelector, directionUp, skipSubChannel, &nextProgram);
mIsTuneCompleted = false;
if (!foundNext) {
auto task = [callback]() {
@@ -520,10 +632,10 @@
cancelLocked();
int64_t stepTo;
- if (utils::hasId(mCurrentProgram, IdentifierType::AMFM_FREQUENCY_KHZ)) {
- stepTo = utils::getId(mCurrentProgram, IdentifierType::AMFM_FREQUENCY_KHZ);
- } else if (mCurrentProgram.primaryId.type == IdentifierType::HD_STATION_ID_EXT) {
- stepTo = utils::getHdFrequency(mCurrentProgram);
+ if (utils::hasId(mCurrentProgramSelector, IdentifierType::AMFM_FREQUENCY_KHZ)) {
+ stepTo = utils::getId(mCurrentProgramSelector, IdentifierType::AMFM_FREQUENCY_KHZ);
+ } else if (mCurrentProgramSelector.primaryId.type == IdentifierType::HD_STATION_ID_EXT) {
+ stepTo = utils::getHdFrequency(mCurrentProgramSelector);
} else {
LOG(WARNING) << __func__ << ": can't step in anything else than AM/FM";
return ScopedAStatus::fromServiceSpecificErrorWithMessage(
@@ -568,7 +680,7 @@
LOG(DEBUG) << __func__ << ": cancelling current tuning operations...";
mTuningThread->cancelAll();
- if (mCurrentProgram.primaryId.type != IdentifierType::INVALID) {
+ if (mCurrentProgramSelector.primaryId.type != IdentifierType::INVALID) {
mIsTuneCompleted = true;
}
}
@@ -692,13 +804,13 @@
bool BroadcastRadio::adjustAmFmRangeLocked() {
bool hasBandBefore = mCurrentAmFmBandRange.has_value();
- if (!utils::hasAmFmFrequency(mCurrentProgram)) {
+ if (!utils::hasAmFmFrequency(mCurrentProgramSelector)) {
LOG(WARNING) << __func__ << ": current program does not has AMFM_FREQUENCY_KHZ identifier";
mCurrentAmFmBandRange.reset();
return hasBandBefore;
}
- int32_t freq = static_cast<int32_t>(utils::getAmFmFrequency(mCurrentProgram));
+ int32_t freq = static_cast<int32_t>(utils::getAmFmFrequency(mCurrentProgramSelector));
for (const auto& range : mAmFmConfig.ranges) {
if (range.lowerBound <= freq && range.upperBound >= freq) {
bool isBandChanged = hasBandBefore ? *mCurrentAmFmBandRange != range : true;
@@ -711,6 +823,24 @@
return !hasBandBefore;
}
+void BroadcastRadio::updateCurrentProgramInfoWithAlert(std::optional<Alert>& alert) {
+ std::shared_ptr<ITunerCallback> callback;
+ ProgramInfo currentProgramInfo;
+ {
+ lock_guard<mutex> lk(mMutex);
+ if (mCallback == nullptr) {
+ return;
+ }
+ if (mCurrentProgramInfo.selector.primaryId.type == IdentifierType::INVALID) {
+ return;
+ }
+ callback = mCallback;
+ currentProgramInfo = mCurrentProgramInfo;
+ }
+ currentProgramInfo.emergencyAlert = alert.value();
+ callback->onCurrentProgramInfoChanged(currentProgramInfo);
+}
+
ScopedAStatus BroadcastRadio::registerAnnouncementListener(
[[maybe_unused]] const std::shared_ptr<IAnnouncementListener>& listener,
const vector<AnnouncementType>& enabled, std::shared_ptr<ICloseHandle>* returnCloseHandle) {
@@ -745,6 +875,8 @@
return cmdStartProgramListUpdates(fd, args, numArgs);
} else if (EqualsIgnoreCase(option, "--stopProgramListUpdates")) {
return cmdStopProgramListUpdates(fd, numArgs);
+ } else if (EqualsIgnoreCase(option, "--simulateAlert")) {
+ return cmdSimulateAlert(fd, args, numArgs);
}
dprintf(fd, "Invalid option: %s\n", option.c_str());
return STATUS_BAD_VALUE;
@@ -767,7 +899,7 @@
} else {
dprintf(fd, "ITunerCallback registered\n");
}
- dprintf(fd, "CurrentProgram: %s \n", mCurrentProgram.toString().c_str());
+ dprintf(fd, "CurrentProgram: %s \n", mCurrentProgramSelector.toString().c_str());
return STATUS_OK;
}
@@ -798,13 +930,41 @@
"excludeModifications (string, should be either \"true\" or \"false\")\n");
dprintf(fd, "--stopProgramListUpdates: stop current pending program list updates\n");
dprintf(fd,
- "Note on <TYPE> for --startProgramList command: it is int for identifier type. "
+ "\t<TYPE>: it is int for identifier type. "
"Please see broadcastradio/aidl/android/hardware/broadcastradio/IdentifierType.aidl "
"for its definition.\n");
dprintf(fd,
- "Note on <VALUE> for --startProgramList command: it is long type for identifier value. "
+ "\t<VALUE>: it is long type for identifier value. "
"Please see broadcastradio/aidl/android/hardware/broadcastradio/IdentifierType.aidl "
"for its value.\n");
+ dprintf(fd,
+ "--simulateAlert <STATUS> <MESSAGE_TYPE> <CATEGORIES> <URGENCY> <SEVERITY> "
+ "<CERTAINTY> <DESCRIPTION> <LANGUAGE> <AREAS>: simulate emergency alert on current "
+ "program; if no arguments following \"--simulateAlert\", the default alert message"
+ "is applied.\n");
+ dprintf(fd, "\t<STATUS>: string representation of alert scope.\n");
+ dprintf(fd, "\t<MESSAGE_TYPE>: string representation of alert message type.\n");
+ dprintf(fd,
+ "\t<CATEGORIES>: string representation of alert categories separated by "
+ "\",\".\n");
+ dprintf(fd, "\t<URGENCY>: string representation of alert urgency type.\n");
+ dprintf(fd, "\t<SEVERITY>: string representation of alert severity type.\n");
+ dprintf(fd, "\t<CERTAINTY>: string representation of alert certainty type.\n");
+ dprintf(fd, "\t<DESCRIPTION>: description of alert message within quotation mark(\"\").\n");
+ dprintf(fd, "\t<LANGUAGE>: language code of alert message, \"null\" if unspecified.\n");
+ dprintf(fd,
+ "\t<AREAS>: <TYPE>:<VALUE>_<TYPE>:<VALUE>_...+<TYPE>:<VALUE>_<TYPE>:<VALUE>_... "
+ "which represents list of affected areas of the alert separated by \"|\". "
+ "If no area, this field should be: |\n"
+ "Each area may contains multiple entries separated by \";\" where "
+ "<TYPE> can be either \"polygon\" or \"geocode\". If <TYPE> is polygon, <VALUE> is a "
+ "series of coordinates of \"LATITUDE,LONGITUDE\" format separated by \",\"; if "
+ "<TYPE> is geocode, <VALUE> is of \"VALUE_NAME,VALUE\" format.\n");
+ dprintf(fd,
+ "Example: --simulateAlert actual alert geo,transport future severe"
+ " possible \"alert message for testing\" en-US geocode:SAME,006109_geocode:SAME,006209"
+ "_polygon:-38.47,-120.14,38.34,-119.95,38.52,-119.74,38.62,-119.89,-38.47,-120.14"
+ "+geocode:SAME,006009\n");
return STATUS_OK;
}
@@ -1038,4 +1198,71 @@
return STATUS_OK;
}
+binder_status_t BroadcastRadio::cmdSimulateAlert(int fd, const char** args, uint32_t numArgs) {
+ if (!checkDumpCallerHasWritePermissions(fd)) {
+ return STATUS_PERMISSION_DENIED;
+ }
+ std::optional<Alert> alertOpt;
+ if (numArgs == 1) {
+ alertOpt.emplace(createSampleAlert());
+ updateCurrentProgramInfoWithAlert(alertOpt);
+ return STATUS_OK;
+ }
+ if (numArgs != 10) {
+ dprintf(fd,
+ "Invalid number of arguments: please provide --simulateAlert "
+ "<STATUS> <MESSAGE_TYPE> <CATEGORIES> <URGENCY> "
+ "<SEVERITY> <CERTAINTY> <DESCRIPTION> <LANGUAGE> <AREAS>, provided: %d\n",
+ numArgs);
+ return STATUS_BAD_VALUE;
+ }
+ Alert parsedAlert;
+ if (!utils::parseAlertStatus(args[1], parsedAlert.status)) {
+ dprintf(fd, "Unknown alert status type: %s\n", args[2]);
+ return STATUS_BAD_VALUE;
+ }
+ if (!utils::parseAlertMessageType(args[2], parsedAlert.messageType)) {
+ dprintf(fd, "Unknown alert message type: %s\n", args[3]);
+ return STATUS_BAD_VALUE;
+ }
+ AlertInfo parsedAlertInfo;
+ vector<string> categoryStrings = ::android::base::Split(args[3], ",");
+ for (const auto& categoryString : categoryStrings) {
+ AlertCategory category;
+ if (!utils::parseAlertCategory(categoryString, category)) {
+ dprintf(fd, "Unknown alert category type: %s\n", args[3]);
+ return STATUS_BAD_VALUE;
+ }
+ parsedAlertInfo.categoryArray.push_back(category);
+ }
+ if (!utils::parseAlertUrgency(args[4], parsedAlertInfo.urgency)) {
+ dprintf(fd, "Unknown alert urgency type: %s\n", args[4]);
+ return STATUS_BAD_VALUE;
+ }
+ if (!utils::parseAlertSeverity(args[5], parsedAlertInfo.severity)) {
+ dprintf(fd, "Unknown alert severity type: %s\n", args[5]);
+ return STATUS_BAD_VALUE;
+ }
+ if (!utils::parseAlertCertainty(args[6], parsedAlertInfo.certainty)) {
+ dprintf(fd, "Unknown alert certainty type: %s\n", args[6]);
+ return STATUS_BAD_VALUE;
+ }
+ parsedAlertInfo.description = string(args[7]);
+ string languageStr = string(args[8]);
+ if (!EqualsIgnoreCase(languageStr, "null")) {
+ parsedAlertInfo.language.emplace(languageStr);
+ }
+ string areaListString = string(args[9]);
+ vector<AlertArea> areaList;
+ if (!parseAreaListString(fd, areaListString, areaList)) {
+ return STATUS_BAD_VALUE;
+ }
+ parsedAlertInfo.areas = areaList;
+ parsedAlert.infoArray = {parsedAlertInfo};
+ LOG(INFO) << "Simulate alert: " << parsedAlert.toString().c_str();
+ alertOpt.emplace(parsedAlert);
+ updateCurrentProgramInfoWithAlert(alertOpt);
+ return STATUS_OK;
+}
+
} // namespace aidl::android::hardware::broadcastradio
diff --git a/broadcastradio/aidl/default/BroadcastRadio.h b/broadcastradio/aidl/default/BroadcastRadio.h
index 60ea907..a4cba3b 100644
--- a/broadcastradio/aidl/default/BroadcastRadio.h
+++ b/broadcastradio/aidl/default/BroadcastRadio.h
@@ -78,7 +78,8 @@
std::unique_ptr<::android::WorkerThread>(new ::android::WorkerThread());
bool mIsTuneCompleted GUARDED_BY(mMutex) = true;
Properties mProperties GUARDED_BY(mMutex);
- ProgramSelector mCurrentProgram GUARDED_BY(mMutex) = {};
+ ProgramSelector mCurrentProgramSelector GUARDED_BY(mMutex) = {};
+ ProgramInfo mCurrentProgramInfo GUARDED_BY(mMutex) = {};
std::vector<VirtualProgram> mProgramList GUARDED_BY(mMutex) = {};
std::optional<AmFmBandRange> mCurrentAmFmBandRange GUARDED_BY(mMutex);
std::shared_ptr<ITunerCallback> mCallback GUARDED_BY(mMutex);
@@ -99,6 +100,7 @@
void jumpToFirstSubChannelLocked(std::vector<VirtualProgram>::const_iterator& it) const
REQUIRES(mMutex);
bool isConfigFlagSetLocked(ConfigFlag flag) const REQUIRES(mMutex);
+ void updateCurrentProgramInfoWithAlert(std::optional<Alert>& alert);
binder_status_t cmdHelp(int fd) const;
binder_status_t cmdTune(int fd, const char** args, uint32_t numArgs);
@@ -107,6 +109,7 @@
binder_status_t cmdCancel(int fd, uint32_t numArgs);
binder_status_t cmdStartProgramListUpdates(int fd, const char** args, uint32_t numArgs);
binder_status_t cmdStopProgramListUpdates(int fd, uint32_t numArgs);
+ binder_status_t cmdSimulateAlert(int fd, const char** args, uint32_t numArgs);
binder_status_t dumpsys(int fd) EXCLUDES(mMutex);
};
diff --git a/broadcastradio/aidl/vts/src/VtsHalBroadcastradioAidlTargetTest.cpp b/broadcastradio/aidl/vts/src/VtsHalBroadcastradioAidlTargetTest.cpp
index ee0c639..7e9e458 100644
--- a/broadcastradio/aidl/vts/src/VtsHalBroadcastradioAidlTargetTest.cpp
+++ b/broadcastradio/aidl/vts/src/VtsHalBroadcastradioAidlTargetTest.cpp
@@ -16,6 +16,7 @@
#define EGMOCK_VERBOSE 1
+#include <aidl/android/hardware/broadcastradio/Alert.h>
#include <aidl/android/hardware/broadcastradio/BnAnnouncementListener.h>
#include <aidl/android/hardware/broadcastradio/BnTunerCallback.h>
#include <aidl/android/hardware/broadcastradio/ConfigFlag.h>
@@ -76,12 +77,13 @@
constexpr int32_t kAidlVersion1 = 1;
constexpr int32_t kAidlVersion2 = 2;
+constexpr int32_t kAidlVersion3 = 3;
bool isValidAmFmFreq(int64_t freq, int aidlVersion) {
ProgramIdentifier id = bcutils::makeIdentifier(IdentifierType::AMFM_FREQUENCY_KHZ, freq);
if (aidlVersion == kAidlVersion1) {
return bcutils::isValid(id);
- } else if (aidlVersion == kAidlVersion2) {
+ } else if (aidlVersion >= kAidlVersion2) {
return bcutils::isValidV2(id);
}
LOG(ERROR) << "Unknown AIDL version " << aidlVersion;
@@ -105,6 +107,41 @@
return false;
}
+void validateMetadata(const ProgramInfo& info, int32_t aidlVersion) {
+ for (const auto& metadataItem : info.metadata) {
+ bool validMetadata = false;
+ if (aidlVersion == kAidlVersion1) {
+ validMetadata = bcutils::isValidMetadata(metadataItem);
+ } else {
+ validMetadata = bcutils::isValidMetadataV2(metadataItem);
+ }
+ EXPECT_TRUE(validMetadata) << "Invalid metadata " << metadataItem.toString().c_str();
+ }
+}
+
+void validateAlert(const ProgramInfo& info, int32_t aidlVersion) {
+ if (aidlVersion < kAidlVersion3 || !info.emergencyAlert.has_value()) {
+ return;
+ }
+ Alert alert = info.emergencyAlert.value();
+ ASSERT_FALSE(alert.infoArray.empty());
+ for (const auto& alertInfo : alert.infoArray) {
+ ASSERT_FALSE(alertInfo.categoryArray.empty());
+ if (alertInfo.areas.empty()) {
+ continue;
+ }
+ for (const auto& area : alertInfo.areas) {
+ if (area.polygons.empty()) {
+ continue;
+ }
+ for (const auto& polygon : area.polygons) {
+ ASSERT_GE(polygon.coordinates.size(), 4);
+ EXPECT_EQ(polygon.coordinates.front(), polygon.coordinates.back());
+ }
+ }
+ }
+}
+
} // namespace
class CallbackFlag final {
@@ -250,15 +287,9 @@
}
}
- for (const auto& metadataItem : info.metadata) {
- bool validMetadata = false;
- if (mCallbackAidlVersion == kAidlVersion1) {
- validMetadata = bcutils::isValidMetadata(metadataItem);
- } else {
- validMetadata = bcutils::isValidMetadataV2(metadataItem);
- }
- EXPECT_TRUE(validMetadata) << "Invalid metadata " << metadataItem.toString().c_str();
- }
+ validateMetadata(info, mCallbackAidlVersion);
+
+ validateAlert(info, mCallbackAidlVersion);
{
std::lock_guard<std::mutex> lk(mLock);
@@ -349,7 +380,7 @@
// get AIDL HAL version
ASSERT_TRUE(mModule->getInterfaceVersion(&mAidlVersion).isOk());
EXPECT_GE(mAidlVersion, kAidlVersion1);
- EXPECT_LE(mAidlVersion, kAidlVersion2);
+ EXPECT_LE(mAidlVersion, kAidlVersion3);
// set callback
mCallback = SharedRefBase::make<TunerCallbackImpl>(mAidlVersion);
@@ -1122,12 +1153,22 @@
* Verifies that:
* - startProgramListUpdates either succeeds or returns NOT_SUPPORTED;
* - the complete list is fetched within kProgramListScanTimeoutMs;
- * - stopProgramListUpdates does not crash.
+ * - stopProgramListUpdates does not crash;
+ * - metadata of program info in the program list is valid;
+ * - alert message is valid if it exists in the program list.
*/
TEST_P(BroadcastRadioHalTest, GetProgramListFromEmptyFilter) {
LOG(DEBUG) << "GetProgramListFromEmptyFilter Test";
- getProgramList();
+ std::optional<bcutils::ProgramInfoSet> completeList = getProgramList();
+
+ if (!completeList || mAidlVersion < kAidlVersion3) {
+ return;
+ }
+ for (const auto& program : *completeList) {
+ validateMetadata(program, mAidlVersion);
+ validateAlert(program, mAidlVersion);
+ }
}
/**
diff --git a/broadcastradio/common/utilsaidl/Android.bp b/broadcastradio/common/utilsaidl/Android.bp
index d88081f..2245492 100644
--- a/broadcastradio/common/utilsaidl/Android.bp
+++ b/broadcastradio/common/utilsaidl/Android.bp
@@ -24,7 +24,7 @@
default_applicable_licenses: ["hardware_interfaces_license"],
}
-cc_library_static {
+cc_library {
name: "android.hardware.broadcastradio@common-utils-aidl-lib",
defaults: [
"BroadcastRadioUtilsDefaults",
@@ -34,7 +34,7 @@
],
}
-cc_library_static {
+cc_library {
name: "android.hardware.broadcastradio@common-utils-aidl-lib-V2",
defaults: [
"BroadcastRadioUtilsDefaults",
@@ -47,7 +47,21 @@
],
}
-cc_library_static {
+cc_library {
+ name: "android.hardware.broadcastradio@common-utils-aidl-lib-V3",
+ defaults: [
+ "BroadcastRadioUtilsDefaults",
+ ],
+ srcs: [
+ "src/UtilsV2.cpp",
+ "src/UtilsV3.cpp",
+ ],
+ shared_libs: [
+ "android.hardware.broadcastradio-V3-ndk",
+ ],
+}
+
+cc_library {
name: "android.hardware.broadcastradio@common-utils-aidl-lib-latest",
defaults: [
"BroadcastRadioUtilsDefaults",
@@ -55,6 +69,7 @@
],
srcs: [
"src/UtilsV2.cpp",
+ "src/UtilsV3.cpp",
],
}
diff --git a/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/Utils.h b/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/Utils.h
index a34ee10..f5b71b2 100644
--- a/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/Utils.h
+++ b/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/Utils.h
@@ -197,6 +197,8 @@
bool parseArgLong(const std::string& s, long* out);
+bool parseArgDouble(const std::string& s, double* out);
+
bool parseArgBool(const std::string& s, bool* out);
bool parseArgDirection(const std::string& s, bool* out);
diff --git a/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/UtilsV3.h b/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/UtilsV3.h
new file mode 100644
index 0000000..250e217
--- /dev/null
+++ b/broadcastradio/common/utilsaidl/include/broadcastradio-utils-aidl/UtilsV3.h
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <aidl/android/hardware/broadcastradio/ProgramInfo.h>
+
+namespace aidl::android::hardware::broadcastradio {
+
+namespace utils {
+
+bool parseAlertStatus(const std::string& s, AlertStatus& out);
+
+bool parseAlertMessageType(const std::string& s, AlertMessageType& out);
+
+bool parseAlertCategory(const std::string& s, AlertCategory& out);
+
+bool parseAlertUrgency(const std::string& s, AlertUrgency& out);
+
+bool parseAlertSeverity(const std::string& s, AlertSeverity& out);
+
+bool parseAlertCertainty(const std::string& s, AlertCertainty& out);
+} // namespace utils
+} // namespace aidl::android::hardware::broadcastradio
\ No newline at end of file
diff --git a/broadcastradio/common/utilsaidl/src/Utils.cpp b/broadcastradio/common/utilsaidl/src/Utils.cpp
index 3de1866..bfa93a5 100644
--- a/broadcastradio/common/utilsaidl/src/Utils.cpp
+++ b/broadcastradio/common/utilsaidl/src/Utils.cpp
@@ -19,6 +19,7 @@
#include "broadcastradio-utils-aidl/Utils.h"
#include <android-base/logging.h>
+#include <android-base/parsedouble.h>
#include <android-base/parseint.h>
#include <android-base/strings.h>
@@ -631,6 +632,10 @@
return ::android::base::ParseInt(s, out);
}
+bool parseArgDouble(const std::string& s, double* out) {
+ return ::android::base::ParseDouble(s, out);
+}
+
bool parseArgBool(const std::string& s, bool* out) {
if (EqualsIgnoreCase(s, "true")) {
*out = true;
diff --git a/broadcastradio/common/utilsaidl/src/UtilsV3.cpp b/broadcastradio/common/utilsaidl/src/UtilsV3.cpp
new file mode 100644
index 0000000..bf694da
--- /dev/null
+++ b/broadcastradio/common/utilsaidl/src/UtilsV3.cpp
@@ -0,0 +1,142 @@
+/*
+ * 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 "BcRadioAidlDef.utilsV3"
+
+#include "broadcastradio-utils-aidl/Utils.h"
+
+#include <android-base/strings.h>
+
+namespace aidl::android::hardware::broadcastradio {
+
+namespace utils {
+
+namespace {
+
+using ::android::base::EqualsIgnoreCase;
+using ::std::vector;
+} // namespace
+
+bool parseAlertStatus(const std::string& s, AlertStatus& out) {
+ if (EqualsIgnoreCase(s, toString(AlertStatus::ACTUAL))) {
+ out = AlertStatus::ACTUAL;
+ } else if (EqualsIgnoreCase(s, toString(AlertStatus::EXERCISE))) {
+ out = AlertStatus::EXERCISE;
+ } else if (EqualsIgnoreCase(s, toString(AlertStatus::TEST))) {
+ out = AlertStatus::TEST;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+bool parseAlertMessageType(const std::string& s, AlertMessageType& out) {
+ if (EqualsIgnoreCase(s, toString(AlertMessageType::ALERT))) {
+ out = AlertMessageType::ALERT;
+ } else if (EqualsIgnoreCase(s, toString(AlertMessageType::UPDATE))) {
+ out = AlertMessageType::UPDATE;
+ } else if (EqualsIgnoreCase(s, toString(AlertMessageType::CANCEL))) {
+ out = AlertMessageType::CANCEL;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+bool parseAlertCategory(const std::string& s, AlertCategory& out) {
+ if (EqualsIgnoreCase(s, toString(AlertCategory::GEO))) {
+ out = AlertCategory::GEO;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::MET))) {
+ out = AlertCategory::MET;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::SAFETY))) {
+ out = AlertCategory::SAFETY;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::SECURITY))) {
+ out = AlertCategory::SECURITY;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::RESCUE))) {
+ out = AlertCategory::RESCUE;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::FIRE))) {
+ out = AlertCategory::FIRE;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::HEALTH))) {
+ out = AlertCategory::HEALTH;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::ENV))) {
+ out = AlertCategory::ENV;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::TRANSPORT))) {
+ out = AlertCategory::TRANSPORT;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::INFRA))) {
+ out = AlertCategory::INFRA;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::CBRNE))) {
+ out = AlertCategory::CBRNE;
+ } else if (EqualsIgnoreCase(s, toString(AlertCategory::OTHER))) {
+ out = AlertCategory::OTHER;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+bool parseAlertUrgency(const std::string& s, AlertUrgency& out) {
+ if (EqualsIgnoreCase(s, toString(AlertUrgency::IMMEDIATE))) {
+ out = AlertUrgency::IMMEDIATE;
+ } else if (EqualsIgnoreCase(s, toString(AlertUrgency::EXPECTED))) {
+ out = AlertUrgency::EXPECTED;
+ } else if (EqualsIgnoreCase(s, toString(AlertUrgency::FUTURE))) {
+ out = AlertUrgency::FUTURE;
+ } else if (EqualsIgnoreCase(s, toString(AlertUrgency::PAST))) {
+ out = AlertUrgency::PAST;
+ } else if (EqualsIgnoreCase(s, toString(AlertUrgency::UNKNOWN))) {
+ out = AlertUrgency::UNKNOWN;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+bool parseAlertSeverity(const std::string& s, AlertSeverity& out) {
+ if (EqualsIgnoreCase(s, toString(AlertSeverity::EXTREME))) {
+ out = AlertSeverity::EXTREME;
+ } else if (EqualsIgnoreCase(s, toString(AlertSeverity::SEVERE))) {
+ out = AlertSeverity::SEVERE;
+ } else if (EqualsIgnoreCase(s, toString(AlertSeverity::MODERATE))) {
+ out = AlertSeverity::MODERATE;
+ } else if (EqualsIgnoreCase(s, toString(AlertSeverity::MINOR))) {
+ out = AlertSeverity::MINOR;
+ } else if (EqualsIgnoreCase(s, toString(AlertSeverity::UNKNOWN))) {
+ out = AlertSeverity::UNKNOWN;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+bool parseAlertCertainty(const std::string& s, AlertCertainty& out) {
+ if (EqualsIgnoreCase(s, toString(AlertCertainty::OBSERVED))) {
+ out = AlertCertainty::OBSERVED;
+ } else if (EqualsIgnoreCase(s, toString(AlertCertainty::LIKELY))) {
+ out = AlertCertainty::LIKELY;
+ } else if (EqualsIgnoreCase(s, toString(AlertCertainty::POSSIBLE))) {
+ out = AlertCertainty::POSSIBLE;
+ } else if (EqualsIgnoreCase(s, toString(AlertCertainty::UNLIKELY))) {
+ out = AlertCertainty::UNLIKELY;
+ } else if (EqualsIgnoreCase(s, toString(AlertCertainty::UNKNOWN))) {
+ out = AlertCertainty::UNKNOWN;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+} // namespace utils
+} // namespace aidl::android::hardware::broadcastradio
diff --git a/camera/device/aidl/Android.bp b/camera/device/aidl/Android.bp
index 48ae34e..291ed0d 100644
--- a/camera/device/aidl/Android.bp
+++ b/camera/device/aidl/Android.bp
@@ -44,7 +44,7 @@
"android.hardware.common.fmq-V1",
"android.hardware.camera.common-V1",
"android.hardware.camera.metadata-V1",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
{
@@ -54,7 +54,7 @@
"android.hardware.common.fmq-V1",
"android.hardware.camera.common-V1",
"android.hardware.camera.metadata-V2",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
{
@@ -64,7 +64,7 @@
"android.hardware.common.fmq-V1",
"android.hardware.camera.common-V1",
"android.hardware.camera.metadata-V3",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
diff --git a/camera/metadata/aidl/Android.bp b/camera/metadata/aidl/Android.bp
index a9c1a1a..d7303fc 100644
--- a/camera/metadata/aidl/Android.bp
+++ b/camera/metadata/aidl/Android.bp
@@ -13,7 +13,7 @@
host_supported: true,
vendor_available: true,
srcs: ["android/hardware/camera/metadata/*.aidl"],
- frozen: true,
+ frozen: false,
stability: "vintf",
backend: {
cpp: {
diff --git a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataSection.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataSection.aidl
index 138101b..5a35915 100644
--- a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataSection.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataSection.aidl
@@ -72,5 +72,6 @@
ANDROID_AUTOMOTIVE_LENS,
ANDROID_EXTENSION,
ANDROID_JPEGR,
+ ANDROID_SHARED_SESSION,
VENDOR_SECTION = 0x8000,
}
diff --git a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataSectionStart.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataSectionStart.aidl
index 85eee08..4cdca62 100644
--- a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataSectionStart.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataSectionStart.aidl
@@ -72,5 +72,6 @@
ANDROID_AUTOMOTIVE_LENS_START = (android.hardware.camera.metadata.CameraMetadataSection.ANDROID_AUTOMOTIVE_LENS << 16) /* 2031616 */,
ANDROID_EXTENSION_START = (android.hardware.camera.metadata.CameraMetadataSection.ANDROID_EXTENSION << 16) /* 2097152 */,
ANDROID_JPEGR_START = (android.hardware.camera.metadata.CameraMetadataSection.ANDROID_JPEGR << 16) /* 2162688 */,
+ ANDROID_SHARED_SESSION_START = (android.hardware.camera.metadata.CameraMetadataSection.ANDROID_SHARED_SESSION << 16) /* 2228224 */,
VENDOR_SECTION_START = (android.hardware.camera.metadata.CameraMetadataSection.VENDOR_SECTION << 16) /* -2147483648 */,
}
diff --git a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataTag.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataTag.aidl
index 9321ec0..2615270 100644
--- a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataTag.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataTag.aidl
@@ -43,6 +43,10 @@
ANDROID_COLOR_CORRECTION_GAINS,
ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
+ ANDROID_COLOR_CORRECTION_COLOR_TEMPERATURE,
+ ANDROID_COLOR_CORRECTION_COLOR_TINT,
+ ANDROID_COLOR_CORRECTION_COLOR_TEMPERATURE_RANGE,
+ ANDROID_COLOR_CORRECTION_AVAILABLE_MODES,
ANDROID_CONTROL_AE_ANTIBANDING_MODE = android.hardware.camera.metadata.CameraMetadataSectionStart.ANDROID_CONTROL_START /* 65536 */,
ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
ANDROID_CONTROL_AE_LOCK,
@@ -100,6 +104,8 @@
ANDROID_CONTROL_AUTOFRAMING_STATE,
ANDROID_CONTROL_LOW_LIGHT_BOOST_INFO_LUMINANCE_RANGE,
ANDROID_CONTROL_LOW_LIGHT_BOOST_STATE,
+ ANDROID_CONTROL_AE_PRIORITY_MODE = 65597,
+ ANDROID_CONTROL_AE_AVAILABLE_PRIORITY_MODES,
ANDROID_DEMOSAIC_MODE = android.hardware.camera.metadata.CameraMetadataSectionStart.ANDROID_DEMOSAIC_START /* 131072 */,
ANDROID_EDGE_MODE = android.hardware.camera.metadata.CameraMetadataSectionStart.ANDROID_EDGE_START /* 196608 */,
ANDROID_EDGE_STRENGTH,
@@ -343,10 +349,17 @@
ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION,
ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS_MAXIMUM_RESOLUTION,
ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS_MAXIMUM_RESOLUTION,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_MIN_FRAME_DURATIONS,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STALL_DURATIONS,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_MIN_FRAME_DURATIONS_MAXIMUM_RESOLUTION,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STALL_DURATIONS_MAXIMUM_RESOLUTION,
ANDROID_HEIC_INFO_SUPPORTED = android.hardware.camera.metadata.CameraMetadataSectionStart.ANDROID_HEIC_INFO_START /* 1900544 */,
ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT,
ANDROID_AUTOMOTIVE_LOCATION = android.hardware.camera.metadata.CameraMetadataSectionStart.ANDROID_AUTOMOTIVE_START /* 1966080 */,
ANDROID_AUTOMOTIVE_LENS_FACING = android.hardware.camera.metadata.CameraMetadataSectionStart.ANDROID_AUTOMOTIVE_LENS_START /* 2031616 */,
+ ANDROID_EXTENSION_NIGHT_MODE_INDICATOR = 2097154,
ANDROID_JPEGR_AVAILABLE_JPEG_R_STREAM_CONFIGURATIONS = android.hardware.camera.metadata.CameraMetadataSectionStart.ANDROID_JPEGR_START /* 2162688 */,
ANDROID_JPEGR_AVAILABLE_JPEG_R_MIN_FRAME_DURATIONS,
ANDROID_JPEGR_AVAILABLE_JPEG_R_STALL_DURATIONS,
diff --git a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ColorCorrectionMode.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ColorCorrectionMode.aidl
index 2381605..69f0f5f 100644
--- a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ColorCorrectionMode.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ColorCorrectionMode.aidl
@@ -41,4 +41,5 @@
ANDROID_COLOR_CORRECTION_MODE_TRANSFORM_MATRIX,
ANDROID_COLOR_CORRECTION_MODE_FAST,
ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY,
+ ANDROID_COLOR_CORRECTION_MODE_CCT,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ControlAePriorityMode.aidl
similarity index 79%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ControlAePriorityMode.aidl
index a5eda52..eac2147 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ControlAePriorityMode.aidl
@@ -12,6 +12,10 @@
* 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.
+ *//*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
*/
///////////////////////////////////////////////////////////////////////////////
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
@@ -31,9 +35,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.camera.metadata;
+@Backing(type="int") @VintfStability
+enum ControlAePriorityMode {
+ ANDROID_CONTROL_AE_PRIORITY_MODE_OFF,
+ ANDROID_CONTROL_AE_PRIORITY_MODE_SENSOR_SENSITIVITY_PRIORITY,
+ ANDROID_CONTROL_AE_PRIORITY_MODE_SENSOR_EXPOSURE_TIME_PRIORITY,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ExtensionNightModeIndicator.aidl
similarity index 80%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ExtensionNightModeIndicator.aidl
index a5eda52..6cfdc02 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/ExtensionNightModeIndicator.aidl
@@ -12,6 +12,10 @@
* 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.
+ *//*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
*/
///////////////////////////////////////////////////////////////////////////////
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
@@ -31,9 +35,10 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.camera.metadata;
+@Backing(type="int") @VintfStability
+enum ExtensionNightModeIndicator {
+ ANDROID_EXTENSION_NIGHT_MODE_INDICATOR_UNKNOWN,
+ ANDROID_EXTENSION_NIGHT_MODE_INDICATOR_OFF,
+ ANDROID_EXTENSION_NIGHT_MODE_INDICATOR_ON,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurations.aidl
similarity index 79%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurations.aidl
index a5eda52..339d2fa 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurations.aidl
@@ -12,6 +12,10 @@
* 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.
+ *//*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
*/
///////////////////////////////////////////////////////////////////////////////
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
@@ -31,9 +35,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.camera.metadata;
+@Backing(type="int") @VintfStability
+enum HeicAvailableHeicUltraHdrStreamConfigurations {
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_OUTPUT,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_INPUT,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurationsMaximumResolution.aidl
similarity index 77%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurationsMaximumResolution.aidl
index a5eda52..7755069 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurationsMaximumResolution.aidl
@@ -12,6 +12,10 @@
* 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.
+ *//*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
*/
///////////////////////////////////////////////////////////////////////////////
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
@@ -31,9 +35,9 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.camera.metadata;
+@Backing(type="int") @VintfStability
+enum HeicAvailableHeicUltraHdrStreamConfigurationsMaximumResolution {
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_OUTPUT,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT,
}
diff --git a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl
index 35dc1a9..11be18e 100644
--- a/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl
+++ b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/SensorReadoutTimestamp.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2024 The Android Open Source Project
+ * Copyright (C) 2022 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.
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataSection.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataSection.aidl
index 73bcc12..2268dfd 100644
--- a/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataSection.aidl
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataSection.aidl
@@ -63,5 +63,6 @@
ANDROID_AUTOMOTIVE_LENS,
ANDROID_EXTENSION,
ANDROID_JPEGR,
+ ANDROID_SHARED_SESSION,
VENDOR_SECTION = 0x8000,
}
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataSectionStart.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataSectionStart.aidl
index 75e7915..3ec54d4 100644
--- a/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataSectionStart.aidl
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataSectionStart.aidl
@@ -65,5 +65,6 @@
ANDROID_AUTOMOTIVE_LENS_START = CameraMetadataSection.ANDROID_AUTOMOTIVE_LENS << 16,
ANDROID_EXTENSION_START = CameraMetadataSection.ANDROID_EXTENSION << 16,
ANDROID_JPEGR_START = CameraMetadataSection.ANDROID_JPEGR << 16,
+ ANDROID_SHARED_SESSION_START = CameraMetadataSection.ANDROID_SHARED_SESSION << 16,
VENDOR_SECTION_START = CameraMetadataSection.VENDOR_SECTION << 16,
}
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl
index 236bcaf..66ca912 100644
--- a/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl
@@ -70,6 +70,38 @@
*/
ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
/**
+ * android.colorCorrection.colorTemperature [dynamic, int32, public]
+ *
+ * <p>Specifies the color temperature for CCT mode in Kelvin
+ * to adjust the white balance of the image.</p>
+ */
+ ANDROID_COLOR_CORRECTION_COLOR_TEMPERATURE,
+ /**
+ * android.colorCorrection.colorTint [dynamic, int32, public]
+ *
+ * <p>Specifies the color tint for CCT mode to adjust the white
+ * balance of the image.</p>
+ */
+ ANDROID_COLOR_CORRECTION_COLOR_TINT,
+ /**
+ * android.colorCorrection.colorTemperatureRange [static, int32[], public]
+ *
+ * <p>The range of supported color temperature values for
+ * ANDROID_COLOR_CORRECTION_COLOR_TEMPERATURE.</p>
+ *
+ * @see ANDROID_COLOR_CORRECTION_COLOR_TEMPERATURE
+ */
+ ANDROID_COLOR_CORRECTION_COLOR_TEMPERATURE_RANGE,
+ /**
+ * android.colorCorrection.availableModes [static, byte[], public]
+ *
+ * <p>List of color correction modes for ANDROID_COLOR_CORRECTION_MODE that are
+ * supported by this camera device.</p>
+ *
+ * @see ANDROID_COLOR_CORRECTION_MODE
+ */
+ ANDROID_COLOR_CORRECTION_AVAILABLE_MODES,
+ /**
* android.control.aeAntibandingMode [dynamic, enum, public]
*
* <p>The desired setting for the camera device's auto-exposure
@@ -502,6 +534,21 @@
*/
ANDROID_CONTROL_LOW_LIGHT_BOOST_STATE,
/**
+ * android.control.aePriorityMode [dynamic, enum, public]
+ *
+ * <p>Turn on AE priority mode.</p>
+ */
+ ANDROID_CONTROL_AE_PRIORITY_MODE = 65597,
+ /**
+ * android.control.aeAvailablePriorityModes [static, byte[], public]
+ *
+ * <p>List of auto-exposure priority modes for ANDROID_CONTROL_AE_PRIORITY_MODE
+ * that are supported by this camera device.</p>
+ *
+ * @see ANDROID_CONTROL_AE_PRIORITY_MODE
+ */
+ ANDROID_CONTROL_AE_AVAILABLE_PRIORITY_MODES,
+ /**
* android.demosaic.mode [controls, enum, system]
*
* <p>Controls the quality of the demosaicing
@@ -2346,6 +2393,62 @@
*/
ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS_MAXIMUM_RESOLUTION,
/**
+ * android.heic.availableHeicUltraHdrStreamConfigurations [static, enum[], ndk_public]
+ *
+ * <p>The available HEIC (ISO/IEC 23008-12/24) UltraHDR stream
+ * configurations that this camera device supports
+ * (i.e. format, width, height, output/input stream).</p>
+ */
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS,
+ /**
+ * android.heic.availableHeicUltraHdrMinFrameDurations [static, int64[], ndk_public]
+ *
+ * <p>This lists the minimum frame duration for each
+ * format/size combination for HEIC UltraHDR output formats.</p>
+ */
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_MIN_FRAME_DURATIONS,
+ /**
+ * android.heic.availableHeicUltraHdrStallDurations [static, int64[], ndk_public]
+ *
+ * <p>This lists the maximum stall duration for each
+ * output format/size combination for HEIC UltraHDR streams.</p>
+ */
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STALL_DURATIONS,
+ /**
+ * android.heic.availableHeicUltraHdrStreamConfigurationsMaximumResolution [static, enum[], ndk_public]
+ *
+ * <p>The available HEIC (ISO/IEC 23008-12/24) UltraHDR stream
+ * configurations that this camera device supports
+ * (i.e. format, width, height, output/input stream) for CaptureRequests where
+ * ANDROID_SENSOR_PIXEL_MODE is set to
+ * <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION">CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION</a>.</p>
+ *
+ * @see ANDROID_SENSOR_PIXEL_MODE
+ */
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION,
+ /**
+ * android.heic.availableHeicUltraHdrMinFrameDurationsMaximumResolution [static, int64[], ndk_public]
+ *
+ * <p>This lists the minimum frame duration for each
+ * format/size combination for HEIC UltraHDR output formats for CaptureRequests where
+ * ANDROID_SENSOR_PIXEL_MODE is set to
+ * <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION">CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION</a>.</p>
+ *
+ * @see ANDROID_SENSOR_PIXEL_MODE
+ */
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_MIN_FRAME_DURATIONS_MAXIMUM_RESOLUTION,
+ /**
+ * android.heic.availableHeicUltraHdrStallDurationsMaximumResolution [static, int64[], ndk_public]
+ *
+ * <p>This lists the maximum stall duration for each
+ * output format/size combination for HEIC UltraHDR streams for CaptureRequests where
+ * ANDROID_SENSOR_PIXEL_MODE is set to
+ * <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION">CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION</a>.</p>
+ *
+ * @see ANDROID_SENSOR_PIXEL_MODE
+ */
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STALL_DURATIONS_MAXIMUM_RESOLUTION,
+ /**
* android.heic.info.supported [static, enum, system]
*
* <p>Whether this camera device can support identical set of stream combinations
@@ -2375,6 +2478,13 @@
*/
ANDROID_AUTOMOTIVE_LENS_FACING = CameraMetadataSectionStart.ANDROID_AUTOMOTIVE_LENS_START,
/**
+ * android.extension.nightModeIndicator [dynamic, enum, public]
+ *
+ * <p>Indicates when to activate Night Mode Camera Extension for high-quality
+ * still captures in low-light conditions.</p>
+ */
+ ANDROID_EXTENSION_NIGHT_MODE_INDICATOR = 2097154,
+ /**
* android.jpegr.availableJpegRStreamConfigurations [static, enum[], ndk_public]
*
* <p>The available Jpeg/R stream
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/ColorCorrectionMode.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/ColorCorrectionMode.aidl
index 2a51bfc..f12b6f6 100644
--- a/camera/metadata/aidl/android/hardware/camera/metadata/ColorCorrectionMode.aidl
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/ColorCorrectionMode.aidl
@@ -33,4 +33,5 @@
ANDROID_COLOR_CORRECTION_MODE_TRANSFORM_MATRIX,
ANDROID_COLOR_CORRECTION_MODE_FAST,
ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY,
+ ANDROID_COLOR_CORRECTION_MODE_CCT,
}
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/ControlAePriorityMode.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/ControlAePriorityMode.aidl
new file mode 100644
index 0000000..fd4f531
--- /dev/null
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/ControlAePriorityMode.aidl
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+/*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
+ */
+
+package android.hardware.camera.metadata;
+
+/**
+ * android.control.aePriorityMode enumeration values
+ * @see ANDROID_CONTROL_AE_PRIORITY_MODE
+ * See system/media/camera/docs/metadata_definitions.xml for details.
+ */
+@VintfStability
+@Backing(type="int")
+enum ControlAePriorityMode {
+ ANDROID_CONTROL_AE_PRIORITY_MODE_OFF,
+ ANDROID_CONTROL_AE_PRIORITY_MODE_SENSOR_SENSITIVITY_PRIORITY,
+ ANDROID_CONTROL_AE_PRIORITY_MODE_SENSOR_EXPOSURE_TIME_PRIORITY,
+}
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/ExtensionNightModeIndicator.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/ExtensionNightModeIndicator.aidl
new file mode 100644
index 0000000..3c3bdf5
--- /dev/null
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/ExtensionNightModeIndicator.aidl
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+/*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
+ */
+
+package android.hardware.camera.metadata;
+
+/**
+ * android.extension.nightModeIndicator enumeration values
+ * @see ANDROID_EXTENSION_NIGHT_MODE_INDICATOR
+ * See system/media/camera/docs/metadata_definitions.xml for details.
+ */
+@VintfStability
+@Backing(type="int")
+enum ExtensionNightModeIndicator {
+ ANDROID_EXTENSION_NIGHT_MODE_INDICATOR_UNKNOWN,
+ ANDROID_EXTENSION_NIGHT_MODE_INDICATOR_OFF,
+ ANDROID_EXTENSION_NIGHT_MODE_INDICATOR_ON,
+}
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurations.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurations.aidl
new file mode 100644
index 0000000..56761b9
--- /dev/null
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurations.aidl
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+/*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
+ */
+
+package android.hardware.camera.metadata;
+
+/**
+ * android.heic.availableHeicUltraHdrStreamConfigurations enumeration values
+ * @see ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS
+ * See system/media/camera/docs/metadata_definitions.xml for details.
+ */
+@VintfStability
+@Backing(type="int")
+enum HeicAvailableHeicUltraHdrStreamConfigurations {
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_OUTPUT,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_INPUT,
+}
diff --git a/camera/metadata/aidl/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurationsMaximumResolution.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurationsMaximumResolution.aidl
new file mode 100644
index 0000000..7fb19dc
--- /dev/null
+++ b/camera/metadata/aidl/android/hardware/camera/metadata/HeicAvailableHeicUltraHdrStreamConfigurationsMaximumResolution.aidl
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+/*
+ * Autogenerated from camera metadata definitions in
+ * /system/media/camera/docs/metadata_definitions.xml
+ * *** DO NOT EDIT BY HAND ***
+ */
+
+package android.hardware.camera.metadata;
+
+/**
+ * android.heic.availableHeicUltraHdrStreamConfigurationsMaximumResolution enumeration values
+ * @see ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION
+ * See system/media/camera/docs/metadata_definitions.xml for details.
+ */
+@VintfStability
+@Backing(type="int")
+enum HeicAvailableHeicUltraHdrStreamConfigurationsMaximumResolution {
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_OUTPUT,
+ ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT,
+}
diff --git a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
index 9fa4df2..ec61eec 100644
--- a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
+++ b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
@@ -118,7 +118,8 @@
ScopedAStatus ret = mProvider->setCallback(cb);
ASSERT_TRUE(ret.isOk());
ret = mProvider->setCallback(nullptr);
- ASSERT_EQ(static_cast<int32_t>(Status::ILLEGAL_ARGUMENT), ret.getServiceSpecificError());
+ ASSERT_TRUE(static_cast<int32_t>(Status::ILLEGAL_ARGUMENT) == ret.getServiceSpecificError() ||
+ EX_NULL_POINTER == ret.getExceptionCode());
}
// Test if ICameraProvider::getCameraDeviceInterface returns Status::OK and non-null device
diff --git a/camera/provider/aidl/vts/camera_aidl_test.cpp b/camera/provider/aidl/vts/camera_aidl_test.cpp
index 6ecd451..44af306 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.cpp
+++ b/camera/provider/aidl/vts/camera_aidl_test.cpp
@@ -2590,8 +2590,7 @@
return ret;
}
- if (flags::session_hal_buf_manager() &&
- (bufferManagerType == BufferManagerType::SESSION && interfaceVersion >= 3)) {
+ if (bufferManagerType == BufferManagerType::SESSION && interfaceVersion >= 3) {
ret = session->configureStreamsV2(config, &aidl_return);
} else {
ret = session->configureStreams(config, halStreams);
@@ -2599,12 +2598,11 @@
if (!ret.isOk()) {
return ret;
}
- if (flags::session_hal_buf_manager() && bufferManagerType == BufferManagerType::SESSION) {
+ if (bufferManagerType == BufferManagerType::SESSION) {
*halStreams = std::move(aidl_return.halStreams);
}
for (const auto& halStream : *halStreams) {
- if ((flags::session_hal_buf_manager() && bufferManagerType == BufferManagerType::SESSION &&
- halStream.enableHalBufferManager) ||
+ if ((bufferManagerType == BufferManagerType::SESSION && halStream.enableHalBufferManager) ||
bufferManagerType == BufferManagerType::HAL) {
halBufManagedStreamIds->insert(halStream.id);
}
diff --git a/compatibility_matrices/compatibility_matrix.202504.xml b/compatibility_matrices/compatibility_matrix.202504.xml
index 4a1a13a..b3a3778 100644
--- a/compatibility_matrices/compatibility_matrix.202504.xml
+++ b/compatibility_matrices/compatibility_matrix.202504.xml
@@ -163,7 +163,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.broadcastradio</name>
- <version>1-2</version>
+ <version>1-3</version>
<interface>
<name>IBroadcastRadio</name>
<regex-instance>.*</regex-instance>
@@ -225,7 +225,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.gnss</name>
- <version>2-4</version>
+ <version>2-5</version>
<interface>
<name>IGnss</name>
<instance>default</instance>
@@ -372,7 +372,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.power</name>
- <version>5</version>
+ <version>5-6</version>
<interface>
<name>IPower</name>
<instance>default</instance>
@@ -551,7 +551,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.thermal</name>
- <version>2</version>
+ <version>3</version>
<interface>
<name>IThermal</name>
<instance>default</instance>
@@ -591,7 +591,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.tv.tuner</name>
- <version>1-2</version>
+ <version>1-3</version>
<interface>
<name>ITuner</name>
<instance>default</instance>
@@ -646,7 +646,7 @@
</hal>
<hal format="aidl" updatable-via-apex="true">
<name>android.hardware.wifi</name>
- <version>1-2</version>
+ <version>2-3</version>
<interface>
<name>IWifi</name>
<instance>default</instance>
@@ -676,6 +676,14 @@
<instance>default</instance>
</interface>
</hal>
+ <hal format="aidl" optional="true">
+ <name>android.hardware.tv.mediaquality</name>
+ <version>1</version>
+ <interface>
+ <name>IMediaQuality</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
<!-- The native mapper HAL must exist on the device -->
<hal format="native">
<name>mapper</name>
diff --git a/compatibility_matrices/exclude/fcm_exclude.cpp b/compatibility_matrices/exclude/fcm_exclude.cpp
index e7a31e6..eabb603 100644
--- a/compatibility_matrices/exclude/fcm_exclude.cpp
+++ b/compatibility_matrices/exclude/fcm_exclude.cpp
@@ -140,6 +140,7 @@
"android.hardware.camera.common@",
"android.hardware.common@",
"android.hardware.common.fmq@",
+ "android.hardware.gnss.gnss_assistance@",
"android.hardware.gnss.measurement_corrections@",
"android.hardware.gnss.visibility_control@",
"android.hardware.graphics.common@",
diff --git a/contexthub/aidl/default/Android.bp b/contexthub/aidl/default/Android.bp
index da173f9..c0b147c 100644
--- a/contexthub/aidl/default/Android.bp
+++ b/contexthub/aidl/default/Android.bp
@@ -30,6 +30,7 @@
shared_libs: [
"libbase",
"libbinder_ndk",
+ "liblog",
"android.hardware.contexthub-V4-ndk",
],
export_include_dirs: ["include"],
@@ -51,6 +52,7 @@
shared_libs: [
"libbase",
"libbinder_ndk",
+ "liblog",
"android.hardware.contexthub-V4-ndk",
],
static_libs: [
diff --git a/contexthub/aidl/default/ContextHub.cpp b/contexthub/aidl/default/ContextHub.cpp
index 5713a1b..4ae9c09 100644
--- a/contexthub/aidl/default/ContextHub.cpp
+++ b/contexthub/aidl/default/ContextHub.cpp
@@ -16,10 +16,54 @@
#include "contexthub-impl/ContextHub.h"
-namespace aidl::android::hardware::contexthub {
+#ifndef LOG_TAG
+#define LOG_TAG "CHRE"
+#endif
+
+#include <inttypes.h>
+#include <log/log.h>
using ::ndk::ScopedAStatus;
+namespace aidl::android::hardware::contexthub {
+
+namespace {
+
+constexpr uint64_t kMockVendorHubId = 0x1234567812345678;
+constexpr uint64_t kMockVendorHub2Id = 0x0EADBEEFDEADBEEF;
+
+// Mock endpoints for the default implementation.
+// These endpoints just echo back any messages sent to them.
+constexpr size_t kMockEndpointCount = 4;
+const EndpointInfo kMockEndpointInfos[kMockEndpointCount] = {
+ {
+ .id = {.hubId = kMockVendorHubId, .id = UINT64_C(0x1)},
+ .type = EndpointInfo::EndpointType::GENERIC,
+ .name = "Mock Endpoint 1",
+ .version = 1,
+ },
+ {
+ .id = {.hubId = kMockVendorHubId, .id = UINT64_C(0x2)},
+ .type = EndpointInfo::EndpointType::GENERIC,
+ .name = "Mock Endpoint 2",
+ .version = 2,
+ },
+ {
+ .id = {.hubId = kMockVendorHub2Id, .id = UINT64_C(0x1)},
+ .type = EndpointInfo::EndpointType::GENERIC,
+ .name = "Mock Endpoint 3",
+ .version = 1,
+ },
+ {
+ .id = {.hubId = kMockVendorHub2Id, .id = UINT64_C(0x2)},
+ .type = EndpointInfo::EndpointType::GENERIC,
+ .name = "Mock Endpoint 4",
+ .version = 2,
+ },
+};
+
+} // anonymous namespace
+
ScopedAStatus ContextHub::getContextHubs(std::vector<ContextHubInfo>* out_contextHubInfos) {
ContextHubInfo hub = {};
hub.name = "Mock Context Hub";
@@ -112,7 +156,13 @@
}
}
-ScopedAStatus ContextHub::setTestMode(bool /* enable */) {
+ScopedAStatus ContextHub::setTestMode(bool enable) {
+ if (enable) {
+ std::unique_lock<std::mutex> lock(mEndpointMutex);
+ mEndpoints.clear();
+ mEndpointSessions.clear();
+ mEndpointCallback = nullptr;
+ }
return ScopedAStatus::ok();
}
@@ -137,6 +187,10 @@
}
ScopedAStatus ContextHub::getHubs(std::vector<HubInfo>* _aidl_return) {
+ if (_aidl_return == nullptr) {
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+
ContextHubInfo hub = {};
hub.name = "Mock Context Hub";
hub.vendor = "AOSP";
@@ -158,61 +212,217 @@
vendorHub.version = 42;
HubInfo hubInfo2 = {};
- hubInfo1.hubId = UINT64_C(0x1234567812345678);
- hubInfo1.hubDetails =
+ hubInfo2.hubId = kMockVendorHubId;
+ hubInfo2.hubDetails =
HubInfo::HubDetails::make<HubInfo::HubDetails::Tag::vendorHubInfo>(vendorHub);
+ VendorHubInfo vendorHub2 = {};
+ vendorHub2.name = "Mock Vendor Hub 2";
+ vendorHub2.version = 24;
+
+ HubInfo hubInfo3 = {};
+ hubInfo3.hubId = kMockVendorHub2Id;
+ hubInfo3.hubDetails =
+ HubInfo::HubDetails::make<HubInfo::HubDetails::Tag::vendorHubInfo>(vendorHub2);
+
_aidl_return->push_back(hubInfo1);
_aidl_return->push_back(hubInfo2);
+ _aidl_return->push_back(hubInfo3);
return ScopedAStatus::ok();
};
-ScopedAStatus ContextHub::getEndpoints(std::vector<EndpointInfo>* /* _aidl_return */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ScopedAStatus ContextHub::getEndpoints(std::vector<EndpointInfo>* _aidl_return) {
+ if (_aidl_return == nullptr) {
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+
+ Service echoService;
+ echoService.format = Service::RpcFormat::CUSTOM;
+ echoService.serviceDescriptor = "ECHO";
+ echoService.majorVersion = 1;
+ echoService.minorVersion = 0;
+
+ for (const EndpointInfo& endpoint : kMockEndpointInfos) {
+ EndpointInfo endpointWithService(endpoint);
+ endpointWithService.services.push_back(echoService);
+ _aidl_return->push_back(std::move(endpointWithService));
+ }
+
+ return ScopedAStatus::ok();
};
-ScopedAStatus ContextHub::registerEndpoint(const EndpointInfo& /* in_endpoint */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ScopedAStatus ContextHub::registerEndpoint(const EndpointInfo& in_endpoint) {
+ std::unique_lock<std::mutex> lock(mEndpointMutex);
+
+ for (const EndpointInfo& endpoint : mEndpoints) {
+ if ((endpoint.id.id == in_endpoint.id.id && endpoint.id.hubId == in_endpoint.id.hubId) ||
+ endpoint.name == in_endpoint.name) {
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+ }
+ mEndpoints.push_back(in_endpoint);
+ return ScopedAStatus::ok();
};
-ScopedAStatus ContextHub::unregisterEndpoint(const EndpointInfo& /* in_endpoint */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ScopedAStatus ContextHub::unregisterEndpoint(const EndpointInfo& in_endpoint) {
+ std::unique_lock<std::mutex> lock(mEndpointMutex);
+
+ for (auto it = mEndpoints.begin(); it != mEndpoints.end(); ++it) {
+ if (it->id.id == in_endpoint.id.id && it->id.hubId == in_endpoint.id.hubId) {
+ mEndpoints.erase(it);
+ return ScopedAStatus::ok();
+ }
+ }
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
};
ScopedAStatus ContextHub::registerEndpointCallback(
- const std::shared_ptr<IEndpointCallback>& /* in_callback */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ const std::shared_ptr<IEndpointCallback>& in_callback) {
+ std::unique_lock<std::mutex> lock(mEndpointMutex);
+
+ mEndpointCallback = in_callback;
+ return ScopedAStatus::ok();
};
-ScopedAStatus ContextHub::requestSessionIdRange(int32_t /* in_size */,
- std::vector<int32_t>* /* _aidl_return */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ScopedAStatus ContextHub::requestSessionIdRange(int32_t in_size,
+ std::vector<int32_t>* _aidl_return) {
+ constexpr int32_t kMaxSize = 1024;
+ if (in_size > kMaxSize || _aidl_return == nullptr) {
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+
+ {
+ std::lock_guard<std::mutex> lock(mEndpointMutex);
+ mMaxValidSessionId = in_size;
+ }
+
+ _aidl_return->push_back(0);
+ _aidl_return->push_back(in_size);
+ return ScopedAStatus::ok();
};
ScopedAStatus ContextHub::openEndpointSession(
- int32_t /* in_sessionId */, const EndpointId& /* in_destination */,
- const EndpointId& /* in_initiator */,
- const std::optional<std::string>& /* in_serviceDescriptor */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ int32_t in_sessionId, const EndpointId& in_destination, const EndpointId& in_initiator,
+ const std::optional<std::string>& in_serviceDescriptor) {
+ // We are not calling onCloseEndpointSession on failure because the remote endpoints (our
+ // mock endpoints) always accept the session.
+
+ std::shared_ptr<IEndpointCallback> callback = nullptr;
+ {
+ std::unique_lock<std::mutex> lock(mEndpointMutex);
+ if (in_sessionId > mMaxValidSessionId) {
+ ALOGE("openEndpointSession: session ID %" PRId32 " is invalid", in_sessionId);
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+
+ for (const EndpointSession& session : mEndpointSessions) {
+ bool sessionAlreadyExists =
+ (session.initiator == in_destination && session.peer == in_initiator) ||
+ (session.peer == in_destination && session.initiator == in_initiator);
+ if (sessionAlreadyExists) {
+ ALOGD("openEndpointSession: session ID %" PRId32 " already exists", in_sessionId);
+ return (session.sessionId == in_sessionId &&
+ session.serviceDescriptor == in_serviceDescriptor)
+ ? ScopedAStatus::ok()
+ : ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ } else if (session.sessionId == in_sessionId) {
+ ALOGE("openEndpointSession: session ID %" PRId32 " is invalid: endpoint mismatch",
+ in_sessionId);
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+ }
+
+ // Verify the initiator and destination are valid endpoints
+ bool initiatorIsValid = findEndpoint(in_initiator, mEndpoints.begin(), mEndpoints.end());
+ if (!initiatorIsValid) {
+ ALOGE("openEndpointSession: initiator %" PRIu64 ":%" PRIu64 " is invalid",
+ in_initiator.id, in_initiator.hubId);
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+ bool destinationIsValid = findEndpoint(in_destination, &kMockEndpointInfos[0],
+ &kMockEndpointInfos[kMockEndpointCount]);
+ if (!destinationIsValid) {
+ ALOGE("openEndpointSession: destination %" PRIu64 ":%" PRIu64 " is invalid",
+ in_destination.id, in_destination.hubId);
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+
+ mEndpointSessions.push_back({
+ .sessionId = in_sessionId,
+ .initiator = in_initiator,
+ .peer = in_destination,
+ .serviceDescriptor = in_serviceDescriptor,
+ });
+
+ if (mEndpointCallback != nullptr) {
+ callback = mEndpointCallback;
+ }
+ }
+
+ if (callback != nullptr) {
+ callback->onEndpointSessionOpenComplete(in_sessionId);
+ }
+ return ScopedAStatus::ok();
};
-ScopedAStatus ContextHub::sendMessageToEndpoint(int32_t /* in_sessionId */,
- const Message& /* in_msg */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ScopedAStatus ContextHub::sendMessageToEndpoint(int32_t in_sessionId, const Message& in_msg) {
+ bool foundSession = false;
+ std::shared_ptr<IEndpointCallback> callback = nullptr;
+ {
+ std::unique_lock<std::mutex> lock(mEndpointMutex);
+
+ for (const EndpointSession& session : mEndpointSessions) {
+ if (session.sessionId == in_sessionId) {
+ foundSession = true;
+ break;
+ }
+ }
+
+ if (mEndpointCallback != nullptr) {
+ callback = mEndpointCallback;
+ }
+ }
+
+ if (!foundSession) {
+ ALOGE("sendMessageToEndpoint: session ID %" PRId32 " is invalid", in_sessionId);
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+
+ if (callback != nullptr) {
+ if (in_msg.flags & Message::FLAG_REQUIRES_DELIVERY_STATUS) {
+ MessageDeliveryStatus msgStatus = {};
+ msgStatus.messageSequenceNumber = in_msg.sequenceNumber;
+ msgStatus.errorCode = ErrorCode::OK;
+ callback->onMessageDeliveryStatusReceived(in_sessionId, msgStatus);
+ }
+
+ // Echo the message back
+ callback->onMessageReceived(in_sessionId, in_msg);
+ }
+ return ScopedAStatus::ok();
};
ScopedAStatus ContextHub::sendMessageDeliveryStatusToEndpoint(
int32_t /* in_sessionId */, const MessageDeliveryStatus& /* in_msgStatus */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ return ScopedAStatus::ok();
};
-ScopedAStatus ContextHub::closeEndpointSession(int32_t /* in_sessionId */, Reason /* in_reason */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ScopedAStatus ContextHub::closeEndpointSession(int32_t in_sessionId, Reason /* in_reason */) {
+ std::unique_lock<std::mutex> lock(mEndpointMutex);
+
+ for (auto it = mEndpointSessions.begin(); it != mEndpointSessions.end(); ++it) {
+ if (it->sessionId == in_sessionId) {
+ mEndpointSessions.erase(it);
+ return ScopedAStatus::ok();
+ }
+ }
+ ALOGE("closeEndpointSession: session ID %" PRId32 " is invalid", in_sessionId);
+ return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
};
ScopedAStatus ContextHub::endpointSessionOpenComplete(int32_t /* in_sessionId */) {
- return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ return ScopedAStatus::ok();
};
} // namespace aidl::android::hardware::contexthub
diff --git a/contexthub/aidl/default/include/contexthub-impl/ContextHub.h b/contexthub/aidl/default/include/contexthub-impl/ContextHub.h
index 5680a77..4968878 100644
--- a/contexthub/aidl/default/include/contexthub-impl/ContextHub.h
+++ b/contexthub/aidl/default/include/contexthub-impl/ContextHub.h
@@ -18,6 +18,7 @@
#include <aidl/android/hardware/contexthub/BnContextHub.h>
+#include <mutex>
#include <unordered_set>
#include <vector>
@@ -72,10 +73,37 @@
::ndk::ScopedAStatus endpointSessionOpenComplete(int32_t in_sessionId) override;
private:
+ struct EndpointSession {
+ int32_t sessionId;
+ EndpointId initiator;
+ EndpointId peer;
+ std::optional<std::string> serviceDescriptor;
+ };
+
static constexpr uint32_t kMockHubId = 0;
+
+ //! Finds an endpoint in the range defined by the endpoints
+ //! @return whether the endpoint was found
+ template <typename Iter>
+ bool findEndpoint(const EndpointId& target, const Iter& begin, const Iter& end) {
+ for (auto iter = begin; iter != end; ++iter) {
+ if (iter->id.id == target.id && iter->id.hubId == target.hubId) {
+ return true;
+ }
+ }
+ return false;
+ }
+
std::shared_ptr<IContextHubCallback> mCallback;
std::unordered_set<char16_t> mConnectedHostEndpoints;
+
+ //! Endpoint storage and information
+ std::mutex mEndpointMutex;
+ std::vector<EndpointInfo> mEndpoints;
+ std::vector<EndpointSession> mEndpointSessions;
+ std::shared_ptr<IEndpointCallback> mEndpointCallback;
+ int32_t mMaxValidSessionId = 0;
};
} // namespace contexthub
diff --git a/contexthub/aidl/vts/Android.bp b/contexthub/aidl/vts/Android.bp
index 62a319e..a19b6fd 100644
--- a/contexthub/aidl/vts/Android.bp
+++ b/contexthub/aidl/vts/Android.bp
@@ -33,7 +33,7 @@
"libbinder",
],
static_libs: [
- "android.hardware.contexthub-V3-cpp",
+ "android.hardware.contexthub-V4-cpp",
"VtsHalContexthubUtils",
],
test_suites: [
diff --git a/contexthub/aidl/vts/VtsAidlHalContextHubTargetTest.cpp b/contexthub/aidl/vts/VtsAidlHalContextHubTargetTest.cpp
index fa427a5..95a96cd 100644
--- a/contexthub/aidl/vts/VtsAidlHalContextHubTargetTest.cpp
+++ b/contexthub/aidl/vts/VtsAidlHalContextHubTargetTest.cpp
@@ -20,8 +20,10 @@
#include <android/hardware/contexthub/BnContextHub.h>
#include <android/hardware/contexthub/BnContextHubCallback.h>
+#include <android/hardware/contexthub/BnEndpointCallback.h>
#include <android/hardware/contexthub/IContextHub.h>
#include <android/hardware/contexthub/IContextHubCallback.h>
+#include <android/hardware/contexthub/IEndpointCallback.h>
#include <binder/IServiceManager.h>
#include <binder/ProcessState.h>
#include <log/log.h>
@@ -34,18 +36,25 @@
using ::android::String16;
using ::android::binder::Status;
using ::android::hardware::contexthub::AsyncEventType;
+using ::android::hardware::contexthub::BnEndpointCallback;
using ::android::hardware::contexthub::ContextHubInfo;
using ::android::hardware::contexthub::ContextHubMessage;
+using ::android::hardware::contexthub::EndpointId;
+using ::android::hardware::contexthub::EndpointInfo;
using ::android::hardware::contexthub::ErrorCode;
using ::android::hardware::contexthub::HostEndpointInfo;
+using ::android::hardware::contexthub::HubInfo;
using ::android::hardware::contexthub::IContextHub;
using ::android::hardware::contexthub::IContextHubCallbackDefault;
+using ::android::hardware::contexthub::Message;
using ::android::hardware::contexthub::MessageDeliveryStatus;
using ::android::hardware::contexthub::NanoappBinary;
using ::android::hardware::contexthub::NanoappInfo;
using ::android::hardware::contexthub::NanoappRpcService;
using ::android::hardware::contexthub::NanSessionRequest;
using ::android::hardware::contexthub::NanSessionStateUpdate;
+using ::android::hardware::contexthub::Reason;
+using ::android::hardware::contexthub::Service;
using ::android::hardware::contexthub::Setting;
using ::android::hardware::contexthub::vts_utils::kNonExistentAppId;
using ::android::hardware::contexthub::vts_utils::waitForCallback;
@@ -61,8 +70,14 @@
contextHub = android::waitForDeclaredService<IContextHub>(
String16(std::get<0>(GetParam()).c_str()));
ASSERT_NE(contextHub, nullptr);
+
+ // Best effort enable test mode - this may not be supported on older HALS, so we
+ // ignore the return value.
+ contextHub->setTestMode(/* enable= */ true);
}
+ virtual void TearDown() override { contextHub->setTestMode(/* enable= */ false); }
+
uint32_t getHubId() { return std::get<1>(GetParam()); }
void testSettingChanged(Setting setting);
@@ -465,6 +480,290 @@
}
}
+class TestEndpointCallback : public BnEndpointCallback {
+ public:
+ Status onEndpointStarted(const std::vector<EndpointInfo>& /* endpointInfos */) override {
+ return Status::ok();
+ }
+
+ Status onEndpointStopped(const std::vector<EndpointId>& /* endpointIds */,
+ Reason /* reason */) override {
+ return Status::ok();
+ }
+
+ Status onMessageReceived(int32_t /* sessionId */, const Message& message) override {
+ mMessages.push_back(message);
+ return Status::ok();
+ }
+
+ Status onMessageDeliveryStatusReceived(int32_t /* sessionId */,
+ const MessageDeliveryStatus& /* msgStatus */) override {
+ return Status::ok();
+ }
+
+ Status onEndpointSessionOpenRequest(
+ int32_t /* sessionId */, const EndpointId& /* destination */,
+ const EndpointId& /* initiator */,
+ const std::optional<String16>& /* serviceDescriptor */) override {
+ return Status::ok();
+ }
+
+ Status onCloseEndpointSession(int32_t /* sessionId */, Reason /* reason */) override {
+ return Status::ok();
+ }
+
+ Status onEndpointSessionOpenComplete(int32_t /* sessionId */) override {
+ mWasOnEndpointSessionOpenCompleteCalled = true;
+ return Status::ok();
+ }
+
+ std::vector<Message> getMessages() { return mMessages; }
+
+ bool wasOnEndpointSessionOpenCompleteCalled() {
+ return mWasOnEndpointSessionOpenCompleteCalled;
+ }
+ void resetWasOnEndpointSessionOpenCompleteCalled() {
+ mWasOnEndpointSessionOpenCompleteCalled = false;
+ }
+
+ private:
+ std::vector<Message> mMessages;
+ bool mWasOnEndpointSessionOpenCompleteCalled = false;
+};
+
+TEST_P(ContextHubAidl, RegisterEndpoint) {
+ EndpointInfo endpointInfo;
+ endpointInfo.id.id = 1;
+ endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
+ endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
+ endpointInfo.name = String16("Test host endpoint 1");
+ endpointInfo.version = 42;
+
+ Status status = contextHub->registerEndpoint(endpointInfo);
+ if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
+ status.transactionError() == android::UNKNOWN_TRANSACTION) {
+ GTEST_SKIP() << "Not supported -> old API; or not implemented";
+ } else {
+ EXPECT_TRUE(status.isOk());
+ }
+}
+
+TEST_P(ContextHubAidl, RegisterEndpointSameNameFailure) {
+ EndpointInfo endpointInfo;
+ endpointInfo.id.id = 2;
+ endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
+ endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
+ endpointInfo.name = String16("Test host endpoint 2");
+ endpointInfo.version = 42;
+
+ EndpointInfo endpointInfo2;
+ endpointInfo2.id.id = 3;
+ endpointInfo2.id.hubId = 0xCAFECAFECAFECAFE;
+ endpointInfo2.type = EndpointInfo::EndpointType::NATIVE;
+ endpointInfo2.name = String16("Test host endpoint 2");
+ endpointInfo2.version = 42;
+
+ Status status = contextHub->registerEndpoint(endpointInfo);
+ if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
+ status.transactionError() == android::UNKNOWN_TRANSACTION) {
+ GTEST_SKIP() << "Not supported -> old API; or not implemented";
+ } else {
+ EXPECT_TRUE(status.isOk());
+ }
+
+ EXPECT_FALSE(contextHub->registerEndpoint(endpointInfo2).isOk());
+}
+
+TEST_P(ContextHubAidl, RegisterEndpointSameIdFailure) {
+ EndpointInfo endpointInfo;
+ endpointInfo.id.id = 4;
+ endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
+ endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
+ endpointInfo.name = String16("Test host endpoint 4");
+ endpointInfo.version = 42;
+
+ EndpointInfo endpointInfo2;
+ endpointInfo2.id.id = 4;
+ endpointInfo2.id.hubId = 0xCAFECAFECAFECAFE;
+ endpointInfo2.type = EndpointInfo::EndpointType::NATIVE;
+ endpointInfo2.name = String16("Test host endpoint - same ID test");
+ endpointInfo2.version = 42;
+
+ Status status = contextHub->registerEndpoint(endpointInfo);
+ if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
+ status.transactionError() == android::UNKNOWN_TRANSACTION) {
+ GTEST_SKIP() << "Not supported -> old API; or not implemented";
+ } else {
+ EXPECT_TRUE(status.isOk());
+ }
+
+ EXPECT_FALSE(contextHub->registerEndpoint(endpointInfo2).isOk());
+}
+
+TEST_P(ContextHubAidl, UnregisterEndpoint) {
+ EndpointInfo endpointInfo;
+ endpointInfo.id.id = 6;
+ endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
+ endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
+ endpointInfo.name = String16("Test host endpoint 6");
+ endpointInfo.version = 42;
+
+ Status status = contextHub->registerEndpoint(endpointInfo);
+ if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
+ status.transactionError() == android::UNKNOWN_TRANSACTION) {
+ GTEST_SKIP() << "Not supported -> old API; or not implemented";
+ } else {
+ EXPECT_TRUE(status.isOk());
+ }
+
+ EXPECT_TRUE(contextHub->unregisterEndpoint(endpointInfo).isOk());
+}
+
+TEST_P(ContextHubAidl, UnregisterEndpointNonexistent) {
+ EndpointInfo endpointInfo;
+ endpointInfo.id.id = 100;
+ endpointInfo.id.hubId = 0xCAFECAFECAFECAFE;
+ endpointInfo.type = EndpointInfo::EndpointType::NATIVE;
+ endpointInfo.name = String16("Test host endpoint 100");
+ endpointInfo.version = 42;
+
+ Status status = contextHub->unregisterEndpoint(endpointInfo);
+ if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
+ status.transactionError() == android::UNKNOWN_TRANSACTION) {
+ GTEST_SKIP() << "Not supported -> old API; or not implemented";
+ } else {
+ EXPECT_FALSE(status.isOk());
+ }
+}
+
+TEST_P(ContextHubAidl, RegisterCallback) {
+ auto cb = sp<TestEndpointCallback>::make();
+ Status status = contextHub->registerEndpointCallback(cb);
+ if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
+ status.transactionError() == android::UNKNOWN_TRANSACTION) {
+ GTEST_SKIP() << "Not supported -> old API; or not implemented";
+ } else {
+ EXPECT_TRUE(status.isOk());
+ }
+}
+
+TEST_P(ContextHubAidl, OpenEndpointSessionInvalidRange) {
+ auto cb = sp<TestEndpointCallback>::make();
+ Status status = contextHub->registerEndpointCallback(cb);
+ if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
+ status.transactionError() == android::UNKNOWN_TRANSACTION) {
+ GTEST_SKIP() << "Not supported -> old API; or not implemented";
+ } else {
+ EXPECT_TRUE(status.isOk());
+ }
+
+ // Register the endpoint
+ EndpointInfo initiatorEndpoint;
+ initiatorEndpoint.id.id = 7;
+ initiatorEndpoint.id.hubId = 0xCAFECAFECAFECAFE;
+ initiatorEndpoint.type = EndpointInfo::EndpointType::NATIVE;
+ initiatorEndpoint.name = String16("Test host endpoint 7");
+ initiatorEndpoint.version = 42;
+ EXPECT_TRUE(contextHub->registerEndpoint(initiatorEndpoint).isOk());
+
+ // Find the destination, if it exists
+ std::vector<EndpointInfo> endpoints;
+ EXPECT_TRUE(contextHub->getEndpoints(&endpoints).isOk());
+ const EndpointInfo* destinationEndpoint = nullptr;
+ for (const EndpointInfo& endpoint : endpoints) {
+ for (const Service& service : endpoint.services) {
+ if (service.serviceDescriptor == String16("ECHO")) {
+ destinationEndpoint = &endpoint;
+ break;
+ }
+ }
+ }
+ if (destinationEndpoint == nullptr) {
+ return; // no echo service endpoint -> just return
+ }
+
+ // Request the range
+ constexpr int32_t requestedRange = 100;
+ std::vector<int32_t> range;
+ ASSERT_TRUE(contextHub->requestSessionIdRange(requestedRange, &range).isOk());
+ EXPECT_EQ(range.size(), 2);
+ EXPECT_GE(range[1] - range[0] + 1, requestedRange);
+
+ // Open the session
+ cb->resetWasOnEndpointSessionOpenCompleteCalled();
+ int32_t sessionId = range[1] + 10; // invalid
+ EXPECT_FALSE(contextHub
+ ->openEndpointSession(sessionId, destinationEndpoint->id,
+ initiatorEndpoint.id,
+ /* in_serviceDescriptor= */ String16("ECHO"))
+ .isOk());
+ EXPECT_FALSE(cb->wasOnEndpointSessionOpenCompleteCalled());
+}
+
+TEST_P(ContextHubAidl, OpenEndpointSessionAndSendMessageEchoesBack) {
+ auto cb = sp<TestEndpointCallback>::make();
+ Status status = contextHub->registerEndpointCallback(cb);
+ if (status.exceptionCode() == Status::EX_UNSUPPORTED_OPERATION ||
+ status.transactionError() == android::UNKNOWN_TRANSACTION) {
+ GTEST_SKIP() << "Not supported -> old API; or not implemented";
+ } else {
+ EXPECT_TRUE(status.isOk());
+ }
+
+ // Register the endpoint
+ EndpointInfo initiatorEndpoint;
+ initiatorEndpoint.id.id = 8;
+ initiatorEndpoint.id.hubId = 0xCAFECAFECAFECAFE;
+ initiatorEndpoint.type = EndpointInfo::EndpointType::NATIVE;
+ initiatorEndpoint.name = String16("Test host endpoint 7");
+ initiatorEndpoint.version = 42;
+ EXPECT_TRUE(contextHub->registerEndpoint(initiatorEndpoint).isOk());
+
+ // Find the destination, if it exists
+ std::vector<EndpointInfo> endpoints;
+ EXPECT_TRUE(contextHub->getEndpoints(&endpoints).isOk());
+ const EndpointInfo* destinationEndpoint = nullptr;
+ for (const EndpointInfo& endpoint : endpoints) {
+ for (const Service& service : endpoint.services) {
+ if (service.serviceDescriptor == String16("ECHO")) {
+ destinationEndpoint = &endpoint;
+ break;
+ }
+ }
+ }
+ if (destinationEndpoint == nullptr) {
+ return; // no echo service endpoint -> just return
+ }
+
+ // Request the range
+ constexpr int32_t requestedRange = 100;
+ std::vector<int32_t> range;
+ ASSERT_TRUE(contextHub->requestSessionIdRange(requestedRange, &range).isOk());
+ EXPECT_EQ(range.size(), 2);
+ EXPECT_GE(range[1] - range[0] + 1, requestedRange);
+
+ // Open the session
+ cb->resetWasOnEndpointSessionOpenCompleteCalled();
+ int32_t sessionId = range[0];
+ ASSERT_TRUE(contextHub
+ ->openEndpointSession(sessionId, destinationEndpoint->id,
+ initiatorEndpoint.id,
+ /* in_serviceDescriptor= */ String16("ECHO"))
+ .isOk());
+ EXPECT_TRUE(cb->wasOnEndpointSessionOpenCompleteCalled());
+
+ // Send the message
+ Message message;
+ message.flags = 0;
+ message.sequenceNumber = 0;
+ message.content.push_back(42);
+ ASSERT_TRUE(contextHub->sendMessageToEndpoint(sessionId, message).isOk());
+
+ // Check for echo
+ EXPECT_FALSE(cb->getMessages().empty());
+ EXPECT_EQ(cb->getMessages().back().content.back(), 42);
+}
+
std::string PrintGeneratedTest(const testing::TestParamInfo<ContextHubAidl::ParamType>& info) {
return std::string("CONTEXT_HUB_ID_") + std::to_string(std::get<1>(info.param));
}
diff --git a/gnss/1.1/default/Android.bp b/gnss/1.1/default/Android.bp
index 697cb91..6c338bd 100644
--- a/gnss/1.1/default/Android.bp
+++ b/gnss/1.1/default/Android.bp
@@ -27,7 +27,7 @@
"android.hardware.gnss@2.0",
"android.hardware.gnss@1.1",
"android.hardware.gnss@1.0",
- "android.hardware.gnss-V4-ndk",
+ "android.hardware.gnss-V5-ndk",
],
static_libs: [
"android.hardware.gnss@common-default-lib",
diff --git a/gnss/1.1/vts/functional/Android.bp b/gnss/1.1/vts/functional/Android.bp
index 65c752c..13984629 100644
--- a/gnss/1.1/vts/functional/Android.bp
+++ b/gnss/1.1/vts/functional/Android.bp
@@ -37,7 +37,7 @@
"android.hardware.gnss@1.1",
"android.hardware.gnss@2.0",
"android.hardware.gnss@common-vts-lib",
- "android.hardware.gnss-V4-cpp",
+ "android.hardware.gnss-V5-cpp",
],
shared_libs: [
"android.hardware.gnss.measurement_corrections@1.0",
diff --git a/gnss/2.0/default/Android.bp b/gnss/2.0/default/Android.bp
index 35c2e37..6a4965b 100644
--- a/gnss/2.0/default/Android.bp
+++ b/gnss/2.0/default/Android.bp
@@ -50,7 +50,7 @@
"android.hardware.gnss@2.0",
"android.hardware.gnss@1.1",
"android.hardware.gnss@1.0",
- "android.hardware.gnss-V4-ndk",
+ "android.hardware.gnss-V5-ndk",
],
static_libs: [
"android.hardware.gnss@common-default-lib",
diff --git a/gnss/2.0/vts/functional/Android.bp b/gnss/2.0/vts/functional/Android.bp
index 4ca3063..08d4cb3 100644
--- a/gnss/2.0/vts/functional/Android.bp
+++ b/gnss/2.0/vts/functional/Android.bp
@@ -40,7 +40,7 @@
"android.hardware.gnss@2.0",
"android.hardware.gnss@2.1",
"android.hardware.gnss@common-vts-lib",
- "android.hardware.gnss-V4-cpp",
+ "android.hardware.gnss-V5-cpp",
],
test_suites: [
"general-tests",
diff --git a/gnss/2.1/default/Android.bp b/gnss/2.1/default/Android.bp
index 1bb7512..a2e652e 100644
--- a/gnss/2.1/default/Android.bp
+++ b/gnss/2.1/default/Android.bp
@@ -44,7 +44,7 @@
"android.hardware.gnss@1.0",
"android.hardware.gnss@1.1",
"android.hardware.gnss@2.0",
- "android.hardware.gnss-V4-ndk",
+ "android.hardware.gnss-V5-ndk",
],
static_libs: [
"android.hardware.gnss@common-default-lib",
diff --git a/gnss/2.1/vts/functional/Android.bp b/gnss/2.1/vts/functional/Android.bp
index af66037..8a8fa93 100644
--- a/gnss/2.1/vts/functional/Android.bp
+++ b/gnss/2.1/vts/functional/Android.bp
@@ -41,7 +41,7 @@
"android.hardware.gnss@2.0",
"android.hardware.gnss@2.1",
"android.hardware.gnss@common-vts-lib",
- "android.hardware.gnss-V4-cpp",
+ "android.hardware.gnss-V5-cpp",
],
shared_libs: [
"libvintf",
diff --git a/gnss/aidl/Android.bp b/gnss/aidl/Android.bp
index 47fc3af..6e159a1 100644
--- a/gnss/aidl/Android.bp
+++ b/gnss/aidl/Android.bp
@@ -30,6 +30,7 @@
"android/hardware/gnss/*.aidl",
"android/hardware/gnss/measurement_corrections/*.aidl",
"android/hardware/gnss/visibility_control/*.aidl",
+ "android/hardware/gnss/gnss_assistance/*.aidl",
],
stability: "vintf",
backend: {
@@ -56,6 +57,6 @@
},
],
- frozen: true,
+ frozen: false,
}
diff --git a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnss.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnss.aidl
index d1aaf2c..fc74612 100644
--- a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnss.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnss.aidl
@@ -61,6 +61,7 @@
void stopSvStatus();
void startNmea();
void stopNmea();
+ android.hardware.gnss.gnss_assistance.IGnssAssistanceInterface getExtensionGnssAssistanceInterface();
const int ERROR_INVALID_ARGUMENT = 1;
const int ERROR_ALREADY_INIT = 2;
const int ERROR_GENERIC = 3;
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/BeidouAlmanac.aidl
similarity index 77%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/BeidouAlmanac.aidl
index a5eda52..f42e1d0 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/BeidouAlmanac.aidl
@@ -31,9 +31,25 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable BeidouAlmanac {
+ int beidouWeekNumber;
+ android.hardware.gnss.gnss_assistance.BeidouAlmanac.BeidouSatelliteAlmanac[] satelliteAlmanac;
+ @VintfStability
+ parcelable BeidouSatelliteAlmanac {
+ int prn;
+ int svHealth;
+ int toaSeconds;
+ double eccentricity;
+ double deltaI;
+ double omega;
+ double omega0;
+ double omegaDot;
+ double rootA;
+ double m0;
+ double af0;
+ double af1;
+ }
}
diff --git a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/BeidouSatelliteEphemeris.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/BeidouSatelliteEphemeris.aidl
new file mode 100644
index 0000000..91735a0
--- /dev/null
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/BeidouSatelliteEphemeris.aidl
@@ -0,0 +1,47 @@
+///////////////////////////////////////////////////////////////////////////////
+// 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.gnss.gnss_assistance;
+/* @hide */
+@VintfStability
+parcelable BeidouSatelliteEphemeris {
+ int prn;
+ android.hardware.gnss.gnss_assistance.BeidouSatelliteEphemeris.BeidouSatelliteClockModel satelliteClockModel;
+ android.hardware.gnss.gnss_assistance.KeplerianOrbitModel satelliteOrbitModel;
+ android.hardware.gnss.gnss_assistance.BeidouSatelliteEphemeris.BeidouSatelliteHealth satelliteHealth;
+ android.hardware.gnss.gnss_assistance.BeidouSatelliteEphemeris.BeidouSatelliteEphemerisTime satelliteEphemerisTime;
+ @VintfStability
+ parcelable BeidouSatelliteClockModel {
+ android.hardware.gnss.gnss_assistance.TimeOfClock timeOfClock;
+ double af0;
+ double af1;
+ double af2;
+ double tgd1;
+ double tgd2;
+ int aodc;
+ }
+ parcelable BeidouSatelliteHealth {
+ int satH1;
+ double svAccur;
+ }
+ parcelable BeidouSatelliteEphemerisTime {
+ int aode;
+ int weekNumber;
+ int toeSeconds;
+ }
+}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GalileoAlmanac.aidl
similarity index 69%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GalileoAlmanac.aidl
index a5eda52..ffe2c3f 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GalileoAlmanac.aidl
@@ -31,9 +31,36 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable GalileoAlmanac {
+ long issueDate;
+ int weekNumber;
+ int toa;
+ int iod;
+ android.hardware.gnss.gnss_assistance.GalileoAlmanac.GalileoSatelliteAlmanac[] satelliteAlmanac;
+ @VintfStability
+ parcelable GalileoSatelliteAlmanac {
+ int svId;
+ android.hardware.gnss.gnss_assistance.GalileoAlmanac.GalileoAlmanacSvHealth svHealth;
+ double eccentricity;
+ double deltaI;
+ double omega;
+ double omega0;
+ double omegaDot;
+ double rootA;
+ double m0;
+ double af0;
+ double af1;
+ int weekNumber;
+ int toa;
+ int iod;
+ }
+ @VintfStability
+ parcelable GalileoAlmanacSvHealth {
+ int fNavE5a;
+ int iNavE5b;
+ int iNavE1b;
+ }
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GalileoIonosphericModel.aidl
similarity index 91%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GalileoIonosphericModel.aidl
index a5eda52..6d8040b 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GalileoIonosphericModel.aidl
@@ -31,9 +31,11 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable GalileoIonosphericModel {
+ double ai0;
+ double ai1;
+ double ai2;
}
diff --git a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GalileoSatelliteEphemeris.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GalileoSatelliteEphemeris.aidl
new file mode 100644
index 0000000..17d48b1
--- /dev/null
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GalileoSatelliteEphemeris.aidl
@@ -0,0 +1,68 @@
+/*
+ * 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.gnss.gnss_assistance;
+/* @hide */
+@VintfStability
+parcelable GalileoSatelliteEphemeris {
+ int satelliteCodeNumber;
+ android.hardware.gnss.gnss_assistance.GalileoSatelliteEphemeris.GalileoSatelliteClockModel[] satelliteClockModel;
+ android.hardware.gnss.gnss_assistance.KeplerianOrbitModel satelliteOrbitModel;
+ android.hardware.gnss.gnss_assistance.GalileoSatelliteEphemeris.GalileoSvHealth svHealth;
+ android.hardware.gnss.gnss_assistance.SatelliteEphemerisTime satelliteEphemerisTime;
+ @VintfStability
+ parcelable GalileoSatelliteClockModel {
+ android.hardware.gnss.gnss_assistance.TimeOfClock toc;
+ double af0;
+ double af1;
+ double af2;
+ double bgdSeconds;
+ double sisaMeters;
+ android.hardware.gnss.gnss_assistance.GalileoSatelliteEphemeris.GalileoSatelliteClockModel.SatelliteClockType satelliteClockType;
+ @Backing(type="int") @VintfStability
+ enum SatelliteClockType {
+ UNDEFINED = 0,
+ GALILEO_FNAV_CLOCK = 1,
+ GALILEO_INAV_CLOCK = 2,
+ }
+ }
+ @VintfStability
+ parcelable GalileoSvHealth {
+ int dataValidityStatusE1b;
+ int signalHealthStatusE1b;
+ int dataValidityStatusE5a;
+ int signalHealthStatusE5a;
+ int dataValidityStatusE5b;
+ int signalHealthStatusE5b;
+ }
+}
diff --git a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GlonassAlmanac.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GlonassAlmanac.aidl
new file mode 100644
index 0000000..a545166
--- /dev/null
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GlonassAlmanac.aidl
@@ -0,0 +1,39 @@
+///////////////////////////////////////////////////////////////////////////////
+// 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.gnss.gnss_assistance;
+/* @hide */
+@VintfStability
+parcelable GlonassAlmanac {
+ long issueDate;
+ android.hardware.gnss.gnss_assistance.GlonassAlmanac.GlonassSatelliteAlmanac[] satelliteAlmanac;
+ @VintfStability
+ parcelable GlonassSatelliteAlmanac {
+ int slotNumber;
+ int svHealth;
+ int frequencyChannel;
+ double tau;
+ double tLambda;
+ double lambda;
+ double deltaI;
+ double deltaT;
+ double deltaTDot;
+ double eccentricity;
+ double omega;
+ }
+}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GlonassSatelliteEphemeris.aidl
similarity index 67%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GlonassSatelliteEphemeris.aidl
index a5eda52..fbab59c 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GlonassSatelliteEphemeris.aidl
@@ -31,9 +31,33 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable GlonassSatelliteEphemeris {
+ int slotNumber;
+ int svHealth;
+ double frameTimeSeconds;
+ int ageInDays;
+ android.hardware.gnss.gnss_assistance.GlonassSatelliteEphemeris.GlonassSatelliteClockModel satelliteClockModel;
+ android.hardware.gnss.gnss_assistance.GlonassSatelliteEphemeris.GlonassSatelliteOrbitModel satelliteOrbitModel;
+ @VintfStability
+ parcelable GlonassSatelliteClockModel {
+ android.hardware.gnss.gnss_assistance.TimeOfClock timeOfClock;
+ double clockBias;
+ double freqBias;
+ int freqNumber;
+ }
+ @VintfStability
+ parcelable GlonassSatelliteOrbitModel {
+ double x;
+ double xDot;
+ double xAccel;
+ double y;
+ double yDot;
+ double yAccel;
+ double z;
+ double zDot;
+ double zAccel;
+ }
}
diff --git a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GnssAssistance.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GnssAssistance.aidl
new file mode 100644
index 0000000..98383ac
--- /dev/null
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GnssAssistance.aidl
@@ -0,0 +1,100 @@
+/*
+ * 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.gnss.gnss_assistance;
+/* @hide */
+@VintfStability
+parcelable GnssAssistance {
+ android.hardware.gnss.gnss_assistance.GnssAssistance.GpsAssistance gpsAssistance;
+ android.hardware.gnss.gnss_assistance.GnssAssistance.GlonassAssistance gloAssistance;
+ android.hardware.gnss.gnss_assistance.GnssAssistance.GalileoAssistance galAssistance;
+ android.hardware.gnss.gnss_assistance.GnssAssistance.BeidouAssistance bdsAssistance;
+ android.hardware.gnss.gnss_assistance.GnssAssistance.QzssAssistance qzsAssistance;
+ @VintfStability
+ parcelable GnssSatelliteCorrections {
+ int svid;
+ android.hardware.gnss.gnss_assistance.IonosphericCorrection[] inonosphericCorrections;
+ }
+ @VintfStability
+ parcelable GpsAssistance {
+ android.hardware.gnss.gnss_assistance.GpsAlmanac almanac;
+ android.hardware.gnss.gnss_assistance.KlobucharIonosphericModel ionosphericModel;
+ android.hardware.gnss.gnss_assistance.UtcModel utcModel;
+ android.hardware.gnss.gnss_assistance.LeapSecondsModel leapSecondsModel;
+ android.hardware.gnss.gnss_assistance.TimeModel[] timeModels;
+ android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris[] satelliteEphemeris;
+ android.hardware.gnss.gnss_assistance.RealTimeIntegrityModel[] realTimeIntegrityModels;
+ android.hardware.gnss.gnss_assistance.GnssAssistance.GnssSatelliteCorrections[] satelliteCorrections;
+ }
+ @VintfStability
+ parcelable GalileoAssistance {
+ android.hardware.gnss.gnss_assistance.GalileoAlmanac almanac;
+ android.hardware.gnss.gnss_assistance.GalileoIonosphericModel ionosphericModel;
+ android.hardware.gnss.gnss_assistance.UtcModel utcModel;
+ android.hardware.gnss.gnss_assistance.LeapSecondsModel leapSecondsModel;
+ android.hardware.gnss.gnss_assistance.TimeModel[] timeModels;
+ android.hardware.gnss.gnss_assistance.GalileoSatelliteEphemeris[] satelliteEphemeris;
+ android.hardware.gnss.gnss_assistance.RealTimeIntegrityModel[] realTimeIntegrityModels;
+ android.hardware.gnss.gnss_assistance.GnssAssistance.GnssSatelliteCorrections[] satelliteCorrections;
+ }
+ @VintfStability
+ parcelable GlonassAssistance {
+ android.hardware.gnss.gnss_assistance.GlonassAlmanac almanac;
+ android.hardware.gnss.gnss_assistance.UtcModel utcModel;
+ android.hardware.gnss.gnss_assistance.TimeModel[] timeModels;
+ android.hardware.gnss.gnss_assistance.GlonassSatelliteEphemeris[] satelliteEphemeris;
+ android.hardware.gnss.gnss_assistance.GnssAssistance.GnssSatelliteCorrections[] satelliteCorrections;
+ }
+ @VintfStability
+ parcelable QzssAssistance {
+ android.hardware.gnss.gnss_assistance.QzssAlmanac almanac;
+ android.hardware.gnss.gnss_assistance.KlobucharIonosphericModel ionosphericModel;
+ android.hardware.gnss.gnss_assistance.UtcModel utcModel;
+ android.hardware.gnss.gnss_assistance.LeapSecondsModel leapSecondsModel;
+ android.hardware.gnss.gnss_assistance.TimeModel[] timeModels;
+ android.hardware.gnss.gnss_assistance.QzssSatelliteEphemeris[] satelliteEphemeris;
+ android.hardware.gnss.gnss_assistance.RealTimeIntegrityModel[] realTimeIntegrityModels;
+ android.hardware.gnss.gnss_assistance.GnssAssistance.GnssSatelliteCorrections[] satelliteCorrections;
+ }
+ @VintfStability
+ parcelable BeidouAssistance {
+ android.hardware.gnss.gnss_assistance.BeidouAlmanac almanac;
+ android.hardware.gnss.gnss_assistance.KlobucharIonosphericModel ionosphericModel;
+ android.hardware.gnss.gnss_assistance.UtcModel utcModel;
+ android.hardware.gnss.gnss_assistance.LeapSecondsModel leapSecondsModel;
+ android.hardware.gnss.gnss_assistance.TimeModel[] timeModels;
+ android.hardware.gnss.gnss_assistance.BeidouSatelliteEphemeris[] satelliteEphemeris;
+ android.hardware.gnss.gnss_assistance.RealTimeIntegrityModel[] realTimeIntegrityModels;
+ android.hardware.gnss.gnss_assistance.GnssAssistance.GnssSatelliteCorrections[] satelliteCorrections;
+ }
+}
diff --git a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GnssCorrectionComponent.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GnssCorrectionComponent.aidl
new file mode 100644
index 0000000..2d43bb3
--- /dev/null
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GnssCorrectionComponent.aidl
@@ -0,0 +1,37 @@
+///////////////////////////////////////////////////////////////////////////////
+// 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.gnss.gnss_assistance;
+/* @hide */
+@VintfStability
+parcelable GnssCorrectionComponent {
+ String sourceKey;
+ android.hardware.gnss.gnss_assistance.GnssCorrectionComponent.GnssInterval validityInterval;
+ android.hardware.gnss.gnss_assistance.GnssCorrectionComponent.PseudorangeCorrection pseudorangeCorrection;
+ @VintfStability
+ parcelable GnssInterval {
+ long startMillisSinceGpsEpoch;
+ long endMillisSinceGpsEpoch;
+ }
+ @VintfStability
+ parcelable PseudorangeCorrection {
+ double correctionMeters;
+ double correctionUncertaintyMeters;
+ double correctionRateMetersPerSecond;
+ }
+}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GpsAlmanac.aidl
similarity index 77%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GpsAlmanac.aidl
index a5eda52..60e0b96 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GpsAlmanac.aidl
@@ -31,9 +31,25 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable GpsAlmanac {
+ int gpsWeekNumber;
+ int secondsOfGpsWeek;
+ android.hardware.gnss.gnss_assistance.GpsAlmanac.GpsSatelliteAlmanac[] satelliteAlmanac;
+ @VintfStability
+ parcelable GpsSatelliteAlmanac {
+ int prn;
+ int svHealth;
+ double eccentricity;
+ double inclination;
+ double omega;
+ double omega0;
+ double omegaDot;
+ double rootA;
+ double m0;
+ double af0;
+ double af1;
+ }
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GpsSatelliteEphemeris.aidl
similarity index 63%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GpsSatelliteEphemeris.aidl
index a5eda52..1e80516 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/GpsSatelliteEphemeris.aidl
@@ -31,9 +31,34 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable GpsSatelliteEphemeris {
+ int prn;
+ android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris.GpsL2Params gpsL2Params;
+ android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris.GpsSatelliteClockModel satelliteClockModel;
+ android.hardware.gnss.gnss_assistance.KeplerianOrbitModel satelliteOrbitModel;
+ android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris.GpsSatelliteHealth satelliteHealth;
+ android.hardware.gnss.gnss_assistance.SatelliteEphemerisTime satelliteEphemerisTime;
+ @VintfStability
+ parcelable GpsL2Params {
+ int l2Code;
+ int l2Flag;
+ }
+ @VintfStability
+ parcelable GpsSatelliteClockModel {
+ android.hardware.gnss.gnss_assistance.TimeOfClock timeOfClock;
+ double af0;
+ double af1;
+ double af2;
+ double tgd;
+ int iodc;
+ }
+ @VintfStability
+ parcelable GpsSatelliteHealth {
+ int svHealth;
+ double svAccur;
+ double fitInt;
+ }
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/IGnssAssistanceCallback.aidl
similarity index 92%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/IGnssAssistanceCallback.aidl
index a5eda52..602a249 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/IGnssAssistanceCallback.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+interface IGnssAssistanceCallback {
+ void injectRequestCb();
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/IGnssAssistanceInterface.aidl
similarity index 84%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/IGnssAssistanceInterface.aidl
index a5eda52..4dd5cf6 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/IGnssAssistanceInterface.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+interface IGnssAssistanceInterface {
+ void injectGnssAssistance(in android.hardware.gnss.gnss_assistance.GnssAssistance gnssAssistance);
+ void setCallback(in android.hardware.gnss.gnss_assistance.IGnssAssistanceCallback callback);
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/IonosphericCorrection.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/IonosphericCorrection.aidl
index a5eda52..e02d97f 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/IonosphericCorrection.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable IonosphericCorrection {
+ long carrierFrequencyHz;
+ android.hardware.gnss.gnss_assistance.GnssCorrectionComponent ionosphericCorrection;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/KeplerianOrbitModel.aidl
similarity index 75%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/KeplerianOrbitModel.aidl
index a5eda52..835c6ec 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/KeplerianOrbitModel.aidl
@@ -31,9 +31,27 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable KeplerianOrbitModel {
+ double rootA;
+ double eccentricity;
+ double i0;
+ double iDot;
+ double omega;
+ double omega0;
+ double omegaDot;
+ double m0;
+ double deltaN;
+ android.hardware.gnss.gnss_assistance.KeplerianOrbitModel.SecondOrderHarmonicPerturbation secondOrderHarmonicPerturbation;
+ @VintfStability
+ parcelable SecondOrderHarmonicPerturbation {
+ double cic;
+ double cis;
+ double crc;
+ double crs;
+ double cuc;
+ double cus;
+ }
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/KlobucharIonosphericModel.aidl
similarity index 87%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/KlobucharIonosphericModel.aidl
index a5eda52..5a0caa5 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/KlobucharIonosphericModel.aidl
@@ -31,9 +31,16 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable KlobucharIonosphericModel {
+ double alpha0;
+ double alpha1;
+ double alpha2;
+ double alpha3;
+ double beta0;
+ double beta1;
+ double beta2;
+ double beta3;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/LeapSecondsModel.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/LeapSecondsModel.aidl
index a5eda52..bc38b9b 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/LeapSecondsModel.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable LeapSecondsModel {
+ int leapSeconds;
+ int leapSecondsFuture;
+ int weekNumberLeapSecondsFuture;
+ int dayNumberLeapSecondsFuture;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/QzssAlmanac.aidl
similarity index 77%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/QzssAlmanac.aidl
index a5eda52..6c645a6 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/QzssAlmanac.aidl
@@ -31,9 +31,25 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable QzssAlmanac {
+ int qzssWeekNumber;
+ int secondsOfQzssWeek;
+ android.hardware.gnss.gnss_assistance.QzssAlmanac.QzssSatelliteAlmanac[] satelliteAlmanac;
+ @VintfStability
+ parcelable QzssSatelliteAlmanac {
+ int prn;
+ int svHealth;
+ double eccentricity;
+ double inclination;
+ double omega;
+ double omega0;
+ double omegaDot;
+ double rootA;
+ double m0;
+ double af0;
+ double af1;
+ }
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/QzssSatelliteEphemeris.aidl
similarity index 74%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/QzssSatelliteEphemeris.aidl
index a5eda52..5bb1c97 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/QzssSatelliteEphemeris.aidl
@@ -31,9 +31,14 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable QzssSatelliteEphemeris {
+ int prn;
+ android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris.GpsL2Params gpsL2Params;
+ android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris.GpsSatelliteClockModel satelliteClockModel;
+ android.hardware.gnss.gnss_assistance.KeplerianOrbitModel satelliteOrbitModel;
+ android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris.GpsSatelliteHealth satelliteHealth;
+ android.hardware.gnss.gnss_assistance.SatelliteEphemerisTime satelliteEphemerisTime;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/RealTimeIntegrityModel.aidl
similarity index 86%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/RealTimeIntegrityModel.aidl
index a5eda52..c7379e1 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/RealTimeIntegrityModel.aidl
@@ -31,9 +31,15 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable RealTimeIntegrityModel {
+ int svid;
+ boolean usable;
+ long publishDateSeconds;
+ long startDateSeconds;
+ long endDateSeconds;
+ String advisoryType;
+ String advisoryNumber;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/SatelliteEphemerisTime.aidl
similarity index 91%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/SatelliteEphemerisTime.aidl
index a5eda52..1e5cd02 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/SatelliteEphemerisTime.aidl
@@ -31,9 +31,11 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable SatelliteEphemerisTime {
+ int iode;
+ int weekNumber;
+ int toeSeconds;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/TimeModel.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/TimeModel.aidl
index a5eda52..e1ce890 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/TimeModel.aidl
@@ -31,9 +31,13 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable TimeModel {
+ android.hardware.gnss.GnssConstellationType toGnss;
+ double a0;
+ double a1;
+ int timeOfWeek;
+ int weekNumber;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/TimeOfClock.aidl
similarity index 90%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/TimeOfClock.aidl
index a5eda52..ae709d4 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/TimeOfClock.aidl
@@ -31,9 +31,14 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable TimeOfClock {
+ int year;
+ int month;
+ int day;
+ int hour;
+ int minute;
+ int seconds;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/UtcModel.aidl
similarity index 91%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/UtcModel.aidl
index a5eda52..df754bc 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/gnss_assistance/UtcModel.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
+package android.hardware.gnss.gnss_assistance;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable UtcModel {
+ double a0;
+ double a1;
+ int timeOfWeek;
+ int weekNumber;
}
diff --git a/gnss/aidl/android/hardware/gnss/IGnss.aidl b/gnss/aidl/android/hardware/gnss/IGnss.aidl
index aaafe7f..5fc8a48 100644
--- a/gnss/aidl/android/hardware/gnss/IGnss.aidl
+++ b/gnss/aidl/android/hardware/gnss/IGnss.aidl
@@ -29,6 +29,7 @@
import android.hardware.gnss.IGnssNavigationMessageInterface;
import android.hardware.gnss.IGnssPowerIndication;
import android.hardware.gnss.IGnssPsds;
+import android.hardware.gnss.gnss_assistance.IGnssAssistanceInterface;
import android.hardware.gnss.measurement_corrections.IMeasurementCorrectionsInterface;
import android.hardware.gnss.visibility_control.IGnssVisibilityControl;
@@ -343,4 +344,11 @@
* Stops the NMEA output stream.
*/
void stopNmea();
+
+ /**
+ * This method returns the IGnssAssistanceInterface.
+ *
+ * @return Handle to the IGnssAssistanceInterface.
+ */
+ IGnssAssistanceInterface getExtensionGnssAssistanceInterface();
}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/BeidouAlmanac.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/BeidouAlmanac.aidl
new file mode 100644
index 0000000..1df485e
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/BeidouAlmanac.aidl
@@ -0,0 +1,78 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/**
+ * Contains Beidou almanac data.
+ * This is defined in BDS-SIS-ICD-B1I-3.0, section 5.2.4.15.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable BeidouAlmanac {
+ /**
+ * Contains Beidou satellite almanac data.
+ * This is defined in BDS-SIS-ICD-B1I-3.0, section 5.2.4.15.
+ */
+ @VintfStability
+ parcelable BeidouSatelliteAlmanac {
+ /** The PRN number of the Beidou satellite. */
+ int prn;
+
+ /** Satellite health (0=healthy, 1=unhealthy). */
+ int svHealth;
+
+ /** Almanac reference time in seconds. */
+ int toaSeconds;
+
+ /** Eccentricity. */
+ double eccentricity;
+
+ /**
+ * Correction of inclination angle relative to reference value at reference time
+ * in semi-circles.
+ */
+ double deltaI;
+
+ /** Argument of perigee in semi-circles. */
+ double omega;
+
+ /** Longitude of ascending node of orbital plane at weekly epoch in semi-circles. */
+ double omega0;
+
+ /** Rate of right ascension in semi-circles per second. */
+ double omegaDot;
+
+ /** Square root of semi-major axis in square root of meters. */
+ double rootA;
+
+ /** Mean anomaly at reference time in semi-circles. */
+ double m0;
+
+ /** Satellite clock time bias correction coefficient in seconds. */
+ double af0;
+
+ /** Satellite clock time drift correction coefficient in seconds per second. */
+ double af1;
+ }
+
+ /** Beidou week number. */
+ int beidouWeekNumber;
+
+ /** Array of BeidouSatelliteAlmanac. */
+ BeidouSatelliteAlmanac[] satelliteAlmanac;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/BeidouSatelliteEphemeris.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/BeidouSatelliteEphemeris.aidl
new file mode 100644
index 0000000..025f402
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/BeidouSatelliteEphemeris.aidl
@@ -0,0 +1,94 @@
+package android.hardware.gnss.gnss_assistance;
+
+import android.hardware.gnss.gnss_assistance.KeplerianOrbitModel;
+import android.hardware.gnss.gnss_assistance.TimeOfClock;
+
+/**
+ * Contains ephemeris parameters specific to Beidou satellites.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable BeidouSatelliteEphemeris {
+ /*
+ * Contains the set of parameters needed for Beidou satellite clock
+ * correction.
+ * This is defined in BDS-SIS-ICD-B1I-3.0, section 5.2.4.9, 5.2.4.10.
+ */
+ @VintfStability
+ parcelable BeidouSatelliteClockModel {
+ /** Time of the clock. */
+ TimeOfClock timeOfClock;
+
+ /** SV clock bias in seconds. */
+ double af0;
+
+ /** SV clock drift in seconds per second. */
+ double af1;
+
+ /** Clock drift rate in seconds per second squared. */
+ double af2;
+
+ /** Group delay differential 1 B1/B3 in seconds. */
+ double tgd1;
+
+ /** Group delay differential 2 B2/B3 in seconds. */
+ double tgd2;
+
+ /**
+ * Age of Data Clock and field range is: 0-31.
+ * This is defined in BDS-SIS-ICD-B1I-3.0 Section 5.2.4.8 Table 5-6.
+ */
+ int aodc;
+ }
+
+ /** Contains information about Beidou health. */
+ parcelable BeidouSatelliteHealth {
+ /**
+ * The autonomous satellite health flag (SatH1) occupies 1 bit. “0” means
+ * broadcasting satellite is good and “1” means not.
+ * This is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.6.
+ */
+ int satH1;
+
+ /**
+ * SV accuracy in meters.
+ * This is defined in the "BROADCAST ORBIT - 6" record of RINEX 3.05
+ * Table A14, pp.78.
+ */
+ double svAccur;
+ }
+
+ /** Contains information about time of ephemeris */
+ parcelable BeidouSatelliteEphemerisTime {
+ /**
+ * AODE Age of Data, Ephemeris.
+ * This is as defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.11 Table 5-8.
+ */
+ int aode;
+
+ /** Beidou week number. */
+ int weekNumber;
+
+ /**
+ * Time of ephemeris in seconds.
+ * This is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.12.
+ */
+ int toeSeconds;
+ }
+
+ /** The PRN number of the Beidou satellite. */
+ int prn;
+
+ /** Satellite clock model. */
+ BeidouSatelliteClockModel satelliteClockModel;
+
+ /** Satellite orbit model. */
+ KeplerianOrbitModel satelliteOrbitModel;
+
+ /** Satellite health. */
+ BeidouSatelliteHealth satelliteHealth;
+
+ /** Satellite ephemeris time. */
+ BeidouSatelliteEphemerisTime satelliteEphemerisTime;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/GalileoAlmanac.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/GalileoAlmanac.aidl
new file mode 100644
index 0000000..db5dd04
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/GalileoAlmanac.aidl
@@ -0,0 +1,117 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/**
+ * Contains Galileo almanac data.
+ * This is defined in Galileo-OS-SIS-ICD-v2.1, 5.1.10.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable GalileoAlmanac {
+ /**
+ * Contains Galileo satellite almanac data.
+ * This is defined in Galileo-OS-SIS-ICD-v2.1, 5.1.10.
+ */
+ @VintfStability
+ parcelable GalileoSatelliteAlmanac {
+ /** Satellite ID. */
+ int svId;
+
+ /** Satellite health status. */
+ GalileoAlmanacSvHealth svHealth;
+
+ /** Eccentricity. */
+ double eccentricity;
+
+ /**
+ * Difference between the inclination angle at reference time and the
+ * nominal inclination, in semi-circles.
+ */
+ double deltaI;
+
+ /** Argument of perigee in semi-circles. */
+ double omega;
+
+ /** Longitude of ascending node of orbital plane at weekly epoch in semi-circles. */
+ double omega0;
+
+ /** Rate of right ascension in semi-circles per second. */
+ double omegaDot;
+
+ /**
+ * Difference with respect to the square root of the nominal semi-major axis
+ * in square root of meters.
+ */
+ double rootA;
+
+ /** Satellite mean anomaly at reference time in semi-circles. */
+ double m0;
+
+ /** Satellite clock correction bias in seconds. */
+ double af0;
+
+ /** Satellite clock correction linear in seconds per second. */
+ double af1;
+
+ /**
+ * Almanac reference week number.
+ * Modulo 4 representation of the Galileo system time week number.
+ */
+ int weekNumber;
+
+ /** Almanac reference time in seconds. */
+ int toa;
+
+ /** Almanac issue of data. */
+ int iod;
+ }
+
+ /**
+ * Contains Galileo satellite health status.
+ */
+ @VintfStability
+ parcelable GalileoAlmanacSvHealth {
+ /** Satellite E5a signal health status. */
+ int fNavE5a;
+
+ /** Satellite E5b signal health status. */
+ int iNavE5b;
+
+ /** Satellite E1b signal health status. */
+ int iNavE1b;
+ }
+
+ /** Almanac reference UTC time in milliseconds */
+ long issueDate;
+
+ /**
+ * Almanac reference week number.
+ * Modulo 4 representation of the Galileo system time week number.
+ */
+ int weekNumber;
+
+ /** Almanac reference time in seconds. */
+ int toa;
+
+ /** Almanac issue of data. */
+ int iod;
+
+ /** Array of GalileoSatelliteAlmanac. */
+ GalileoSatelliteAlmanac[] satelliteAlmanac;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/GalileoIonosphericModel.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/GalileoIonosphericModel.aidl
new file mode 100644
index 0000000..ced8917
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/GalileoIonosphericModel.aidl
@@ -0,0 +1,35 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/**
+ * Contains Galileo ionospheric model.
+ * This is Defined in Galileo-OS-SIS-ICD-v2.1, 5.1.6.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable GalileoIonosphericModel {
+ /** Effective ionisation level 1st order parameter in sfu. */
+ double ai0;
+
+ /** Effective ionisation level 2nd order parameter in sfu per degree. */
+ double ai1;
+
+ /** Effective ionisation level 3nd order parameter in sfu per degree squared. */
+ double ai2;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/GalileoSatelliteEphemeris.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/GalileoSatelliteEphemeris.aidl
new file mode 100644
index 0000000..1562934
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/GalileoSatelliteEphemeris.aidl
@@ -0,0 +1,114 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+import android.hardware.gnss.gnss_assistance.KeplerianOrbitModel;
+import android.hardware.gnss.gnss_assistance.SatelliteEphemerisTime;
+import android.hardware.gnss.gnss_assistance.TimeOfClock;
+
+/**
+ * Contains ephemeris parameters specific to Galileo satellites.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable GalileoSatelliteEphemeris {
+ /**
+ * Contains the set of parameters needed for Galileo satellite clock correction.
+ * This is defined in Galileo-OS-SIS-ICD 5.1.3.
+ */
+ @VintfStability
+ parcelable GalileoSatelliteClockModel {
+ /*
+ * States the type of satellite clock.
+ */
+ @VintfStability
+ @Backing(type="int")
+ enum SatelliteClockType {
+ UNDEFINED = 0,
+ GALILEO_FNAV_CLOCK = 1,
+ GALILEO_INAV_CLOCK = 2
+ }
+
+ /** Time of the clock. */
+ TimeOfClock toc;
+
+ /** SV clock bias correction coefficient in seconds. */
+ double af0;
+
+ /** SV clock drift correction coefficient in seconds per second. */
+ double af1;
+
+ /** SV clock drift rate correction coefficient in seconds per second squared. */
+ double af2;
+
+ /**
+ * Broadcast group delay in seconds.
+ * This is defined in Galileo-OS-SIS-ICD 5.1.5.
+ */
+ double bgdSeconds;
+
+ /**
+ * Signal in space accuracy in meters.
+ * This is defined in Galileo-OS-SIS-ICD 5.1.12.
+ */
+ double sisaMeters;
+
+ /** Type of satellite clock .*/
+ SatelliteClockType satelliteClockType;
+ }
+
+ /**
+ * Contains satellite health.
+ * This is defined in Galileo-OS-SIS-ICD 5.1.9.3.
+ */
+ @VintfStability
+ parcelable GalileoSvHealth {
+ /** E1-B data validity status. */
+ int dataValidityStatusE1b;
+
+ /** E1-B/C signal health status. */
+ int signalHealthStatusE1b;
+
+ /** E5a data validity status. */
+ int dataValidityStatusE5a;
+
+ /** E5a signal health status. */
+ int signalHealthStatusE5a;
+
+ /** E5b data validity status. */
+ int dataValidityStatusE5b;
+
+ /** E5b signal health status. */
+ int signalHealthStatusE5b;
+ }
+
+ /** Satellite code number. */
+ int satelliteCodeNumber;
+
+ /** Array of satellite clock model. */
+ GalileoSatelliteClockModel[] satelliteClockModel;
+
+ /** Satellite orbit model. */
+ KeplerianOrbitModel satelliteOrbitModel;
+
+ /** Satellite health. */
+ GalileoSvHealth svHealth;
+
+ /** Satellite ephemeris time. */
+ SatelliteEphemerisTime satelliteEphemerisTime;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/GlonassAlmanac.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/GlonassAlmanac.aidl
new file mode 100644
index 0000000..2662717
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/GlonassAlmanac.aidl
@@ -0,0 +1,56 @@
+package android.hardware.gnss.gnss_assistance;
+
+/**
+ * Contains Glonass almanac data.
+ * This is defined in Glonass ICD v5.1, Section 4.5.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable GlonassAlmanac {
+ /**
+ * Contains Glonass satellite almanac data.
+ * This is defined in Glonass ICD v5.1, Section 4.5.
+ */
+ @VintfStability
+ parcelable GlonassSatelliteAlmanac {
+ /** Slot number. */
+ int slotNumber;
+
+ /** Satellite health (0=healthy, 1=unhealthy). */
+ int svHealth;
+
+ /** Frequency channel number. */
+ int frequencyChannel;
+
+ /** Coarse value of satellite time correction to GLONASS time in seconds. */
+ double tau;
+
+ /** Time of first ascending node passage of satellite in seconds. */
+ double tLambda;
+
+ /** Longitude of the first ascending node in semi-circles. */
+ double lambda;
+
+ /** Correction to the mean value of inclination in semi-circles. */
+ double deltaI;
+
+ /** Correction to the mean value of the draconian period in seconds per orbital period. */
+ double deltaT;
+
+ /** Rate of change of draconian period in seconds per orbital period squared. */
+ double deltaTDot;
+
+ /** Eccentricity. */
+ double eccentricity;
+
+ /** Argument of perigee in radians. */
+ double omega;
+ }
+
+ /** Almanac reference UTC time in milliseconds. */
+ long issueDate;
+
+ /** Array of GlonassSatelliteAlmanac. */
+ GlonassSatelliteAlmanac[] satelliteAlmanac;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/GlonassSatelliteEphemeris.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/GlonassSatelliteEphemeris.aidl
new file mode 100644
index 0000000..383aed1
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/GlonassSatelliteEphemeris.aidl
@@ -0,0 +1,97 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+import android.hardware.gnss.gnss_assistance.SatelliteEphemerisTime;
+import android.hardware.gnss.gnss_assistance.TimeOfClock;
+
+/**
+ * Contains ephemeris parameters specific to Glonass satellites.
+ * This is defined in RINEX 3.05 APPENDIX 10 and Glonass ICD v5.1, section 4.4.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable GlonassSatelliteEphemeris {
+ /** Contains the set of parameters needed for Glonass satellite clock correction. */
+ @VintfStability
+ parcelable GlonassSatelliteClockModel {
+ /** Time of Clock. */
+ TimeOfClock timeOfClock;
+
+ /** Clock bias in seconds (-TauN). */
+ double clockBias;
+
+ /** Frequency bias (+GammaN). */
+ double freqBias;
+
+ /** Frequency number. */
+ int freqNumber;
+ }
+
+ /** Contains Glonass orbit model parameters in PZ-90 coordinate system. */
+ @VintfStability
+ parcelable GlonassSatelliteOrbitModel {
+ /** X position in kilometers. */
+ double x;
+
+ /** X velocity in kilometers per second. */
+ double xDot;
+
+ /** X acceleration in kilometers per second squared. */
+ double xAccel;
+
+ /** Y position in kilometers. */
+ double y;
+
+ /** Y velocity in kilometers per second. */
+ double yDot;
+
+ /** Y acceleration in kilometers per second squared. */
+ double yAccel;
+
+ /** Z position in kilometers. */
+ double z;
+
+ /** Z velocity in kilometers per second. */
+ double zDot;
+
+ /** Z acceleration in kilometers per second squared. */
+ double zAccel;
+ }
+
+ /**
+ * L1/Satellite system (R), satellite number (slot number in sat.
+ * constellation).
+ */
+ int slotNumber;
+
+ /** Satellite health (0=healthy, 1=unhealthy). */
+ int svHealth;
+
+ /** Message frame time in seconds of the UTC week (tk+nd*86400). */
+ double frameTimeSeconds;
+
+ /** Age of current information in days (E). */
+ int ageInDays;
+
+ /** Satellite clock model. */
+ GlonassSatelliteClockModel satelliteClockModel;
+
+ /** Satellite orbit model. */
+ GlonassSatelliteOrbitModel satelliteOrbitModel;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/GnssAssistance.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/GnssAssistance.aidl
new file mode 100644
index 0000000..dad0764
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/GnssAssistance.aidl
@@ -0,0 +1,209 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+import android.hardware.gnss.gnss_assistance.BeidouAlmanac;
+import android.hardware.gnss.gnss_assistance.BeidouSatelliteEphemeris;
+import android.hardware.gnss.gnss_assistance.GalileoAlmanac;
+import android.hardware.gnss.gnss_assistance.GalileoIonosphericModel;
+import android.hardware.gnss.gnss_assistance.GalileoSatelliteEphemeris;
+import android.hardware.gnss.gnss_assistance.GlonassAlmanac;
+import android.hardware.gnss.gnss_assistance.GlonassSatelliteEphemeris;
+import android.hardware.gnss.gnss_assistance.GpsAlmanac;
+import android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris;
+import android.hardware.gnss.gnss_assistance.IonosphericCorrection;
+import android.hardware.gnss.gnss_assistance.KlobucharIonosphericModel;
+import android.hardware.gnss.gnss_assistance.LeapSecondsModel;
+import android.hardware.gnss.gnss_assistance.QzssAlmanac;
+import android.hardware.gnss.gnss_assistance.QzssSatelliteEphemeris;
+import android.hardware.gnss.gnss_assistance.RealTimeIntegrityModel;
+import android.hardware.gnss.gnss_assistance.TimeModel;
+import android.hardware.gnss.gnss_assistance.UtcModel;
+
+/**
+ * Contains GNSS assistance.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable GnssAssistance {
+ /** GNSS corrections for satellites. */
+ @VintfStability
+ parcelable GnssSatelliteCorrections {
+ /**
+ * Pseudo-random or satellite ID number for the satellite, a.k.a. Space Vehicle (SV), or
+ * OSN number for Glonass. The distinction is made by looking at the constellation field.
+ * Values must be in the range of:
+ *
+ * - GNSS: 1-32
+ * - GLONASS: 1-25
+ * - QZSS: 183-206
+ * - Galileo: 1-36
+ * - Beidou: 1-63
+ */
+ int svid;
+
+ /** Ionospheric corrections */
+ IonosphericCorrection[] inonosphericCorrections;
+ }
+
+ /** Contains GPS assistance. */
+ @VintfStability
+ parcelable GpsAssistance {
+ /** The GPS almanac. */
+ GpsAlmanac almanac;
+
+ /** The Klobuchar ionospheric model. */
+ KlobucharIonosphericModel ionosphericModel;
+
+ /** The UTC model. */
+ UtcModel utcModel;
+
+ /** The leap seconds model. */
+ LeapSecondsModel leapSecondsModel;
+
+ /** The array of time models. */
+ TimeModel[] timeModels;
+
+ /** The array of GPS ephemeris. */
+ GpsSatelliteEphemeris[] satelliteEphemeris;
+
+ /** The array of real time integrity models. */
+ RealTimeIntegrityModel[] realTimeIntegrityModels;
+
+ /** The array of GPS satellite corrections. */
+ GnssSatelliteCorrections[] satelliteCorrections;
+ }
+
+ /** Contains Galileo assistance. */
+ @VintfStability
+ parcelable GalileoAssistance {
+ /** The Galileo almanac. */
+ GalileoAlmanac almanac;
+
+ /** The Galileo ionospheric model. */
+ GalileoIonosphericModel ionosphericModel;
+
+ /** The UTC model. */
+ UtcModel utcModel;
+
+ /** The leap seconds model. */
+ LeapSecondsModel leapSecondsModel;
+
+ /** The array of time models. */
+ TimeModel[] timeModels;
+
+ /** The array of Galileo ephemeris. */
+ GalileoSatelliteEphemeris[] satelliteEphemeris;
+
+ /** The array of real time integrity models. */
+ RealTimeIntegrityModel[] realTimeIntegrityModels;
+
+ /** The array of Galileo satellite corrections. */
+ GnssSatelliteCorrections[] satelliteCorrections;
+ }
+
+ /** Contains Glonass assistance. */
+ @VintfStability
+ parcelable GlonassAssistance {
+ /** The Glonass almanac. */
+ GlonassAlmanac almanac;
+
+ /** The UTC model. */
+ UtcModel utcModel;
+
+ /** The array of time models. */
+ TimeModel[] timeModels;
+
+ /** The array of Glonass ephemeris. */
+ GlonassSatelliteEphemeris[] satelliteEphemeris;
+
+ /** The array of Glonass satellite corrections. */
+ GnssSatelliteCorrections[] satelliteCorrections;
+ }
+
+ /** Contains QZSS assistance. */
+ @VintfStability
+ parcelable QzssAssistance {
+ /** The QZSS almanac. */
+ QzssAlmanac almanac;
+
+ /** The Klobuchar ionospheric model. */
+ KlobucharIonosphericModel ionosphericModel;
+
+ /** The UTC model. */
+ UtcModel utcModel;
+
+ /** The leap seconds model. */
+ LeapSecondsModel leapSecondsModel;
+
+ /** The array of time models. */
+ TimeModel[] timeModels;
+
+ /** The array of QZSS ephemeris. */
+ QzssSatelliteEphemeris[] satelliteEphemeris;
+
+ /** The array of real time integrity models. */
+ RealTimeIntegrityModel[] realTimeIntegrityModels;
+
+ /** The array of QZSS satellite corrections. */
+ GnssSatelliteCorrections[] satelliteCorrections;
+ }
+
+ /** Contains Beidou assistance. */
+ @VintfStability
+ parcelable BeidouAssistance {
+ /** The Beidou almanac. */
+ BeidouAlmanac almanac;
+
+ /** The Klobuchar ionospheric model. */
+ KlobucharIonosphericModel ionosphericModel;
+
+ /** The UTC model. */
+ UtcModel utcModel;
+
+ /** The leap seconds model. */
+ LeapSecondsModel leapSecondsModel;
+
+ /** The array of time models. */
+ TimeModel[] timeModels;
+
+ /** The array of Beidou ephemeris. */
+ BeidouSatelliteEphemeris[] satelliteEphemeris;
+
+ /** The array of real time integrity models. */
+ RealTimeIntegrityModel[] realTimeIntegrityModels;
+
+ /** The array of Beidou satellite corrections. */
+ GnssSatelliteCorrections[] satelliteCorrections;
+ }
+
+ /** GPS assistance. */
+ GpsAssistance gpsAssistance;
+
+ /** Glonass assistance. */
+ GlonassAssistance gloAssistance;
+
+ /** Galileo assistance. */
+ GalileoAssistance galAssistance;
+
+ /** Beidou assistance. */
+ BeidouAssistance bdsAssistance;
+
+ /** QZSS assistance. */
+ QzssAssistance qzsAssistance;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/GnssCorrectionComponent.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/GnssCorrectionComponent.aidl
new file mode 100644
index 0000000..445727f
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/GnssCorrectionComponent.aidl
@@ -0,0 +1,64 @@
+package android.hardware.gnss.gnss_assistance;
+
+/**
+ * Gnss correction associated with a component (e.g. the Ionospheric error).
+ *
+ * @hide
+ */
+@VintfStability
+parcelable GnssCorrectionComponent {
+ /**
+ * Uniquely identifies the source of correction (e.g. "Klobuchar" for
+ * ionospheric corrections).
+ * Clients should not depend on the value of the source key but, rather,
+ * can compare before/after to detect changes.
+ */
+ String sourceKey;
+
+ /**
+ * Time interval referenced against the GPS epoch. The start must be less than
+ * or equal to the end. When the start equals the end, the interval is empty.
+ */
+ @VintfStability
+ parcelable GnssInterval {
+ /**
+ * Inclusive start of the interval in milliseconds since the GPS epoch.
+ * A timestamp matching this interval will have to be the same or after the
+ * start. Required as a reference time for the initial correction value and
+ * its rate of change over time.
+ */
+ long startMillisSinceGpsEpoch;
+
+ /**
+ * Exclusive end of the interval in milliseconds since the GPS epoch. If
+ * specified, a timestamp matching this interval will have to be before the
+ * end.
+ */
+ long endMillisSinceGpsEpoch;
+ }
+
+ /** The correction is only applicable during this time interval. */
+ GnssInterval validityInterval;
+
+ /** Pseudorange correction. */
+ @VintfStability
+ parcelable PseudorangeCorrection {
+ /* Correction to be added to the measured pseudorange, in meters. */
+ double correctionMeters;
+
+ /* Uncertainty of the correction, in meters. */
+ double correctionUncertaintyMeters;
+
+ /**
+ * Linear approximation of the change in correction over time. Intended
+ * usage is to adjust the correction using the formula:
+ * correctionMeters + correctionRateMetersPerSecond * delta_seconds
+ * Where `delta_seconds` is the number of elapsed seconds since the beginning
+ * of the correction validity interval.
+ */
+ double correctionRateMetersPerSecond;
+ }
+
+ /* Pseudorange correction. */
+ PseudorangeCorrection pseudorangeCorrection;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/GpsAlmanac.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/GpsAlmanac.aidl
new file mode 100644
index 0000000..9cc37f9
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/GpsAlmanac.aidl
@@ -0,0 +1,82 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/**
+ * Contains GPS almanac data.
+ * This is defined in IS-GPS-200, section 20.3.3.5.1.2.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable GpsAlmanac {
+ /** GPS week number. */
+ int gpsWeekNumber;
+
+ /** GPS time of week in seconds. */
+ int secondsOfGpsWeek;
+
+ /**
+ * Contains GPS satellite almanac data.
+ * This is defined in IS-GPS-200, section 20.3.3.5.1.2.
+ */
+ @VintfStability
+ parcelable GpsSatelliteAlmanac {
+ /** The PRN number of the GPS satellite. */
+ int prn;
+
+ /**
+ * Satellite health information.
+ * The satellite subframe 4 and 5, page 25 six-bit health code as defined
+ * in IS-GPS-200 Table 20-VIII expressed in integer form.
+ */
+ int svHealth;
+
+ /** Eccentricity. */
+ double eccentricity;
+
+ /**
+ * Correction of inclination angle relative to reference value at
+ * reference time in semi-circles.
+ */
+ double inclination;
+
+ /** Argument of perigee in semi-circles. */
+ double omega;
+
+ /** Longitude of ascending node of orbital plane at weekly epoch in semi-circles. */
+ double omega0;
+
+ /** Rate of right ascension in semi-circles per second. */
+ double omegaDot;
+
+ /** Square root of semi-major axis in square root of meters. */
+ double rootA;
+
+ /** Mean anomaly at reference time in semi-circles. */
+ double m0;
+
+ /** Satellite clock time bias correction coefficient in seconds. */
+ double af0;
+
+ /** Satellite clock time drift correction coefficient in seconds per second. */
+ double af1;
+ }
+
+ /** Array of GpsSatelliteAlmanac. */
+ GpsSatelliteAlmanac[] satelliteAlmanac;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/GpsSatelliteEphemeris.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/GpsSatelliteEphemeris.aidl
new file mode 100644
index 0000000..b24c593
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/GpsSatelliteEphemeris.aidl
@@ -0,0 +1,105 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+import android.hardware.gnss.gnss_assistance.KeplerianOrbitModel;
+import android.hardware.gnss.gnss_assistance.SatelliteEphemerisTime;
+import android.hardware.gnss.gnss_assistance.TimeOfClock;
+
+/**
+ * Contains ephemeris parameters specific to GPS satellites.
+ * This is defined in IS-GPS-200, section 20.3.3.3.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable GpsSatelliteEphemeris {
+ /** Satellite PRN */
+ int prn;
+
+ /* Contains information about L2 params. */
+ @VintfStability
+ parcelable GpsL2Params {
+ /** Code(s) on L2 Channel. */
+ int l2Code;
+
+ /** Data Flag for L2 P-Code. */
+ int l2Flag;
+ }
+
+ /** L2 parameters. */
+ GpsL2Params gpsL2Params;
+
+ /** Contains the set of parameters needed for GPS satellite clock correction. */
+ @VintfStability
+ parcelable GpsSatelliteClockModel {
+ /** Time of the clock. */
+ TimeOfClock timeOfClock;
+
+ /** SV clock bias in seconds. */
+ double af0;
+
+ /** SV clock drift in seconds per second. */
+ double af1;
+
+ /** Clock drift rate in seconds per second squared. */
+ double af2;
+
+ /** Group delay differential in seconds. */
+ double tgd;
+
+ /** Issue of data, clock. */
+ int iodc;
+ }
+
+ /** Clock model. */
+ GpsSatelliteClockModel satelliteClockModel;
+
+ /** Orbit model. */
+ KeplerianOrbitModel satelliteOrbitModel;
+
+ /**
+ * Contains information about GPS health. The information is tied to
+ * Legacy Navigation (LNAV) data, not Civil Navigation (CNAV) data.
+ */
+ @VintfStability
+ parcelable GpsSatelliteHealth {
+ /**
+ * Represents "SV health" in the "BROADCAST ORBIT - 6"
+ * record of RINEX 3.05. Table A6, pp.68.
+ */
+ int svHealth;
+
+ /**
+ * Represents "SV accuracy" in meters in the "BROADCAST ORBIT - 6"
+ * record of RINEX 3.05. Table A6, pp.68.
+ */
+ double svAccur;
+
+ /**
+ * Represents the "Fit Interval" in hours in the "BROADCAST ORBIT - 7"
+ * record of RINEX 3.05. Table A6, pp.69.
+ */
+ double fitInt;
+ }
+
+ /** Satellite health. */
+ GpsSatelliteHealth satelliteHealth;
+
+ /** Ephemeris time. */
+ SatelliteEphemerisTime satelliteEphemerisTime;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/IGnssAssistanceCallback.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/IGnssAssistanceCallback.aidl
new file mode 100644
index 0000000..883189c
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/IGnssAssistanceCallback.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.gnss.gnss_assistance;
+
+/**
+ * The callback interface for GNSS HAL to request GNSS assistance data
+ * (ephemeris and ionospheric corrections) from the framework.
+ *
+ * @hide
+ */
+@VintfStability
+interface IGnssAssistanceCallback {
+ /**
+ * Callback to request the framework to inject GNSS assistance data via
+ * IGnssAssistanceInterface.
+ */
+ void injectRequestCb();
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/IGnssAssistanceInterface.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/IGnssAssistanceInterface.aidl
new file mode 100644
index 0000000..2097e1e
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/IGnssAssistanceInterface.aidl
@@ -0,0 +1,49 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+import android.hardware.gnss.gnss_assistance.GnssAssistance;
+import android.hardware.gnss.gnss_assistance.IGnssAssistanceCallback;
+
+/**
+ * Interface used by the GNSS HAL to request the GNSS assistance data
+ * (ephemeris and ionospheric corrections) from the framework.
+ *
+ * The GNSS chipset uses the injected assistance data in the process of computing
+ * the user position for satellite position computation and error corrections.
+ *
+ * The framework ensures the assistance data is valid. GNSS HAL should request the
+ * data when it's engine lacks valid assistance data.
+ *
+ * @hide
+ */
+@VintfStability
+interface IGnssAssistanceInterface {
+ /**
+ * Inject the GNSS assistance into the GNSS receiver.
+ *
+ * @param gnssAssistance GNSS assistance.
+ */
+ void injectGnssAssistance(in GnssAssistance gnssAssistance);
+
+ /**
+ * Provides the callback routines to request the GNSS assistance.
+ *
+ * @param callback Handle to the IGnssAssistanceCallback interface.
+ */
+ void setCallback(in IGnssAssistanceCallback callback);
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/IonosphericCorrection.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/IonosphericCorrection.aidl
new file mode 100644
index 0000000..e8e50bd
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/IonosphericCorrection.aidl
@@ -0,0 +1,36 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+import android.hardware.gnss.gnss_assistance.GnssCorrectionComponent;
+
+/**
+ * Contains Ionospheric correction.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable IonosphericCorrection {
+ /**
+ * Carrier frequency in Hz to differentiate signals from the same satellite.
+ * e.g. GPS L1/L5
+ */
+ long carrierFrequencyHz;
+
+ /** Ionospheric correction. */
+ GnssCorrectionComponent ionosphericCorrection;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/KeplerianOrbitModel.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/KeplerianOrbitModel.aidl
new file mode 100644
index 0000000..15003e7
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/KeplerianOrbitModel.aidl
@@ -0,0 +1,83 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/**
+ * Contains Keplerian orbit model parameters for GPS/Galileo/QZSS/Beidou.
+ * For GPS, this is defined in IS-GPS-200 Table 20-II.
+ * For Galileo, this is defined in Galileo-OS-SIS-ICD-v2.1 5.1.1.
+ * For QZSS, this is defined in IS-QZSS-PNT section 4.1.2.
+ * For Baidou, this is defined in BDS-SIS-ICD-B1I-3.0 section 5.2.4.12.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable KeplerianOrbitModel {
+ /** Square root of the semi-major axis in square root of meters. */
+ double rootA;
+
+ /** Eccentricity. */
+ double eccentricity;
+
+ /** Inclination angle at reference time in semi-circles. */
+ double i0;
+
+ /** Rate of change of inclination angle in semi-circles per second. */
+ double iDot;
+
+ /** Argument of perigee in semi-circles. */
+ double omega;
+
+ /** Longitude of ascending node of orbit plane at beginning of week in semi-circles. */
+ double omega0;
+
+ /** Rate of right ascension in semi-circles per second. */
+ double omegaDot;
+
+ /** Mean anomaly at reference time in semi-circles. */
+ double m0;
+
+ /** Mean motion difference from computed value in semi-circles per second. */
+ double deltaN;
+
+ /**
+ * Contains second-order harmonic perturbations.
+ */
+ @VintfStability
+ parcelable SecondOrderHarmonicPerturbation {
+ /** Amplitude of cosine harmonic correction term to angle of inclination in radians. */
+ double cic;
+
+ /** Amplitude of sine harmonic correction term to angle of inclination in radians. */
+ double cis;
+
+ /** Amplitude of cosine harmonic correction term to the orbit in meters. */
+ double crc;
+
+ /** Amplitude of sine harmonic correction term to the orbit in meters. */
+ double crs;
+
+ /** Amplitude of cosine harmonic correction term to the argument of latitude in radians. */
+ double cuc;
+
+ /** Amplitude of sine harmonic correction term to the argument of latitude in radians. */
+ double cus;
+ }
+
+ /** Second-order harmonic perturbations. */
+ SecondOrderHarmonicPerturbation secondOrderHarmonicPerturbation;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/KlobucharIonosphericModel.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/KlobucharIonosphericModel.aidl
new file mode 100644
index 0000000..e261e97
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/KlobucharIonosphericModel.aidl
@@ -0,0 +1,50 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/**
+ * Contains Klobuchar ionospheric model coefficients used by GPS, BDS, QZSS.
+ * This is defined in IS-GPS-200 20.3.3.5.1.7.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable KlobucharIonosphericModel {
+ /** Alpha0 coefficient in seconds. */
+ double alpha0;
+
+ /** Alpha1 coefficient in seconds per semi-circle. */
+ double alpha1;
+
+ /** Alpha2 coefficient in seconds per semi-circle squared. */
+ double alpha2;
+
+ /** Alpha3 coefficient in seconds per semi-circle cubed. */
+ double alpha3;
+
+ /** Beta0 coefficient in seconds. */
+ double beta0;
+
+ /** Beta1 coefficient in seconds per semi-circle. */
+ double beta1;
+
+ /** Beta2 coefficient in seconds per semi-circle squared. */
+ double beta2;
+
+ /** Beta3 coefficient in seconds per semi-circle cubed. */
+ double beta3;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/LeapSecondsModel.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/LeapSecondsModel.aidl
new file mode 100644
index 0000000..0ebd46d
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/LeapSecondsModel.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.
+ */
+
+package android.hardware.gnss.gnss_assistance;
+
+/**
+ * Contains the leap seconds set of parameters needed for GNSS time.
+ * This is defined in RINEX 3.05 "LEAP SECONDS" in table A2.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable LeapSecondsModel {
+ /** Time difference due to leap seconds before the event in seconds. */
+ int leapSeconds;
+
+ /** Time difference due to leap seconds after the event in seconds. */
+ int leapSecondsFuture;
+
+ /** GNSS week number in which the leap second event will occur. */
+ int weekNumberLeapSecondsFuture;
+
+ /** Day number when the next leap second will occur. */
+ int dayNumberLeapSecondsFuture;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/QzssAlmanac.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/QzssAlmanac.aidl
new file mode 100644
index 0000000..80ace39
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/QzssAlmanac.aidl
@@ -0,0 +1,82 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/**
+ * Contains QZSS almanac data.
+ * This is defined in IS-QZSS-PNT, section 4.1.2.6.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable QzssAlmanac {
+ /** QZSS week number. */
+ int qzssWeekNumber;
+
+ /** QZSS time of week in seconds. */
+ int secondsOfQzssWeek;
+
+ /**
+ * Contains QZSS satellite almanac data.
+ * This is defined in IS-QZSS-PNT, section 4.1.2.6.
+ */
+ @VintfStability
+ parcelable QzssSatelliteAlmanac {
+ /** The PRN number of the QZSS satellite. */
+ int prn;
+
+ /**
+ * Satellite health information.
+ * This is the 5-bit health code as defined in IS-QZSS-PNT, Table 4.1.2-5-2
+ * expressed in integer form.
+ */
+ int svHealth;
+
+ /** Eccentricity. */
+ double eccentricity;
+
+ /**
+ * Correction of inclination angle relative to reference value at
+ * reference time in semi-circles.
+ */
+ double inclination;
+
+ /** Argument of perigee in semi-circles. */
+ double omega;
+
+ /** Longitude of ascending node of orbital plane at weekly epoch in semi-circles. */
+ double omega0;
+
+ /** Rate of right ascension in semi-circles per second. */
+ double omegaDot;
+
+ /** Square root of semi-major axis in square root of meters. */
+ double rootA;
+
+ /** Mean anomaly at reference time in semi-circles. */
+ double m0;
+
+ /** Satellite clock time bias correction coefficient in seconds. */
+ double af0;
+
+ /** Satellite clock time drift correction coefficient in seconds per second. */
+ double af1;
+ }
+
+ /** Array of QzssSatelliteAlmanac. */
+ QzssSatelliteAlmanac[] satelliteAlmanac;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/QzssSatelliteEphemeris.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/QzssSatelliteEphemeris.aidl
new file mode 100644
index 0000000..7efa4d9
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/QzssSatelliteEphemeris.aidl
@@ -0,0 +1,51 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+import android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris.GpsL2Params;
+import android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris.GpsSatelliteClockModel;
+import android.hardware.gnss.gnss_assistance.GpsSatelliteEphemeris.GpsSatelliteHealth;
+import android.hardware.gnss.gnss_assistance.KeplerianOrbitModel;
+import android.hardware.gnss.gnss_assistance.SatelliteEphemerisTime;
+import android.hardware.gnss.gnss_assistance.TimeOfClock;
+
+/**
+ * Contains ephemeris parameters specific to QZSS satellites.
+ * This is defined in IS-QZSS-PNT, section 4.1.2.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable QzssSatelliteEphemeris {
+ /** Satellite PRN. */
+ int prn;
+
+ /** L2 parameters. */
+ GpsL2Params gpsL2Params;
+
+ /** Clock model. */
+ GpsSatelliteClockModel satelliteClockModel;
+
+ /** Orbit model. */
+ KeplerianOrbitModel satelliteOrbitModel;
+
+ /** Satellite health. */
+ GpsSatelliteHealth satelliteHealth;
+
+ /** Ephemeris time. */
+ SatelliteEphemerisTime satelliteEphemerisTime;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/RealTimeIntegrityModel.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/RealTimeIntegrityModel.aidl
new file mode 100644
index 0000000..4a4122c
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/RealTimeIntegrityModel.aidl
@@ -0,0 +1,69 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/**
+ * Contains the real time integrity status of a GNSS satellite based on
+ * notice advisory.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable RealTimeIntegrityModel {
+ /**
+ * Pseudo-random or satellite ID number for the satellite, a.k.a. Space Vehicle (SV), or
+ * OSN number for Glonass. The distinction is made by looking at the constellation field.
+ * Values must be in the range of:
+ *
+ * - GNSS: 1-32
+ * - GLONASS: 1-25
+ * - QZSS: 183-206
+ * - Galileo: 1-36
+ * - Beidou: 1-63
+ */
+ int svid;
+
+ /** Indicates whether the satellite is currently usable for navigation. */
+ boolean usable;
+
+ /** UTC timestamp (in seconds) when the advisory was published. */
+ long publishDateSeconds;
+
+ /** UTC timestamp (in seconds) for the start of the event. */
+ long startDateSeconds;
+
+ /** UTC timestamp (in seconds) for the end of the event. */
+ long endDateSeconds;
+
+ /**
+ * Abbreviated type of the advisory, providing a concise summary of the event.
+ * This field follows different definitions depending on the GNSS constellation:
+ * - GPS: See NANU type definitions
+ * (https://www.navcen.uscg.gov/nanu-abbreviations-and-descriptions)
+ * - Galileo: See NAGU type definitions
+ * (https://www.gsc-europa.eu/system-service-status/nagu-information)
+ * - QZSS: See NAQU type definitions (https://sys.qzss.go.jp/dod/en/naqu/type.html)
+ * - BeiDou: Not used; set to an empty string.
+ */
+ String advisoryType;
+
+ /**
+ * Unique identifier for the advisory within its constellation's system.
+ * For BeiDou, this is not used and should be an empty string.
+ */
+ String advisoryNumber;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/SatelliteEphemerisTime.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/SatelliteEphemerisTime.aidl
new file mode 100644
index 0000000..2d9b3e6
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/SatelliteEphemerisTime.aidl
@@ -0,0 +1,36 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/**
+ * Contains time of ephemeris.
+ *
+ * For GPS, this is defined in IS-GPS-200, section 20.3.3.4.1.
+ * For QZSS, this is defined in IS-QZSS-200, section 4.1.2.4.
+ * @hide
+ */
+@VintfStability
+parcelable SatelliteEphemerisTime {
+ /** The issue of ephemeris data. */
+ int iode;
+
+ /** The satellite week number. */
+ int weekNumber;
+
+ /** The broadcast time of ephemeris in GNSS time of week in seconds. */
+ int toeSeconds;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/TimeModel.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/TimeModel.aidl
new file mode 100644
index 0000000..8804f02
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/TimeModel.aidl
@@ -0,0 +1,46 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+import android.hardware.gnss.GnssConstellationType;
+
+/*
+ * Contains the GNSS-GNSS system time offset between the GNSS system time.
+ * This is defined in RINEX 3.05 "TIME SYSTEM CORR" in table A5.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable TimeModel {
+ /*
+ * Model represents parameters to convert from current GNSS to GNSS system
+ * time indicated by toGnss.
+ */
+ GnssConstellationType toGnss;
+
+ /** Bias coefficient of GNSS time scale relative to GNSS time scale in seconds. */
+ double a0;
+
+ /** Drift coefficient of GNSS time scale relative to GNSS time scale in seconds per second. */
+ double a1;
+
+ /** Reference GNSS time of week in seconds. */
+ int timeOfWeek;
+
+ /** Reference GNSS week number. */
+ int weekNumber;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/TimeOfClock.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/TimeOfClock.aidl
new file mode 100644
index 0000000..7b9cc9f
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/TimeOfClock.aidl
@@ -0,0 +1,43 @@
+/*
+ * 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.gnss.gnss_assistance;
+
+/*
+ * Contains the reference time of the GNSS clock.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable TimeOfClock {
+ /** Year of the clock. */
+ int year;
+
+ /** Month of the clock. */
+ int month;
+
+ /** Day of the clock. */
+ int day;
+
+ /** Hour of the clock. */
+ int hour;
+
+ /** Minute of the clock. */
+ int minute;
+
+ /** Second of the clock. */
+ int seconds;
+}
diff --git a/gnss/aidl/android/hardware/gnss/gnss_assistance/UtcModel.aidl b/gnss/aidl/android/hardware/gnss/gnss_assistance/UtcModel.aidl
new file mode 100644
index 0000000..c16a711
--- /dev/null
+++ b/gnss/aidl/android/hardware/gnss/gnss_assistance/UtcModel.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.
+ */
+
+package android.hardware.gnss.gnss_assistance;
+
+/**
+ * Contains parameters to convert from current GNSS time to UTC time.
+ * This is defined in RINEX 3.05 "TIME SYSTEM CORR" in table A5.
+ *
+ * @hide
+ */
+@VintfStability
+parcelable UtcModel {
+ /** Bias coefficient of GNSS time scale relative to UTC time scale in seconds. */
+ double a0;
+
+ /** Drift coefficient of GNSS time scale relative to UTC time scale in seconds per second. */
+ double a1;
+
+ /** Reference GNSS time of week in seconds. */
+ int timeOfWeek;
+
+ /** Reference GNSS week number. */
+ int weekNumber;
+}
diff --git a/gnss/aidl/default/Android.bp b/gnss/aidl/default/Android.bp
index 822e8fc..efe2953 100644
--- a/gnss/aidl/default/Android.bp
+++ b/gnss/aidl/default/Android.bp
@@ -45,13 +45,14 @@
"android.hardware.gnss.measurement_corrections@1.1",
"android.hardware.gnss.measurement_corrections@1.0",
"android.hardware.gnss.visibility_control@1.0",
- "android.hardware.gnss-V4-ndk",
+ "android.hardware.gnss-V5-ndk",
],
srcs: [
"AGnssRil.cpp",
"AGnss.cpp",
"Gnss.cpp",
"GnssAntennaInfo.cpp",
+ "GnssAssistanceInterface.cpp",
"GnssBatching.cpp",
"GnssDebug.cpp",
"GnssGeofence.cpp",
diff --git a/gnss/aidl/default/Gnss.cpp b/gnss/aidl/default/Gnss.cpp
index 94d4d00..4978281 100644
--- a/gnss/aidl/default/Gnss.cpp
+++ b/gnss/aidl/default/Gnss.cpp
@@ -25,6 +25,7 @@
#include "DeviceFileReader.h"
#include "FixLocationParser.h"
#include "GnssAntennaInfo.h"
+#include "GnssAssistanceInterface.h"
#include "GnssBatching.h"
#include "GnssConfiguration.h"
#include "GnssDebug.h"
@@ -390,6 +391,14 @@
return ndk::ScopedAStatus::ok();
}
+ndk::ScopedAStatus Gnss::getExtensionGnssAssistanceInterface(
+ std::shared_ptr<gnss_assistance::IGnssAssistanceInterface>* iGnssAssistanceInterface) {
+ ALOGD("Gnss::getExtensionGnssAssistanceInterface");
+
+ *iGnssAssistanceInterface = SharedRefBase::make<gnss_assistance::GnssAssistanceInterface>();
+ return ndk::ScopedAStatus::ok();
+}
+
void Gnss::setGnssMeasurementEnabled(const bool enabled) {
mGnssMeasurementEnabled = enabled;
}
diff --git a/gnss/aidl/default/Gnss.h b/gnss/aidl/default/Gnss.h
index 73085ef..56fe399 100644
--- a/gnss/aidl/default/Gnss.h
+++ b/gnss/aidl/default/Gnss.h
@@ -26,6 +26,7 @@
#include <aidl/android/hardware/gnss/BnGnssMeasurementInterface.h>
#include <aidl/android/hardware/gnss/BnGnssPowerIndication.h>
#include <aidl/android/hardware/gnss/BnGnssPsds.h>
+#include <aidl/android/hardware/gnss/gnss_assistance/BnGnssAssistanceInterface.h>
#include <aidl/android/hardware/gnss/measurement_corrections/BnMeasurementCorrectionsInterface.h>
#include <aidl/android/hardware/gnss/visibility_control/BnGnssVisibilityControl.h>
#include <atomic>
@@ -83,6 +84,9 @@
std::shared_ptr<android::hardware::gnss::measurement_corrections::
IMeasurementCorrectionsInterface>* iMeasurementCorrections)
override;
+ ndk::ScopedAStatus getExtensionGnssAssistanceInterface(
+ std::shared_ptr<android::hardware::gnss::gnss_assistance::IGnssAssistanceInterface>*
+ iGnssAssistanceInterface) override;
void reportSvStatus() const;
void setGnssMeasurementEnabled(const bool enabled);
diff --git a/gnss/aidl/default/GnssAssistanceInterface.cpp b/gnss/aidl/default/GnssAssistanceInterface.cpp
new file mode 100644
index 0000000..2ef334c
--- /dev/null
+++ b/gnss/aidl/default/GnssAssistanceInterface.cpp
@@ -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.
+ */
+
+#define LOG_TAG "GnssAssistanceInterfaceAidl"
+
+#include "GnssAssistanceInterface.h"
+#include <aidl/android/hardware/gnss/BnGnss.h>
+#include <log/log.h>
+
+namespace aidl::android::hardware::gnss::gnss_assistance {
+
+std::shared_ptr<IGnssAssistanceCallback> GnssAssistanceInterface::sCallback = nullptr;
+
+ndk::ScopedAStatus GnssAssistanceInterface::setCallback(
+ const std::shared_ptr<IGnssAssistanceCallback>& callback) {
+ ALOGD("setCallback");
+ std::unique_lock<std::mutex> lock(mMutex);
+ sCallback = callback;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus GnssAssistanceInterface::injectGnssAssistance(
+ const GnssAssistance& gnssAssistance) {
+ ALOGD("injectGnssAssistance. %s", gnssAssistance.toString().c_str());
+ if (gnssAssistance.gpsAssistance.satelliteEphemeris.size() == 0 &&
+ gnssAssistance.gpsAssistance.satelliteCorrections.size() == 0) {
+ ALOGE("Empty GnssAssistance");
+ return ndk::ScopedAStatus::fromServiceSpecificError(IGnss::ERROR_INVALID_ARGUMENT);
+ }
+ return ndk::ScopedAStatus::ok();
+}
+} // namespace aidl::android::hardware::gnss::gnss_assistance
diff --git a/gnss/aidl/default/GnssAssistanceInterface.h b/gnss/aidl/default/GnssAssistanceInterface.h
new file mode 100644
index 0000000..9d92975
--- /dev/null
+++ b/gnss/aidl/default/GnssAssistanceInterface.h
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <aidl/android/hardware/gnss/gnss_assistance/BnGnssAssistanceInterface.h>
+
+namespace aidl::android::hardware::gnss::gnss_assistance {
+
+struct GnssAssistanceInterface : public BnGnssAssistanceInterface {
+ public:
+ ndk::ScopedAStatus setCallback(
+ const std::shared_ptr<IGnssAssistanceCallback>& callback) override;
+ ndk::ScopedAStatus injectGnssAssistance(const GnssAssistance& gnssAssistance) override;
+
+ private:
+ // Guarded by mMutex
+ static std::shared_ptr<IGnssAssistanceCallback> sCallback;
+
+ // Synchronization lock for sCallback
+ mutable std::mutex mMutex;
+};
+
+} // namespace aidl::android::hardware::gnss::gnss_assistance
diff --git a/gnss/aidl/default/gnss-default.xml b/gnss/aidl/default/gnss-default.xml
index c01069e..700e240 100644
--- a/gnss/aidl/default/gnss-default.xml
+++ b/gnss/aidl/default/gnss-default.xml
@@ -1,7 +1,7 @@
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.gnss</name>
- <version>4</version>
+ <version>5</version>
<interface>
<name>IGnss</name>
<instance>default</instance>
diff --git a/gnss/aidl/vts/Android.bp b/gnss/aidl/vts/Android.bp
index 2bd6f07..20cf44f 100644
--- a/gnss/aidl/vts/Android.bp
+++ b/gnss/aidl/vts/Android.bp
@@ -52,7 +52,7 @@
"libbinder",
],
static_libs: [
- "android.hardware.gnss-V4-cpp",
+ "android.hardware.gnss-V5-cpp",
"android.hardware.gnss@common-vts-lib",
],
test_suites: [
diff --git a/gnss/aidl/vts/gnss_hal_test_cases.cpp b/gnss/aidl/vts/gnss_hal_test_cases.cpp
index e4890a7..a2e81d1 100644
--- a/gnss/aidl/vts/gnss_hal_test_cases.cpp
+++ b/gnss/aidl/vts/gnss_hal_test_cases.cpp
@@ -25,6 +25,7 @@
#include <android/hardware/gnss/IGnssMeasurementInterface.h>
#include <android/hardware/gnss/IGnssPowerIndication.h>
#include <android/hardware/gnss/IGnssPsds.h>
+#include <android/hardware/gnss/gnss_assistance/IGnssAssistanceInterface.h>
#include <android/hardware/gnss/measurement_corrections/IMeasurementCorrectionsInterface.h>
#include <android/hardware/gnss/visibility_control/IGnssVisibilityControl.h>
#include <cutils/properties.h>
@@ -73,6 +74,8 @@
using android::hardware::gnss::PsdsType;
using android::hardware::gnss::SatellitePvt;
using android::hardware::gnss::common::Utils;
+using android::hardware::gnss::gnss_assistance::GnssAssistance;
+using android::hardware::gnss::gnss_assistance::IGnssAssistanceInterface;
using android::hardware::gnss::measurement_corrections::IMeasurementCorrectionsInterface;
using android::hardware::gnss::visibility_control::IGnssVisibilityControl;
@@ -1877,3 +1880,22 @@
}
}
}
+
+/*
+ * Test GnssAssistanceExtension:
+ * 1. Gets the GnssAssistanceExtension
+ * 2. Injects empty GnssAssistance data and verifies that it returns an error.
+ */
+TEST_P(GnssHalTest, TestGnssAssistanceExtension) {
+ // Only runs on devices launched in Android 16+
+ if (aidl_gnss_hal_->getInterfaceVersion() <= 4) {
+ return;
+ }
+ sp<IGnssAssistanceInterface> iGnssAssistance;
+ auto status = aidl_gnss_hal_->getExtensionGnssAssistanceInterface(&iGnssAssistance);
+ if (status.isOk() && iGnssAssistance != nullptr) {
+ GnssAssistance gnssAssistance = {};
+ status = iGnssAssistance->injectGnssAssistance(gnssAssistance);
+ ASSERT_FALSE(status.isOk());
+ }
+}
diff --git a/gnss/common/utils/default/Android.bp b/gnss/common/utils/default/Android.bp
index 208bc59..e8c370a 100644
--- a/gnss/common/utils/default/Android.bp
+++ b/gnss/common/utils/default/Android.bp
@@ -57,6 +57,6 @@
"android.hardware.gnss@2.1",
"android.hardware.gnss.measurement_corrections@1.1",
"android.hardware.gnss.measurement_corrections@1.0",
- "android.hardware.gnss-V4-ndk",
+ "android.hardware.gnss-V5-ndk",
],
}
diff --git a/gnss/common/utils/vts/Android.bp b/gnss/common/utils/vts/Android.bp
index ed5674c..b8b048a 100644
--- a/gnss/common/utils/vts/Android.bp
+++ b/gnss/common/utils/vts/Android.bp
@@ -44,7 +44,7 @@
"android.hardware.gnss@2.1",
"android.hardware.gnss.measurement_corrections@1.0",
"android.hardware.gnss.measurement_corrections@1.1",
- "android.hardware.gnss-V4-cpp",
+ "android.hardware.gnss-V5-cpp",
],
static_libs: [
"libgtest",
diff --git a/graphics/Android.bp b/graphics/Android.bp
index 0ad3852..2213f15 100644
--- a/graphics/Android.bp
+++ b/graphics/Android.bp
@@ -35,9 +35,13 @@
cc_defaults {
name: "android.hardware.graphics.allocator-ndk_static",
- static_libs: [
- "android.hardware.graphics.allocator-V2-ndk",
- ],
+ target: {
+ linux: {
+ static_libs: [
+ "android.hardware.graphics.allocator-V2-ndk",
+ ],
+ },
+ },
defaults: [
"android.hardware.graphics.common-ndk_static",
],
@@ -45,9 +49,13 @@
cc_defaults {
name: "android.hardware.graphics.allocator-ndk_shared",
- shared_libs: [
- "android.hardware.graphics.allocator-V2-ndk",
- ],
+ target: {
+ linux: {
+ shared_libs: [
+ "android.hardware.graphics.allocator-V2-ndk",
+ ],
+ },
+ },
defaults: [
"android.hardware.graphics.common-ndk_shared",
],
@@ -56,29 +64,37 @@
aidl_interface_defaults {
name: "android.hardware.graphics.common-latest",
imports: [
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
}
rust_defaults {
name: "android.hardware.graphics.common-latest-rust",
rustlibs: [
- "android.hardware.graphics.common-V5-rust",
+ "android.hardware.graphics.common-V6-rust",
],
}
cc_defaults {
name: "android.hardware.graphics.common-ndk_static",
- static_libs: [
- "android.hardware.graphics.common-V5-ndk",
- ],
+ target: {
+ linux: {
+ static_libs: [
+ "android.hardware.graphics.common-V6-ndk",
+ ],
+ },
+ },
}
cc_defaults {
name: "android.hardware.graphics.common-ndk_shared",
- shared_libs: [
- "android.hardware.graphics.common-V5-ndk",
- ],
+ target: {
+ linux: {
+ shared_libs: [
+ "android.hardware.graphics.common-V6-ndk",
+ ],
+ },
+ },
}
aidl_interface_defaults {
@@ -90,16 +106,24 @@
cc_defaults {
name: "android.hardware.graphics.composer3-ndk_static",
- static_libs: [
- "android.hardware.drm.common-V1-ndk",
- "android.hardware.graphics.composer3-V4-ndk",
- ],
+ target: {
+ linux: {
+ static_libs: [
+ "android.hardware.drm.common-V1-ndk",
+ "android.hardware.graphics.composer3-V4-ndk",
+ ],
+ },
+ },
}
cc_defaults {
name: "android.hardware.graphics.composer3-ndk_shared",
- shared_libs: [
- "android.hardware.drm.common-V1-ndk",
- "android.hardware.graphics.composer3-V4-ndk",
- ],
+ target: {
+ linux: {
+ shared_libs: [
+ "android.hardware.drm.common-V1-ndk",
+ "android.hardware.graphics.composer3-V4-ndk",
+ ],
+ },
+ },
}
diff --git a/graphics/allocator/aidl/Android.bp b/graphics/allocator/aidl/Android.bp
index 30b341c..3f74b23 100644
--- a/graphics/allocator/aidl/Android.bp
+++ b/graphics/allocator/aidl/Android.bp
@@ -45,7 +45,7 @@
version: "2",
imports: [
"android.hardware.common-V2",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
diff --git a/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/DisplayHotplugEvent.aidl b/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/DisplayHotplugEvent.aidl
index 63dca0a..b18d2be 100644
--- a/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/DisplayHotplugEvent.aidl
+++ b/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/DisplayHotplugEvent.aidl
@@ -39,4 +39,5 @@
ERROR_UNKNOWN = (-1) /* -1 */,
ERROR_INCOMPATIBLE_CABLE = (-2) /* -2 */,
ERROR_TOO_MANY_DISPLAYS = (-3) /* -3 */,
+ ERROR_LINK_UNSTABLE = (-4) /* -4 */,
}
diff --git a/graphics/common/aidl/android/hardware/graphics/common/DisplayHotplugEvent.aidl b/graphics/common/aidl/android/hardware/graphics/common/DisplayHotplugEvent.aidl
index b35ada5..c807ffd 100644
--- a/graphics/common/aidl/android/hardware/graphics/common/DisplayHotplugEvent.aidl
+++ b/graphics/common/aidl/android/hardware/graphics/common/DisplayHotplugEvent.aidl
@@ -43,4 +43,11 @@
* displays that can be simultaneously connected
*/
ERROR_TOO_MANY_DISPLAYS = -3,
+
+ /**
+ * Display link is unstable, e.g. link training failure (negotiation
+ * of connection speed failed), and the display needs to be
+ * reconfigured
+ */
+ ERROR_LINK_UNSTABLE = -4,
}
diff --git a/graphics/common/aidl/android/hardware/graphics/common/StandardMetadataType.aidl b/graphics/common/aidl/android/hardware/graphics/common/StandardMetadataType.aidl
index 8cfdae6..e4da890 100644
--- a/graphics/common/aidl/android/hardware/graphics/common/StandardMetadataType.aidl
+++ b/graphics/common/aidl/android/hardware/graphics/common/StandardMetadataType.aidl
@@ -282,7 +282,7 @@
* When it is encoded into a byte stream, the total number of Rects is written using
* 8 bytes in little endian. It is followed by each Rect.
*
- * To encode a Rect, write the following fields in this order each as 8 bytes in little endian:
+ * To encode a Rect, write the following fields in this order each as 4 bytes in little endian:
* left, top, right and bottom.
*/
CROP = 16,
diff --git a/graphics/composer/aidl/Android.bp b/graphics/composer/aidl/Android.bp
index bba41da..655188d 100644
--- a/graphics/composer/aidl/Android.bp
+++ b/graphics/composer/aidl/Android.bp
@@ -59,25 +59,24 @@
{
version: "1",
imports: [
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
"android.hardware.common-V2",
],
},
{
version: "2",
imports: [
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
"android.hardware.common-V2",
],
},
{
version: "3",
imports: [
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
"android.hardware.common-V2",
],
},
-
],
}
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayCapability.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayCapability.aidl
index 0e2d72b..955ff89 100644
--- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayCapability.aidl
+++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayCapability.aidl
@@ -43,4 +43,5 @@
SUSPEND = 6,
DISPLAY_IDLE_TIMER = 7,
MULTI_THREADED_PRESENT = 8,
+ PICTURE_PROCESSING = 9,
}
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayCommand.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayCommand.aidl
index cce35e7..9e24a26 100644
--- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayCommand.aidl
+++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayCommand.aidl
@@ -46,4 +46,5 @@
boolean presentDisplay;
boolean presentOrValidateDisplay;
int frameIntervalNs;
+ long pictureProfileId;
}
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayLuts.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayLuts.aidl
index 327e84c..4263140 100644
--- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayLuts.aidl
+++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/DisplayLuts.aidl
@@ -38,6 +38,6 @@
android.hardware.graphics.composer3.DisplayLuts.LayerLut[] layerLuts;
parcelable LayerLut {
long layer;
- android.hardware.graphics.composer3.Lut lut;
+ android.hardware.graphics.composer3.Luts luts;
}
}
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/IComposerClient.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/IComposerClient.aidl
index bc27cc7..55604a6 100644
--- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/IComposerClient.aidl
+++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/IComposerClient.aidl
@@ -87,6 +87,7 @@
void setRefreshRateChangedCallbackDebugEnabled(long display, boolean enabled);
android.hardware.graphics.composer3.DisplayConfiguration[] getDisplayConfigurations(long display, int maxFrameIntervalNs);
oneway void notifyExpectedPresent(long display, in android.hardware.graphics.composer3.ClockMonotonicTimestamp expectedPresentTime, int frameIntervalNs);
+ int getMaxLayerPictureProfiles(long display);
const int EX_BAD_CONFIG = 1;
const int EX_BAD_DISPLAY = 2;
const int EX_BAD_LAYER = 3;
@@ -97,5 +98,7 @@
const int EX_UNSUPPORTED = 8;
const int EX_SEAMLESS_NOT_ALLOWED = 9;
const int EX_SEAMLESS_NOT_POSSIBLE = 10;
+ const int EX_CONFIG_FAILED = 11;
+ const int EX_PICTURE_PROFILE_MAX_EXCEEDED = 12;
const int INVALID_CONFIGURATION = 0x7fffffff;
}
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LayerCommand.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LayerCommand.aidl
index 8b2b13c..c26cb15 100644
--- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LayerCommand.aidl
+++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LayerCommand.aidl
@@ -57,5 +57,6 @@
@nullable int[] bufferSlotsToClear;
android.hardware.graphics.composer3.LayerLifecycleBatchCommandType layerLifecycleBatchCommandType;
int newBufferSlotCount;
- @nullable android.hardware.graphics.composer3.Lut[] luts;
+ @nullable android.hardware.graphics.composer3.Luts luts;
+ long pictureProfileId;
}
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LutProperties.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LutProperties.aidl
index 5edceb5..6a4593a 100644
--- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LutProperties.aidl
+++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LutProperties.aidl
@@ -35,7 +35,7 @@
@VintfStability
parcelable LutProperties {
android.hardware.graphics.composer3.LutProperties.Dimension dimension;
- long size;
+ int size;
android.hardware.graphics.composer3.LutProperties.SamplingKey[] samplingKeys;
@VintfStability
enum Dimension {
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Lut.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Luts.aidl
similarity index 93%
rename from graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Lut.aidl
rename to graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Luts.aidl
index 5fae35b..2890365 100644
--- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Lut.aidl
+++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Luts.aidl
@@ -33,7 +33,8 @@
package android.hardware.graphics.composer3;
@VintfStability
-parcelable Lut {
+parcelable Luts {
@nullable ParcelFileDescriptor pfd;
- android.hardware.graphics.composer3.LutProperties lutProperties;
+ @nullable int[] offsets;
+ android.hardware.graphics.composer3.LutProperties[] lutProperties;
}
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCapability.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCapability.aidl
index 7154d74..fa58fb7 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCapability.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCapability.aidl
@@ -96,4 +96,10 @@
* @see DisplayCommand.validateDisplay
*/
MULTI_THREADED_PRESENT = 8,
+ /**
+ * Specifies that the display supports a global picture-processing pipeline.
+ *
+ * @see DisplayCommand.pictureProfileId
+ */
+ PICTURE_PROCESSING = 9,
}
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCommand.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCommand.aidl
index 02c1389..c3fd68e 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCommand.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCommand.aidl
@@ -185,4 +185,21 @@
* close as possible to the cadence.
*/
int frameIntervalNs;
+
+ /**
+ * If the display supports DisplayCapability.PICTURE_PROCESSING, then this value is used to look
+ * up a picture profile which defines the parameters used when configuring a picture-processing
+ * pipeline applied to the composition result, enhancing the quality of the entire composed
+ * image. If the server does not recognize the picture profile, it must continue composition
+ * and ignore this value. If the value is zero, then the server's default picture processing,
+ * if possible, must be applied.
+ *
+ * Note that the client will never send a DisplayCommand.pictureProfileId if
+ * IComposerClient.getMaxLayerPictureProfiles is non-zero. Picture profiles will only be
+ * specified on a per-layer basis via LayerCommand.pictureProfileId.
+ *
+ * @see IComposerClient.getMaxLayerPictureProfiles
+ * @see DisplayCommand.pictureProfileId
+ */
+ long pictureProfileId;
}
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayLuts.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayLuts.aidl
index ac0a606..6b59a6f 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayLuts.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayLuts.aidl
@@ -16,7 +16,7 @@
package android.hardware.graphics.composer3;
-import android.hardware.graphics.composer3.Lut;
+import android.hardware.graphics.composer3.Luts;
/**
* LUT (Look-Up Table) Interface for Color Transformation.
@@ -37,9 +37,9 @@
*/
long layer;
/**
- * A Lut specified by the HWC for given HDR layers that don't have Luts provided.
+ * Lut(s) specified by the HWC for given HDR layers that don't have Luts provided.
*/
- Lut lut;
+ Luts luts;
}
LayerLut[] layerLuts;
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
index 213e8e9..edbb988 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
@@ -93,6 +93,18 @@
* Seamless requirements cannot be met Exception
*/
const int EX_SEAMLESS_NOT_POSSIBLE = 10;
+ /**
+ * Proposed configuration failed for undisclosed reasons
+ */
+ const int EX_CONFIG_FAILED = 11;
+
+ /**
+ * The number of per-layer picture profiles in use is larger than the number of layer-specific
+ * picture-processing pipelines, as-defined by getMaxLayerPictureProfiles.
+ *
+ * @see LayerCommand.pictureProfileId
+ */
+ const int EX_PICTURE_PROFILE_MAX_EXCEEDED = 12;
/**
* Integer.MAX_VALUE is reserved for the invalid configuration.
@@ -558,6 +570,7 @@
* @exception EX_BAD_DISPLAY when an invalid display handle was passed in.
* @exception EX_BAD_CONFIG when the configuration handle passed in is not valid
* for this display.
+ * @exception EX_CONFIG_FAILED when the config failed for undisclosed reasons.
*/
void setActiveConfig(long display, int config);
@@ -583,6 +596,7 @@
* achieve the vsync period change without a noticeable visual artifact. When the conditions
* change and it may be possible to change the vsync period seamlessly, onSeamlessPossible
* callback must be called to indicate that caller should retry.
+ * @exception EX_CONFIG_FAILED when the config failed for undisclosed reasons.
*
* @return is the timeline for the vsync period change.
*/
@@ -913,4 +927,15 @@
*/
oneway void notifyExpectedPresent(
long display, in ClockMonotonicTimestamp expectedPresentTime, int frameIntervalNs);
+
+ /*
+ * Returns the number of layer-specific picture-processing profiles that can be referenced from
+ * multiple LayerCommand.pictureProfileId. If the client passes in more pictureProfileIds whose
+ * values are larger than zero (indicating none) then the implementation can support, it should
+ * return EX_PICTURE_PROFILE_MAX_EXCEEDED.
+ *
+ * If the implementation only supports one display-wide picture-processing
+ * pipeline, a value of zero should be returned here.
+ */
+ int getMaxLayerPictureProfiles(long display);
}
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl
index bf4f504..d7ef4c1 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl
@@ -24,7 +24,7 @@
import android.hardware.graphics.composer3.Color;
import android.hardware.graphics.composer3.LayerBrightness;
import android.hardware.graphics.composer3.LayerLifecycleBatchCommandType;
-import android.hardware.graphics.composer3.Lut;
+import android.hardware.graphics.composer3.Luts;
import android.hardware.graphics.composer3.ParcelableBlendMode;
import android.hardware.graphics.composer3.ParcelableComposition;
import android.hardware.graphics.composer3.ParcelableDataspace;
@@ -284,5 +284,21 @@
/**
* Sets the lut(s) for the layer.
*/
- @nullable Lut[] luts;
+ @nullable Luts luts;
+
+ /**
+ * If the display has multiple per-layer picture processing pipelines, then this value is used
+ * to look up a picture profile which defines the parameters used when configuring a
+ * picture-processing pipeline for this layer, enhancing the quality of the buffer contents. If
+ * the server doesn't recognize this profile, it must continue with composition and ignore
+ * this value. If the value is zero, then the no picture processing must be applied.
+ *
+ * Note that the client will never send a DisplayCommand.pictureProfileId if
+ * IComposerClient.getMaxLayerPictureProfiles is non-zero. Picture profiles will only be
+ * specified on a per-layer basis.
+ *
+ * @see IComposerClient.getMaxLayerPictureProfiles
+ * @see DisplayCommand.pictureProfileId
+ */
+ long pictureProfileId;
}
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/LutProperties.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/LutProperties.aidl
index 47ec390..d3dd30e 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/LutProperties.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/LutProperties.aidl
@@ -32,12 +32,12 @@
* The size of the Lut.
* This refers to the length of a 1D Lut, or the grid size of a 3D one.
*/
- long size;
+ int size;
/**
* SamplingKey is about how a Lut can be sampled.
- * A Lut can be sampled in more than one way,
- * but only one sampling method is used at one time.
+ * A Lut can be sampled in more than one key,
+ * but only one sampling key is used at one time.
*
* The implementations should use a sampling strategy
* at least as good as linear sampling.
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/Lut.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/Luts.aidl
similarity index 75%
rename from graphics/composer/aidl/android/hardware/graphics/composer3/Lut.aidl
rename to graphics/composer/aidl/android/hardware/graphics/composer3/Luts.aidl
index abfeb14..592ac50 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/Lut.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/Luts.aidl
@@ -26,13 +26,13 @@
*/
@VintfStability
-parcelable Lut {
+parcelable Luts {
/**
* A handle to a memory region.
* If the file descriptor is not set, this means that the HWC doesn't specify a Lut.
*
* When specifying a Lut, the HWC is required to follow the instructions as below:
- * 1. use `memfd_create` to create a shared memory segment
+ * 1. use `ashmem_create_region` to create a shared memory segment
* with the size specified in lutProperties.
* 2. use `mmap` to map the shared memory segment into its own virtual address space.
* PROT_READ/PROT_WRITE recommended for prot argument.
@@ -46,11 +46,24 @@
* `FLAT[WIDTH * HEIGHT * DEPTH]` by
*
* `FLAT[z + DEPTH * (y + HEIGHT * x)] = ORIGINAL[x, y, z]`
+ *
+ * Noted that 1D Lut(s) should be gain curve ones
+ * and 3D Lut(s) should be pure color lookup ones.
*/
@nullable ParcelFileDescriptor pfd;
/**
- * The properties of the Lut.
+ * The offsets store the starting point of each Lut memory of the Lut buffer.
+ *
+ * Multiple Luts can be packed into one same `pfd`, and `offsets` is used to pinpoint
+ * the starting point of each Lut.
*/
- LutProperties lutProperties;
+ @nullable int[] offsets;
+
+ /**
+ * The properties list of the Luts.
+ *
+ * The number of sampling key inside should only be one.
+ */
+ LutProperties[] lutProperties;
}
diff --git a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h
index 331d717..07c9c6d 100644
--- a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h
+++ b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h
@@ -247,11 +247,11 @@
void parseSetDisplayLuts(DisplayLuts&& displayLuts) {
LOG_ALWAYS_FATAL_IF(mDisplay && displayLuts.display != *mDisplay);
auto& data = mReturnData[displayLuts.display];
- for (auto& layerLut : displayLuts.layerLuts) {
- if (layerLut.lut.pfd.get() >= 0) {
+ for (auto& [layerId, luts] : displayLuts.layerLuts) {
+ if (luts.pfd.get() >= 0) {
data.layerLuts.push_back(
- {layerLut.layer, Lut{ndk::ScopedFileDescriptor(layerLut.lut.pfd.release()),
- layerLut.lut.lutProperties}});
+ {layerId, Luts{ndk::ScopedFileDescriptor(luts.pfd.release()), luts.offsets,
+ luts.lutProperties}});
}
}
}
diff --git a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientWriter.h b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientWriter.h
index 02fb3aa..71a04f3 100644
--- a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientWriter.h
+++ b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientWriter.h
@@ -25,21 +25,19 @@
#include <string.h>
#include <aidl/android/hardware/graphics/common/BlendMode.h>
-#include <aidl/android/hardware/graphics/composer3/Color.h>
-#include <aidl/android/hardware/graphics/composer3/Composition.h>
-#include <aidl/android/hardware/graphics/composer3/DisplayBrightness.h>
-#include <aidl/android/hardware/graphics/composer3/LayerBrightness.h>
-#include <aidl/android/hardware/graphics/composer3/LayerLifecycleBatchCommandType.h>
-#include <aidl/android/hardware/graphics/composer3/Lut.h>
-#include <aidl/android/hardware/graphics/composer3/PerFrameMetadata.h>
-#include <aidl/android/hardware/graphics/composer3/PerFrameMetadataBlob.h>
-
-#include <aidl/android/hardware/graphics/composer3/DisplayCommand.h>
-
#include <aidl/android/hardware/graphics/common/ColorTransform.h>
#include <aidl/android/hardware/graphics/common/FRect.h>
#include <aidl/android/hardware/graphics/common/Rect.h>
#include <aidl/android/hardware/graphics/common/Transform.h>
+#include <aidl/android/hardware/graphics/composer3/Color.h>
+#include <aidl/android/hardware/graphics/composer3/Composition.h>
+#include <aidl/android/hardware/graphics/composer3/DisplayBrightness.h>
+#include <aidl/android/hardware/graphics/composer3/DisplayCommand.h>
+#include <aidl/android/hardware/graphics/composer3/LayerBrightness.h>
+#include <aidl/android/hardware/graphics/composer3/LayerLifecycleBatchCommandType.h>
+#include <aidl/android/hardware/graphics/composer3/Luts.h>
+#include <aidl/android/hardware/graphics/composer3/PerFrameMetadata.h>
+#include <aidl/android/hardware/graphics/composer3/PerFrameMetadataBlob.h>
#include <log/log.h>
#include <sync/sync.h>
@@ -59,6 +57,8 @@
namespace aidl::android::hardware::graphics::composer3 {
+using PictureProfileId = decltype(LayerCommand().pictureProfileId);
+
class ComposerClientWriter final {
public:
static constexpr std::optional<ClockMonotonicTimestamp> kNoTimestamp = std::nullopt;
@@ -84,6 +84,10 @@
DisplayBrightness{.brightness = brightness, .brightnessNits = brightnessNits});
}
+ void setDisplayPictureProfileId(int64_t display, PictureProfileId pictureProfileId) {
+ getDisplayCommand(display).pictureProfileId = pictureProfileId;
+ }
+
void setClientTarget(int64_t display, uint32_t slot, const native_handle_t* target,
int acquireFence, Dataspace dataspace, const std::vector<Rect>& damage,
float hdrSdrRatio) {
@@ -246,13 +250,13 @@
getLayerCommand(display, layer).blockingRegion.emplace(blocking.begin(), blocking.end());
}
- void setLayerLuts(int64_t display, int64_t layer, std::vector<Lut>& luts) {
- std::vector<std::optional<Lut>> currentLuts;
- for (auto& lut : luts) {
- currentLuts.push_back(std::make_optional<Lut>(
- {ndk::ScopedFileDescriptor(lut.pfd.release()), lut.lutProperties}));
- }
- getLayerCommand(display, layer).luts.emplace(std::move(currentLuts));
+ void setLayerLuts(int64_t display, int64_t layer, Luts& luts) {
+ getLayerCommand(display, layer).luts.emplace(std::move(luts));
+ }
+
+ void setLayerPictureProfileId(int64_t display, int64_t layer,
+ PictureProfileId pictureProfileId) {
+ getLayerCommand(display, layer).pictureProfileId = pictureProfileId;
}
std::vector<DisplayCommand> takePendingCommands() {
diff --git a/graphics/composer/aidl/vts/RenderEngineVts.h b/graphics/composer/aidl/vts/RenderEngineVts.h
index bbe508f..6553720 100644
--- a/graphics/composer/aidl/vts/RenderEngineVts.h
+++ b/graphics/composer/aidl/vts/RenderEngineVts.h
@@ -51,9 +51,10 @@
private:
common::PixelFormat mFormat;
- std::vector<::android::renderengine::LayerSettings> mCompositionLayers;
std::unique_ptr<::android::renderengine::RenderEngine> mRenderEngine;
- std::vector<::android::renderengine::LayerSettings> mRenderLayers;
+ // Delete RenderEngine layers before RenderEngine -- ExternalTexture holds a reference to
+ // RenderEngine.
+ std::vector<::android::renderengine::LayerSettings> mCompositionLayers;
::android::sp<::android::GraphicBuffer> mGraphicBuffer;
DisplaySettings mDisplaySettings;
diff --git a/graphics/composer/aidl/vts/VtsComposerClient.cpp b/graphics/composer/aidl/vts/VtsComposerClient.cpp
index 89ba2e6..9b6a005 100644
--- a/graphics/composer/aidl/vts/VtsComposerClient.cpp
+++ b/graphics/composer/aidl/vts/VtsComposerClient.cpp
@@ -690,4 +690,10 @@
mDisplayResources.clear();
return true;
}
+
+std::pair<ScopedAStatus, int32_t> VtsComposerClient::getMaxLayerPictureProfiles(int64_t display) {
+ int32_t outMaxProfiles = 0;
+ return {mComposerClient->getMaxLayerPictureProfiles(display, &outMaxProfiles), outMaxProfiles};
+}
+
} // namespace aidl::android::hardware::graphics::composer3::vts
diff --git a/graphics/composer/aidl/vts/VtsComposerClient.h b/graphics/composer/aidl/vts/VtsComposerClient.h
index da6116f..53f5fae 100644
--- a/graphics/composer/aidl/vts/VtsComposerClient.h
+++ b/graphics/composer/aidl/vts/VtsComposerClient.h
@@ -198,6 +198,8 @@
std::vector<RefreshRateChangedDebugData> takeListOfRefreshRateChangedDebugData();
+ std::pair<ScopedAStatus, int32_t> getMaxLayerPictureProfiles(int64_t display);
+
static constexpr int32_t kMaxFrameIntervalNs = 50000000; // 20fps
static constexpr int32_t kNoFrameIntervalNs = 0;
diff --git a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
index eaf23b5..8006523 100644
--- a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
+++ b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
@@ -28,9 +28,11 @@
#include <android/hardware/graphics/composer3/ComposerClientReader.h>
#include <android/hardware/graphics/composer3/ComposerClientWriter.h>
#include <binder/ProcessState.h>
+#include <cutils/ashmem.h>
#include <gtest/gtest.h>
#include <ui/Fence.h>
#include <ui/GraphicBuffer.h>
+#include <ui/PictureProfileHandle.h>
#include <ui/PixelFormat.h>
#include <algorithm>
#include <iterator>
@@ -118,6 +120,15 @@
[&](const Capability& activeCapability) { return activeCapability == capability; });
}
+ bool hasDisplayCapability(int64_t displayId, DisplayCapability capability) {
+ const auto& [status, capabilities] = mComposerClient->getDisplayCapabilities(displayId);
+ EXPECT_TRUE(status.isOk());
+ return std::any_of(capabilities.begin(), capabilities.end(),
+ [&](const DisplayCapability& activeCapability) {
+ return activeCapability == capability;
+ });
+ }
+
int getInterfaceVersion() {
const auto& [versionStatus, version] = mComposerClient->getInterfaceVersion();
EXPECT_TRUE(versionStatus.isOk());
@@ -1388,6 +1399,14 @@
}
}
+TEST_P(GraphicsComposerAidlV3Test, GetMaxLayerPictureProfiles) {
+ for (const auto& display : mDisplays) {
+ const auto& [status, maxPorfiles] =
+ mComposerClient->getMaxLayerPictureProfiles(display.getDisplayId());
+ EXPECT_TRUE(status.isOk());
+ }
+}
+
// Tests for Command.
class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest {
protected:
@@ -2048,6 +2067,7 @@
EXPECT_TRUE(layerStatus.isOk());
writer.setLayerBuffer(getPrimaryDisplayId(), layer, /*slot*/ 0, handle, /*acquireFence*/ -1);
execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
}
TEST_P(GraphicsComposerAidlCommandTest, SetLayerBufferMultipleTimes) {
@@ -3219,6 +3239,140 @@
});
}
+TEST_P(GraphicsComposerAidlCommandV3Test, getMaxLayerPictureProfiles_success) {
+ for (auto& display : mDisplays) {
+ int64_t displayId = display.getDisplayId();
+ if (!hasDisplayCapability(displayId, DisplayCapability::PICTURE_PROCESSING)) {
+ continue;
+ }
+ const auto& [status, maxProfiles] =
+ mComposerClient->getMaxLayerPictureProfiles(getPrimaryDisplayId());
+ EXPECT_TRUE(status.isOk());
+ }
+}
+
+TEST_P(GraphicsComposerAidlCommandV3Test, setDisplayPictureProfileId_success) {
+ for (auto& display : mDisplays) {
+ int64_t displayId = display.getDisplayId();
+ if (!hasDisplayCapability(displayId, DisplayCapability::PICTURE_PROCESSING)) {
+ continue;
+ }
+
+ auto& writer = getWriter(displayId);
+ const auto layer = createOnScreenLayer(display);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ ASSERT_NE(nullptr, buffer->handle);
+ // TODO(b/337330263): Lookup profile IDs from PictureProfileService
+ writer.setDisplayPictureProfileId(displayId, PictureProfileId(1));
+ writer.setLayerBuffer(displayId, layer, /*slot*/ 0, buffer->handle,
+ /*acquireFence*/ -1);
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
+}
+
+TEST_P(GraphicsComposerAidlCommandV3Test, setLayerPictureProfileId_success) {
+ for (auto& display : mDisplays) {
+ int64_t displayId = display.getDisplayId();
+ if (!hasDisplayCapability(displayId, DisplayCapability::PICTURE_PROCESSING)) {
+ continue;
+ }
+ const auto& [status, maxProfiles] = mComposerClient->getMaxLayerPictureProfiles(displayId);
+ EXPECT_TRUE(status.isOk());
+ if (maxProfiles == 0) {
+ continue;
+ }
+
+ auto& writer = getWriter(displayId);
+ const auto layer = createOnScreenLayer(display);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ ASSERT_NE(nullptr, buffer->handle);
+ writer.setLayerBuffer(displayId, layer, /*slot*/ 0, buffer->handle,
+ /*acquireFence*/ -1);
+ // TODO(b/337330263): Lookup profile IDs from PictureProfileService
+ writer.setLayerPictureProfileId(displayId, layer, PictureProfileId(1));
+ execute();
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
+}
+
+TEST_P(GraphicsComposerAidlCommandV3Test, setLayerPictureProfileId_failsWithTooManyProfiles) {
+ for (auto& display : mDisplays) {
+ int64_t displayId = display.getDisplayId();
+ if (!hasDisplayCapability(displayId, DisplayCapability::PICTURE_PROCESSING)) {
+ continue;
+ }
+ const auto& [status, maxProfiles] = mComposerClient->getMaxLayerPictureProfiles(displayId);
+ EXPECT_TRUE(status.isOk());
+ if (maxProfiles == 0) {
+ continue;
+ }
+
+ auto& writer = getWriter(displayId);
+ for (int profileId = 1; profileId <= maxProfiles + 1; ++profileId) {
+ const auto layer = createOnScreenLayer(display);
+ const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+ ASSERT_NE(nullptr, buffer->handle);
+ writer.setLayerBuffer(displayId, layer, /*slot*/ 0, buffer->handle,
+ /*acquireFence*/ -1);
+ // TODO(b/337330263): Lookup profile IDs from PictureProfileService
+ writer.setLayerPictureProfileId(displayId, layer, PictureProfileId(profileId));
+ }
+ execute();
+ const auto errors = mReader.takeErrors();
+ ASSERT_TRUE(errors.size() == 1 &&
+ errors[0].errorCode == IComposerClient::EX_PICTURE_PROFILE_MAX_EXCEEDED);
+ }
+}
+
+class GraphicsComposerAidlCommandV4Test : public GraphicsComposerAidlCommandTest {
+ protected:
+ void SetUp() override {
+ GraphicsComposerAidlTest::SetUp();
+ if (getInterfaceVersion() <= 3) {
+ GTEST_SKIP() << "Device interface version is expected to be >= 4";
+ }
+ }
+};
+
+TEST_P(GraphicsComposerAidlCommandV4Test, SetUnsupportedLayerLuts) {
+ auto& writer = getWriter(getPrimaryDisplayId());
+ const auto& [layerStatus, layer] =
+ mComposerClient->createLayer(getPrimaryDisplayId(), kBufferSlotCount, &writer);
+ EXPECT_TRUE(layerStatus.isOk());
+ const auto& [status, properties] = mComposerClient->getOverlaySupport();
+ if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+ status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
+ GTEST_SUCCEED() << "getOverlaySupport is not supported";
+ return;
+ }
+ ASSERT_TRUE(status.isOk());
+
+ // TODO (b/362319189): add Lut VTS enforcement
+ if (!properties.lutProperties) {
+ int32_t size = 7;
+ size_t bufferSize = static_cast<size_t>(size) * sizeof(float);
+ int32_t fd = ashmem_create_region("lut_shared_mem", bufferSize);
+ void* ptr = mmap(nullptr, bufferSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ std::vector<float> buffers = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
+ memcpy(ptr, buffers.data(), bufferSize);
+ munmap(ptr, bufferSize);
+ Luts luts;
+ luts.offsets = {0};
+ luts.lutProperties = {
+ {LutProperties::Dimension::ONE_D, size, {LutProperties::SamplingKey::RGB}}};
+ luts.pfd = ndk::ScopedFileDescriptor(fd);
+
+ writer.setLayerLuts(getPrimaryDisplayId(), layer, luts);
+ writer.validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
+ VtsComposerClient::kNoFrameIntervalNs);
+ execute();
+ // change to client composition
+ ASSERT_FALSE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
+ ASSERT_TRUE(mReader.takeErrors().empty());
+ }
+}
+
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandTest);
INSTANTIATE_TEST_SUITE_P(
PerInstance, GraphicsComposerAidlCommandTest,
@@ -3249,6 +3403,11 @@
PerInstance, GraphicsComposerAidlCommandV3Test,
testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
::android::PrintInstanceNameToString);
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsComposerAidlCommandV4Test);
+INSTANTIATE_TEST_SUITE_P(
+ PerInstance, GraphicsComposerAidlCommandV4Test,
+ testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
+ ::android::PrintInstanceNameToString);
} // namespace aidl::android::hardware::graphics::composer3::vts
int main(int argc, char** argv) {
diff --git a/graphics/mapper/4.0/utils/vts/Android.bp b/graphics/mapper/4.0/utils/vts/Android.bp
index c5f124c..1be460e 100644
--- a/graphics/mapper/4.0/utils/vts/Android.bp
+++ b/graphics/mapper/4.0/utils/vts/Android.bp
@@ -48,7 +48,7 @@
],
export_static_lib_headers: [
"android.hardware.graphics.allocator@4.0",
- "android.hardware.graphics.common-V5-ndk",
+ "android.hardware.graphics.common-V6-ndk",
"android.hardware.graphics.mapper@4.0",
],
export_include_dirs: ["include"],
diff --git a/graphics/mapper/stable-c/Android.bp b/graphics/mapper/stable-c/Android.bp
index 82306be..f4196b9 100644
--- a/graphics/mapper/stable-c/Android.bp
+++ b/graphics/mapper/stable-c/Android.bp
@@ -111,7 +111,7 @@
"VtsHalTargetTestDefaults",
"use_libaidlvintf_gtest_helper_static",
"android.hardware.graphics.allocator-ndk_shared",
- "android.hardware.graphics.common-ndk_shared",
+ "android.hardware.graphics.common-ndk_static",
],
srcs: [
"vts/VtsHalGraphicsMapperStableC_TargetTest.cpp",
diff --git a/graphics/mapper/stable-c/vts/VtsHalGraphicsMapperStableC_TargetTest.cpp b/graphics/mapper/stable-c/vts/VtsHalGraphicsMapperStableC_TargetTest.cpp
index bdbe4d0..3e2f2ac 100644
--- a/graphics/mapper/stable-c/vts/VtsHalGraphicsMapperStableC_TargetTest.cpp
+++ b/graphics/mapper/stable-c/vts/VtsHalGraphicsMapperStableC_TargetTest.cpp
@@ -753,7 +753,7 @@
* Test IMapper::lock and IMapper::unlock with no CPU usage requested.
*/
TEST_P(GraphicsMapperStableCTests, LockUnlockNoCPUUsage) {
- constexpr auto usage = BufferUsage::CPU_READ_NEVER | BufferUsage::CPU_WRITE_NEVER;
+ constexpr auto usage = BufferUsage::CPU_READ_RARELY | BufferUsage::CPU_WRITE_NEVER;
auto buffer = allocate({
.name = {"VTS_TEMP"},
.width = 64,
@@ -771,15 +771,12 @@
auto handle = buffer->import();
uint8_t* data = nullptr;
- EXPECT_EQ(AIMAPPER_ERROR_BAD_VALUE,
- mapper()->v5.lock(*handle, static_cast<int64_t>(info.usage),
- region, -1,(void**)&data))
- << "Locking with 0 access succeeded";
+ EXPECT_EQ(AIMAPPER_ERROR_BAD_VALUE, mapper()->v5.lock(*handle, 0, region, -1, (void**)&data))
+ << "Locking with 0 access succeeded";
int releaseFence = -1;
- EXPECT_EQ(AIMAPPER_ERROR_BAD_BUFFER,
- mapper()->v5.unlock(*handle, &releaseFence))
- << "Unlocking not locked buffer succeeded";
+ EXPECT_EQ(AIMAPPER_ERROR_BAD_BUFFER, mapper()->v5.unlock(*handle, &releaseFence))
+ << "Unlocking not locked buffer succeeded";
if (releaseFence != -1) {
close(releaseFence);
}
diff --git a/neuralnetworks/aidl/Android.bp b/neuralnetworks/aidl/Android.bp
index 9589750..45b34e6 100644
--- a/neuralnetworks/aidl/Android.bp
+++ b/neuralnetworks/aidl/Android.bp
@@ -43,28 +43,28 @@
version: "1",
imports: [
"android.hardware.common-V2",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
{
version: "2",
imports: [
"android.hardware.common-V2",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
{
version: "3",
imports: [
"android.hardware.common-V2",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
{
version: "4",
imports: [
"android.hardware.common-V2",
- "android.hardware.graphics.common-V5",
+ "android.hardware.graphics.common-V6",
],
},
diff --git a/power/aidl/Android.bp b/power/aidl/Android.bp
index dc57613..2c80aab 100644
--- a/power/aidl/Android.bp
+++ b/power/aidl/Android.bp
@@ -69,46 +69,53 @@
"android.hardware.common-V2",
],
},
-
],
- frozen: true,
-
+ frozen: false,
}
+power_version = "android.hardware.power-V6"
+
cc_defaults {
name: "android.hardware.power-ndk_shared",
shared_libs: [
- "android.hardware.power-V5-ndk",
+ power_version + "-ndk",
],
}
cc_defaults {
name: "android.hardware.power-ndk_export_shared",
shared_libs: [
- "android.hardware.power-V5-ndk",
+ power_version + "-ndk",
],
export_shared_lib_headers: [
- "android.hardware.power-V5-ndk",
+ power_version + "-ndk",
],
}
cc_defaults {
name: "android.hardware.power-ndk_static",
static_libs: [
- "android.hardware.power-V5-ndk",
+ power_version + "-ndk",
],
}
java_defaults {
name: "android.hardware.power-java_shared",
libs: [
- "android.hardware.power-V5-java",
+ power_version + "-java",
],
}
java_defaults {
name: "android.hardware.power-java_static",
static_libs: [
- "android.hardware.power-V5-java",
+ power_version + "-java",
+ ],
+}
+
+aidl_interface_defaults {
+ name: "android.hardware.power-aidl",
+ imports: [
+ power_version,
],
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/CpuHeadroomParams.aidl
similarity index 81%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/CpuHeadroomParams.aidl
index a5eda52..09a2ace 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/CpuHeadroomParams.aidl
@@ -31,9 +31,18 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.power;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable CpuHeadroomParams {
+ android.hardware.power.CpuHeadroomParams.CalculationType calculationType;
+ android.hardware.power.CpuHeadroomParams.SelectionType selectionType;
+ int pid;
+ enum CalculationType {
+ MIN,
+ AVERAGE,
+ }
+ enum SelectionType {
+ ALL,
+ PER_CORE,
+ }
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/GpuHeadroomParams.aidl
similarity index 86%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/GpuHeadroomParams.aidl
index a5eda52..64bb4a4 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/GpuHeadroomParams.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.power;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable GpuHeadroomParams {
+ android.hardware.power.GpuHeadroomParams.CalculationType calculationType;
+ enum CalculationType {
+ MIN,
+ AVERAGE,
+ }
}
diff --git a/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/IPower.aidl b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/IPower.aidl
index 8acdaf2..10456cb 100644
--- a/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/IPower.aidl
+++ b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/IPower.aidl
@@ -43,4 +43,9 @@
android.hardware.power.IPowerHintSession createHintSessionWithConfig(in int tgid, in int uid, in int[] threadIds, in long durationNanos, in android.hardware.power.SessionTag tag, out android.hardware.power.SessionConfig config);
android.hardware.power.ChannelConfig getSessionChannel(in int tgid, in int uid);
oneway void closeSessionChannel(in int tgid, in int uid);
+ android.hardware.power.SupportInfo getSupportInfo();
+ float[] getCpuHeadroom(in android.hardware.power.CpuHeadroomParams params);
+ float getGpuHeadroom(in android.hardware.power.GpuHeadroomParams params);
+ long getCpuHeadroomMinIntervalMillis();
+ long getGpuHeadroomMinIntervalMillis();
}
diff --git a/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionTag.aidl b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionTag.aidl
index 862fbc5..71da2d4 100644
--- a/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionTag.aidl
+++ b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SessionTag.aidl
@@ -39,4 +39,5 @@
HWUI,
GAME,
APP,
+ SYSUI,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SupportInfo.aidl
similarity index 90%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SupportInfo.aidl
index a5eda52..85da2fc 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/power/aidl/aidl_api/android.hardware.power/current/android/hardware/power/SupportInfo.aidl
@@ -31,9 +31,13 @@
// 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.vibrator;
+package android.hardware.power;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable SupportInfo {
+ boolean usesSessions;
+ long boosts;
+ long modes;
+ long sessionHints;
+ long sessionModes;
+ long sessionTags;
}
diff --git a/power/aidl/android/hardware/power/CpuHeadroomParams.aidl b/power/aidl/android/hardware/power/CpuHeadroomParams.aidl
new file mode 100644
index 0000000..cf71b67
--- /dev/null
+++ b/power/aidl/android/hardware/power/CpuHeadroomParams.aidl
@@ -0,0 +1,62 @@
+/*
+ * 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.power;
+
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable CpuHeadroomParams {
+ /**
+ * Defines how to calculate the headroom.
+ */
+ enum CalculationType {
+ // Default to return the minimum headroom in a window.
+ MIN,
+ // Returns the average headroom in a window.
+ AVERAGE,
+ }
+
+ /**
+ * The calculation type.
+ */
+ CalculationType calculationType;
+
+ /**
+ * Defines how to select the CPU.
+ */
+ enum SelectionType {
+ // Default to return a single value for all cores.
+ ALL,
+ // Returns per-core headroom in a list.
+ PER_CORE,
+ }
+
+ /**
+ * The CPU selection type.
+ */
+ SelectionType selectionType;
+
+ /**
+ * The caller thread's PID.
+ *
+ * If pid is positive, return the headroom only for cores that are available
+ * to the given pid, otherwise return the headroom(s) for all cores.
+ *
+ * This should handle all the cases including but not limited to thread core
+ * affinity and app cpuset that change the available CPU cores for the caller.
+ */
+ int pid;
+}
diff --git a/power/aidl/android/hardware/power/GpuHeadroomParams.aidl b/power/aidl/android/hardware/power/GpuHeadroomParams.aidl
new file mode 100644
index 0000000..972adbc
--- /dev/null
+++ b/power/aidl/android/hardware/power/GpuHeadroomParams.aidl
@@ -0,0 +1,36 @@
+/*
+ * 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.power;
+
+@VintfStability
+@JavaDerive(equals=true, toString=true)
+parcelable GpuHeadroomParams {
+ /**
+ * Defines how to calculate the headroom.
+ */
+ enum CalculationType {
+ // Default to return the minimum headroom in a window.
+ MIN,
+ // Returns the average headroom in a window.
+ AVERAGE,
+ }
+
+ /**
+ * The calculation type.
+ */
+ CalculationType calculationType;
+}
diff --git a/power/aidl/android/hardware/power/IPower.aidl b/power/aidl/android/hardware/power/IPower.aidl
index e25714f..e2f121c 100644
--- a/power/aidl/android/hardware/power/IPower.aidl
+++ b/power/aidl/android/hardware/power/IPower.aidl
@@ -18,10 +18,13 @@
import android.hardware.power.Boost;
import android.hardware.power.ChannelConfig;
+import android.hardware.power.CpuHeadroomParams;
+import android.hardware.power.GpuHeadroomParams;
import android.hardware.power.IPowerHintSession;
import android.hardware.power.Mode;
import android.hardware.power.SessionConfig;
import android.hardware.power.SessionTag;
+import android.hardware.power.SupportInfo;
@VintfStability
interface IPower {
@@ -144,4 +147,57 @@
* @param uid The UID to be associated with this channel.
*/
oneway void closeSessionChannel(in int tgid, in int uid);
+
+ /**
+ * Called to get detailed information on the support status of various PowerHAL
+ * features, such as hint sessions and specific boosts.
+ *
+ * @return a SupportInfo giving detailed support information, or
+ * EX_UNSUPPORTED_OPERATION if detailed support checking is itself
+ * not supported.
+ */
+ SupportInfo getSupportInfo();
+
+ /**
+ * Provides an estimate of available CPU headroom the device based on past history.
+ * <p>
+ * @param params params to customize the CPU headroom calculation
+ * @return a single value or an array of values depending on selection type of params.
+ * Each value is ranged from [0, 100], and 0 indicates no CPU resources were left
+ * during the calculation interval and the app may expect low resources to be granted.
+ * @throws EX_UNSUPPORTED_OPERATION if the API is unsupported or the request params can't be
+ * served.
+ */
+ float[] getCpuHeadroom(in CpuHeadroomParams params);
+
+ /**
+ * Provides an estimate of available GPU headroom the device based on past history.
+ * <p>
+ * @param params params to customize the GPU headroom calculation
+ * @return Value is ranged from [0, 100], and 0 indicates no GPU resources were left
+ * during the calculation interval and the app may expect low resources to be granted.
+ * @throws EX_UNSUPPORTED_OPERATION if the API is unsupported or the request params can't be
+ * served.
+ */
+ float getGpuHeadroom(in GpuHeadroomParams params);
+
+ /**
+ * Minimum polling interval for calling getCpuHeadroom in milliseconds.
+ *
+ * The getCpuHeadroom API may return cached result if called more frequent
+ * than the interval.
+ *
+ * @throws EX_UNSUPPORTED_OPERATION if the API is unsupported.
+ */
+ long getCpuHeadroomMinIntervalMillis();
+
+ /**
+ * Minimum polling interval for calling getGpuHeadroom in milliseconds.
+ *
+ * The getGpuHeadroom API may return cached result if called more frequent
+ * than the interval.
+ *
+ * @throws EX_UNSUPPORTED_OPERATION if the API is unsupported.
+ */
+ long getGpuHeadroomMinIntervalMillis();
}
diff --git a/power/aidl/android/hardware/power/SessionTag.aidl b/power/aidl/android/hardware/power/SessionTag.aidl
index 27bf3e3..e98cc77 100644
--- a/power/aidl/android/hardware/power/SessionTag.aidl
+++ b/power/aidl/android/hardware/power/SessionTag.aidl
@@ -46,4 +46,9 @@
* instead.
*/
APP,
+
+ /**
+ * This tag is used to mark hint sessions created by the system UI.
+ */
+ SYSUI,
}
diff --git a/power/aidl/android/hardware/power/SupportInfo.aidl b/power/aidl/android/hardware/power/SupportInfo.aidl
new file mode 100644
index 0000000..46bcdd3
--- /dev/null
+++ b/power/aidl/android/hardware/power/SupportInfo.aidl
@@ -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.
+ */
+
+package android.hardware.power;
+
+import android.hardware.power.Boost;
+import android.hardware.power.Mode;
+import android.hardware.power.SessionHint;
+import android.hardware.power.SessionMode;
+
+/**
+ * Tells clients the status of various PowerHAL features in a single call.
+ * SupportInfo consists of several bitsets, where each bit from the left
+ * corresponds to the support status of that same value of that enum index.
+ *
+ * For "Boost", having the first bit set would mean "INTERACTION"
+ * boost is supported, having the second bit set would mean
+ * "DISPLAY_UPDATE_IMMINENT" is supported, and so on. The expectation
+ * is that a client should be able to index the bitset like
+ * "(supportInfo.boosts >> Boost::AUDIO_LAUNCH) % 2" and it should return
+ * the support value of Boost::AUDIO_LAUNCH. This pattern is the same for
+ * all four support bitsets.
+ */
+@VintfStability
+parcelable SupportInfo {
+ /**
+ * Boolean representing whether hint sessions are supported on this device
+ */
+ boolean usesSessions;
+
+ /**
+ * The set of "Boost" enum values that are supported by this device
+ * Each bit should correspond to a value of the "Boost.aidl" enum
+ */
+ long boosts;
+
+ /**
+ * The set of "Mode" enum values that are supported by this device
+ * Each bit should correspond to a value of the "Mode.aidl" enum
+ */
+ long modes;
+
+ /**
+ * The set of "SessionHint" enum values that are supported by this device
+ * Each bit should correspond to a value of the "SessionHint.aidl" enum
+ */
+ long sessionHints;
+
+ /**
+ * The set of "SessionMode" enum values that are supported by this device
+ * Each bit should correspond to a value of the "SessionMode.aidl" enum
+ */
+ long sessionModes;
+
+ /**
+ * The set of "SessionTag" enum values that are supported by this device
+ * Each bit should correspond to a value of the "SessionTag.aidl" enum
+ */
+ long sessionTags;
+}
diff --git a/power/aidl/default/Power.cpp b/power/aidl/default/Power.cpp
index 64294e5..1fc0a0a 100644
--- a/power/aidl/default/Power.cpp
+++ b/power/aidl/default/Power.cpp
@@ -41,6 +41,11 @@
ndk::enum_range<Boost>().end()};
const std::vector<Mode> MODE_RANGE{ndk::enum_range<Mode>().begin(), ndk::enum_range<Mode>().end()};
+template <class T>
+constexpr size_t enum_size() {
+ return static_cast<size_t>(*(ndk::enum_range<T>().end() - 1)) + 1;
+}
+
ScopedAStatus Power::setMode(Mode type, bool enabled) {
LOG(VERBOSE) << "Power setMode: " << static_cast<int32_t>(type) << " to: " << enabled;
return ScopedAStatus::ok();
@@ -64,6 +69,27 @@
return ScopedAStatus::ok();
}
+ndk::ScopedAStatus Power::getCpuHeadroom(const CpuHeadroomParams& _,
+ std::vector<float>* _aidl_return) {
+ *_aidl_return = {0.5f};
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus Power::getGpuHeadroom(const GpuHeadroomParams& _, float* _aidl_return) {
+ *_aidl_return = 0.5f;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus Power::getCpuHeadroomMinIntervalMillis(int64_t* _aidl_return) {
+ *_aidl_return = 1000;
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus Power::getGpuHeadroomMinIntervalMillis(int64_t* _aidl_return) {
+ *_aidl_return = 1000;
+ return ndk::ScopedAStatus::ok();
+}
+
ScopedAStatus Power::createHintSession(int32_t, int32_t, const std::vector<int32_t>& tids, int64_t,
std::shared_ptr<IPowerHintSession>* _aidl_return) {
if (tids.size() == 0) {
@@ -105,11 +131,30 @@
return ndk::ScopedAStatus::ok();
}
-ScopedAStatus Power::getHintSessionPreferredRate(int64_t* outNanoseconds) {
+ndk::ScopedAStatus Power::getHintSessionPreferredRate(int64_t* outNanoseconds) {
*outNanoseconds = std::chrono::nanoseconds(1ms).count();
return ScopedAStatus::ok();
}
+template <class E>
+int64_t bitsForEnum() {
+ return static_cast<int64_t>(std::bitset<enum_size<E>()>().set().to_ullong());
+}
+
+ndk::ScopedAStatus Power::getSupportInfo(SupportInfo* _aidl_return) {
+ static SupportInfo supportInfo = {
+ .usesSessions = false,
+ .modes = bitsForEnum<Mode>(),
+ .boosts = bitsForEnum<Boost>(),
+ .sessionHints = 0,
+ .sessionModes = 0,
+ .sessionTags = 0,
+ };
+ // Copy the support object into the binder
+ *_aidl_return = supportInfo;
+ return ndk::ScopedAStatus::ok();
+}
+
} // namespace example
} // namespace impl
} // namespace power
diff --git a/power/aidl/default/Power.h b/power/aidl/default/Power.h
index baabaa7..a77a514 100644
--- a/power/aidl/default/Power.h
+++ b/power/aidl/default/Power.h
@@ -44,6 +44,13 @@
ndk::ScopedAStatus getSessionChannel(int32_t tgid, int32_t uid,
ChannelConfig* _aidl_return) override;
ndk::ScopedAStatus closeSessionChannel(int32_t tgid, int32_t uid) override;
+ ndk::ScopedAStatus getSupportInfo(SupportInfo* _aidl_return) override;
+ ndk::ScopedAStatus getCpuHeadroom(const CpuHeadroomParams& params,
+ std::vector<float>* _aidl_return) override;
+ ndk::ScopedAStatus getGpuHeadroom(const GpuHeadroomParams& params,
+ float* _aidl_return) override;
+ ndk::ScopedAStatus getCpuHeadroomMinIntervalMillis(int64_t* _aidl_return) override;
+ ndk::ScopedAStatus getGpuHeadroomMinIntervalMillis(int64_t* _aidl_return) override;
private:
std::vector<std::shared_ptr<IPowerHintSession>> mPowerHintSessions;
diff --git a/power/aidl/default/power-default.xml b/power/aidl/default/power-default.xml
index 418fb83..1bb73f3 100644
--- a/power/aidl/default/power-default.xml
+++ b/power/aidl/default/power-default.xml
@@ -1,7 +1,7 @@
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.power</name>
- <version>5</version>
+ <version>6</version>
<fqname>IPower/default</fqname>
</hal>
</manifest>
diff --git a/power/aidl/vts/VtsHalPowerTargetTest.cpp b/power/aidl/vts/VtsHalPowerTargetTest.cpp
index 272674f..5e3ddd5 100644
--- a/power/aidl/vts/VtsHalPowerTargetTest.cpp
+++ b/power/aidl/vts/VtsHalPowerTargetTest.cpp
@@ -30,6 +30,8 @@
#include <unistd.h>
#include <cstdint>
#include "aidl/android/hardware/common/fmq/SynchronizedReadWrite.h"
+#include "aidl/android/hardware/power/CpuHeadroomParams.h"
+#include "aidl/android/hardware/power/GpuHeadroomParams.h"
namespace aidl::android::hardware::power {
namespace {
@@ -40,11 +42,14 @@
using android::hardware::power::Boost;
using android::hardware::power::ChannelConfig;
using android::hardware::power::ChannelMessage;
+using android::hardware::power::CpuHeadroomParams;
+using android::hardware::power::GpuHeadroomParams;
using android::hardware::power::IPower;
using android::hardware::power::IPowerHintSession;
using android::hardware::power::Mode;
using android::hardware::power::SessionHint;
using android::hardware::power::SessionMode;
+using android::hardware::power::SupportInfo;
using android::hardware::power::WorkDuration;
using ChannelMessageContents = ChannelMessage::ChannelMessageContents;
using ModeSetter = ChannelMessage::ChannelMessageContents::SessionModeSetter;
@@ -83,6 +88,16 @@
static_cast<SessionMode>(static_cast<int32_t>(kSessionModes.back()) + 1),
};
+template <class T>
+constexpr size_t enum_size() {
+ return static_cast<size_t>(*(ndk::enum_range<T>().end() - 1)) + 1;
+}
+
+template <class E>
+bool supportFromBitset(int64_t& supportInt, E type) {
+ return (supportInt >> static_cast<int>(type)) % 2;
+}
+
class DurationWrapper : public WorkDuration {
public:
DurationWrapper(int64_t dur, int64_t time) {
@@ -280,6 +295,43 @@
ASSERT_NE(nullptr, session);
}
+TEST_P(PowerAidl, getCpuHeadroom) {
+ if (mServiceVersion < 6) {
+ GTEST_SKIP() << "DEVICE not launching with Power V6 and beyond.";
+ }
+ CpuHeadroomParams params;
+ std::vector<float> headroom;
+ auto ret = power->getCpuHeadroom(params, &headroom);
+ if (ret.getExceptionCode() == EX_UNSUPPORTED_OPERATION) {
+ GTEST_SKIP() << "power->getCpuHeadroom is not supported";
+ }
+ ASSERT_TRUE(ret.isOk());
+ int64_t minIntervalMillis;
+ ASSERT_TRUE(power->getCpuHeadroomMinIntervalMillis(&minIntervalMillis).isOk());
+ ASSERT_GE(minIntervalMillis, 0);
+ ASSERT_GE(headroom.size(), 1);
+ ASSERT_GE(headroom[0], 0.0f);
+ ASSERT_LE(headroom[0], 100.00f);
+}
+
+TEST_P(PowerAidl, getGpuHeadroom) {
+ if (mServiceVersion < 6) {
+ GTEST_SKIP() << "DEVICE not launching with Power V6 and beyond.";
+ }
+ GpuHeadroomParams params;
+ float headroom;
+ auto ret = power->getGpuHeadroom(params, &headroom);
+ if (ret.getExceptionCode() == EX_UNSUPPORTED_OPERATION) {
+ GTEST_SKIP() << "power->getGpuHeadroom is not supported";
+ }
+ ASSERT_TRUE(ret.isOk());
+ int64_t minIntervalMillis;
+ ASSERT_TRUE(power->getGpuHeadroomMinIntervalMillis(&minIntervalMillis).isOk());
+ ASSERT_GE(minIntervalMillis, 0);
+ ASSERT_GE(headroom, 0.0f);
+ ASSERT_LE(headroom, 100.00f);
+}
+
// FIXED_PERFORMANCE mode is required for all devices which ship on Android 11
// or later
TEST_P(PowerAidl, hasFixedPerformance) {
@@ -288,6 +340,21 @@
ASSERT_TRUE(supported);
}
+TEST_P(PowerAidl, hasSupportInfo) {
+ SupportInfo config;
+ ASSERT_TRUE(power->getSupportInfo(&config).isOk());
+ for (Mode mode : kModes) {
+ bool supported;
+ power->isModeSupported(mode, &supported);
+ ASSERT_EQ(supported, supportFromBitset(config.modes, mode));
+ }
+ for (Boost boost : kBoosts) {
+ bool supported;
+ power->isBoostSupported(boost, &supported);
+ ASSERT_EQ(supported, supportFromBitset(config.boosts, boost));
+ }
+}
+
TEST_P(HintSessionAidl, createAndCloseHintSession) {
if (!mSessionSupport) {
GTEST_SKIP() << "DEVICE not support Hint Session.";
diff --git a/radio/aidl/android/hardware/radio/modem/IRadioModem.aidl b/radio/aidl/android/hardware/radio/modem/IRadioModem.aidl
index bfca5a9..491657c 100644
--- a/radio/aidl/android/hardware/radio/modem/IRadioModem.aidl
+++ b/radio/aidl/android/hardware/radio/modem/IRadioModem.aidl
@@ -139,15 +139,14 @@
void nvReadItem(in int serial, in NvItem itemId);
/**
- * Reset the radio NV configuration to the factory state.
- * This is used for device configuration by some CDMA operators.
+ * Reset the radio NV configuration.
+ *
+ * This is also used to reboot the modem with ResetNvType.RELOAD.
*
* @param serial Serial number of request.
- * @param resetType ResetNvType
+ * @param resetType Type of reset operation
*
* Response function is IRadioModemResponse.nvResetConfigResponse()
- *
- * Note: This will be deprecated in favor of a rebootModem API in Android U.
*/
void nvResetConfig(in int serial, in ResetNvType resetType);
diff --git a/radio/aidl/android/hardware/radio/modem/IRadioModemResponse.aidl b/radio/aidl/android/hardware/radio/modem/IRadioModemResponse.aidl
index 6d2504c..498f228 100644
--- a/radio/aidl/android/hardware/radio/modem/IRadioModemResponse.aidl
+++ b/radio/aidl/android/hardware/radio/modem/IRadioModemResponse.aidl
@@ -175,8 +175,6 @@
* Valid errors returned:
* RadioError:NONE
* RadioError:RADIO_NOT_AVAILABLE
- *
- * Note: This will be deprecated in favor of a rebootModemResponse API in Android U.
*/
void nvResetConfigResponse(in RadioResponseInfo info);
diff --git a/radio/aidl/android/hardware/radio/modem/ResetNvType.aidl b/radio/aidl/android/hardware/radio/modem/ResetNvType.aidl
index b6be54d..71736d8 100644
--- a/radio/aidl/android/hardware/radio/modem/ResetNvType.aidl
+++ b/radio/aidl/android/hardware/radio/modem/ResetNvType.aidl
@@ -17,7 +17,6 @@
package android.hardware.radio.modem;
/**
- * Note: This will be deprecated along with nvResetConfig in Android U.
* @hide
*/
@VintfStability
@@ -26,7 +25,7 @@
@SuppressWarnings(value={"redundant-name"})
enum ResetNvType {
/**
- * Reload all NV items
+ * Reload all NV items. This may reboot modem.
*/
RELOAD,
/**
diff --git a/radio/aidl/android/hardware/radio/sim/IRadioSimResponse.aidl b/radio/aidl/android/hardware/radio/sim/IRadioSimResponse.aidl
index cf08bad..8666e03 100644
--- a/radio/aidl/android/hardware/radio/sim/IRadioSimResponse.aidl
+++ b/radio/aidl/android/hardware/radio/sim/IRadioSimResponse.aidl
@@ -381,6 +381,7 @@
* RadioError:INVALID_MODEM_STATE
* RadioError:SIM_ERR
* RadioError:INVALID_ARGUMENTS
+ * RadioError:REQUEST_NOT_SUPPORTED
*/
void requestIccSimAuthenticationResponse(in RadioResponseInfo info, in IccIoResult result);
diff --git a/radio/aidl/vts/radio_network_test.cpp b/radio/aidl/vts/radio_network_test.cpp
index 914cad0..3d24165 100644
--- a/radio/aidl/vts/radio_network_test.cpp
+++ b/radio/aidl/vts/radio_network_test.cpp
@@ -609,6 +609,11 @@
}
}
+ if (!deviceSupportsFeature(FEATURE_TELEPHONY_CDMA)) {
+ GTEST_SKIP() << "Skipping setSignalStrengthReportingCriteria_Cdma2000 "
+ "due to undefined FEATURE_TELEPHONY_CDMA";
+ }
+
serial = GetRandomSerialNumber();
SignalThresholdInfo signalThresholdInfo;
@@ -824,9 +829,12 @@
signalThresholdInfoNgran.isEnabled = true;
signalThresholdInfoNgran.ran = AccessNetwork::NGRAN;
- const static std::vector<SignalThresholdInfo> candidateSignalThresholdInfos = {
+ std::vector<SignalThresholdInfo> candidateSignalThresholdInfos = {
signalThresholdInfoGeran, signalThresholdInfoUtran, signalThresholdInfoEutran,
- signalThresholdInfoCdma2000, signalThresholdInfoNgran};
+ signalThresholdInfoNgran};
+ if (deviceSupportsFeature(FEATURE_TELEPHONY_CDMA)) {
+ candidateSignalThresholdInfos.push_back(signalThresholdInfoCdma2000);
+ }
std::vector<SignalThresholdInfo> supportedSignalThresholdInfos;
for (size_t i = 0; i < candidateSignalThresholdInfos.size(); i++) {
diff --git a/thermal/aidl/Android.bp b/thermal/aidl/Android.bp
index 597a166..db77783 100644
--- a/thermal/aidl/Android.bp
+++ b/thermal/aidl/Android.bp
@@ -48,8 +48,7 @@
version: "2",
imports: [],
},
-
],
- frozen: true,
+ frozen: false,
}
diff --git a/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/IThermalChangedCallback.aidl b/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/IThermalChangedCallback.aidl
index 5e1d753..779544b 100644
--- a/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/IThermalChangedCallback.aidl
+++ b/thermal/aidl/aidl_api/android.hardware.thermal/current/android/hardware/thermal/IThermalChangedCallback.aidl
@@ -36,4 +36,5 @@
@VintfStability
interface IThermalChangedCallback {
oneway void notifyThrottling(in android.hardware.thermal.Temperature temperature);
+ oneway void notifyThresholdChanged(in android.hardware.thermal.TemperatureThreshold threshold);
}
diff --git a/thermal/aidl/android/hardware/thermal/IThermalChangedCallback.aidl b/thermal/aidl/android/hardware/thermal/IThermalChangedCallback.aidl
index 105f085..1ff4b7a 100644
--- a/thermal/aidl/android/hardware/thermal/IThermalChangedCallback.aidl
+++ b/thermal/aidl/android/hardware/thermal/IThermalChangedCallback.aidl
@@ -17,6 +17,7 @@
package android.hardware.thermal;
import android.hardware.thermal.Temperature;
+import android.hardware.thermal.TemperatureThreshold;
/**
* IThermalChangedCallback send throttling notification to clients.
@@ -25,11 +26,19 @@
@VintfStability
interface IThermalChangedCallback {
/**
- * Send a thermal throttling event to all ThermalHAL
+ * Send a thermal throttling event to all Thermal HAL
* thermal event listeners.
*
* @param temperature The temperature associated with the
* throttling event.
*/
oneway void notifyThrottling(in Temperature temperature);
+
+ /**
+ * Send a thermal threshold change event to all Thermal HAL
+ * thermal event listeners.
+ *
+ * @param threshold The temperature threshold that changed.
+ */
+ oneway void notifyThresholdChanged(in TemperatureThreshold threshold);
}
diff --git a/thermal/aidl/default/Android.bp b/thermal/aidl/default/Android.bp
index 9fe62ce..9d89903 100644
--- a/thermal/aidl/default/Android.bp
+++ b/thermal/aidl/default/Android.bp
@@ -27,7 +27,7 @@
vendor: true,
stl: "c++_static",
static_libs: [
- "android.hardware.thermal-V2-ndk",
+ "android.hardware.thermal-V3-ndk",
"libbase",
],
shared_libs: [
diff --git a/thermal/aidl/default/thermal-example.xml b/thermal/aidl/default/thermal-example.xml
index 08dc68c..148ddbf 100644
--- a/thermal/aidl/default/thermal-example.xml
+++ b/thermal/aidl/default/thermal-example.xml
@@ -1,7 +1,7 @@
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.thermal</name>
- <version>2</version>
+ <version>3</version>
<fqname>IThermal/default</fqname>
</hal>
</manifest>
diff --git a/thermal/aidl/vts/Android.bp b/thermal/aidl/vts/Android.bp
index 35f7649..18cb051 100644
--- a/thermal/aidl/vts/Android.bp
+++ b/thermal/aidl/vts/Android.bp
@@ -33,7 +33,7 @@
"libbinder_ndk",
],
static_libs: [
- "android.hardware.thermal-V2-ndk",
+ "android.hardware.thermal-V3-ndk",
],
test_suites: [
"vts",
diff --git a/thermal/aidl/vts/VtsHalThermalTargetTest.cpp b/thermal/aidl/vts/VtsHalThermalTargetTest.cpp
index 7f33e2d..066e773 100644
--- a/thermal/aidl/vts/VtsHalThermalTargetTest.cpp
+++ b/thermal/aidl/vts/VtsHalThermalTargetTest.cpp
@@ -93,6 +93,10 @@
return ndk::ScopedAStatus::ok();
}
+ ndk::ScopedAStatus notifyThresholdChanged(const TemperatureThreshold&) {
+ return ndk::ScopedAStatus::ok();
+ }
+
template <typename R, typename P>
[[nodiscard]] bool waitForCallback(std::chrono::duration<R, P> duration) {
std::unique_lock<std::mutex> lock(mMutex);
diff --git a/tv/mediaquality/OWNERS b/tv/mediaquality/OWNERS
new file mode 100644
index 0000000..35ca732
--- /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 0000000..0084248
--- /dev/null
+++ b/tv/mediaquality/aidl/Android.bp
@@ -0,0 +1,38 @@
+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",
+ ],
+ imports: [
+ "android.hardware.graphics.common-V5",
+ ],
+ stability: "vintf",
+ backend: {
+ java: {
+ enabled: true,
+ platform_apis: true,
+ },
+ ndk: {
+ enabled: true,
+ min_sdk_version: "29",
+ },
+ rust: {
+ enabled: true,
+ },
+ cpp: {
+ enabled: false,
+ },
+ },
+ frozen: false,
+}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightCompressAlgorithm.aidl
similarity index 92%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightCompressAlgorithm.aidl
index a5eda52..d441370 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightCompressAlgorithm.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
+package android.hardware.tv.mediaquality;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+enum AmbientBacklightCompressAlgorithm {
+ NONE = 0,
+ RLE = 1,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightEvent.aidl
similarity index 90%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightEvent.aidl
index a5eda52..2fc2cc6 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightEvent.aidl
@@ -31,9 +31,9 @@
// 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.vibrator;
+package android.hardware.tv.mediaquality;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+union AmbientBacklightEvent {
+ boolean enabled;
+ android.hardware.tv.mediaquality.AmbientBacklightMetadata metadata;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightMetadata.aidl
similarity index 86%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightMetadata.aidl
index a5eda52..bbdfd62 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightMetadata.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
+package android.hardware.tv.mediaquality;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable AmbientBacklightMetadata {
+ android.hardware.tv.mediaquality.AmbientBacklightSettings settings;
+ android.hardware.tv.mediaquality.AmbientBacklightCompressAlgorithm compressAlgorithm;
+ int[] zonesColors;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSettings.aidl
similarity index 83%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSettings.aidl
index a5eda52..ffbae26 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSettings.aidl
@@ -31,9 +31,15 @@
// 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.vibrator;
+package android.hardware.tv.mediaquality;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+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/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSource.aidl
similarity index 92%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSource.aidl
index a5eda52..22912f4 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/AmbientBacklightSource.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
+package android.hardware.tv.mediaquality;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+enum AmbientBacklightSource {
+ NONE = 0,
+ AUDIO = 1,
+ VIDEO = 2,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl
similarity index 81%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl
index a5eda52..d2b2bc3 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl
@@ -31,9 +31,11 @@
// 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.vibrator;
+package android.hardware.tv.mediaquality;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+interface IMediaQuality {
+ 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/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQualityCallback.aidl
similarity index 89%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQualityCallback.aidl
index a5eda52..014bf58 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQualityCallback.aidl
@@ -31,9 +31,8 @@
// 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.vibrator;
+package android.hardware.tv.mediaquality;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+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
new file mode 100644
index 0000000..def9e39
--- /dev/null
+++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl
@@ -0,0 +1,59 @@
+/*
+ * 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.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 backlight detection, false to disable.
+ */
+ void setAmbientBacklightDetectionEnabled(in boolean enabled);
+
+ /**
+ * 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 backlight detection is enabled, false otherwise.
+ */
+ 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/Android.bp b/tv/mediaquality/aidl/default/Android.bp
new file mode 100644
index 0000000..e25b01f
--- /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 0000000..8769804
--- /dev/null
+++ b/tv/mediaquality/aidl/default/hal/media_quality_hal_impl.rs
@@ -0,0 +1,114 @@
+/*
+ * 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,
+ 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 {
+ callback: Arc<Mutex<Option<Strong<dyn IMediaQualityCallback>>>>,
+ ambient_backlight_enabled: Arc<Mutex<bool>>,
+ ambient_backlight_detector_settings: Arc<Mutex<AmbientBacklightSettings>>
+}
+
+impl MediaQualityService {
+
+ /// Create a new instance of the MediaQualityService.
+ pub fn new() -> Self {
+ Self {
+ callback: Arc::new(Mutex::new(None)),
+ ambient_backlight_enabled: Arc::new(Mutex::new(true)),
+ ambient_backlight_detector_settings:
+ Arc::new(Mutex::new(AmbientBacklightSettings::default())),
+ }
+ }
+}
+
+impl Interface for MediaQualityService {}
+
+impl IMediaQuality for MediaQualityService {
+
+ 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 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/default/hal/mod.rs b/tv/mediaquality/aidl/default/hal/mod.rs
new file mode 100644
index 0000000..5b5d4ac
--- /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 0000000..f0cccb4
--- /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 0000000..5a103a9
--- /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 0000000..865f663
--- /dev/null
+++ b/tv/mediaquality/aidl/default/mediaquality-default.xml
@@ -0,0 +1,6 @@
+<manifest version="1.0" type="device">
+ <hal format="aidl">
+ <name>android.hardware.tv.mediaquality</name>
+ <fqname>IMediaQuality/default</fqname>
+ </hal>
+</manifest>
\ 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 0000000..226569e
--- /dev/null
+++ b/tv/mediaquality/aidl/vts/functional/Android.bp
@@ -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 {
+ 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",
+ "libbinder_ndk",
+ ],
+ static_libs: [
+ "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
new file mode 100644
index 0000000..c11ebcb
--- /dev/null
+++ b/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp
@@ -0,0 +1,120 @@
+/*
+ * 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_backlight_aidl_hal_test"
+
+#include <aidl/Gtest.h>
+#include <aidl/Vintf.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 <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::String16;
+using ndk::ScopedAStatus;
+using ndk::SpAIBinder;
+
+#define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk())
+#define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk())
+
+class MediaQualityCallback : public BnMediaQualityCallback {
+ public:
+ 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();
+ }
+
+ private:
+ std::function<void(const AmbientBacklightEvent& event)> on_hal_event_cb_;
+};
+
+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, TestGetAmbientBacklightDetectionEnabled) {
+ bool 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);
+
+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();
+}
diff --git a/tv/tuner/aidl/Android.bp b/tv/tuner/aidl/Android.bp
index efcc327..e53e84d 100644
--- a/tv/tuner/aidl/Android.bp
+++ b/tv/tuner/aidl/Android.bp
@@ -39,7 +39,7 @@
"android.hardware.common.fmq-V1",
],
},
-
],
+ frozen: false,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioPreselectionRenderingIndicationType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioPreselectionRenderingIndicationType.aidl
index 783511f..2977ff6 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioPreselectionRenderingIndicationType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioPreselectionRenderingIndicationType.aidl
@@ -35,9 +35,9 @@
/* @hide */
@Backing(type="int") @VintfStability
enum AudioPreselectionRenderingIndicationType {
- NOT_INDICATED = 0,
- STEREO = 1,
- TWO_DIMENSIONAL = 2,
- THREE_DIMENSIONAL = 3,
- HEADPHONE = 4,
+ NOT_INDICATED,
+ STEREO,
+ TWO_DIMENSIONAL,
+ THREE_DIMENSIONAL,
+ HEADPHONE,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioPresentation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioPresentation.aidl
index 96a6d98..eba820c 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioPresentation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioPresentation.aidl
@@ -36,5 +36,5 @@
@VintfStability
parcelable AudioPresentation {
android.hardware.tv.tuner.AudioPreselection preselection;
- int ac4ShortProgramId = -1;
+ int ac4ShortProgramId = (-1) /* -1 */;
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioStreamType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioStreamType.aidl
index 6c538ea..4754bb1 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioStreamType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioStreamType.aidl
@@ -35,24 +35,24 @@
/* @hide */
@Backing(type="int") @VintfStability
enum AudioStreamType {
- UNDEFINED = 0,
- PCM = 1,
- MP3 = 2,
- MPEG1 = 3,
- MPEG2 = 4,
- MPEGH = 5,
- AAC = 6,
- AC3 = 7,
- EAC3 = 8,
- AC4 = 9,
- DTS = 10,
- DTS_HD = 11,
- WMA = 12,
- OPUS = 13,
- VORBIS = 14,
- DRA = 15,
- AAC_ADTS = 16,
- AAC_LATM = 17,
- AAC_HE_ADTS = 18,
- AAC_HE_LATM = 19,
+ UNDEFINED,
+ PCM,
+ MP3,
+ MPEG1,
+ MPEG2,
+ MPEGH,
+ AAC,
+ AC3,
+ EAC3,
+ AC4,
+ DTS,
+ DTS_HD,
+ WMA,
+ OPUS,
+ VORBIS,
+ DRA,
+ AAC_ADTS,
+ AAC_LATM,
+ AAC_HE_ADTS,
+ AAC_HE_LATM,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant.aidl
index 95ecc51..1f7153b 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant.aidl
@@ -35,17 +35,17 @@
/* @hide */
@Backing(type="int") @VintfStability
enum Constant {
- INVALID_TS_PID = 65535,
- INVALID_STREAM_ID = 65535,
- INVALID_FILTER_ID = -1,
- INVALID_AV_SYNC_ID = -1,
- INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM = -1,
- INVALID_FIRST_MACROBLOCK_IN_SLICE = -1,
- INVALID_FRONTEND_SETTING_FREQUENCY = -1,
- INVALID_IP_FILTER_CONTEXT_ID = -1,
- INVALID_LTS_ID = -1,
- INVALID_FRONTEND_ID = -1,
- INVALID_LNB_ID = -1,
- INVALID_KEYTOKEN = 0,
- INVALID_TABINFO_VERSION = -1,
+ INVALID_TS_PID = 0xFFFF,
+ INVALID_STREAM_ID = 0xFFFF,
+ INVALID_FILTER_ID = 0xFFFFFFFF,
+ INVALID_AV_SYNC_ID = 0xFFFFFFFF,
+ INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM = 0xFFFFFFFF,
+ INVALID_FIRST_MACROBLOCK_IN_SLICE = 0xFFFFFFFF,
+ INVALID_FRONTEND_SETTING_FREQUENCY = 0xFFFFFFFF,
+ INVALID_IP_FILTER_CONTEXT_ID = 0xFFFFFFFF,
+ INVALID_LTS_ID = 0xFFFFFFFF,
+ INVALID_FRONTEND_ID = 0xFFFFFFFF,
+ INVALID_LNB_ID = 0xFFFFFFFF,
+ INVALID_KEYTOKEN = 0x00,
+ INVALID_TABINFO_VERSION = 0xFFFFFFFF,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant64Bit.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant64Bit.aidl
index a56a0cf..ccbfd1a 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant64Bit.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant64Bit.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="long") @VintfStability
enum Constant64Bit {
- INVALID_FILTER_ID_64BIT = -1,
- INVALID_AV_SYNC_ID_64BIT = -1,
- INVALID_PRESENTATION_TIME_STAMP = -1,
+ INVALID_FILTER_ID_64BIT = 0xFFFFFFFFFFFFFFFF,
+ INVALID_AV_SYNC_ID_64BIT = 0xFFFFFFFFFFFFFFFF,
+ INVALID_PRESENTATION_TIME_STAMP = 0xFFFFFFFFFFFFFFFF,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DataFormat.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DataFormat.aidl
index 3b8fee4..5fb34ba 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DataFormat.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DataFormat.aidl
@@ -35,9 +35,9 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DataFormat {
- TS = 0,
- PES = 1,
- ES = 2,
- SHV_TLV = 3,
- UNDEFINED = 4,
+ TS,
+ PES,
+ ES,
+ SHV_TLV,
+ UNDEFINED,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterType.aidl
index f0df497..c164f19 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterType.aidl
@@ -35,8 +35,8 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DemuxAlpFilterType {
- UNDEFINED = 0,
- SECTION = 1,
- PTP = 2,
- PAYLOAD_THROUGH = 3,
+ UNDEFINED,
+ SECTION,
+ PTP,
+ PAYLOAD_THROUGH,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpLengthType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpLengthType.aidl
index ccca6de..59edc34 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpLengthType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpLengthType.aidl
@@ -36,6 +36,6 @@
@Backing(type="byte") @VintfStability
enum DemuxAlpLengthType {
UNDEFINED = 0,
- WITHOUT_ADDITIONAL_HEADER = 1,
- WITH_ADDITIONAL_HEADER = 2,
+ WITHOUT_ADDITIONAL_HEADER,
+ WITH_ADDITIONAL_HEADER,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMainType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMainType.aidl
index 6abd87b..b78965d 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMainType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMainType.aidl
@@ -36,9 +36,9 @@
@Backing(type="int") @VintfStability
enum DemuxFilterMainType {
UNDEFINED = 0,
- TS = 1,
- MMTP = 2,
- IP = 4,
- TLV = 8,
- ALP = 16,
+ TS = (1 << 0) /* 1 */,
+ MMTP = (1 << 1) /* 2 */,
+ IP = (1 << 2) /* 4 */,
+ TLV = (1 << 3) /* 8 */,
+ ALP = (1 << 4) /* 16 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl
index 61a9555..126c740 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl
@@ -49,4 +49,7 @@
boolean isPesPrivateData;
android.hardware.tv.tuner.DemuxFilterMediaEventExtraMetaData extraMetaData;
android.hardware.tv.tuner.DemuxFilterScIndexMask scIndexMask;
+ int numDataPieces;
+ int indexInDataGroup;
+ int dataGroupId;
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl
index 5d27f76..062650b 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl
@@ -35,6 +35,6 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DemuxFilterMonitorEventType {
- SCRAMBLING_STATUS = 1,
- IP_CID_CHANGE = 2,
+ SCRAMBLING_STATUS = (1 << 0) /* 1 */,
+ IP_CID_CHANGE = (1 << 1) /* 2 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterStatus.aidl
index 1dc593a..cfc5838 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterStatus.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterStatus.aidl
@@ -35,9 +35,9 @@
/* @hide */
@Backing(type="byte") @VintfStability
enum DemuxFilterStatus {
- DATA_READY = 1,
- LOW_WATER = 2,
- HIGH_WATER = 4,
- OVERFLOW = 8,
- NO_DATA = 16,
+ DATA_READY = (1 << 0) /* 1 */,
+ LOW_WATER = (1 << 1) /* 2 */,
+ HIGH_WATER = (1 << 2) /* 4 */,
+ OVERFLOW = (1 << 3) /* 8 */,
+ NO_DATA = (1 << 4) /* 16 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxInfo.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxInfo.aidl
index 872d963..12f9dc8 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxInfo.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxInfo.aidl
@@ -35,5 +35,5 @@
/* @hide */
@VintfStability
parcelable DemuxInfo {
- int filterTypes = 0;
+ int filterTypes = android.hardware.tv.tuner.DemuxFilterMainType.UNDEFINED /* 0 */;
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterType.aidl
index b78ac9a..7320aec 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterType.aidl
@@ -35,10 +35,10 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DemuxIpFilterType {
- UNDEFINED = 0,
- SECTION = 1,
- NTP = 2,
- IP_PAYLOAD = 3,
- IP = 4,
- PAYLOAD_THROUGH = 5,
+ UNDEFINED,
+ SECTION,
+ NTP,
+ IP_PAYLOAD,
+ IP,
+ PAYLOAD_THROUGH,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl
index 7e9e3a6..a89c5b1 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl
@@ -35,12 +35,12 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DemuxMmtpFilterType {
- UNDEFINED = 0,
- SECTION = 1,
- PES = 2,
- MMTP = 3,
- AUDIO = 4,
- VIDEO = 5,
- RECORD = 6,
- DOWNLOAD = 7,
+ UNDEFINED,
+ SECTION,
+ PES,
+ MMTP,
+ AUDIO,
+ VIDEO,
+ RECORD,
+ DOWNLOAD,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl
index bcd0aeb..ecb4e8b 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl
@@ -35,6 +35,6 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DemuxQueueNotifyBits {
- DATA_READY = 1,
- DATA_CONSUMED = 2,
+ DATA_READY = (1 << 0) /* 1 */,
+ DATA_CONSUMED = (1 << 1) /* 2 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl
index fb4430b..5556bb2 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl
@@ -35,9 +35,9 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DemuxRecordScIndexType {
- NONE = 0,
- SC = 1,
- SC_HEVC = 2,
- SC_AVC = 3,
- SC_VVC = 4,
+ NONE,
+ SC,
+ SC_HEVC,
+ SC_AVC,
+ SC_VVC,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScAvcIndex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScAvcIndex.aidl
index 651b66c..5c51793 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScAvcIndex.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScAvcIndex.aidl
@@ -36,9 +36,9 @@
@Backing(type="int") @VintfStability
enum DemuxScAvcIndex {
UNDEFINED = 0,
- I_SLICE = 1,
- P_SLICE = 2,
- B_SLICE = 4,
- SI_SLICE = 8,
- SP_SLICE = 16,
+ I_SLICE = (1 << 0) /* 1 */,
+ P_SLICE = (1 << 1) /* 2 */,
+ B_SLICE = (1 << 2) /* 4 */,
+ SI_SLICE = (1 << 3) /* 8 */,
+ SP_SLICE = (1 << 4) /* 16 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScHevcIndex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScHevcIndex.aidl
index 670b34e..d07bcb7 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScHevcIndex.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScHevcIndex.aidl
@@ -36,12 +36,12 @@
@Backing(type="int") @VintfStability
enum DemuxScHevcIndex {
UNDEFINED = 0,
- SPS = 1,
- AUD = 2,
- SLICE_CE_BLA_W_LP = 4,
- SLICE_BLA_W_RADL = 8,
- SLICE_BLA_N_LP = 16,
- SLICE_IDR_W_RADL = 32,
- SLICE_IDR_N_LP = 64,
- SLICE_TRAIL_CRA = 128,
+ SPS = (1 << 0) /* 1 */,
+ AUD = (1 << 1) /* 2 */,
+ SLICE_CE_BLA_W_LP = (1 << 2) /* 4 */,
+ SLICE_BLA_W_RADL = (1 << 3) /* 8 */,
+ SLICE_BLA_N_LP = (1 << 4) /* 16 */,
+ SLICE_IDR_W_RADL = (1 << 5) /* 32 */,
+ SLICE_IDR_N_LP = (1 << 6) /* 64 */,
+ SLICE_TRAIL_CRA = (1 << 7) /* 128 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScIndex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScIndex.aidl
index 25f0585..509c1ab 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScIndex.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScIndex.aidl
@@ -36,8 +36,8 @@
@Backing(type="int") @VintfStability
enum DemuxScIndex {
UNDEFINED = 0,
- I_FRAME = 1,
- P_FRAME = 2,
- B_FRAME = 4,
- SEQUENCE = 8,
+ I_FRAME = (1 << 0) /* 1 */,
+ P_FRAME = (1 << 1) /* 2 */,
+ B_FRAME = (1 << 2) /* 4 */,
+ SEQUENCE = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScVvcIndex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScVvcIndex.aidl
index 3e08d26..ac3a5e6 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScVvcIndex.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScVvcIndex.aidl
@@ -36,11 +36,11 @@
@Backing(type="int") @VintfStability
enum DemuxScVvcIndex {
UNDEFINED = 0,
- SLICE_IDR_W_RADL = 1,
- SLICE_IDR_N_LP = 2,
- SLICE_CRA = 4,
- SLICE_GDR = 8,
- VPS = 16,
- SPS = 32,
- AUD = 64,
+ SLICE_IDR_W_RADL = (1 << 0) /* 1 */,
+ SLICE_IDR_N_LP = (1 << 1) /* 2 */,
+ SLICE_CRA = (1 << 2) /* 4 */,
+ SLICE_GDR = (1 << 3) /* 8 */,
+ VPS = (1 << 4) /* 16 */,
+ SPS = (1 << 5) /* 32 */,
+ AUD = (1 << 6) /* 64 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterType.aidl
index a4e1ff1..bd9e583 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterType.aidl
@@ -35,8 +35,8 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DemuxTlvFilterType {
- UNDEFINED = 0,
- SECTION = 1,
- TLV = 2,
- PAYLOAD_THROUGH = 3,
+ UNDEFINED,
+ SECTION,
+ TLV,
+ PAYLOAD_THROUGH,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterType.aidl
index 8b806bf..8be0e95 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterType.aidl
@@ -35,13 +35,13 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DemuxTsFilterType {
- UNDEFINED = 0,
- SECTION = 1,
- PES = 2,
- TS = 3,
- AUDIO = 4,
- VIDEO = 5,
- PCR = 6,
- RECORD = 7,
- TEMI = 8,
+ UNDEFINED,
+ SECTION,
+ PES,
+ TS,
+ AUDIO,
+ VIDEO,
+ PCR,
+ RECORD,
+ TEMI,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsIndex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsIndex.aidl
index ed03477..9ca684f 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsIndex.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsIndex.aidl
@@ -35,22 +35,22 @@
/* @hide */
@Backing(type="int") @VintfStability
enum DemuxTsIndex {
- FIRST_PACKET = 1,
- PAYLOAD_UNIT_START_INDICATOR = 2,
- CHANGE_TO_NOT_SCRAMBLED = 4,
- CHANGE_TO_EVEN_SCRAMBLED = 8,
- CHANGE_TO_ODD_SCRAMBLED = 16,
- DISCONTINUITY_INDICATOR = 32,
- RANDOM_ACCESS_INDICATOR = 64,
- PRIORITY_INDICATOR = 128,
- PCR_FLAG = 256,
- OPCR_FLAG = 512,
- SPLICING_POINT_FLAG = 1024,
- PRIVATE_DATA = 2048,
- ADAPTATION_EXTENSION_FLAG = 4096,
- MPT_INDEX_MPT = 65536,
- MPT_INDEX_VIDEO = 131072,
- MPT_INDEX_AUDIO = 262144,
- MPT_INDEX_TIMESTAMP_TARGET_VIDEO = 524288,
- MPT_INDEX_TIMESTAMP_TARGET_AUDIO = 1048576,
+ FIRST_PACKET = (1 << 0) /* 1 */,
+ PAYLOAD_UNIT_START_INDICATOR = (1 << 1) /* 2 */,
+ CHANGE_TO_NOT_SCRAMBLED = (1 << 2) /* 4 */,
+ CHANGE_TO_EVEN_SCRAMBLED = (1 << 3) /* 8 */,
+ CHANGE_TO_ODD_SCRAMBLED = (1 << 4) /* 16 */,
+ DISCONTINUITY_INDICATOR = (1 << 5) /* 32 */,
+ RANDOM_ACCESS_INDICATOR = (1 << 6) /* 64 */,
+ PRIORITY_INDICATOR = (1 << 7) /* 128 */,
+ PCR_FLAG = (1 << 8) /* 256 */,
+ OPCR_FLAG = (1 << 9) /* 512 */,
+ SPLICING_POINT_FLAG = (1 << 10) /* 1024 */,
+ PRIVATE_DATA = (1 << 11) /* 2048 */,
+ ADAPTATION_EXTENSION_FLAG = (1 << 12) /* 4096 */,
+ MPT_INDEX_MPT = (1 << 16) /* 65536 */,
+ MPT_INDEX_VIDEO = (1 << 17) /* 131072 */,
+ MPT_INDEX_AUDIO = (1 << 18) /* 262144 */,
+ MPT_INDEX_TIMESTAMP_TARGET_VIDEO = (1 << 19) /* 524288 */,
+ MPT_INDEX_TIMESTAMP_TARGET_AUDIO = (1 << 20) /* 1048576 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrType.aidl
index 3a0c1e4..6dab74b 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrType.aidl
@@ -35,6 +35,6 @@
/* @hide */
@Backing(type="byte") @VintfStability
enum DvrType {
- RECORD = 0,
- PLAYBACK = 1,
+ RECORD,
+ PLAYBACK,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FilterDelayHintType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FilterDelayHintType.aidl
index 8c5a3f5..af35c70 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FilterDelayHintType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FilterDelayHintType.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FilterDelayHintType {
- INVALID = 0,
- TIME_DELAY_IN_MS = 1,
- DATA_SIZE_DELAY_IN_BYTES = 2,
+ INVALID,
+ TIME_DELAY_IN_MS,
+ DATA_SIZE_DELAY_IN_BYTES,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl
index 6b32110..45aa2af 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendAnalogAftFlag {
- UNDEFINED = 0,
- AFT_TRUE = 1,
- AFT_FALSE = 2,
+ UNDEFINED,
+ AFT_TRUE,
+ AFT_FALSE,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl
index 3502522..8d19461 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl
@@ -36,22 +36,22 @@
@Backing(type="int") @VintfStability
enum FrontendAnalogSifStandard {
UNDEFINED = 0,
- AUTO = 1,
- BG = 2,
- BG_A2 = 4,
- BG_NICAM = 8,
- I = 16,
- DK = 32,
- DK1_A2 = 64,
- DK2_A2 = 128,
- DK3_A2 = 256,
- DK_NICAM = 512,
- L = 1024,
- M = 2048,
- M_BTSC = 4096,
- M_A2 = 8192,
- M_EIAJ = 16384,
- I_NICAM = 32768,
- L_NICAM = 65536,
- L_PRIME = 131072,
+ AUTO = (1 << 0) /* 1 */,
+ BG = (1 << 1) /* 2 */,
+ BG_A2 = (1 << 2) /* 4 */,
+ BG_NICAM = (1 << 3) /* 8 */,
+ I = (1 << 4) /* 16 */,
+ DK = (1 << 5) /* 32 */,
+ DK1_A2 = (1 << 6) /* 64 */,
+ DK2_A2 = (1 << 7) /* 128 */,
+ DK3_A2 = (1 << 8) /* 256 */,
+ DK_NICAM = (1 << 9) /* 512 */,
+ L = (1 << 10) /* 1024 */,
+ M = (1 << 11) /* 2048 */,
+ M_BTSC = (1 << 12) /* 4096 */,
+ M_A2 = (1 << 13) /* 8192 */,
+ M_EIAJ = (1 << 14) /* 16384 */,
+ I_NICAM = (1 << 15) /* 32768 */,
+ L_NICAM = (1 << 16) /* 65536 */,
+ L_PRIME = (1 << 17) /* 131072 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogType.aidl
index 33fd93d..bf8b000 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogType.aidl
@@ -36,12 +36,12 @@
@Backing(type="int") @VintfStability
enum FrontendAnalogType {
UNDEFINED = 0,
- AUTO = 1,
- PAL = 2,
- PAL_M = 4,
- PAL_N = 8,
- PAL_60 = 16,
- NTSC = 32,
- NTSC_443 = 64,
- SECAM = 128,
+ AUTO = (1 << 0) /* 1 */,
+ PAL = (1 << 1) /* 2 */,
+ PAL_M = (1 << 2) /* 4 */,
+ PAL_N = (1 << 3) /* 8 */,
+ PAL_60 = (1 << 4) /* 16 */,
+ NTSC = (1 << 5) /* 32 */,
+ NTSC_443 = (1 << 6) /* 64 */,
+ SECAM = (1 << 7) /* 128 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl
index 51a3fc5..9704f40 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl
@@ -36,8 +36,8 @@
@Backing(type="int") @VintfStability
enum FrontendAtsc3Bandwidth {
UNDEFINED = 0,
- AUTO = 1,
- BANDWIDTH_6MHZ = 2,
- BANDWIDTH_7MHZ = 4,
- BANDWIDTH_8MHZ = 8,
+ AUTO = (1 << 0) /* 1 */,
+ BANDWIDTH_6MHZ = (1 << 1) /* 2 */,
+ BANDWIDTH_7MHZ = (1 << 2) /* 4 */,
+ BANDWIDTH_8MHZ = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl
index aec0718..2d09271 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl
@@ -36,17 +36,17 @@
@Backing(type="int") @VintfStability
enum FrontendAtsc3CodeRate {
UNDEFINED = 0,
- AUTO = 1,
- CODERATE_2_15 = 2,
- CODERATE_3_15 = 4,
- CODERATE_4_15 = 8,
- CODERATE_5_15 = 16,
- CODERATE_6_15 = 32,
- CODERATE_7_15 = 64,
- CODERATE_8_15 = 128,
- CODERATE_9_15 = 256,
- CODERATE_10_15 = 512,
- CODERATE_11_15 = 1024,
- CODERATE_12_15 = 2048,
- CODERATE_13_15 = 4096,
+ AUTO = (1 << 0) /* 1 */,
+ CODERATE_2_15 = (1 << 1) /* 2 */,
+ CODERATE_3_15 = (1 << 2) /* 4 */,
+ CODERATE_4_15 = (1 << 3) /* 8 */,
+ CODERATE_5_15 = (1 << 4) /* 16 */,
+ CODERATE_6_15 = (1 << 5) /* 32 */,
+ CODERATE_7_15 = (1 << 6) /* 64 */,
+ CODERATE_8_15 = (1 << 7) /* 128 */,
+ CODERATE_9_15 = (1 << 8) /* 256 */,
+ CODERATE_10_15 = (1 << 9) /* 512 */,
+ CODERATE_11_15 = (1 << 10) /* 1024 */,
+ CODERATE_12_15 = (1 << 11) /* 2048 */,
+ CODERATE_13_15 = (1 << 12) /* 4096 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl
index 8702a49..22267e7 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl
@@ -36,6 +36,6 @@
@Backing(type="byte") @VintfStability
enum FrontendAtsc3DemodOutputFormat {
UNDEFINED = 0,
- ATSC3_LINKLAYER_PACKET = 1,
- BASEBAND_PACKET = 2,
+ ATSC3_LINKLAYER_PACKET = (1 << 0) /* 1 */,
+ BASEBAND_PACKET = (1 << 1) /* 2 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl
index a2c140a..2e229c0 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl
@@ -36,11 +36,11 @@
@Backing(type="int") @VintfStability
enum FrontendAtsc3Fec {
UNDEFINED = 0,
- AUTO = 1,
- BCH_LDPC_16K = 2,
- BCH_LDPC_64K = 4,
- CRC_LDPC_16K = 8,
- CRC_LDPC_64K = 16,
- LDPC_16K = 32,
- LDPC_64K = 64,
+ AUTO = (1 << 0) /* 1 */,
+ BCH_LDPC_16K = (1 << 1) /* 2 */,
+ BCH_LDPC_64K = (1 << 2) /* 4 */,
+ CRC_LDPC_16K = (1 << 3) /* 8 */,
+ CRC_LDPC_64K = (1 << 4) /* 16 */,
+ LDPC_16K = (1 << 5) /* 32 */,
+ LDPC_64K = (1 << 6) /* 64 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl
index 09e513d..cbe8c1f 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl
@@ -36,11 +36,11 @@
@Backing(type="int") @VintfStability
enum FrontendAtsc3Modulation {
UNDEFINED = 0,
- AUTO = 1,
- MOD_QPSK = 2,
- MOD_16QAM = 4,
- MOD_64QAM = 8,
- MOD_256QAM = 16,
- MOD_1024QAM = 32,
- MOD_4096QAM = 64,
+ AUTO = (1 << 0) /* 1 */,
+ MOD_QPSK = (1 << 1) /* 2 */,
+ MOD_16QAM = (1 << 2) /* 4 */,
+ MOD_64QAM = (1 << 3) /* 8 */,
+ MOD_256QAM = (1 << 4) /* 16 */,
+ MOD_1024QAM = (1 << 5) /* 32 */,
+ MOD_4096QAM = (1 << 6) /* 64 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl
index a9747f0..4e70641 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl
@@ -36,7 +36,7 @@
@Backing(type="int") @VintfStability
enum FrontendAtsc3TimeInterleaveMode {
UNDEFINED = 0,
- AUTO = 1,
- CTI = 2,
- HTI = 4,
+ AUTO = (1 << 0) /* 1 */,
+ CTI = (1 << 1) /* 2 */,
+ HTI = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscModulation.aidl
index 426fe20..7da48f1 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscModulation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscModulation.aidl
@@ -36,7 +36,7 @@
@Backing(type="int") @VintfStability
enum FrontendAtscModulation {
UNDEFINED = 0,
- AUTO = 1,
- MOD_8VSB = 4,
- MOD_16VSB = 8,
+ AUTO = (1 << 0) /* 1 */,
+ MOD_8VSB = (1 << 2) /* 4 */,
+ MOD_16VSB = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl
index ff71df3..61cbf12 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl
@@ -36,14 +36,14 @@
@Backing(type="int") @VintfStability
enum FrontendCableTimeInterleaveMode {
UNDEFINED = 0,
- AUTO = 1,
- INTERLEAVING_128_1_0 = 2,
- INTERLEAVING_128_1_1 = 4,
- INTERLEAVING_64_2 = 8,
- INTERLEAVING_32_4 = 16,
- INTERLEAVING_16_8 = 32,
- INTERLEAVING_8_16 = 64,
- INTERLEAVING_128_2 = 128,
- INTERLEAVING_128_3 = 256,
- INTERLEAVING_128_4 = 512,
+ AUTO = (1 << 0) /* 1 */,
+ INTERLEAVING_128_1_0 = (1 << 1) /* 2 */,
+ INTERLEAVING_128_1_1 = (1 << 2) /* 4 */,
+ INTERLEAVING_64_2 = (1 << 3) /* 8 */,
+ INTERLEAVING_32_4 = (1 << 4) /* 16 */,
+ INTERLEAVING_16_8 = (1 << 5) /* 32 */,
+ INTERLEAVING_8_16 = (1 << 6) /* 64 */,
+ INTERLEAVING_128_2 = (1 << 7) /* 128 */,
+ INTERLEAVING_128_3 = (1 << 8) /* 256 */,
+ INTERLEAVING_128_4 = (1 << 9) /* 512 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl
index 18d71d2..6f62d91 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl
@@ -36,7 +36,7 @@
@Backing(type="int") @VintfStability
enum FrontendDtmbBandwidth {
UNDEFINED = 0,
- AUTO = 1,
- BANDWIDTH_8MHZ = 2,
- BANDWIDTH_6MHZ = 4,
+ AUTO = (1 << 0) /* 1 */,
+ BANDWIDTH_8MHZ = (1 << 1) /* 2 */,
+ BANDWIDTH_6MHZ = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl
index c9454e7..d6be639 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl
@@ -36,8 +36,8 @@
@Backing(type="int") @VintfStability
enum FrontendDtmbCodeRate {
UNDEFINED = 0,
- AUTO = 1,
- CODERATE_2_5 = 2,
- CODERATE_3_5 = 4,
- CODERATE_4_5 = 8,
+ AUTO = (1 << 0) /* 1 */,
+ CODERATE_2_5 = (1 << 1) /* 2 */,
+ CODERATE_3_5 = (1 << 2) /* 4 */,
+ CODERATE_4_5 = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl
index 872eb6a..5626064 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl
@@ -36,11 +36,11 @@
@Backing(type="int") @VintfStability
enum FrontendDtmbGuardInterval {
UNDEFINED = 0,
- AUTO = 1,
- PN_420_VARIOUS = 2,
- PN_595_CONST = 4,
- PN_945_VARIOUS = 8,
- PN_420_CONST = 16,
- PN_945_CONST = 32,
- PN_RESERVED = 64,
+ AUTO = (1 << 0) /* 1 */,
+ PN_420_VARIOUS = (1 << 1) /* 2 */,
+ PN_595_CONST = (1 << 2) /* 4 */,
+ PN_945_VARIOUS = (1 << 3) /* 8 */,
+ PN_420_CONST = (1 << 4) /* 16 */,
+ PN_945_CONST = (1 << 5) /* 32 */,
+ PN_RESERVED = (1 << 6) /* 64 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbModulation.aidl
index 088aac5..036e64b 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbModulation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbModulation.aidl
@@ -36,10 +36,10 @@
@Backing(type="int") @VintfStability
enum FrontendDtmbModulation {
UNDEFINED = 0,
- AUTO = 1,
- CONSTELLATION_4QAM = 2,
- CONSTELLATION_4QAM_NR = 4,
- CONSTELLATION_16QAM = 8,
- CONSTELLATION_32QAM = 16,
- CONSTELLATION_64QAM = 32,
+ AUTO = (1 << 0) /* 1 */,
+ CONSTELLATION_4QAM = (1 << 1) /* 2 */,
+ CONSTELLATION_4QAM_NR = (1 << 2) /* 4 */,
+ CONSTELLATION_16QAM = (1 << 3) /* 8 */,
+ CONSTELLATION_32QAM = (1 << 4) /* 16 */,
+ CONSTELLATION_64QAM = (1 << 5) /* 32 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl
index 8321ad0..1223887 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl
@@ -36,7 +36,7 @@
@Backing(type="int") @VintfStability
enum FrontendDtmbTimeInterleaveMode {
UNDEFINED = 0,
- AUTO = 1,
- TIMER_INT_240 = 2,
- TIMER_INT_720 = 4,
+ AUTO = (1 << 0) /* 1 */,
+ TIMER_INT_240 = (1 << 1) /* 2 */,
+ TIMER_INT_720 = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl
index 5298291..0498825 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl
@@ -36,7 +36,7 @@
@Backing(type="int") @VintfStability
enum FrontendDtmbTransmissionMode {
UNDEFINED = 0,
- AUTO = 1,
- C1 = 2,
- C3780 = 4,
+ AUTO = (1 << 0) /* 1 */,
+ C1 = (1 << 1) /* 2 */,
+ C3780 = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl
index cdfedb6..985add1 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl
@@ -36,7 +36,7 @@
@Backing(type="byte") @VintfStability
enum FrontendDvbcAnnex {
UNDEFINED = 0,
- A = 1,
- B = 2,
- C = 4,
+ A = (1 << 0) /* 1 */,
+ B = (1 << 1) /* 2 */,
+ C = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl
index f0fe460..c253cfe 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl
@@ -36,8 +36,8 @@
@Backing(type="int") @VintfStability
enum FrontendDvbcBandwidth {
UNDEFINED = 0,
- BANDWIDTH_5MHZ = 1,
- BANDWIDTH_6MHZ = 2,
- BANDWIDTH_7MHZ = 4,
- BANDWIDTH_8MHZ = 8,
+ BANDWIDTH_5MHZ = (1 << 0) /* 1 */,
+ BANDWIDTH_6MHZ = (1 << 1) /* 2 */,
+ BANDWIDTH_7MHZ = (1 << 2) /* 4 */,
+ BANDWIDTH_8MHZ = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcModulation.aidl
index 0871777..c18e83e 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcModulation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcModulation.aidl
@@ -36,10 +36,10 @@
@Backing(type="int") @VintfStability
enum FrontendDvbcModulation {
UNDEFINED = 0,
- AUTO = 1,
- MOD_16QAM = 2,
- MOD_32QAM = 4,
- MOD_64QAM = 8,
- MOD_128QAM = 16,
- MOD_256QAM = 32,
+ AUTO = (1 << 0) /* 1 */,
+ MOD_16QAM = (1 << 1) /* 2 */,
+ MOD_32QAM = (1 << 2) /* 4 */,
+ MOD_64QAM = (1 << 3) /* 8 */,
+ MOD_128QAM = (1 << 4) /* 16 */,
+ MOD_256QAM = (1 << 5) /* 32 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl
index f1e92c9..a6fbc6d 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl
@@ -36,6 +36,6 @@
@Backing(type="int") @VintfStability
enum FrontendDvbcOuterFec {
UNDEFINED = 0,
- OUTER_FEC_NONE = 1,
- OUTER_FEC_RS = 2,
+ OUTER_FEC_NONE,
+ OUTER_FEC_RS,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsModulation.aidl
index 25951cc..71957d5 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsModulation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsModulation.aidl
@@ -36,18 +36,18 @@
@Backing(type="int") @VintfStability
enum FrontendDvbsModulation {
UNDEFINED = 0,
- AUTO = 1,
- MOD_QPSK = 2,
- MOD_8PSK = 4,
- MOD_16QAM = 8,
- MOD_16PSK = 16,
- MOD_32PSK = 32,
- MOD_ACM = 64,
- MOD_8APSK = 128,
- MOD_16APSK = 256,
- MOD_32APSK = 512,
- MOD_64APSK = 1024,
- MOD_128APSK = 2048,
- MOD_256APSK = 4096,
- MOD_RESERVED = 8192,
+ AUTO = (1 << 0) /* 1 */,
+ MOD_QPSK = (1 << 1) /* 2 */,
+ MOD_8PSK = (1 << 2) /* 4 */,
+ MOD_16QAM = (1 << 3) /* 8 */,
+ MOD_16PSK = (1 << 4) /* 16 */,
+ MOD_32PSK = (1 << 5) /* 32 */,
+ MOD_ACM = (1 << 6) /* 64 */,
+ MOD_8APSK = (1 << 7) /* 128 */,
+ MOD_16APSK = (1 << 8) /* 256 */,
+ MOD_32APSK = (1 << 9) /* 512 */,
+ MOD_64APSK = (1 << 10) /* 1024 */,
+ MOD_128APSK = (1 << 11) /* 2048 */,
+ MOD_256APSK = (1 << 12) /* 4096 */,
+ MOD_RESERVED = (1 << 13) /* 8192 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsPilot.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsPilot.aidl
index 4f2c6eb..e3543b3 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsPilot.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsPilot.aidl
@@ -35,8 +35,8 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendDvbsPilot {
- UNDEFINED = 0,
- ON = 1,
- OFF = 2,
- AUTO = 3,
+ UNDEFINED,
+ ON,
+ OFF,
+ AUTO,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl
index 56ee37b..2181abf 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl
@@ -35,11 +35,11 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendDvbsRolloff {
- UNDEFINED = 0,
- ROLLOFF_0_35 = 1,
- ROLLOFF_0_25 = 2,
- ROLLOFF_0_20 = 3,
- ROLLOFF_0_15 = 4,
- ROLLOFF_0_10 = 5,
- ROLLOFF_0_5 = 6,
+ UNDEFINED,
+ ROLLOFF_0_35,
+ ROLLOFF_0_25,
+ ROLLOFF_0_20,
+ ROLLOFF_0_15,
+ ROLLOFF_0_10,
+ ROLLOFF_0_5,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsScanType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsScanType.aidl
index 110b1d8..46edb56 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsScanType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsScanType.aidl
@@ -36,8 +36,8 @@
@Backing(type="int") @VintfStability
enum FrontendDvbsScanType {
UNDEFINED = 0,
- DIRECT = 1,
- DISEQC = 2,
- UNICABLE = 3,
- JESS = 4,
+ DIRECT,
+ DISEQC,
+ UNICABLE,
+ JESS,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsStandard.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsStandard.aidl
index b9cb657..bcb1c6d 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsStandard.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsStandard.aidl
@@ -36,8 +36,8 @@
@Backing(type="byte") @VintfStability
enum FrontendDvbsStandard {
UNDEFINED = 0,
- AUTO = 1,
- S = 2,
- S2 = 4,
- S2X = 8,
+ AUTO = (1 << 0) /* 1 */,
+ S = (1 << 1) /* 2 */,
+ S2 = (1 << 2) /* 4 */,
+ S2X = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl
index 2cbff7c..af87423 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendDvbsVcmMode {
- UNDEFINED = 0,
- AUTO = 1,
- MANUAL = 2,
+ UNDEFINED,
+ AUTO,
+ MANUAL,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl
index f5d14e8..ff2d9e4 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl
@@ -36,11 +36,11 @@
@Backing(type="int") @VintfStability
enum FrontendDvbtBandwidth {
UNDEFINED = 0,
- AUTO = 1,
- BANDWIDTH_8MHZ = 2,
- BANDWIDTH_7MHZ = 4,
- BANDWIDTH_6MHZ = 8,
- BANDWIDTH_5MHZ = 16,
- BANDWIDTH_1_7MHZ = 32,
- BANDWIDTH_10MHZ = 64,
+ AUTO = (1 << 0) /* 1 */,
+ BANDWIDTH_8MHZ = (1 << 1) /* 2 */,
+ BANDWIDTH_7MHZ = (1 << 2) /* 4 */,
+ BANDWIDTH_6MHZ = (1 << 3) /* 8 */,
+ BANDWIDTH_5MHZ = (1 << 4) /* 16 */,
+ BANDWIDTH_1_7MHZ = (1 << 5) /* 32 */,
+ BANDWIDTH_10MHZ = (1 << 6) /* 64 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl
index 8bd0489..8d2df06 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl
@@ -36,14 +36,14 @@
@Backing(type="int") @VintfStability
enum FrontendDvbtCoderate {
UNDEFINED = 0,
- AUTO = 1,
- CODERATE_1_2 = 2,
- CODERATE_2_3 = 4,
- CODERATE_3_4 = 8,
- CODERATE_5_6 = 16,
- CODERATE_7_8 = 32,
- CODERATE_3_5 = 64,
- CODERATE_4_5 = 128,
- CODERATE_6_7 = 256,
- CODERATE_8_9 = 512,
+ AUTO = (1 << 0) /* 1 */,
+ CODERATE_1_2 = (1 << 1) /* 2 */,
+ CODERATE_2_3 = (1 << 2) /* 4 */,
+ CODERATE_3_4 = (1 << 3) /* 8 */,
+ CODERATE_5_6 = (1 << 4) /* 16 */,
+ CODERATE_7_8 = (1 << 5) /* 32 */,
+ CODERATE_3_5 = (1 << 6) /* 64 */,
+ CODERATE_4_5 = (1 << 7) /* 128 */,
+ CODERATE_6_7 = (1 << 8) /* 256 */,
+ CODERATE_8_9 = (1 << 9) /* 512 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl
index bc40901..4bd5691 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl
@@ -36,13 +36,13 @@
@Backing(type="int") @VintfStability
enum FrontendDvbtConstellation {
UNDEFINED = 0,
- AUTO = 1,
- CONSTELLATION_QPSK = 2,
- CONSTELLATION_16QAM = 4,
- CONSTELLATION_64QAM = 8,
- CONSTELLATION_256QAM = 16,
- CONSTELLATION_QPSK_R = 32,
- CONSTELLATION_16QAM_R = 64,
- CONSTELLATION_64QAM_R = 128,
- CONSTELLATION_256QAM_R = 256,
+ AUTO = (1 << 0) /* 1 */,
+ CONSTELLATION_QPSK = (1 << 1) /* 2 */,
+ CONSTELLATION_16QAM = (1 << 2) /* 4 */,
+ CONSTELLATION_64QAM = (1 << 3) /* 8 */,
+ CONSTELLATION_256QAM = (1 << 4) /* 16 */,
+ CONSTELLATION_QPSK_R = (1 << 5) /* 32 */,
+ CONSTELLATION_16QAM_R = (1 << 6) /* 64 */,
+ CONSTELLATION_64QAM_R = (1 << 7) /* 128 */,
+ CONSTELLATION_256QAM_R = (1 << 8) /* 256 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl
index 073a77e..01c2b66 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl
@@ -36,12 +36,12 @@
@Backing(type="int") @VintfStability
enum FrontendDvbtGuardInterval {
UNDEFINED = 0,
- AUTO = 1,
- INTERVAL_1_32 = 2,
- INTERVAL_1_16 = 4,
- INTERVAL_1_8 = 8,
- INTERVAL_1_4 = 16,
- INTERVAL_1_128 = 32,
- INTERVAL_19_128 = 64,
- INTERVAL_19_256 = 128,
+ AUTO = (1 << 0) /* 1 */,
+ INTERVAL_1_32 = (1 << 1) /* 2 */,
+ INTERVAL_1_16 = (1 << 2) /* 4 */,
+ INTERVAL_1_8 = (1 << 3) /* 8 */,
+ INTERVAL_1_4 = (1 << 4) /* 16 */,
+ INTERVAL_1_128 = (1 << 5) /* 32 */,
+ INTERVAL_19_128 = (1 << 6) /* 64 */,
+ INTERVAL_19_256 = (1 << 7) /* 128 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl
index 9ed5c8c..bd86479 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl
@@ -36,13 +36,13 @@
@Backing(type="int") @VintfStability
enum FrontendDvbtHierarchy {
UNDEFINED = 0,
- AUTO = 1,
- HIERARCHY_NON_NATIVE = 2,
- HIERARCHY_1_NATIVE = 4,
- HIERARCHY_2_NATIVE = 8,
- HIERARCHY_4_NATIVE = 16,
- HIERARCHY_NON_INDEPTH = 32,
- HIERARCHY_1_INDEPTH = 64,
- HIERARCHY_2_INDEPTH = 128,
- HIERARCHY_4_INDEPTH = 256,
+ AUTO = (1 << 0) /* 1 */,
+ HIERARCHY_NON_NATIVE = (1 << 1) /* 2 */,
+ HIERARCHY_1_NATIVE = (1 << 2) /* 4 */,
+ HIERARCHY_2_NATIVE = (1 << 3) /* 8 */,
+ HIERARCHY_4_NATIVE = (1 << 4) /* 16 */,
+ HIERARCHY_NON_INDEPTH = (1 << 5) /* 32 */,
+ HIERARCHY_1_INDEPTH = (1 << 6) /* 64 */,
+ HIERARCHY_2_INDEPTH = (1 << 7) /* 128 */,
+ HIERARCHY_4_INDEPTH = (1 << 8) /* 256 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl
index c80bc2a..dc8e12c 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendDvbtPlpMode {
- UNDEFINED = 0,
- AUTO = 1,
- MANUAL = 2,
+ UNDEFINED,
+ AUTO,
+ MANUAL,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtStandard.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtStandard.aidl
index c7ba68a..080cc5c 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtStandard.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtStandard.aidl
@@ -36,7 +36,7 @@
@Backing(type="byte") @VintfStability
enum FrontendDvbtStandard {
UNDEFINED = 0,
- AUTO = 1,
- T = 2,
- T2 = 4,
+ AUTO = (1 << 0) /* 1 */,
+ T = (1 << 1) /* 2 */,
+ T2 = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl
index e3ca2e3..3731f86 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl
@@ -36,14 +36,14 @@
@Backing(type="int") @VintfStability
enum FrontendDvbtTransmissionMode {
UNDEFINED = 0,
- AUTO = 1,
- MODE_2K = 2,
- MODE_8K = 4,
- MODE_4K = 8,
- MODE_1K = 16,
- MODE_16K = 32,
- MODE_32K = 64,
- MODE_8K_E = 128,
- MODE_16K_E = 256,
- MODE_32K_E = 512,
+ AUTO = (1 << 0) /* 1 */,
+ MODE_2K = (1 << 1) /* 2 */,
+ MODE_8K = (1 << 2) /* 4 */,
+ MODE_4K = (1 << 3) /* 8 */,
+ MODE_1K = (1 << 4) /* 16 */,
+ MODE_16K = (1 << 5) /* 32 */,
+ MODE_32K = (1 << 6) /* 64 */,
+ MODE_8K_E = (1 << 7) /* 128 */,
+ MODE_16K_E = (1 << 8) /* 256 */,
+ MODE_32K_E = (1 << 9) /* 512 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendEventType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendEventType.aidl
index 443313f..101e347 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendEventType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendEventType.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendEventType {
- LOCKED = 0,
- NO_SIGNAL = 1,
- LOST_LOCK = 2,
+ LOCKED,
+ NO_SIGNAL,
+ LOST_LOCK,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInnerFec.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInnerFec.aidl
index 19599a3..da91888 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInnerFec.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInnerFec.aidl
@@ -36,57 +36,57 @@
@Backing(type="long") @VintfStability
enum FrontendInnerFec {
FEC_UNDEFINED = 0,
- AUTO = 1,
- FEC_1_2 = 2,
- FEC_1_3 = 4,
- FEC_1_4 = 8,
- FEC_1_5 = 16,
- FEC_2_3 = 32,
- FEC_2_5 = 64,
- FEC_2_9 = 128,
- FEC_3_4 = 256,
- FEC_3_5 = 512,
- FEC_4_5 = 1024,
- FEC_4_15 = 2048,
- FEC_5_6 = 4096,
- FEC_5_9 = 8192,
- FEC_6_7 = 16384,
- FEC_7_8 = 32768,
- FEC_7_9 = 65536,
- FEC_7_15 = 131072,
- FEC_8_9 = 262144,
- FEC_8_15 = 524288,
- FEC_9_10 = 1048576,
- FEC_9_20 = 2097152,
- FEC_11_15 = 4194304,
- FEC_11_20 = 8388608,
- FEC_11_45 = 16777216,
- FEC_13_18 = 33554432,
- FEC_13_45 = 67108864,
- FEC_14_45 = 134217728,
- FEC_23_36 = 268435456,
- FEC_25_36 = 536870912,
- FEC_26_45 = 1073741824,
- FEC_28_45 = 2147483648,
- FEC_29_45 = 4294967296,
- FEC_31_45 = 8589934592,
- FEC_32_45 = 17179869184,
- FEC_77_90 = 34359738368,
- FEC_2_15 = 68719476736,
- FEC_3_15 = 137438953472,
- FEC_5_15 = 274877906944,
- FEC_6_15 = 549755813888,
- FEC_9_15 = 1099511627776,
- FEC_10_15 = 2199023255552,
- FEC_12_15 = 4398046511104,
- FEC_13_15 = 8796093022208,
- FEC_18_30 = 17592186044416,
- FEC_20_30 = 35184372088832,
- FEC_90_180 = 70368744177664,
- FEC_96_180 = 140737488355328,
- FEC_104_180 = 281474976710656,
- FEC_128_180 = 562949953421312,
- FEC_132_180 = 1125899906842624,
- FEC_135_180 = 2251799813685248,
- FEC_140_180 = 4503599627370496,
+ AUTO = (1L << 0) /* 1 */,
+ FEC_1_2 = (1L << 1) /* 2 */,
+ FEC_1_3 = (1L << 2) /* 4 */,
+ FEC_1_4 = (1L << 3) /* 8 */,
+ FEC_1_5 = (1L << 4) /* 16 */,
+ FEC_2_3 = (1L << 5) /* 32 */,
+ FEC_2_5 = (1L << 6) /* 64 */,
+ FEC_2_9 = (1L << 7) /* 128 */,
+ FEC_3_4 = (1L << 8) /* 256 */,
+ FEC_3_5 = (1L << 9) /* 512 */,
+ FEC_4_5 = (1L << 10) /* 1024 */,
+ FEC_4_15 = (1L << 11) /* 2048 */,
+ FEC_5_6 = (1L << 12) /* 4096 */,
+ FEC_5_9 = (1L << 13) /* 8192 */,
+ FEC_6_7 = (1L << 14) /* 16384 */,
+ FEC_7_8 = (1L << 15) /* 32768 */,
+ FEC_7_9 = (1L << 16) /* 65536 */,
+ FEC_7_15 = (1L << 17) /* 131072 */,
+ FEC_8_9 = (1L << 18) /* 262144 */,
+ FEC_8_15 = (1L << 19) /* 524288 */,
+ FEC_9_10 = (1L << 20) /* 1048576 */,
+ FEC_9_20 = (1L << 21) /* 2097152 */,
+ FEC_11_15 = (1L << 22) /* 4194304 */,
+ FEC_11_20 = (1L << 23) /* 8388608 */,
+ FEC_11_45 = (1L << 24) /* 16777216 */,
+ FEC_13_18 = (1L << 25) /* 33554432 */,
+ FEC_13_45 = (1L << 26) /* 67108864 */,
+ FEC_14_45 = (1L << 27) /* 134217728 */,
+ FEC_23_36 = (1L << 28) /* 268435456 */,
+ FEC_25_36 = (1L << 29) /* 536870912 */,
+ FEC_26_45 = (1L << 30) /* 1073741824 */,
+ FEC_28_45 = (1L << 31) /* 2147483648 */,
+ FEC_29_45 = (1L << 32) /* 4294967296 */,
+ FEC_31_45 = (1L << 33) /* 8589934592 */,
+ FEC_32_45 = (1L << 34) /* 17179869184 */,
+ FEC_77_90 = (1L << 35) /* 34359738368 */,
+ FEC_2_15 = (1L << 36) /* 68719476736 */,
+ FEC_3_15 = (1L << 37) /* 137438953472 */,
+ FEC_5_15 = (1L << 38) /* 274877906944 */,
+ FEC_6_15 = (1L << 39) /* 549755813888 */,
+ FEC_9_15 = (1L << 40) /* 1099511627776 */,
+ FEC_10_15 = (1L << 41) /* 2199023255552 */,
+ FEC_12_15 = (1L << 42) /* 4398046511104 */,
+ FEC_13_15 = (1L << 43) /* 8796093022208 */,
+ FEC_18_30 = (1L << 44) /* 17592186044416 */,
+ FEC_20_30 = (1L << 45) /* 35184372088832 */,
+ FEC_90_180 = (1L << 46) /* 70368744177664 */,
+ FEC_96_180 = (1L << 47) /* 140737488355328 */,
+ FEC_104_180 = (1L << 48) /* 281474976710656 */,
+ FEC_128_180 = (1L << 49) /* 562949953421312 */,
+ FEC_132_180 = (1L << 50) /* 1125899906842624 */,
+ FEC_135_180 = (1L << 51) /* 2251799813685248 */,
+ FEC_140_180 = (1L << 52) /* 4503599627370496 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsFecType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsFecType.aidl
index 50a1208..5806cc5 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsFecType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsFecType.aidl
@@ -36,7 +36,7 @@
@Backing(type="int") @VintfStability
enum FrontendIptvSettingsFecType {
UNDEFINED = 0,
- COLUMN = 1,
- ROW = 2,
- COLUMN_ROW = 4,
+ COLUMN = (1 << 0) /* 1 */,
+ ROW = (1 << 1) /* 2 */,
+ COLUMN_ROW = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsIgmp.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsIgmp.aidl
index aa08496..43ae523 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsIgmp.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsIgmp.aidl
@@ -36,7 +36,7 @@
@Backing(type="int") @VintfStability
enum FrontendIptvSettingsIgmp {
UNDEFINED = 0,
- V1 = 1,
- V2 = 2,
- V3 = 4,
+ V1 = (1 << 0) /* 1 */,
+ V2 = (1 << 1) /* 2 */,
+ V3 = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsProtocol.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsProtocol.aidl
index 08a01f1..2e4c478 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsProtocol.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIptvSettingsProtocol.aidl
@@ -36,6 +36,6 @@
@Backing(type="int") @VintfStability
enum FrontendIptvSettingsProtocol {
UNDEFINED = 0,
- UDP = 1,
- RTP = 2,
+ UDP = (1 << 0) /* 1 */,
+ RTP = (1 << 1) /* 2 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl
index 1ee7f07..de865ca 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl
@@ -36,16 +36,16 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbs3Coderate {
UNDEFINED = 0,
- AUTO = 1,
- CODERATE_1_3 = 2,
- CODERATE_2_5 = 4,
- CODERATE_1_2 = 8,
- CODERATE_3_5 = 16,
- CODERATE_2_3 = 32,
- CODERATE_3_4 = 64,
- CODERATE_7_9 = 128,
- CODERATE_4_5 = 256,
- CODERATE_5_6 = 512,
- CODERATE_7_8 = 1024,
- CODERATE_9_10 = 2048,
+ AUTO = (1 << 0) /* 1 */,
+ CODERATE_1_3 = (1 << 1) /* 2 */,
+ CODERATE_2_5 = (1 << 2) /* 4 */,
+ CODERATE_1_2 = (1 << 3) /* 8 */,
+ CODERATE_3_5 = (1 << 4) /* 16 */,
+ CODERATE_2_3 = (1 << 5) /* 32 */,
+ CODERATE_3_4 = (1 << 6) /* 64 */,
+ CODERATE_7_9 = (1 << 7) /* 128 */,
+ CODERATE_4_5 = (1 << 8) /* 256 */,
+ CODERATE_5_6 = (1 << 9) /* 512 */,
+ CODERATE_7_8 = (1 << 10) /* 1024 */,
+ CODERATE_9_10 = (1 << 11) /* 2048 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl
index 3603292..adc902d 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl
@@ -36,10 +36,10 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbs3Modulation {
UNDEFINED = 0,
- AUTO = 1,
- MOD_BPSK = 2,
- MOD_QPSK = 4,
- MOD_8PSK = 8,
- MOD_16APSK = 16,
- MOD_32APSK = 32,
+ AUTO = (1 << 0) /* 1 */,
+ MOD_BPSK = (1 << 1) /* 2 */,
+ MOD_QPSK = (1 << 2) /* 4 */,
+ MOD_8PSK = (1 << 3) /* 8 */,
+ MOD_16APSK = (1 << 4) /* 16 */,
+ MOD_32APSK = (1 << 5) /* 32 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl
index 733760c..c93cf20 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl
@@ -35,6 +35,6 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendIsdbs3Rolloff {
- UNDEFINED = 0,
- ROLLOFF_0_03 = 1,
+ UNDEFINED,
+ ROLLOFF_0_03,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl
index 09e9c59..a0e436f 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl
@@ -36,10 +36,10 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbsCoderate {
UNDEFINED = 0,
- AUTO = 1,
- CODERATE_1_2 = 2,
- CODERATE_2_3 = 4,
- CODERATE_3_4 = 8,
- CODERATE_5_6 = 16,
- CODERATE_7_8 = 32,
+ AUTO = (1 << 0) /* 1 */,
+ CODERATE_1_2 = (1 << 1) /* 2 */,
+ CODERATE_2_3 = (1 << 2) /* 4 */,
+ CODERATE_3_4 = (1 << 3) /* 8 */,
+ CODERATE_5_6 = (1 << 4) /* 16 */,
+ CODERATE_7_8 = (1 << 5) /* 32 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl
index 7b9bde6..61a21c3 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl
@@ -36,8 +36,8 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbsModulation {
UNDEFINED = 0,
- AUTO = 1,
- MOD_BPSK = 2,
- MOD_QPSK = 4,
- MOD_TC8PSK = 8,
+ AUTO = (1 << 0) /* 1 */,
+ MOD_BPSK = (1 << 1) /* 2 */,
+ MOD_QPSK = (1 << 2) /* 4 */,
+ MOD_TC8PSK = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl
index a2ab154..b769231 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl
@@ -35,6 +35,6 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendIsdbsRolloff {
- UNDEFINED = 0,
- ROLLOFF_0_35 = 1,
+ UNDEFINED,
+ ROLLOFF_0_35,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl
index 089f611..77956b6 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendIsdbsStreamIdType {
- STREAM_ID = 0,
- RELATIVE_STREAM_NUMBER = 1,
- UNDEFINED = 2,
+ STREAM_ID,
+ RELATIVE_STREAM_NUMBER,
+ UNDEFINED,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl
index cd49214..209620f 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl
@@ -36,8 +36,8 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbtBandwidth {
UNDEFINED = 0,
- AUTO = 1,
- BANDWIDTH_8MHZ = 2,
- BANDWIDTH_7MHZ = 4,
- BANDWIDTH_6MHZ = 8,
+ AUTO = (1 << 0) /* 1 */,
+ BANDWIDTH_8MHZ = (1 << 1) /* 2 */,
+ BANDWIDTH_7MHZ = (1 << 2) /* 4 */,
+ BANDWIDTH_6MHZ = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl
index 2b747ed..4236b7c 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl
@@ -36,14 +36,14 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbtCoderate {
UNDEFINED = 0,
- AUTO = 1,
- CODERATE_1_2 = 2,
- CODERATE_2_3 = 4,
- CODERATE_3_4 = 8,
- CODERATE_5_6 = 16,
- CODERATE_7_8 = 32,
- CODERATE_3_5 = 64,
- CODERATE_4_5 = 128,
- CODERATE_6_7 = 256,
- CODERATE_8_9 = 512,
+ AUTO = (1 << 0) /* 1 */,
+ CODERATE_1_2 = (1 << 1) /* 2 */,
+ CODERATE_2_3 = (1 << 2) /* 4 */,
+ CODERATE_3_4 = (1 << 3) /* 8 */,
+ CODERATE_5_6 = (1 << 4) /* 16 */,
+ CODERATE_7_8 = (1 << 5) /* 32 */,
+ CODERATE_3_5 = (1 << 6) /* 64 */,
+ CODERATE_4_5 = (1 << 7) /* 128 */,
+ CODERATE_6_7 = (1 << 8) /* 256 */,
+ CODERATE_8_9 = (1 << 9) /* 512 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl
index 42a023a..86225e2 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl
@@ -36,12 +36,12 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbtGuardInterval {
UNDEFINED = 0,
- AUTO = 1,
- INTERVAL_1_32 = 2,
- INTERVAL_1_16 = 4,
- INTERVAL_1_8 = 8,
- INTERVAL_1_4 = 16,
- INTERVAL_1_128 = 32,
- INTERVAL_19_128 = 64,
- INTERVAL_19_256 = 128,
+ AUTO = (1 << 0) /* 1 */,
+ INTERVAL_1_32 = (1 << 1) /* 2 */,
+ INTERVAL_1_16 = (1 << 2) /* 4 */,
+ INTERVAL_1_8 = (1 << 3) /* 8 */,
+ INTERVAL_1_4 = (1 << 4) /* 16 */,
+ INTERVAL_1_128 = (1 << 5) /* 32 */,
+ INTERVAL_19_128 = (1 << 6) /* 64 */,
+ INTERVAL_19_256 = (1 << 7) /* 128 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtMode.aidl
index 54698ab..0e38c26 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtMode.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtMode.aidl
@@ -36,8 +36,8 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbtMode {
UNDEFINED = 0,
- AUTO = 1,
- MODE_1 = 2,
- MODE_2 = 4,
- MODE_3 = 8,
+ AUTO = (1 << 0) /* 1 */,
+ MODE_1 = (1 << 1) /* 2 */,
+ MODE_2 = (1 << 2) /* 4 */,
+ MODE_3 = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl
index a31e0cf..4474c83 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl
@@ -36,9 +36,9 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbtModulation {
UNDEFINED = 0,
- AUTO = 1,
- MOD_DQPSK = 2,
- MOD_QPSK = 4,
- MOD_16QAM = 8,
- MOD_64QAM = 16,
+ AUTO = (1 << 0) /* 1 */,
+ MOD_DQPSK = (1 << 1) /* 2 */,
+ MOD_QPSK = (1 << 2) /* 4 */,
+ MOD_16QAM = (1 << 3) /* 8 */,
+ MOD_64QAM = (1 << 4) /* 16 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtPartialReceptionFlag.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtPartialReceptionFlag.aidl
index 133887f..1387e66 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtPartialReceptionFlag.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtPartialReceptionFlag.aidl
@@ -36,7 +36,7 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbtPartialReceptionFlag {
UNDEFINED = 0,
- AUTO = 1,
- FALSE = 2,
- TRUE = 4,
+ AUTO = (1 << 0) /* 1 */,
+ FALSE = (1 << 1) /* 2 */,
+ TRUE = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtTimeInterleaveMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtTimeInterleaveMode.aidl
index 50adde9..b9d76ee 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtTimeInterleaveMode.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtTimeInterleaveMode.aidl
@@ -36,17 +36,17 @@
@Backing(type="int") @VintfStability
enum FrontendIsdbtTimeInterleaveMode {
UNDEFINED = 0,
- AUTO = 1,
- INTERLEAVE_1_0 = 2,
- INTERLEAVE_1_4 = 4,
- INTERLEAVE_1_8 = 8,
- INTERLEAVE_1_16 = 16,
- INTERLEAVE_2_0 = 32,
- INTERLEAVE_2_2 = 64,
- INTERLEAVE_2_4 = 128,
- INTERLEAVE_2_8 = 256,
- INTERLEAVE_3_0 = 512,
- INTERLEAVE_3_1 = 1024,
- INTERLEAVE_3_2 = 2048,
- INTERLEAVE_3_4 = 4096,
+ AUTO = (1 << 0) /* 1 */,
+ INTERLEAVE_1_0 = (1 << 1) /* 2 */,
+ INTERLEAVE_1_4 = (1 << 2) /* 4 */,
+ INTERLEAVE_1_8 = (1 << 3) /* 8 */,
+ INTERLEAVE_1_16 = (1 << 4) /* 16 */,
+ INTERLEAVE_2_0 = (1 << 5) /* 32 */,
+ INTERLEAVE_2_2 = (1 << 6) /* 64 */,
+ INTERLEAVE_2_4 = (1 << 7) /* 128 */,
+ INTERLEAVE_2_8 = (1 << 8) /* 256 */,
+ INTERLEAVE_3_0 = (1 << 9) /* 512 */,
+ INTERLEAVE_3_1 = (1 << 10) /* 1024 */,
+ INTERLEAVE_3_2 = (1 << 11) /* 2048 */,
+ INTERLEAVE_3_4 = (1 << 12) /* 4096 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageType.aidl
index 6976ecd..186dbd7 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageType.aidl
@@ -35,20 +35,20 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendScanMessageType {
- LOCKED = 0,
- END = 1,
- PROGRESS_PERCENT = 2,
- FREQUENCY = 3,
- SYMBOL_RATE = 4,
- HIERARCHY = 5,
- ANALOG_TYPE = 6,
- PLP_IDS = 7,
- GROUP_IDS = 8,
- INPUT_STREAM_IDS = 9,
- STANDARD = 10,
- ATSC3_PLP_INFO = 11,
- MODULATION = 12,
- DVBC_ANNEX = 13,
- HIGH_PRIORITY = 14,
- DVBT_CELL_IDS = 15,
+ LOCKED,
+ END,
+ PROGRESS_PERCENT,
+ FREQUENCY,
+ SYMBOL_RATE,
+ HIERARCHY,
+ ANALOG_TYPE,
+ PLP_IDS,
+ GROUP_IDS,
+ INPUT_STREAM_IDS,
+ STANDARD,
+ ATSC3_PLP_INFO,
+ MODULATION,
+ DVBC_ANNEX,
+ HIGH_PRIORITY,
+ DVBT_CELL_IDS,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanType.aidl
index ed42d0a..cef02cc 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanType.aidl
@@ -36,6 +36,6 @@
@Backing(type="int") @VintfStability
enum FrontendScanType {
SCAN_UNDEFINED = 0,
- SCAN_AUTO = 1,
- SCAN_BLIND = 2,
+ SCAN_AUTO = (1 << 0) /* 1 */,
+ SCAN_BLIND = (1 << 1) /* 2 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSpectralInversion.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSpectralInversion.aidl
index ff11bb8..14ec2fd 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSpectralInversion.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSpectralInversion.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendSpectralInversion {
- UNDEFINED = 0,
- NORMAL = 1,
- INVERTED = 2,
+ UNDEFINED,
+ NORMAL,
+ INVERTED,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStandardExt.aidl
similarity index 80%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStandardExt.aidl
index a5eda52..88637db 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStandardExt.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2024 The Android Open Source Project
+ * Copyright 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.
@@ -31,9 +31,10 @@
// 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.vibrator;
+package android.hardware.tv.tuner;
+/* @hide */
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+union FrontendStandardExt {
+ android.hardware.tv.tuner.FrontendDvbsStandard dvbsStandardExt = android.hardware.tv.tuner.FrontendDvbsStandard.UNDEFINED;
+ android.hardware.tv.tuner.FrontendDvbtStandard dvbtStandardExt = android.hardware.tv.tuner.FrontendDvbtStandard.UNDEFINED;
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl
index b991ab6..e79eba6 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl
@@ -82,4 +82,5 @@
long iptvPacketsLost;
int iptvWorstJitterMs;
int iptvAverageJitterMs;
+ android.hardware.tv.tuner.FrontendStandardExt standardExt;
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusReadiness.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusReadiness.aidl
index 41944ce..13735fa 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusReadiness.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusReadiness.aidl
@@ -35,9 +35,9 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendStatusReadiness {
- UNDEFINED = 0,
- UNAVAILABLE = 1,
- UNSTABLE = 2,
- STABLE = 3,
- UNSUPPORTED = 4,
+ UNDEFINED,
+ UNAVAILABLE,
+ UNSTABLE,
+ STABLE,
+ UNSUPPORTED,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl
index 3791299..bfd2145 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl
@@ -35,51 +35,52 @@
/* @hide */
@Backing(type="int") @VintfStability
enum FrontendStatusType {
- DEMOD_LOCK = 0,
- SNR = 1,
- BER = 2,
- PER = 3,
- PRE_BER = 4,
- SIGNAL_QUALITY = 5,
- SIGNAL_STRENGTH = 6,
- SYMBOL_RATE = 7,
- FEC = 8,
- MODULATION = 9,
- SPECTRAL = 10,
- LNB_VOLTAGE = 11,
- PLP_ID = 12,
- EWBS = 13,
- AGC = 14,
- LNA = 15,
- LAYER_ERROR = 16,
- MER = 17,
- FREQ_OFFSET = 18,
- HIERARCHY = 19,
- RF_LOCK = 20,
- ATSC3_PLP_INFO = 21,
- MODULATIONS = 22,
- BERS = 23,
- CODERATES = 24,
- BANDWIDTH = 25,
- GUARD_INTERVAL = 26,
- TRANSMISSION_MODE = 27,
- UEC = 28,
- T2_SYSTEM_ID = 29,
- INTERLEAVINGS = 30,
- ISDBT_SEGMENTS = 31,
- TS_DATA_RATES = 32,
- ROLL_OFF = 33,
- IS_MISO = 34,
- IS_LINEAR = 35,
- IS_SHORT_FRAMES = 36,
- ISDBT_MODE = 37,
- ISDBT_PARTIAL_RECEPTION_FLAG = 38,
- STREAM_ID_LIST = 39,
- DVBT_CELL_IDS = 40,
- ATSC3_ALL_PLP_INFO = 41,
- IPTV_CONTENT_URL = 42,
- IPTV_PACKETS_LOST = 43,
- IPTV_PACKETS_RECEIVED = 44,
- IPTV_WORST_JITTER_MS = 45,
- IPTV_AVERAGE_JITTER_MS = 46,
+ DEMOD_LOCK,
+ SNR,
+ BER,
+ PER,
+ PRE_BER,
+ SIGNAL_QUALITY,
+ SIGNAL_STRENGTH,
+ SYMBOL_RATE,
+ FEC,
+ MODULATION,
+ SPECTRAL,
+ LNB_VOLTAGE,
+ PLP_ID,
+ EWBS,
+ AGC,
+ LNA,
+ LAYER_ERROR,
+ MER,
+ FREQ_OFFSET,
+ HIERARCHY,
+ RF_LOCK,
+ ATSC3_PLP_INFO,
+ MODULATIONS,
+ BERS,
+ CODERATES,
+ BANDWIDTH,
+ GUARD_INTERVAL,
+ TRANSMISSION_MODE,
+ UEC,
+ T2_SYSTEM_ID,
+ INTERLEAVINGS,
+ ISDBT_SEGMENTS,
+ TS_DATA_RATES,
+ ROLL_OFF,
+ IS_MISO,
+ IS_LINEAR,
+ IS_SHORT_FRAMES,
+ ISDBT_MODE,
+ ISDBT_PARTIAL_RECEPTION_FLAG,
+ STREAM_ID_LIST,
+ DVBT_CELL_IDS,
+ ATSC3_ALL_PLP_INFO,
+ IPTV_CONTENT_URL,
+ IPTV_PACKETS_LOST,
+ IPTV_PACKETS_RECEIVED,
+ IPTV_WORST_JITTER_MS,
+ IPTV_AVERAGE_JITTER_MS,
+ STANDARD_EXT,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendType.aidl
index cbf5b47..455bbc0 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendType.aidl
@@ -36,15 +36,15 @@
@Backing(type="int") @VintfStability
enum FrontendType {
UNDEFINED = 0,
- ANALOG = 1,
- ATSC = 2,
- ATSC3 = 3,
- DVBC = 4,
- DVBS = 5,
- DVBT = 6,
- ISDBS = 7,
- ISDBS3 = 8,
- ISDBT = 9,
- DTMB = 10,
- IPTV = 11,
+ ANALOG,
+ ATSC,
+ ATSC3,
+ DVBC,
+ DVBS,
+ DVBT,
+ ISDBS,
+ ISDBS3,
+ ISDBT,
+ DTMB,
+ IPTV,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbEventType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbEventType.aidl
index e6e2b05..7bec809 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbEventType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbEventType.aidl
@@ -35,8 +35,8 @@
/* @hide */
@Backing(type="int") @VintfStability
enum LnbEventType {
- DISEQC_RX_OVERFLOW = 0,
- DISEQC_RX_TIMEOUT = 1,
- DISEQC_RX_PARITY_ERROR = 2,
- LNB_OVERLOAD = 3,
+ DISEQC_RX_OVERFLOW,
+ DISEQC_RX_TIMEOUT,
+ DISEQC_RX_PARITY_ERROR,
+ LNB_OVERLOAD,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbPosition.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbPosition.aidl
index 5fc4d15..a4a5740 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbPosition.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbPosition.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="int") @VintfStability
enum LnbPosition {
- UNDEFINED = 0,
- POSITION_A = 1,
- POSITION_B = 2,
+ UNDEFINED,
+ POSITION_A,
+ POSITION_B,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbTone.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbTone.aidl
index 3217de9..0628354 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbTone.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbTone.aidl
@@ -35,6 +35,6 @@
/* @hide */
@Backing(type="int") @VintfStability
enum LnbTone {
- NONE = 0,
- CONTINUOUS = 1,
+ NONE,
+ CONTINUOUS,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbVoltage.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbVoltage.aidl
index 034c7e6..b18ff0e 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbVoltage.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbVoltage.aidl
@@ -35,13 +35,13 @@
/* @hide */
@Backing(type="int") @VintfStability
enum LnbVoltage {
- NONE = 0,
- VOLTAGE_5V = 1,
- VOLTAGE_11V = 2,
- VOLTAGE_12V = 3,
- VOLTAGE_13V = 4,
- VOLTAGE_14V = 5,
- VOLTAGE_15V = 6,
- VOLTAGE_18V = 7,
- VOLTAGE_19V = 8,
+ NONE,
+ VOLTAGE_5V,
+ VOLTAGE_11V,
+ VOLTAGE_12V,
+ VOLTAGE_13V,
+ VOLTAGE_14V,
+ VOLTAGE_15V,
+ VOLTAGE_18V,
+ VOLTAGE_19V,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackStatus.aidl
index 850b737..a8b6378 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackStatus.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackStatus.aidl
@@ -35,8 +35,8 @@
/* @hide */
@Backing(type="int") @VintfStability
enum PlaybackStatus {
- SPACE_EMPTY = 1,
- SPACE_ALMOST_EMPTY = 2,
- SPACE_ALMOST_FULL = 4,
- SPACE_FULL = 8,
+ SPACE_EMPTY = (1 << 0) /* 1 */,
+ SPACE_ALMOST_EMPTY = (1 << 1) /* 2 */,
+ SPACE_ALMOST_FULL = (1 << 2) /* 4 */,
+ SPACE_FULL = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordStatus.aidl
index 48bf9ec..e06b616 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordStatus.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordStatus.aidl
@@ -35,8 +35,8 @@
/* @hide */
@Backing(type="byte") @VintfStability
enum RecordStatus {
- DATA_READY = 1,
- LOW_WATER = 2,
- HIGH_WATER = 4,
- OVERFLOW = 8,
+ DATA_READY = (1 << 0) /* 1 */,
+ LOW_WATER = (1 << 1) /* 2 */,
+ HIGH_WATER = (1 << 2) /* 4 */,
+ OVERFLOW = (1 << 3) /* 8 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Result.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Result.aidl
index 4e22f67..ae43350 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Result.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Result.aidl
@@ -35,11 +35,11 @@
/* @hide */
@Backing(type="int") @VintfStability
enum Result {
- SUCCESS = 0,
- UNAVAILABLE = 1,
- NOT_INITIALIZED = 2,
- INVALID_STATE = 3,
- INVALID_ARGUMENT = 4,
- OUT_OF_MEMORY = 5,
- UNKNOWN_ERROR = 6,
+ SUCCESS,
+ UNAVAILABLE,
+ NOT_INITIALIZED,
+ INVALID_STATE,
+ INVALID_ARGUMENT,
+ OUT_OF_MEMORY,
+ UNKNOWN_ERROR,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ScramblingStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ScramblingStatus.aidl
index 656fe20..4d52de1 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ScramblingStatus.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ScramblingStatus.aidl
@@ -35,7 +35,7 @@
/* @hide */
@Backing(type="int") @VintfStability
enum ScramblingStatus {
- UNKNOWN = 1,
- NOT_SCRAMBLED = 2,
- SCRAMBLED = 4,
+ UNKNOWN = (1 << 0) /* 1 */,
+ NOT_SCRAMBLED = (1 << 1) /* 2 */,
+ SCRAMBLED = (1 << 2) /* 4 */,
}
diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/VideoStreamType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/VideoStreamType.aidl
index dbb6033..530f454 100644
--- a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/VideoStreamType.aidl
+++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/VideoStreamType.aidl
@@ -35,18 +35,18 @@
/* @hide */
@Backing(type="int") @VintfStability
enum VideoStreamType {
- UNDEFINED = 0,
- RESERVED = 1,
- MPEG1 = 2,
- MPEG2 = 3,
- MPEG4P2 = 4,
- AVC = 5,
- HEVC = 6,
- VC1 = 7,
- VP8 = 8,
- VP9 = 9,
- AV1 = 10,
- AVS = 11,
- AVS2 = 12,
- VVC = 13,
+ UNDEFINED,
+ RESERVED,
+ MPEG1,
+ MPEG2,
+ MPEG4P2,
+ AVC,
+ HEVC,
+ VC1,
+ VP8,
+ VP9,
+ AV1,
+ AVS,
+ AVS2,
+ VVC,
}
diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl
index 32f0cb2..06f087b 100644
--- a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl
+++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl
@@ -17,7 +17,6 @@
package android.hardware.tv.tuner;
import android.hardware.common.NativeHandle;
-
import android.hardware.tv.tuner.DemuxFilterMediaEventExtraMetaData;
import android.hardware.tv.tuner.DemuxFilterScIndexMask;
@@ -91,4 +90,32 @@
* access unit framing at decode stage.
*/
DemuxFilterScIndexMask scIndexMask;
+
+ /**
+ * This attribute is used together with dataGroupId and indexInDataGroup to
+ * associate fragmented data.
+ *
+ * 1 if the media event contains the complete data. dataGroupId can be
+ * ignored.
+ * Greater than 1 if the media event contains incomplete data. Data can be
+ * reassembled by gathering all media events with the same dataGroupId.
+ */
+ int numDataPieces;
+
+ /**
+ * This attribute is used together with numDataPieces and dataGroupId to
+ * associate fragmented data.
+ *
+ * The value should be in the range of [0, numDataPieces - 1], indicating
+ * this piece is the Nth piece.
+ */
+ int indexInDataGroup;
+
+ /**
+ * This attribute is used together with numDataPieces and indexInDataGroup to
+ * associate fragmented data.
+ *
+ * The value is the id of the data group.
+ */
+ int dataGroupId;
}
diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStandardExt.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStandardExt.aidl
new file mode 100644
index 0000000..0b68e89
--- /dev/null
+++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStandardExt.aidl
@@ -0,0 +1,36 @@
+/*
+ * Copyright 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.tuner;
+
+import android.hardware.tv.tuner.FrontendDvbsStandard;
+import android.hardware.tv.tuner.FrontendDvbtStandard;
+
+/**
+ * @hide
+ */
+@VintfStability
+union FrontendStandardExt {
+ /**
+ * The DVB-S standard extension after standard transition.
+ */
+ FrontendDvbsStandard dvbsStandardExt = FrontendDvbsStandard.UNDEFINED;
+
+ /**
+ * The DVB-T standard extension after standard transition.
+ */
+ FrontendDvbtStandard dvbtStandardExt = FrontendDvbtStandard.UNDEFINED;
+}
diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl
index 391f29b..a3902df 100644
--- a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl
+++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl
@@ -28,6 +28,7 @@
import android.hardware.tv.tuner.FrontendRollOff;
import android.hardware.tv.tuner.FrontendScanAtsc3PlpInfo;
import android.hardware.tv.tuner.FrontendSpectralInversion;
+import android.hardware.tv.tuner.FrontendStandardExt;
import android.hardware.tv.tuner.FrontendStatusAtsc3PlpInfo;
import android.hardware.tv.tuner.FrontendTransmissionMode;
import android.hardware.tv.tuner.LnbVoltage;
@@ -272,4 +273,13 @@
* Average jitter (milliseconds).
*/
int iptvAverageJitterMs;
+
+ /**
+ * Standard extension.
+ *
+ * DVB-T and DVB-S can transition to another standard within the same standard series. For
+ * example, DVB-T can transition to DVB-T2 and back. This attribute represents the standard
+ * extension. Valid values include FrontendDvbtStandard.T or FrontendDvbsStandard.S2 etc.
+ */
+ FrontendStandardExt standardExt;
}
diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl
index 6804b2d..3225c42 100644
--- a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl
+++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl
@@ -259,4 +259,9 @@
* Average jitter (milliseconds).
*/
IPTV_AVERAGE_JITTER_MS,
+
+ /**
+ * Standard extension.
+ */
+ STANDARD_EXT,
}
diff --git a/tv/tuner/aidl/default/Filter.cpp b/tv/tuner/aidl/default/Filter.cpp
index 5f7a4cd..946ec3a 100644
--- a/tv/tuner/aidl/default/Filter.cpp
+++ b/tv/tuner/aidl/default/Filter.cpp
@@ -333,8 +333,8 @@
// All the filter event callbacks in start are for testing purpose.
switch (mType.mainType) {
case DemuxFilterMainType::TS:
- createMediaEvent(events, false);
- createMediaEvent(events, true);
+ createMediaEvent(events, false, 0);
+ createMediaEvent(events, true, 1);
createTsRecordEvent(events);
createTemiEvent(events);
break;
@@ -1235,7 +1235,8 @@
return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino);
}
-void Filter::createMediaEvent(vector<DemuxFilterEvent>& events, bool isAudioPresentation) {
+void Filter::createMediaEvent(vector<DemuxFilterEvent>& events, bool isAudioPresentation,
+ int indexInDataGroup) {
DemuxFilterMediaEvent mediaEvent;
mediaEvent.streamId = 1;
mediaEvent.isPtsPresent = true;
@@ -1302,6 +1303,10 @@
mediaEvent.avDataId = static_cast<int64_t>(dataId);
mediaEvent.avMemory = ::android::dupToAidl(nativeHandle);
+ mediaEvent.numDataPieces = 2;
+ mediaEvent.indexInDataGroup = indexInDataGroup;
+ mediaEvent.dataGroupId = 321;
+
events.push_back(DemuxFilterEvent::make<DemuxFilterEvent::Tag::media>(std::move(mediaEvent)));
native_handle_close(nativeHandle);
diff --git a/tv/tuner/aidl/default/Filter.h b/tv/tuner/aidl/default/Filter.h
index e2a0c7a..4be15e2 100644
--- a/tv/tuner/aidl/default/Filter.h
+++ b/tv/tuner/aidl/default/Filter.h
@@ -231,7 +231,8 @@
::ndk::ScopedAStatus createShareMemMediaEvents(vector<int8_t>& output);
bool sameFile(int fd1, int fd2);
- void createMediaEvent(vector<DemuxFilterEvent>&, bool isAudioPresentation);
+ void createMediaEvent(vector<DemuxFilterEvent>&, bool isAudioPresentation,
+ int indexInDataGroup);
void createTsRecordEvent(vector<DemuxFilterEvent>&);
void createMmtpRecordEvent(vector<DemuxFilterEvent>&);
void createSectionEvent(vector<DemuxFilterEvent>&);
diff --git a/tv/tuner/aidl/default/Frontend.cpp b/tv/tuner/aidl/default/Frontend.cpp
index 1031604..bba004a 100644
--- a/tv/tuner/aidl/default/Frontend.cpp
+++ b/tv/tuner/aidl/default/Frontend.cpp
@@ -81,6 +81,7 @@
FrontendStatusType::SIGNAL_STRENGTH, FrontendStatusType::SYMBOL_RATE,
FrontendStatusType::MODULATION, FrontendStatusType::MODULATIONS,
FrontendStatusType::ROLL_OFF, FrontendStatusType::IS_MISO,
+ FrontendStatusType::STANDARD_EXT,
};
break;
}
@@ -96,6 +97,7 @@
FrontendStatusType::TRANSMISSION_MODE,
FrontendStatusType::T2_SYSTEM_ID,
FrontendStatusType::DVBT_CELL_IDS,
+ FrontendStatusType::STANDARD_EXT,
};
break;
}
@@ -985,6 +987,17 @@
status.set<FrontendStatus::iptvAverageJitterMs>(5);
break;
}
+ case FrontendStatusType::STANDARD_EXT: {
+ FrontendStandardExt standardExt;
+ if (mType == FrontendType::DVBS) {
+ standardExt.set<FrontendStandardExt::dvbsStandardExt>(
+ FrontendDvbsStandard::S2X);
+ } else if (mType == FrontendType::DVBT) {
+ standardExt.set<FrontendStandardExt::dvbtStandardExt>(FrontendDvbtStandard::T2);
+ }
+ status.set<FrontendStatus::standardExt>(standardExt);
+ break;
+ }
default: {
continue;
}
diff --git a/tv/tuner/aidl/default/tuner-default.xml b/tv/tuner/aidl/default/tuner-default.xml
index bff8ff0..261fcbf 100644
--- a/tv/tuner/aidl/default/tuner-default.xml
+++ b/tv/tuner/aidl/default/tuner-default.xml
@@ -2,6 +2,6 @@
<hal format="aidl">
<name>android.hardware.tv.tuner</name>
<fqname>ITuner/default</fqname>
- <version>2</version>
+ <version>3</version>
</hal>
</manifest>
diff --git a/tv/tuner/aidl/vts/functional/FilterTests.cpp b/tv/tuner/aidl/vts/functional/FilterTests.cpp
index 533d0e6..788ebbd 100644
--- a/tv/tuner/aidl/vts/functional/FilterTests.cpp
+++ b/tv/tuner/aidl/vts/functional/FilterTests.cpp
@@ -105,17 +105,30 @@
// todo separate filter handlers
for (int i = 0; i < events.size(); i++) {
switch (events[i].getTag()) {
- case DemuxFilterEvent::Tag::media:
- ALOGD("[vts] Media filter event, avMemHandle numFds=%zu.",
- events[i].get<DemuxFilterEvent::Tag::media>().avMemory.fds.size());
+ case DemuxFilterEvent::Tag::media: {
+ int numDataPieces = events[i].get<DemuxFilterEvent::Tag::media>().numDataPieces;
+ int indexInDataGroup
+ = events[i].get<DemuxFilterEvent::Tag::media>().indexInDataGroup;
+ ALOGD("[vts] Media filter event, avMemHandle numFds=%zu, numDataPieces=%d,"
+ " indexInDataGroup=%d, dataGroupId=%d.",
+ events[i].get<DemuxFilterEvent::Tag::media>().avMemory.fds.size(),
+ numDataPieces,
+ indexInDataGroup,
+ events[i].get<DemuxFilterEvent::Tag::media>().dataGroupId);
+ if (numDataPieces > 1) {
+ EXPECT_TRUE(indexInDataGroup >= 0);
+ EXPECT_TRUE(indexInDataGroup < numDataPieces);
+ }
dumpAvData(events[i].get<DemuxFilterEvent::Tag::media>());
break;
- case DemuxFilterEvent::Tag::tsRecord:
+ }
+ case DemuxFilterEvent::Tag::tsRecord: {
ALOGD("[vts] TS record filter event, pts=%" PRIu64 ", firstMbInSlice=%d",
events[i].get<DemuxFilterEvent::Tag::tsRecord>().pts,
events[i].get<DemuxFilterEvent::Tag::tsRecord>().firstMbInSlice);
break;
- case DemuxFilterEvent::Tag::mmtpRecord:
+ }
+ case DemuxFilterEvent::Tag::mmtpRecord: {
ALOGD("[vts] MMTP record filter event, pts=%" PRIu64
", firstMbInSlice=%d, mpuSequenceNumber=%d, tsIndexMask=%d",
events[i].get<DemuxFilterEvent::Tag::mmtpRecord>().pts,
@@ -123,7 +136,8 @@
events[i].get<DemuxFilterEvent::Tag::mmtpRecord>().mpuSequenceNumber,
events[i].get<DemuxFilterEvent::Tag::mmtpRecord>().tsIndexMask);
break;
- case DemuxFilterEvent::Tag::monitorEvent:
+ }
+ case DemuxFilterEvent::Tag::monitorEvent: {
switch (events[i].get<DemuxFilterEvent::Tag::monitorEvent>().getTag()) {
case DemuxFilterMonitorEvent::Tag::scramblingStatus:
mScramblingStatusEvent++;
@@ -135,13 +149,16 @@
break;
}
break;
- case DemuxFilterEvent::Tag::startId:
+ }
+ case DemuxFilterEvent::Tag::startId: {
ALOGD("[vts] Restart filter event, startId=%d",
events[i].get<DemuxFilterEvent::Tag::startId>());
mStartIdReceived = true;
break;
- default:
+ }
+ default: {
break;
+ }
}
}
}
diff --git a/tv/tuner/aidl/vts/functional/FrontendTests.cpp b/tv/tuner/aidl/vts/functional/FrontendTests.cpp
index 85d0496..99c0283 100644
--- a/tv/tuner/aidl/vts/functional/FrontendTests.cpp
+++ b/tv/tuner/aidl/vts/functional/FrontendTests.cpp
@@ -636,7 +636,7 @@
ASSERT_TRUE(tuneFrontend(frontendConf, false /*testWithDemux*/));
// TODO: find a better way to push all frontend status types
- for (int32_t i = 0; i <= static_cast<int32_t>(FrontendStatusType::ATSC3_ALL_PLP_INFO); i++) {
+ for (int32_t i = 0; i <= static_cast<int32_t>(FrontendStatusType::STANDARD_EXT); i++) {
allTypes.push_back(static_cast<FrontendStatusType>(i));
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/CompositePwleV2.aidl
similarity index 94%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/CompositePwleV2.aidl
index a5eda52..de0bdb5 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/CompositePwleV2.aidl
@@ -33,7 +33,6 @@
package android.hardware.vibrator;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable CompositePwleV2 {
+ android.hardware.vibrator.PwleV2Primitive[] pwlePrimitives;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/FrequencyAccelerationMapEntry.aidl
similarity index 97%
rename from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
rename to vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/FrequencyAccelerationMapEntry.aidl
index a5eda52..e6743f9 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/FrequencyAccelerationMapEntry.aidl
@@ -33,7 +33,7 @@
package android.hardware.vibrator;
@VintfStability
-parcelable PwleV2OutputMapEntry {
+parcelable FrequencyAccelerationMapEntry {
float frequencyHz;
float maxOutputAccelerationGs;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibrationSession.aidl
similarity index 94%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibrationSession.aidl
index a5eda52..ec301b2 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibrationSession.aidl
@@ -33,7 +33,7 @@
package android.hardware.vibrator;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+interface IVibrationSession {
+ void close();
+ void abort();
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibrator.aidl b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibrator.aidl
index 0dcc657..9fad952 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibrator.aidl
+++ b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibrator.aidl
@@ -51,19 +51,40 @@
void alwaysOnDisable(in int id);
float getResonantFrequency();
float getQFactor();
+ /**
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be implemented even if CAP_FREQUENCY_CONTROL capability is reported.
+ */
float getFrequencyResolution();
+ /**
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be implemented even if CAP_FREQUENCY_CONTROL capability is reported.
+ */
float getFrequencyMinimum();
+ /**
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be implemented even if CAP_FREQUENCY_CONTROL capability is reported.
+ */
float[] getBandwidthAmplitudeMap();
+ /**
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be implemented. Use `IVibrator.getPwleV2PrimitiveDurationMaxMillis` instead.
+ */
int getPwlePrimitiveDurationMax();
+ /**
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be implemented. Use `IVibrator.getPwleV2CompositionSizeMax` instead.
+ */
int getPwleCompositionSizeMax();
+ /**
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be implemented.
+ */
android.hardware.vibrator.Braking[] getSupportedBraking();
+ /**
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be implemented. Use `IVibrator.composePwleV2` instead.
+ */
void composePwle(in android.hardware.vibrator.PrimitivePwle[] composite, in android.hardware.vibrator.IVibratorCallback callback);
void performVendorEffect(in android.hardware.vibrator.VendorEffect vendorEffect, in android.hardware.vibrator.IVibratorCallback callback);
- List<android.hardware.vibrator.PwleV2OutputMapEntry> getPwleV2FrequencyToOutputAccelerationMap();
+ List<android.hardware.vibrator.FrequencyAccelerationMapEntry> getFrequencyToOutputAccelerationMap();
int getPwleV2PrimitiveDurationMaxMillis();
int getPwleV2CompositionSizeMax();
int getPwleV2PrimitiveDurationMinMillis();
- void composePwleV2(in android.hardware.vibrator.PwleV2Primitive[] composite, in android.hardware.vibrator.IVibratorCallback callback);
+ void composePwleV2(in android.hardware.vibrator.CompositePwleV2 composite, in android.hardware.vibrator.IVibratorCallback callback);
const int CAP_ON_CALLBACK = (1 << 0) /* 1 */;
const int CAP_PERFORM_CALLBACK = (1 << 1) /* 2 */;
const int CAP_AMPLITUDE_CONTROL = (1 << 2) /* 4 */;
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibratorManager.aidl b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibratorManager.aidl
index ef5794c..081d9dc 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibratorManager.aidl
+++ b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/IVibratorManager.aidl
@@ -40,6 +40,8 @@
void prepareSynced(in int[] vibratorIds);
void triggerSynced(in android.hardware.vibrator.IVibratorCallback callback);
void cancelSynced();
+ android.hardware.vibrator.IVibrationSession startSession(in int[] vibratorIds, in android.hardware.vibrator.VibrationSessionConfig config, in android.hardware.vibrator.IVibratorCallback callback);
+ void clearSessions();
const int CAP_SYNC = (1 << 0) /* 1 */;
const int CAP_PREPARE_ON = (1 << 1) /* 2 */;
const int CAP_PREPARE_PERFORM = (1 << 2) /* 4 */;
@@ -48,4 +50,5 @@
const int CAP_MIXED_TRIGGER_PERFORM = (1 << 5) /* 32 */;
const int CAP_MIXED_TRIGGER_COMPOSE = (1 << 6) /* 64 */;
const int CAP_TRIGGER_CALLBACK = (1 << 7) /* 128 */;
+ const int CAP_START_SESSIONS = (1 << 8) /* 256 */;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VibrationSessionConfig.aidl
similarity index 94%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VibrationSessionConfig.aidl
index a5eda52..01136aa 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VibrationSessionConfig.aidl
@@ -33,7 +33,6 @@
package android.hardware.vibrator;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable VibrationSessionConfig {
+ ParcelableHolder vendorExtension;
}
diff --git a/vibrator/aidl/android/hardware/vibrator/CompositePwleV2.aidl b/vibrator/aidl/android/hardware/vibrator/CompositePwleV2.aidl
new file mode 100644
index 0000000..9662ca0
--- /dev/null
+++ b/vibrator/aidl/android/hardware/vibrator/CompositePwleV2.aidl
@@ -0,0 +1,27 @@
+/*
+ * 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.vibrator;
+
+import android.hardware.vibrator.PwleV2Primitive;
+
+@VintfStability
+parcelable CompositePwleV2 {
+ /**
+ * An array of primitives that represents the PWLE effect
+ */
+ PwleV2Primitive[] pwlePrimitives;
+}
diff --git a/vibrator/aidl/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/vibrator/aidl/android/hardware/vibrator/FrequencyAccelerationMapEntry.aidl
similarity index 96%
rename from vibrator/aidl/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
rename to vibrator/aidl/android/hardware/vibrator/FrequencyAccelerationMapEntry.aidl
index a8db87c..470dc80 100644
--- a/vibrator/aidl/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/vibrator/aidl/android/hardware/vibrator/FrequencyAccelerationMapEntry.aidl
@@ -17,7 +17,7 @@
package android.hardware.vibrator;
@VintfStability
-parcelable PwleV2OutputMapEntry {
+parcelable FrequencyAccelerationMapEntry {
/**
* Absolute frequency point in the units of hertz
*
diff --git a/vibrator/aidl/android/hardware/vibrator/IVibrationSession.aidl b/vibrator/aidl/android/hardware/vibrator/IVibrationSession.aidl
new file mode 100644
index 0000000..88382e5
--- /dev/null
+++ b/vibrator/aidl/android/hardware/vibrator/IVibrationSession.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.vibrator;
+
+@VintfStability
+interface IVibrationSession {
+ /**
+ * Request the end of this session.
+ *
+ * This will cause this session to end once the ongoing vibration commands are completed in each
+ * individual vibrator. The immediate end of this session can stll be trigged via abort().
+ *
+ * This should not block on the end of this session. The callback provided during the creation
+ * of this session should be used to indicate the vibrations are done and the session has
+ * ended. The session object can be safely destroyed after this is called, and the session
+ * should end as expected.
+ */
+ void close();
+
+ /**
+ * Immediately end this session.
+ *
+ * This will cause this session to end immediately and stop any ongoing vibration. The vibrator
+ * manager and each individual vibrator in this session will be reset and available when this
+ * returns.
+ */
+ void abort();
+}
diff --git a/vibrator/aidl/android/hardware/vibrator/IVibrator.aidl b/vibrator/aidl/android/hardware/vibrator/IVibrator.aidl
index 11f36ba..a2f0017 100644
--- a/vibrator/aidl/android/hardware/vibrator/IVibrator.aidl
+++ b/vibrator/aidl/android/hardware/vibrator/IVibrator.aidl
@@ -19,12 +19,12 @@
import android.hardware.vibrator.Braking;
import android.hardware.vibrator.CompositeEffect;
import android.hardware.vibrator.CompositePrimitive;
+import android.hardware.vibrator.CompositePwleV2;
import android.hardware.vibrator.Effect;
import android.hardware.vibrator.EffectStrength;
+import android.hardware.vibrator.FrequencyAccelerationMapEntry;
import android.hardware.vibrator.IVibratorCallback;
import android.hardware.vibrator.PrimitivePwle;
-import android.hardware.vibrator.PwleV2OutputMapEntry;
-import android.hardware.vibrator.PwleV2Primitive;
import android.hardware.vibrator.VendorEffect;
@VintfStability
@@ -290,6 +290,8 @@
*
* @return The frequency resolution of the bandwidth amplitude map.
* Non-zero value if supported, or value should be ignored if not supported.
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be
+ * implemented even if CAP_FREQUENCY_CONTROL capability is reported.
*/
float getFrequencyResolution();
@@ -301,6 +303,8 @@
*
* @return The minimum frequency allowed. Non-zero value if supported,
* or value should be ignored if not supported.
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be
+ * implemented even if CAP_FREQUENCY_CONTROL capability is reported.
*/
float getFrequencyMinimum();
@@ -322,6 +326,8 @@
*
* @return The maximum output acceleration amplitude for each supported frequency,
* starting at getMinimumFrequency()
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be
+ * implemented even if CAP_FREQUENCY_CONTROL capability is reported.
*/
float[] getBandwidthAmplitudeMap();
@@ -333,6 +339,8 @@
*
* @return The maximum duration allowed for a single PrimitivePwle.
* Non-zero value if supported, or value should be ignored if not supported.
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be
+ * implemented. Use `IVibrator.getPwleV2PrimitiveDurationMaxMillis` instead.
*/
int getPwlePrimitiveDurationMax();
@@ -344,6 +352,8 @@
*
* @return The maximum count allowed. Non-zero value if supported,
* or value should be ignored if not supported.
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be
+ * implemented. Use `IVibrator.getPwleV2CompositionSizeMax` instead.
*/
int getPwleCompositionSizeMax();
@@ -355,6 +365,8 @@
* Implementations are optional but encouraged if available.
*
* @return The braking mechanisms which are supported by the composePwle API.
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be
+ * implemented.
*/
Braking[] getSupportedBraking();
@@ -368,6 +380,8 @@
* explicitly call off. IVibratorCallback.onComplete() support is required for this API.
*
* @param composite Array of PWLEs.
+ * @deprecated This method is deprecated from AIDL v3 and is no longer required to be
+ * implemented. Use `IVibrator.composePwleV2` instead.
*/
void composePwle(in PrimitivePwle[] composite, in IVibratorCallback callback);
@@ -396,12 +410,12 @@
* Retrieves a mapping of vibration frequency (Hz) to the maximum achievable output
* acceleration (Gs) the device can reach at that frequency.
*
- * The map, represented as a list of `PwleV2OutputMapEntry` (frequency, output acceleration)
- * pairs, defines the device's frequency response. The platform uses the minimum and maximum
- * frequency values to determine the supported input range for `IVibrator.composePwleV2`.
- * Output acceleration values are used to identify a frequency range suitable to safely play
- * perceivable vibrations with a simple API. The map is also exposed for developers using an
- * advanced API.
+ * The map, represented as a list of `FrequencyAccelerationMapEntry` (frequency, output
+ * acceleration) pairs, defines the device's frequency response. The platform uses the minimum
+ * and maximum frequency values to determine the supported input range for
+ * `IVibrator.composePwleV2`. Output acceleration values are used to identify a frequency range
+ * suitable to safely play perceivable vibrations with a simple API. The map is also exposed for
+ * developers using an advanced API.
*
* The platform does not impose specific requirements on map resolution which can vary
* depending on the shape of device output curve. The values will be linearly interpolated
@@ -410,7 +424,7 @@
*
*
* This may not be supported and this support is reflected in getCapabilities
- * (CAP_COMPOSE_PWLE_EFFECTS_V2). If this is supported, it's expected to be non-empty and
+ * (CAP_FREQUENCY_CONTROL). If this is supported, it's expected to be non-empty and
* describe a valid non-empty frequency range where the simple API can be defined
* (i.e. a range where the output acceleration is always above 10 db SL).
*
@@ -418,7 +432,7 @@
* mapping.
* @throws EX_UNSUPPORTED_OPERATION if unsupported, as reflected by getCapabilities.
*/
- List<PwleV2OutputMapEntry> getPwleV2FrequencyToOutputAccelerationMap();
+ List<FrequencyAccelerationMapEntry> getFrequencyToOutputAccelerationMap();
/**
* Retrieve the maximum duration allowed for any primitive PWLE in units of
@@ -436,8 +450,8 @@
* Retrieve the maximum number of PWLE primitives input supported by IVibrator.composePwleV2.
*
* This may not be supported and this support is reflected in
- * getCapabilities (CAP_COMPOSE_PWLE_EFFECTS_V2). Devices supporting PWLE effects must
- * support effects with at least 16 PwleV2Primitive.
+ * getCapabilities (CAP_COMPOSE_PWLE_EFFECTS_V2). Devices supporting
+ * PWLE effects must support effects with at least 16 PwleV2Primitive.
*
* @return The maximum count allowed. Non-zero value if supported.
* @throws EX_UNSUPPORTED_OPERATION if unsupported, as reflected by getCapabilities.
@@ -463,10 +477,14 @@
* This may not be supported and this support is reflected in
* getCapabilities (CAP_COMPOSE_PWLE_EFFECTS_V2).
*
+ * Note: Devices reporting CAP_COMPOSE_PWLE_EFFECTS_V2 support MUST also have the
+ * CAP_FREQUENCY_CONTROL capability and provide a valid frequency to output acceleration map.
+ *
* Doing this operation while the vibrator is already on is undefined behavior. Clients should
* explicitly call off. IVibratorCallback.onComplete() support is required for this API.
*
- * @param composite An array of primitives that represents a PWLE (Piecewise-Linear Envelope).
+ * @param composite A CompositePwleV2 representing a composite vibration effect, composed of an
+ * array of primitives that define the PWLE (Piecewise-Linear Envelope).
*/
- void composePwleV2(in PwleV2Primitive[] composite, in IVibratorCallback callback);
+ void composePwleV2(in CompositePwleV2 composite, in IVibratorCallback callback);
}
diff --git a/vibrator/aidl/android/hardware/vibrator/IVibratorManager.aidl b/vibrator/aidl/android/hardware/vibrator/IVibratorManager.aidl
index eb5e9cc..e8b85c5 100644
--- a/vibrator/aidl/android/hardware/vibrator/IVibratorManager.aidl
+++ b/vibrator/aidl/android/hardware/vibrator/IVibratorManager.aidl
@@ -16,8 +16,10 @@
package android.hardware.vibrator;
+import android.hardware.vibrator.IVibrationSession;
import android.hardware.vibrator.IVibrator;
import android.hardware.vibrator.IVibratorCallback;
+import android.hardware.vibrator.VibrationSessionConfig;
@VintfStability
interface IVibratorManager {
@@ -42,17 +44,23 @@
*/
const int CAP_MIXED_TRIGGER_ON = 1 << 4;
/**
- * Whether IVibrator 'perform' can be triggered with other functions in sync with 'triggerSynced'.
+ * Whether IVibrator 'perform' can be triggered with other functions in sync with
+ * 'triggerSynced'.
*/
const int CAP_MIXED_TRIGGER_PERFORM = 1 << 5;
/**
- * Whether IVibrator 'compose' can be triggered with other functions in sync with 'triggerSynced'.
+ * Whether IVibrator 'compose' can be triggered with other functions in sync with
+ * 'triggerSynced'.
*/
const int CAP_MIXED_TRIGGER_COMPOSE = 1 << 6;
/**
* Whether on w/ IVibratorCallback can be used w/ 'trigerSynced' function.
*/
const int CAP_TRIGGER_CALLBACK = 1 << 7;
+ /**
+ * Whether vibration sessions are supported.
+ */
+ const int CAP_START_SESSIONS = 1 << 8;
/**
* Determine capabilities of the vibrator manager HAL (CAP_* mask)
@@ -75,8 +83,8 @@
* This function must only be called after the previous synced vibration was triggered or
* canceled (through cancelSynced()).
*
- * Doing this operation while any of the specified vibrators is already on is undefined behavior.
- * Clients should explicitly call off in each vibrator.
+ * Doing this operation while any of the specified vibrators is already on is undefined
+ * behavior. Clients should explicitly call off in each vibrator.
*
* @param vibratorIds ids of the vibrators to play vibrations in sync.
*/
@@ -99,4 +107,41 @@
* Cancel a previously-started preparation for synced vibration, if any.
*/
void cancelSynced();
+
+ /**
+ * Start a vibration session.
+ *
+ * A vibration session can be used to send commands without resetting the vibrator state. Once a
+ * session starts, the individual vibrators can receive one or more commands like on(),
+ * performEffect(), setAmplitude(), etc. The vibrations performed in a session must have the
+ * same behavior they have outside them. Multiple commands can be synced in a session via
+ * prepareSynced as usual.
+ *
+ * Starting a session on a vibrator already in another session or in a prepareSynced state is
+ * not allowed and should throw illegal state. The end of a session should always notify the
+ * callback provided, even if it ends prematurely due to an error.
+ *
+ * This may not be supported and this support is reflected in
+ * getCapabilities (CAP_START_SESSIONS). IVibratorCallback.onComplete() support is required for
+ * this API.
+ *
+ * @param vibratorIds ids of the vibrators in the session.
+ * @param config The parameters for starting a vibration session.
+ * @param callback A callback used to inform Frameworks of state change.
+ * @throws :
+ * - EX_UNSUPPORTED_OPERATION if unsupported, as reflected by getCapabilities.
+ * - EX_ILLEGAL_ARGUMENT for invalid vibrator IDs.
+ * - EX_ILLEGAL_STATE for vibrator IDs already in a session or in a prepareSynced state.
+ * - EX_SERVICE_SPECIFIC for bad vendor data.
+ */
+ IVibrationSession startSession(
+ in int[] vibratorIds, in VibrationSessionConfig config, in IVibratorCallback callback);
+
+ /**
+ * Abort and clear all ongoing vibration sessions.
+ *
+ * This can be used to reset the vibrator manager and some individual vibrators to an idle
+ * state.
+ */
+ void clearSessions();
}
diff --git a/vibrator/aidl/android/hardware/vibrator/PwleV2Primitive.aidl b/vibrator/aidl/android/hardware/vibrator/PwleV2Primitive.aidl
index bd7bec6..1ad1a9f 100644
--- a/vibrator/aidl/android/hardware/vibrator/PwleV2Primitive.aidl
+++ b/vibrator/aidl/android/hardware/vibrator/PwleV2Primitive.aidl
@@ -21,7 +21,7 @@
/**
* Input amplitude ranges from 0.0 (inclusive) to 1.0 (inclusive), representing the relative
* input value. Actual output acceleration depends on frequency and device response curve
- * (see IVibrator.getPwleV2FrequencyToOutputAccelerationMap for max values).
+ * (see IVibrator.getFrequencyToOutputAccelerationMap for max values).
*
* Input amplitude linearly maps to output acceleration (e.g., 0.5 amplitude yields half the
* max acceleration for that frequency).
@@ -36,7 +36,7 @@
* Absolute frequency point in the units of hertz
*
* Values are within the continuous inclusive frequency range defined by
- * IVibrator#getPwleV2FrequencyToOutputAccelerationMap.
+ * IVibrator#getFrequencyToOutputAccelerationMap.
*/
float frequencyHz;
diff --git a/vibrator/aidl/android/hardware/vibrator/VibrationSessionConfig.aidl b/vibrator/aidl/android/hardware/vibrator/VibrationSessionConfig.aidl
new file mode 100644
index 0000000..56cdde3
--- /dev/null
+++ b/vibrator/aidl/android/hardware/vibrator/VibrationSessionConfig.aidl
@@ -0,0 +1,25 @@
+/*
+ * 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.vibrator;
+
+@VintfStability
+parcelable VibrationSessionConfig {
+ /**
+ * Vendor extension point for starting a vibration session.
+ */
+ ParcelableHolder vendorExtension;
+}
diff --git a/vibrator/aidl/default/Android.bp b/vibrator/aidl/default/Android.bp
index b25a5ba..de228cd 100644
--- a/vibrator/aidl/default/Android.bp
+++ b/vibrator/aidl/default/Android.bp
@@ -19,6 +19,7 @@
],
export_include_dirs: ["include"],
srcs: [
+ "VibrationSession.cpp",
"Vibrator.cpp",
"VibratorManager.cpp",
],
diff --git a/vibrator/aidl/default/VibrationSession.cpp b/vibrator/aidl/default/VibrationSession.cpp
new file mode 100644
index 0000000..cfb6608
--- /dev/null
+++ b/vibrator/aidl/default/VibrationSession.cpp
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+
+#include "vibrator-impl/VibrationSession.h"
+
+#include <android-base/logging.h>
+#include <thread>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace vibrator {
+
+static constexpr int32_t SESSION_END_DELAY_MS = 50;
+
+ndk::ScopedAStatus VibrationSession::close() {
+ LOG(VERBOSE) << "Vibration Session close";
+ mManager->closeSession(SESSION_END_DELAY_MS);
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus VibrationSession::abort() {
+ LOG(VERBOSE) << "Vibration Session abort";
+ mManager->abortSession();
+ return ndk::ScopedAStatus::ok();
+}
+
+} // namespace vibrator
+} // namespace hardware
+} // namespace android
+} // namespace aidl
diff --git a/vibrator/aidl/default/Vibrator.cpp b/vibrator/aidl/default/Vibrator.cpp
index 4f8c2b8..165a3bf 100644
--- a/vibrator/aidl/default/Vibrator.cpp
+++ b/vibrator/aidl/default/Vibrator.cpp
@@ -45,11 +45,62 @@
// Service specific error code used for vendor vibration effects.
static constexpr int32_t ERROR_CODE_INVALID_DURATION = 1;
+void Vibrator::dispatchVibrate(int32_t timeoutMs,
+ const std::shared_ptr<IVibratorCallback>& callback) {
+ std::lock_guard lock(mMutex);
+ if (mIsVibrating) {
+ // Already vibrating, ignore new request.
+ return;
+ }
+ mVibrationCallback = callback;
+ mIsVibrating = true;
+ // Note that thread lambdas aren't using implicit capture [=], to avoid capturing "this",
+ // which may be asynchronously destructed.
+ std::thread([timeoutMs, callback, sharedThis = this->ref<Vibrator>()] {
+ LOG(VERBOSE) << "Starting delayed callback on another thread";
+ usleep(timeoutMs * 1000);
+
+ if (sharedThis) {
+ std::lock_guard lock(sharedThis->mMutex);
+ sharedThis->mIsVibrating = false;
+ if (sharedThis->mVibrationCallback && (callback == sharedThis->mVibrationCallback)) {
+ LOG(VERBOSE) << "Notifying callback onComplete";
+ if (!sharedThis->mVibrationCallback->onComplete().isOk()) {
+ LOG(ERROR) << "Failed to call onComplete";
+ }
+ sharedThis->mVibrationCallback = nullptr;
+ }
+ if (sharedThis->mGlobalVibrationCallback) {
+ LOG(VERBOSE) << "Notifying global callback onComplete";
+ if (!sharedThis->mGlobalVibrationCallback->onComplete().isOk()) {
+ LOG(ERROR) << "Failed to call onComplete";
+ }
+ sharedThis->mGlobalVibrationCallback = nullptr;
+ }
+ }
+ }).detach();
+}
+
+void Vibrator::setGlobalVibrationCallback(const std::shared_ptr<IVibratorCallback>& callback) {
+ std::lock_guard lock(mMutex);
+ if (mIsVibrating) {
+ mGlobalVibrationCallback = callback;
+ } else if (callback) {
+ std::thread([callback] {
+ LOG(VERBOSE) << "Notifying global callback onComplete";
+ if (!callback->onComplete().isOk()) {
+ LOG(ERROR) << "Failed to call onComplete";
+ }
+ }).detach();
+ }
+}
+
ndk::ScopedAStatus Vibrator::getCapabilities(int32_t* _aidl_return) {
LOG(VERBOSE) << "Vibrator reporting capabilities";
std::lock_guard lock(mMutex);
if (mCapabilities == 0) {
- if (!getInterfaceVersion(&mVersion).isOk()) {
+ int32_t version;
+ if (!getInterfaceVersion(&version).isOk()) {
return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_ILLEGAL_STATE));
}
mCapabilities = IVibrator::CAP_ON_CALLBACK | IVibrator::CAP_PERFORM_CALLBACK |
@@ -59,9 +110,9 @@
IVibrator::CAP_GET_Q_FACTOR | IVibrator::CAP_FREQUENCY_CONTROL |
IVibrator::CAP_COMPOSE_PWLE_EFFECTS;
- if (mVersion >= 3) {
- mCapabilities |= (IVibrator::CAP_PERFORM_VENDOR_EFFECTS |
- IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2);
+ if (version >= 3) {
+ mCapabilities |=
+ IVibrator::CAP_PERFORM_VENDOR_EFFECTS | IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2;
}
}
@@ -71,25 +122,35 @@
ndk::ScopedAStatus Vibrator::off() {
LOG(VERBOSE) << "Vibrator off";
+ std::lock_guard lock(mMutex);
+ std::shared_ptr<IVibratorCallback> callback = mVibrationCallback;
+ std::shared_ptr<IVibratorCallback> globalCallback = mGlobalVibrationCallback;
+ mIsVibrating = false;
+ mVibrationCallback = nullptr;
+ mGlobalVibrationCallback = nullptr;
+ if (callback || globalCallback) {
+ std::thread([callback, globalCallback] {
+ if (callback) {
+ LOG(VERBOSE) << "Notifying callback onComplete";
+ if (!callback->onComplete().isOk()) {
+ LOG(ERROR) << "Failed to call onComplete";
+ }
+ }
+ if (globalCallback) {
+ LOG(VERBOSE) << "Notifying global callback onComplete";
+ if (!globalCallback->onComplete().isOk()) {
+ LOG(ERROR) << "Failed to call onComplete";
+ }
+ }
+ }).detach();
+ }
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus Vibrator::on(int32_t timeoutMs,
const std::shared_ptr<IVibratorCallback>& callback) {
LOG(VERBOSE) << "Vibrator on for timeoutMs: " << timeoutMs;
- if (callback != nullptr) {
- // Note that thread lambdas aren't using implicit capture [=], to avoid capturing "this",
- // which may be asynchronously destructed.
- // If "this" is needed, use [sharedThis = this->ref<Vibrator>()].
- std::thread([timeoutMs, callback] {
- LOG(VERBOSE) << "Starting on on another thread";
- usleep(timeoutMs * 1000);
- LOG(VERBOSE) << "Notifying on complete";
- if (!callback->onComplete().isOk()) {
- LOG(ERROR) << "Failed to call onComplete";
- }
- }).detach();
- }
+ dispatchVibrate(timeoutMs, callback);
return ndk::ScopedAStatus::ok();
}
@@ -107,16 +168,7 @@
}
constexpr size_t kEffectMillis = 100;
-
- if (callback != nullptr) {
- std::thread([callback] {
- LOG(VERBOSE) << "Starting perform on another thread";
- usleep(kEffectMillis * 1000);
- LOG(VERBOSE) << "Notifying perform complete";
- callback->onComplete();
- }).detach();
- }
-
+ dispatchVibrate(kEffectMillis, callback);
*_aidl_return = kEffectMillis;
return ndk::ScopedAStatus::ok();
}
@@ -150,15 +202,7 @@
return ndk::ScopedAStatus::fromServiceSpecificError(ERROR_CODE_INVALID_DURATION);
}
- if (callback != nullptr) {
- std::thread([callback, durationMs] {
- LOG(VERBOSE) << "Starting perform on another thread for durationMs:" << durationMs;
- usleep(durationMs * 1000);
- LOG(VERBOSE) << "Notifying perform vendor effect complete";
- callback->onComplete();
- }).detach();
- }
-
+ dispatchVibrate(durationMs, callback);
return ndk::ScopedAStatus::ok();
}
@@ -237,28 +281,14 @@
}
}
- // The thread may theoretically outlive the vibrator, so take a proper reference to it.
- std::thread([sharedThis = this->ref<Vibrator>(), composite, callback] {
- LOG(VERBOSE) << "Starting compose on another thread";
+ int32_t totalDuration = 0;
+ for (auto& e : composite) {
+ int32_t durationMs;
+ getPrimitiveDuration(e.primitive, &durationMs);
+ totalDuration += e.delayMs + durationMs;
+ }
- for (auto& e : composite) {
- if (e.delayMs) {
- usleep(e.delayMs * 1000);
- }
- LOG(VERBOSE) << "triggering primitive " << static_cast<int>(e.primitive) << " @ scale "
- << e.scale;
-
- int32_t durationMs;
- sharedThis->getPrimitiveDuration(e.primitive, &durationMs);
- usleep(durationMs * 1000);
- }
-
- if (callback != nullptr) {
- LOG(VERBOSE) << "Notifying perform complete";
- callback->onComplete();
- }
- }).detach();
-
+ dispatchVibrate(totalDuration, callback);
return ndk::ScopedAStatus::ok();
}
@@ -460,21 +490,21 @@
}
}
- std::thread([totalDuration, callback] {
- LOG(VERBOSE) << "Starting composePwle on another thread";
- usleep(totalDuration * 1000);
- if (callback != nullptr) {
- LOG(VERBOSE) << "Notifying compose PWLE complete";
- callback->onComplete();
- }
- }).detach();
-
+ dispatchVibrate(totalDuration, callback);
return ndk::ScopedAStatus::ok();
}
-ndk::ScopedAStatus Vibrator::getPwleV2FrequencyToOutputAccelerationMap(
- std::vector<PwleV2OutputMapEntry>* _aidl_return) {
- std::vector<PwleV2OutputMapEntry> frequencyToOutputAccelerationMap;
+ndk::ScopedAStatus Vibrator::getFrequencyToOutputAccelerationMap(
+ std::vector<FrequencyAccelerationMapEntry>* _aidl_return) {
+ int32_t capabilities = 0;
+ if (!getCapabilities(&capabilities).isOk()) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
+ if (!(capabilities & IVibrator::CAP_FREQUENCY_CONTROL)) {
+ return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_UNSUPPORTED_OPERATION));
+ }
+
+ std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap;
std::vector<std::pair<float, float>> frequencyToOutputAccelerationData = {
{30.0f, 0.01f}, {46.0f, 0.09f}, {50.0f, 0.1f}, {55.0f, 0.12f}, {62.0f, 0.66f},
@@ -485,8 +515,8 @@
{263.0f, 1.39f}, {65.0f, 1.38f}, {278.0f, 1.37f}, {294.0f, 1.35f}, {300.0f, 1.34f}};
for (const auto& entry : frequencyToOutputAccelerationData) {
frequencyToOutputAccelerationMap.push_back(
- PwleV2OutputMapEntry(/*frequency=*/entry.first,
- /*maxOutputAcceleration=*/entry.second));
+ FrequencyAccelerationMapEntry(/*frequency=*/entry.first,
+ /*maxOutputAcceleration=*/entry.second));
}
*_aidl_return = frequencyToOutputAccelerationMap;
@@ -509,7 +539,8 @@
return ndk::ScopedAStatus::ok();
}
-float getPwleV2FrequencyMinHz(std::vector<PwleV2OutputMapEntry> frequencyToOutputAccelerationMap) {
+float getPwleV2FrequencyMinHz(
+ std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap) {
if (frequencyToOutputAccelerationMap.empty()) {
return 0.0f;
}
@@ -525,7 +556,8 @@
return minFrequency;
}
-float getPwleV2FrequencyMaxHz(std::vector<PwleV2OutputMapEntry> frequencyToOutputAccelerationMap) {
+float getPwleV2FrequencyMaxHz(
+ std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap) {
if (frequencyToOutputAccelerationMap.empty()) {
return 0.0f;
}
@@ -541,29 +573,31 @@
return maxFrequency;
}
-ndk::ScopedAStatus Vibrator::composePwleV2(const std::vector<PwleV2Primitive>& composite,
+ndk::ScopedAStatus Vibrator::composePwleV2(const CompositePwleV2& composite,
const std::shared_ptr<IVibratorCallback>& callback) {
+ LOG(VERBOSE) << "Vibrator compose PWLE V2";
int32_t capabilities = 0;
if (!getCapabilities(&capabilities).isOk()) {
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
}
- if ((capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2) == 0) {
+ if (!(capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2) ||
+ !(capabilities & IVibrator::CAP_FREQUENCY_CONTROL)) {
return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_UNSUPPORTED_OPERATION));
}
int compositionSizeMax;
getPwleV2CompositionSizeMax(&compositionSizeMax);
- if (composite.size() <= 0 || composite.size() > compositionSizeMax) {
+ if (composite.pwlePrimitives.empty() || composite.pwlePrimitives.size() > compositionSizeMax) {
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
}
int32_t totalEffectDuration = 0;
- std::vector<PwleV2OutputMapEntry> frequencyToOutputAccelerationMap;
- getPwleV2FrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap);
+ std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap;
+ getFrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap);
float minFrequency = getPwleV2FrequencyMinHz(frequencyToOutputAccelerationMap);
float maxFrequency = getPwleV2FrequencyMaxHz(frequencyToOutputAccelerationMap);
- for (auto& e : composite) {
+ for (auto& e : composite.pwlePrimitives) {
if (e.timeMillis < 0.0f || e.timeMillis > COMPOSE_PWLE_V2_PRIMITIVE_DURATION_MAX_MS) {
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
}
@@ -576,15 +610,7 @@
totalEffectDuration += e.timeMillis;
}
- std::thread([totalEffectDuration, callback] {
- LOG(VERBOSE) << "Starting composePwleV2 on another thread";
- usleep(totalEffectDuration * 1000);
- if (callback != nullptr) {
- LOG(VERBOSE) << "Notifying compose PWLE V2 complete";
- callback->onComplete();
- }
- }).detach();
-
+ dispatchVibrate(totalEffectDuration, callback);
return ndk::ScopedAStatus::ok();
}
diff --git a/vibrator/aidl/default/VibratorManager.cpp b/vibrator/aidl/default/VibratorManager.cpp
index 26edf5a..c3be468 100644
--- a/vibrator/aidl/default/VibratorManager.cpp
+++ b/vibrator/aidl/default/VibratorManager.cpp
@@ -15,6 +15,9 @@
*/
#include "vibrator-impl/VibratorManager.h"
+#include "vibrator-impl/VibrationSession.h"
+
+#include <aidl/android/hardware/vibrator/BnVibratorCallback.h>
#include <android-base/logging.h>
#include <thread>
@@ -26,25 +29,52 @@
static constexpr int32_t kDefaultVibratorId = 1;
+class VibratorCallback : public BnVibratorCallback {
+ public:
+ VibratorCallback(const std::function<void()>& callback) : mCallback(callback) {}
+ ndk::ScopedAStatus onComplete() override {
+ mCallback();
+ return ndk::ScopedAStatus::ok();
+ }
+
+ private:
+ std::function<void()> mCallback;
+};
+
ndk::ScopedAStatus VibratorManager::getCapabilities(int32_t* _aidl_return) {
- LOG(INFO) << "Vibrator manager reporting capabilities";
- *_aidl_return =
- IVibratorManager::CAP_SYNC | IVibratorManager::CAP_PREPARE_ON |
- IVibratorManager::CAP_PREPARE_PERFORM | IVibratorManager::CAP_PREPARE_COMPOSE |
- IVibratorManager::CAP_MIXED_TRIGGER_ON | IVibratorManager::CAP_MIXED_TRIGGER_PERFORM |
- IVibratorManager::CAP_MIXED_TRIGGER_COMPOSE | IVibratorManager::CAP_TRIGGER_CALLBACK;
+ LOG(VERBOSE) << "Vibrator manager reporting capabilities";
+ std::lock_guard lock(mMutex);
+ if (mCapabilities == 0) {
+ int32_t version;
+ if (!getInterfaceVersion(&version).isOk()) {
+ return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_ILLEGAL_STATE));
+ }
+ mCapabilities = IVibratorManager::CAP_SYNC | IVibratorManager::CAP_PREPARE_ON |
+ IVibratorManager::CAP_PREPARE_PERFORM |
+ IVibratorManager::CAP_PREPARE_COMPOSE |
+ IVibratorManager::CAP_MIXED_TRIGGER_ON |
+ IVibratorManager::CAP_MIXED_TRIGGER_PERFORM |
+ IVibratorManager::CAP_MIXED_TRIGGER_COMPOSE |
+ IVibratorManager::CAP_TRIGGER_CALLBACK;
+
+ if (version >= 3) {
+ mCapabilities |= IVibratorManager::CAP_START_SESSIONS;
+ }
+ }
+
+ *_aidl_return = mCapabilities;
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus VibratorManager::getVibratorIds(std::vector<int32_t>* _aidl_return) {
- LOG(INFO) << "Vibrator manager getting vibrator ids";
+ LOG(VERBOSE) << "Vibrator manager getting vibrator ids";
*_aidl_return = {kDefaultVibratorId};
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus VibratorManager::getVibrator(int32_t vibratorId,
std::shared_ptr<IVibrator>* _aidl_return) {
- LOG(INFO) << "Vibrator manager getting vibrator " << vibratorId;
+ LOG(VERBOSE) << "Vibrator manager getting vibrator " << vibratorId;
if (vibratorId == kDefaultVibratorId) {
*_aidl_return = mDefaultVibrator;
return ndk::ScopedAStatus::ok();
@@ -55,32 +85,131 @@
}
ndk::ScopedAStatus VibratorManager::prepareSynced(const std::vector<int32_t>& vibratorIds) {
- LOG(INFO) << "Vibrator Manager prepare synced";
- if (vibratorIds.size() == 1 && vibratorIds[0] == kDefaultVibratorId) {
- return ndk::ScopedAStatus::ok();
- } else {
+ LOG(VERBOSE) << "Vibrator Manager prepare synced";
+ if (vibratorIds.size() != 1 || vibratorIds[0] != kDefaultVibratorId) {
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
}
+ std::lock_guard lock(mMutex);
+ if (mIsPreparing) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
+ mIsPreparing = true;
+ return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus VibratorManager::triggerSynced(
const std::shared_ptr<IVibratorCallback>& callback) {
- LOG(INFO) << "Vibrator Manager trigger synced";
+ LOG(VERBOSE) << "Vibrator Manager trigger synced";
+ std::lock_guard lock(mMutex);
+ if (!mIsPreparing) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
std::thread([callback] {
if (callback != nullptr) {
- LOG(INFO) << "Notifying perform complete";
+ LOG(VERBOSE) << "Notifying perform complete";
callback->onComplete();
}
}).detach();
-
+ mIsPreparing = false;
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus VibratorManager::cancelSynced() {
- LOG(INFO) << "Vibrator Manager cancel synced";
+ LOG(VERBOSE) << "Vibrator Manager cancel synced";
+ std::lock_guard lock(mMutex);
+ mIsPreparing = false;
return ndk::ScopedAStatus::ok();
}
+ndk::ScopedAStatus VibratorManager::startSession(const std::vector<int32_t>& vibratorIds,
+ const VibrationSessionConfig&,
+ const std::shared_ptr<IVibratorCallback>& callback,
+ std::shared_ptr<IVibrationSession>* _aidl_return) {
+ LOG(VERBOSE) << "Vibrator Manager start session";
+ *_aidl_return = nullptr;
+ int32_t capabilities = 0;
+ if (!getCapabilities(&capabilities).isOk()) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
+ if ((capabilities & IVibratorManager::CAP_START_SESSIONS) == 0) {
+ return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_UNSUPPORTED_OPERATION));
+ }
+ if (vibratorIds.size() != 1 || vibratorIds[0] != kDefaultVibratorId) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
+ std::lock_guard lock(mMutex);
+ if (mIsPreparing || mSession) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
+ mSessionCallback = callback;
+ mSession = ndk::SharedRefBase::make<VibrationSession>(this->ref<VibratorManager>());
+ *_aidl_return = static_cast<std::shared_ptr<IVibrationSession>>(mSession);
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus VibratorManager::clearSessions() {
+ LOG(VERBOSE) << "Vibrator Manager clear sessions";
+ abortSession();
+ return ndk::ScopedAStatus::ok();
+}
+
+void VibratorManager::abortSession() {
+ std::shared_ptr<IVibrationSession> session;
+ {
+ std::lock_guard lock(mMutex);
+ session = mSession;
+ }
+ if (session) {
+ mDefaultVibrator->off();
+ clearSession(session);
+ }
+}
+
+void VibratorManager::closeSession(int32_t delayMs) {
+ std::shared_ptr<IVibrationSession> session;
+ {
+ std::lock_guard lock(mMutex);
+ if (mIsClosingSession) {
+ // Already closing session, ignore this.
+ return;
+ }
+ session = mSession;
+ mIsClosingSession = true;
+ }
+ if (session) {
+ auto callback = ndk::SharedRefBase::make<VibratorCallback>(
+ [session, delayMs, sharedThis = this->ref<VibratorManager>()] {
+ LOG(VERBOSE) << "Closing session after vibrator became idle";
+ usleep(delayMs * 1000);
+
+ if (sharedThis) {
+ sharedThis->clearSession(session);
+ }
+ });
+ mDefaultVibrator->setGlobalVibrationCallback(callback);
+ }
+}
+
+void VibratorManager::clearSession(const std::shared_ptr<IVibrationSession>& session) {
+ std::lock_guard lock(mMutex);
+ if (mSession != session) {
+ // Probably a delayed call from an old session that was already cleared, ignore it.
+ return;
+ }
+ std::shared_ptr<IVibratorCallback> callback = mSessionCallback;
+ mSession = nullptr;
+ mSessionCallback = nullptr; // make sure any delayed call will not trigger this again.
+ mIsClosingSession = false;
+ if (callback) {
+ std::thread([callback] {
+ LOG(VERBOSE) << "Notifying session complete";
+ if (!callback->onComplete().isOk()) {
+ LOG(ERROR) << "Failed to call onComplete";
+ }
+ }).detach();
+ }
+}
+
} // namespace vibrator
} // namespace hardware
} // namespace android
diff --git a/vibrator/aidl/default/include/vibrator-impl/VibrationSession.h b/vibrator/aidl/default/include/vibrator-impl/VibrationSession.h
new file mode 100644
index 0000000..98bdd1c
--- /dev/null
+++ b/vibrator/aidl/default/include/vibrator-impl/VibrationSession.h
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <aidl/android/hardware/vibrator/BnVibrationSession.h>
+#include <aidl/android/hardware/vibrator/IVibrator.h>
+#include <aidl/android/hardware/vibrator/IVibratorCallback.h>
+#include <android-base/thread_annotations.h>
+
+#include "vibrator-impl/VibratorManager.h"
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace vibrator {
+
+class VibrationSession : public BnVibrationSession {
+ public:
+ VibrationSession(std::shared_ptr<VibratorManager> manager) : mManager(std::move(manager)) {};
+
+ ndk::ScopedAStatus close() override;
+ ndk::ScopedAStatus abort() override;
+
+ private:
+ mutable std::mutex mMutex;
+ std::shared_ptr<VibratorManager> mManager;
+};
+
+} // namespace vibrator
+} // namespace hardware
+} // namespace android
+} // namespace aidl
diff --git a/vibrator/aidl/default/include/vibrator-impl/Vibrator.h b/vibrator/aidl/default/include/vibrator-impl/Vibrator.h
index 28bc763..354ba46 100644
--- a/vibrator/aidl/default/include/vibrator-impl/Vibrator.h
+++ b/vibrator/aidl/default/include/vibrator-impl/Vibrator.h
@@ -25,6 +25,7 @@
namespace vibrator {
class Vibrator : public BnVibrator {
+ public:
ndk::ScopedAStatus getCapabilities(int32_t* _aidl_return) override;
ndk::ScopedAStatus off() override;
ndk::ScopedAStatus on(int32_t timeoutMs,
@@ -58,18 +59,24 @@
ndk::ScopedAStatus getSupportedBraking(std::vector<Braking>* supported) override;
ndk::ScopedAStatus composePwle(const std::vector<PrimitivePwle> &composite,
const std::shared_ptr<IVibratorCallback> &callback) override;
- ndk::ScopedAStatus getPwleV2FrequencyToOutputAccelerationMap(
- std::vector<PwleV2OutputMapEntry>* _aidl_return) override;
+ ndk::ScopedAStatus getFrequencyToOutputAccelerationMap(
+ std::vector<FrequencyAccelerationMapEntry>* _aidl_return) override;
ndk::ScopedAStatus getPwleV2PrimitiveDurationMaxMillis(int32_t* maxDurationMs) override;
ndk::ScopedAStatus getPwleV2PrimitiveDurationMinMillis(int32_t* minDurationMs) override;
ndk::ScopedAStatus getPwleV2CompositionSizeMax(int32_t* maxSize) override;
- ndk::ScopedAStatus composePwleV2(const std::vector<PwleV2Primitive>& composite,
+ ndk::ScopedAStatus composePwleV2(const CompositePwleV2& composite,
const std::shared_ptr<IVibratorCallback>& callback) override;
+ void setGlobalVibrationCallback(const std::shared_ptr<IVibratorCallback>& callback);
+
private:
mutable std::mutex mMutex;
- int32_t mVersion GUARDED_BY(mMutex) = 0; // current Hal version
+ bool mIsVibrating GUARDED_BY(mMutex) = false;
int32_t mCapabilities GUARDED_BY(mMutex) = 0;
+ std::shared_ptr<IVibratorCallback> mVibrationCallback GUARDED_BY(mMutex) = nullptr;
+ std::shared_ptr<IVibratorCallback> mGlobalVibrationCallback GUARDED_BY(mMutex) = nullptr;
+
+ void dispatchVibrate(int32_t timeoutMs, const std::shared_ptr<IVibratorCallback>& callback);
};
} // namespace vibrator
diff --git a/vibrator/aidl/default/include/vibrator-impl/VibratorManager.h b/vibrator/aidl/default/include/vibrator-impl/VibratorManager.h
index 319eb05..fe30394 100644
--- a/vibrator/aidl/default/include/vibrator-impl/VibratorManager.h
+++ b/vibrator/aidl/default/include/vibrator-impl/VibratorManager.h
@@ -17,6 +17,9 @@
#pragma once
#include <aidl/android/hardware/vibrator/BnVibratorManager.h>
+#include <android-base/thread_annotations.h>
+
+#include "vibrator-impl/Vibrator.h"
namespace aidl {
namespace android {
@@ -25,7 +28,8 @@
class VibratorManager : public BnVibratorManager {
public:
- VibratorManager(std::shared_ptr<IVibrator> vibrator) : mDefaultVibrator(std::move(vibrator)){};
+ VibratorManager(std::shared_ptr<Vibrator> vibrator) : mDefaultVibrator(std::move(vibrator)) {};
+
ndk::ScopedAStatus getCapabilities(int32_t* _aidl_return) override;
ndk::ScopedAStatus getVibratorIds(std::vector<int32_t>* _aidl_return) override;
ndk::ScopedAStatus getVibrator(int32_t vibratorId,
@@ -33,9 +37,25 @@
ndk::ScopedAStatus prepareSynced(const std::vector<int32_t>& vibratorIds) override;
ndk::ScopedAStatus triggerSynced(const std::shared_ptr<IVibratorCallback>& callback) override;
ndk::ScopedAStatus cancelSynced() override;
+ ndk::ScopedAStatus startSession(const std::vector<int32_t>& vibratorIds,
+ const VibrationSessionConfig& config,
+ const std::shared_ptr<IVibratorCallback>& callback,
+ std::shared_ptr<IVibrationSession>* _aidl_return) override;
+ ndk::ScopedAStatus clearSessions() override;
+
+ void abortSession();
+ void closeSession(int32_t delayMs);
private:
- std::shared_ptr<IVibrator> mDefaultVibrator;
+ std::shared_ptr<Vibrator> mDefaultVibrator;
+ mutable std::mutex mMutex;
+ int32_t mCapabilities GUARDED_BY(mMutex) = 0;
+ bool mIsPreparing GUARDED_BY(mMutex) = false;
+ bool mIsClosingSession GUARDED_BY(mMutex) = false;
+ std::shared_ptr<IVibrationSession> mSession GUARDED_BY(mMutex) = nullptr;
+ std::shared_ptr<IVibratorCallback> mSessionCallback GUARDED_BY(mMutex) = nullptr;
+
+ void clearSession(const std::shared_ptr<IVibrationSession>& session);
};
} // namespace vibrator
diff --git a/vibrator/aidl/vts/VtsHalVibratorManagerTargetTest.cpp b/vibrator/aidl/vts/VtsHalVibratorManagerTargetTest.cpp
index 3c2a360..101d4f5 100644
--- a/vibrator/aidl/vts/VtsHalVibratorManagerTargetTest.cpp
+++ b/vibrator/aidl/vts/VtsHalVibratorManagerTargetTest.cpp
@@ -16,12 +16,14 @@
#include <aidl/Gtest.h>
#include <aidl/Vintf.h>
#include <aidl/android/hardware/vibrator/BnVibratorCallback.h>
+#include <aidl/android/hardware/vibrator/IVibrationSession.h>
#include <aidl/android/hardware/vibrator/IVibrator.h>
#include <aidl/android/hardware/vibrator/IVibratorManager.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
+#include <algorithm>
#include <cmath>
#include <future>
@@ -32,10 +34,14 @@
using aidl::android::hardware::vibrator::CompositePrimitive;
using aidl::android::hardware::vibrator::Effect;
using aidl::android::hardware::vibrator::EffectStrength;
+using aidl::android::hardware::vibrator::IVibrationSession;
using aidl::android::hardware::vibrator::IVibrator;
using aidl::android::hardware::vibrator::IVibratorManager;
+using aidl::android::hardware::vibrator::VibrationSessionConfig;
using std::chrono::high_resolution_clock;
+using namespace ::std::chrono_literals;
+
const std::vector<Effect> kEffects{ndk::enum_range<Effect>().begin(),
ndk::enum_range<Effect>().end()};
const std::vector<EffectStrength> kEffectStrengths{ndk::enum_range<EffectStrength>().begin(),
@@ -43,6 +49,11 @@
const std::vector<CompositePrimitive> kPrimitives{ndk::enum_range<CompositePrimitive>().begin(),
ndk::enum_range<CompositePrimitive>().end()};
+// Timeout to wait for vibration callback completion.
+static constexpr std::chrono::milliseconds VIBRATION_CALLBACK_TIMEOUT = 100ms;
+
+static constexpr int32_t VIBRATION_SESSIONS_MIN_VERSION = 3;
+
class CompletionCallback : public BnVibratorCallback {
public:
CompletionCallback(const std::function<void()>& callback) : mCallback(callback) {}
@@ -64,9 +75,29 @@
ASSERT_NE(manager, nullptr);
EXPECT_OK(manager->getCapabilities(&capabilities));
EXPECT_OK(manager->getVibratorIds(&vibratorIds));
+ EXPECT_OK(manager->getInterfaceVersion(&version));
+ }
+
+ virtual void TearDown() override {
+ // Reset manager state between tests.
+ if (capabilities & IVibratorManager::CAP_SYNC) {
+ manager->cancelSynced();
+ }
+ if (capabilities & IVibratorManager::CAP_START_SESSIONS) {
+ manager->clearSessions();
+ }
+ // Reset all managed vibrators.
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+ EXPECT_OK(vibrator->off());
+ }
}
std::shared_ptr<IVibratorManager> manager;
+ std::shared_ptr<IVibrationSession> session;
+ int32_t version;
int32_t capabilities;
std::vector<int32_t> vibratorIds;
};
@@ -109,7 +140,7 @@
if (vibratorIds.empty()) return;
if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
if (!(capabilities & IVibratorManager::CAP_PREPARE_ON)) {
- uint32_t durationMs = 250;
+ int32_t durationMs = 250;
EXPECT_OK(manager->prepareSynced(vibratorIds));
std::shared_ptr<IVibrator> vibrator;
for (int32_t id : vibratorIds) {
@@ -170,7 +201,7 @@
std::future<void> completionFuture{completionPromise.get_future()};
auto callback = ndk::SharedRefBase::make<CompletionCallback>(
[&completionPromise] { completionPromise.set_value(); });
- uint32_t durationMs = 250;
+ int32_t durationMs = 250;
std::chrono::milliseconds timeout{durationMs * 2};
EXPECT_OK(manager->prepareSynced(vibratorIds));
@@ -202,6 +233,435 @@
}
}
+TEST_P(VibratorAidl, VibrationSessionsSupported) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (vibratorIds.empty()) return;
+
+ std::promise<void> sessionPromise;
+ std::future<void> sessionFuture{sessionPromise.get_future()};
+ auto sessionCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&sessionPromise] { sessionPromise.set_value(); });
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_OK(manager->startSession(vibratorIds, sessionConfig, sessionCallback, &session));
+ ASSERT_NE(session, nullptr);
+
+ int32_t durationMs = 250;
+ std::vector<std::promise<void>> vibrationPromises;
+ std::vector<std::future<void>> vibrationFutures;
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+
+ std::promise<void>& vibrationPromise = vibrationPromises.emplace_back();
+ vibrationFutures.push_back(vibrationPromise.get_future());
+ auto vibrationCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&vibrationPromise] { vibrationPromise.set_value(); });
+ EXPECT_OK(vibrator->on(durationMs, vibrationCallback));
+ }
+
+ auto timeout = std::chrono::milliseconds(durationMs) + VIBRATION_CALLBACK_TIMEOUT;
+ for (std::future<void>& future : vibrationFutures) {
+ EXPECT_EQ(future.wait_for(timeout), std::future_status::ready);
+ }
+
+ // Session callback not triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::timeout);
+
+ // Ending a session should not take long since the vibration was already completed
+ EXPECT_OK(session->close());
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::ready);
+}
+
+TEST_P(VibratorAidl, VibrationSessionInterrupted) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (vibratorIds.empty()) return;
+
+ std::promise<void> sessionPromise;
+ std::future<void> sessionFuture{sessionPromise.get_future()};
+ auto sessionCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&sessionPromise] { sessionPromise.set_value(); });
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_OK(manager->startSession(vibratorIds, sessionConfig, sessionCallback, &session));
+ ASSERT_NE(session, nullptr);
+
+ std::vector<std::promise<void>> vibrationPromises;
+ std::vector<std::future<void>> vibrationFutures;
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+
+ std::promise<void>& vibrationPromise = vibrationPromises.emplace_back();
+ vibrationFutures.push_back(vibrationPromise.get_future());
+ auto vibrationCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&vibrationPromise] { vibrationPromise.set_value(); });
+
+ // Vibration longer than test timeout.
+ EXPECT_OK(vibrator->on(2000, vibrationCallback));
+ }
+
+ // Session callback not triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::timeout);
+
+ // Interrupt vibrations and session.
+ EXPECT_OK(session->abort());
+
+ // Both callbacks triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::ready);
+ for (std::future<void>& future : vibrationFutures) {
+ EXPECT_EQ(future.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::ready);
+ }
+}
+
+TEST_P(VibratorAidl, VibrationSessionEndingInterrupted) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (vibratorIds.empty()) return;
+
+ std::promise<void> sessionPromise;
+ std::future<void> sessionFuture{sessionPromise.get_future()};
+ auto sessionCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&sessionPromise] { sessionPromise.set_value(); });
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_OK(manager->startSession(vibratorIds, sessionConfig, sessionCallback, &session));
+ ASSERT_NE(session, nullptr);
+
+ std::vector<std::promise<void>> vibrationPromises;
+ std::vector<std::future<void>> vibrationFutures;
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+
+ std::promise<void>& vibrationPromise = vibrationPromises.emplace_back();
+ vibrationFutures.push_back(vibrationPromise.get_future());
+ auto vibrationCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&vibrationPromise] { vibrationPromise.set_value(); });
+
+ // Vibration longer than test timeout.
+ EXPECT_OK(vibrator->on(2000, vibrationCallback));
+ }
+
+ // Session callback not triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::timeout);
+
+ // End session, this might take a while
+ EXPECT_OK(session->close());
+
+ // Interrupt ending session.
+ EXPECT_OK(session->abort());
+
+ // Both callbacks triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::ready);
+ for (std::future<void>& future : vibrationFutures) {
+ EXPECT_EQ(future.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::ready);
+ }
+}
+
+TEST_P(VibratorAidl, VibrationSessionCleared) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (vibratorIds.empty()) return;
+
+ std::promise<void> sessionPromise;
+ std::future<void> sessionFuture{sessionPromise.get_future()};
+ auto sessionCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&sessionPromise] { sessionPromise.set_value(); });
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_OK(manager->startSession(vibratorIds, sessionConfig, sessionCallback, &session));
+ ASSERT_NE(session, nullptr);
+
+ int32_t durationMs = 250;
+ std::vector<std::promise<void>> vibrationPromises;
+ std::vector<std::future<void>> vibrationFutures;
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+
+ std::promise<void>& vibrationPromise = vibrationPromises.emplace_back();
+ vibrationFutures.push_back(vibrationPromise.get_future());
+ auto vibrationCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&vibrationPromise] { vibrationPromise.set_value(); });
+ EXPECT_OK(vibrator->on(durationMs, vibrationCallback));
+ }
+
+ // Session callback not triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::timeout);
+
+ // Clearing sessions should abort ongoing session
+ EXPECT_OK(manager->clearSessions());
+
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::ready);
+ for (std::future<void>& future : vibrationFutures) {
+ EXPECT_EQ(future.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::ready);
+ }
+}
+
+TEST_P(VibratorAidl, VibrationSessionsClearedWithoutSession) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+
+ EXPECT_OK(manager->clearSessions());
+}
+
+TEST_P(VibratorAidl, VibrationSessionsWithSyncedVibrations) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
+ if (!(capabilities & IVibratorManager::CAP_PREPARE_ON)) return;
+ if (!(capabilities & IVibratorManager::CAP_TRIGGER_CALLBACK)) return;
+ if (vibratorIds.empty()) return;
+
+ std::promise<void> sessionPromise;
+ std::future<void> sessionFuture{sessionPromise.get_future()};
+ auto sessionCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&sessionPromise] { sessionPromise.set_value(); });
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_OK(manager->startSession(vibratorIds, sessionConfig, sessionCallback, &session));
+ ASSERT_NE(session, nullptr);
+
+ EXPECT_OK(manager->prepareSynced(vibratorIds));
+
+ int32_t durationMs = 250;
+ std::vector<std::promise<void>> vibrationPromises;
+ std::vector<std::future<void>> vibrationFutures;
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+
+ std::promise<void>& vibrationPromise = vibrationPromises.emplace_back();
+ vibrationFutures.push_back(vibrationPromise.get_future());
+ auto vibrationCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&vibrationPromise] { vibrationPromise.set_value(); });
+ EXPECT_OK(vibrator->on(durationMs, vibrationCallback));
+ }
+
+ std::promise<void> triggerPromise;
+ std::future<void> triggerFuture{triggerPromise.get_future()};
+ auto triggerCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&triggerPromise] { triggerPromise.set_value(); });
+
+ EXPECT_OK(manager->triggerSynced(triggerCallback));
+
+ auto timeout = std::chrono::milliseconds(durationMs) + VIBRATION_CALLBACK_TIMEOUT;
+ EXPECT_EQ(triggerFuture.wait_for(timeout), std::future_status::ready);
+ for (std::future<void>& future : vibrationFutures) {
+ EXPECT_EQ(future.wait_for(timeout), std::future_status::ready);
+ }
+
+ // Session callback not triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::timeout);
+
+ // Ending a session should not take long since the vibration was already completed
+ EXPECT_OK(session->close());
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::ready);
+}
+
+TEST_P(VibratorAidl, VibrationSessionWithMultipleIndependentVibrations) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (vibratorIds.empty()) return;
+
+ std::promise<void> sessionPromise;
+ std::future<void> sessionFuture{sessionPromise.get_future()};
+ auto sessionCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&sessionPromise] { sessionPromise.set_value(); });
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_OK(manager->startSession(vibratorIds, sessionConfig, sessionCallback, &session));
+ ASSERT_NE(session, nullptr);
+
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+
+ EXPECT_OK(vibrator->on(100, nullptr));
+ EXPECT_OK(vibrator->on(200, nullptr));
+ EXPECT_OK(vibrator->on(300, nullptr));
+ }
+
+ // Session callback not triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::timeout);
+
+ EXPECT_OK(session->close());
+
+ int32_t maxDurationMs = 100 + 200 + 300;
+ auto timeout = std::chrono::milliseconds(maxDurationMs) + VIBRATION_CALLBACK_TIMEOUT;
+ EXPECT_EQ(sessionFuture.wait_for(timeout), std::future_status::ready);
+}
+
+TEST_P(VibratorAidl, VibrationSessionsIgnoresSecondSessionWhenFirstIsOngoing) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (vibratorIds.empty()) return;
+
+ std::promise<void> sessionPromise;
+ std::future<void> sessionFuture{sessionPromise.get_future()};
+ auto sessionCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&sessionPromise] { sessionPromise.set_value(); });
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_OK(manager->startSession(vibratorIds, sessionConfig, sessionCallback, &session));
+ ASSERT_NE(session, nullptr);
+
+ std::shared_ptr<IVibrationSession> secondSession;
+ EXPECT_ILLEGAL_STATE(
+ manager->startSession(vibratorIds, sessionConfig, nullptr, &secondSession));
+ EXPECT_EQ(secondSession, nullptr);
+
+ // First session was not cancelled.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::timeout);
+
+ // First session still ongoing, we can still vibrate.
+ int32_t durationMs = 100;
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+ EXPECT_OK(vibrator->on(durationMs, nullptr));
+ }
+
+ EXPECT_OK(session->close());
+
+ auto timeout = std::chrono::milliseconds(durationMs) + VIBRATION_CALLBACK_TIMEOUT;
+ EXPECT_EQ(sessionFuture.wait_for(timeout), std::future_status::ready);
+}
+
+TEST_P(VibratorAidl, VibrationSessionEndMultipleTimes) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (vibratorIds.empty()) return;
+
+ std::promise<void> sessionPromise;
+ std::future<void> sessionFuture{sessionPromise.get_future()};
+ auto sessionCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&sessionPromise] { sessionPromise.set_value(); });
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_OK(manager->startSession(vibratorIds, sessionConfig, sessionCallback, &session));
+ ASSERT_NE(session, nullptr);
+
+ int32_t durationMs = 250;
+ std::vector<std::promise<void>> vibrationPromises;
+ std::vector<std::future<void>> vibrationFutures;
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+
+ std::promise<void>& vibrationPromise = vibrationPromises.emplace_back();
+ vibrationFutures.push_back(vibrationPromise.get_future());
+ auto vibrationCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&vibrationPromise] { vibrationPromise.set_value(); });
+ EXPECT_OK(vibrator->on(durationMs, vibrationCallback));
+ }
+
+ // Session callback not triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::timeout);
+
+ // End session, this might take a while
+ EXPECT_OK(session->close());
+
+ // End session again
+ EXPECT_OK(session->close());
+
+ // Both callbacks triggered within timeout.
+ auto timeout = std::chrono::milliseconds(durationMs) + VIBRATION_CALLBACK_TIMEOUT;
+ EXPECT_EQ(sessionFuture.wait_for(timeout), std::future_status::ready);
+ for (std::future<void>& future : vibrationFutures) {
+ EXPECT_EQ(future.wait_for(timeout), std::future_status::ready);
+ }
+}
+
+TEST_P(VibratorAidl, VibrationSessionDeletedAfterEnded) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (vibratorIds.empty()) return;
+
+ std::promise<void> sessionPromise;
+ std::future<void> sessionFuture{sessionPromise.get_future()};
+ auto sessionCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&sessionPromise] { sessionPromise.set_value(); });
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_OK(manager->startSession(vibratorIds, sessionConfig, sessionCallback, &session));
+ ASSERT_NE(session, nullptr);
+
+ int32_t durationMs = 250;
+ std::vector<std::promise<void>> vibrationPromises;
+ std::vector<std::future<void>> vibrationFutures;
+ for (int32_t id : vibratorIds) {
+ std::shared_ptr<IVibrator> vibrator;
+ EXPECT_OK(manager->getVibrator(id, &vibrator));
+ ASSERT_NE(vibrator, nullptr);
+
+ std::promise<void>& vibrationPromise = vibrationPromises.emplace_back();
+ vibrationFutures.push_back(vibrationPromise.get_future());
+ auto vibrationCallback = ndk::SharedRefBase::make<CompletionCallback>(
+ [&vibrationPromise] { vibrationPromise.set_value(); });
+ EXPECT_OK(vibrator->on(durationMs, vibrationCallback));
+ }
+
+ // Session callback not triggered.
+ EXPECT_EQ(sessionFuture.wait_for(VIBRATION_CALLBACK_TIMEOUT), std::future_status::timeout);
+
+ // End session, this might take a while
+ EXPECT_OK(session->close());
+
+ session.reset();
+
+ // Both callbacks triggered within timeout, even after session was deleted.
+ auto timeout = std::chrono::milliseconds(durationMs) + VIBRATION_CALLBACK_TIMEOUT;
+ EXPECT_EQ(sessionFuture.wait_for(timeout), std::future_status::ready);
+ for (std::future<void>& future : vibrationFutures) {
+ EXPECT_EQ(future.wait_for(timeout), std::future_status::ready);
+ }
+}
+
+TEST_P(VibratorAidl, VibrationSessionWrongVibratorIdsFail) {
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+
+ auto maxIdIt = std::max_element(vibratorIds.begin(), vibratorIds.end());
+ int32_t wrongId = maxIdIt == vibratorIds.end() ? 0 : *maxIdIt + 1;
+
+ std::vector<int32_t> emptyIds;
+ std::vector<int32_t> wrongIds{wrongId};
+ VibrationSessionConfig sessionConfig;
+ EXPECT_ILLEGAL_ARGUMENT(manager->startSession(emptyIds, sessionConfig, nullptr, &session));
+ EXPECT_ILLEGAL_ARGUMENT(manager->startSession(wrongIds, sessionConfig, nullptr, &session));
+ EXPECT_EQ(session, nullptr);
+}
+
+TEST_P(VibratorAidl, VibrationSessionDuringPrepareSyncedFails) {
+ if (!(capabilities & IVibratorManager::CAP_SYNC)) return;
+ if (!(capabilities & IVibratorManager::CAP_START_SESSIONS)) return;
+ if (vibratorIds.empty()) return;
+
+ EXPECT_OK(manager->prepareSynced(vibratorIds));
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_ILLEGAL_STATE(manager->startSession(vibratorIds, sessionConfig, nullptr, &session));
+ EXPECT_EQ(session, nullptr);
+
+ EXPECT_OK(manager->cancelSynced());
+}
+
+TEST_P(VibratorAidl, VibrationSessionsUnsupported) {
+ if (version < VIBRATION_SESSIONS_MIN_VERSION) {
+ EXPECT_EQ(capabilities & IVibratorManager::CAP_START_SESSIONS, 0)
+ << "Vibrator manager version " << version
+ << " should not report start session capability";
+ }
+ if (capabilities & IVibratorManager::CAP_START_SESSIONS) return;
+
+ VibrationSessionConfig sessionConfig;
+ EXPECT_UNKNOWN_OR_UNSUPPORTED(
+ manager->startSession(vibratorIds, sessionConfig, nullptr, &session));
+ EXPECT_EQ(session, nullptr);
+ EXPECT_UNKNOWN_OR_UNSUPPORTED(manager->clearSessions());
+}
+
std::vector<std::string> FindVibratorManagerNames() {
std::vector<std::string> names;
constexpr auto callback = [](const char* instance, void* context) {
@@ -219,7 +679,7 @@
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
- ABinderProcess_setThreadPoolMaxThreadCount(1);
+ ABinderProcess_setThreadPoolMaxThreadCount(2);
ABinderProcess_startThreadPool();
return RUN_ALL_TESTS();
}
diff --git a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp
index bc017ae..03ecb1a 100644
--- a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp
+++ b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp
@@ -41,12 +41,13 @@
using aidl::android::hardware::vibrator::BrakingPwle;
using aidl::android::hardware::vibrator::CompositeEffect;
using aidl::android::hardware::vibrator::CompositePrimitive;
+using aidl::android::hardware::vibrator::CompositePwleV2;
using aidl::android::hardware::vibrator::Effect;
using aidl::android::hardware::vibrator::EffectStrength;
+using aidl::android::hardware::vibrator::FrequencyAccelerationMapEntry;
using aidl::android::hardware::vibrator::IVibrator;
using aidl::android::hardware::vibrator::IVibratorManager;
using aidl::android::hardware::vibrator::PrimitivePwle;
-using aidl::android::hardware::vibrator::PwleV2OutputMapEntry;
using aidl::android::hardware::vibrator::PwleV2Primitive;
using aidl::android::hardware::vibrator::VendorEffect;
using aidl::android::os::PersistableBundle;
@@ -175,11 +176,23 @@
return resonantFrequencyHz;
}
+static bool shouldValidateLegacyFrequencyControlResult(int32_t capabilities, int32_t version,
+ ndk::ScopedAStatus& status) {
+ bool hasFrequencyControl = capabilities & IVibrator::CAP_FREQUENCY_CONTROL;
+ // Legacy frequency control APIs deprecated with PWLE V2 feature.
+ bool isDeprecated = version >= PWLE_V2_MIN_VERSION;
+ bool isUnknownOrUnsupported = status.getExceptionCode() == EX_UNSUPPORTED_OPERATION ||
+ status.getStatus() == STATUS_UNKNOWN_TRANSACTION;
+
+ // Validate if older HAL or if result is provided, even after deprecation.
+ return hasFrequencyControl && (!isDeprecated || !isUnknownOrUnsupported);
+}
+
static float getFrequencyResolutionHz(const std::shared_ptr<IVibrator>& vibrator,
- int32_t capabilities) {
- float freqResolutionHz;
+ int32_t capabilities, int32_t version) {
+ float freqResolutionHz = -1;
ndk::ScopedAStatus status = vibrator->getFrequencyResolution(&freqResolutionHz);
- if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
+ if (shouldValidateLegacyFrequencyControlResult(capabilities, version, status)) {
EXPECT_OK(std::move(status));
EXPECT_GT(freqResolutionHz, 0);
} else {
@@ -188,11 +201,11 @@
return freqResolutionHz;
}
-static float getFrequencyMinimumHz(const std::shared_ptr<IVibrator>& vibrator,
- int32_t capabilities) {
+static float getFrequencyMinimumHz(const std::shared_ptr<IVibrator>& vibrator, int32_t capabilities,
+ int32_t version) {
float freqMinimumHz;
ndk::ScopedAStatus status = vibrator->getFrequencyMinimum(&freqMinimumHz);
- if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
+ if (shouldValidateLegacyFrequencyControlResult(capabilities, version, status)) {
EXPECT_OK(std::move(status));
float resonantFrequencyHz = getResonantFrequencyHz(vibrator, capabilities);
@@ -205,19 +218,19 @@
return freqMinimumHz;
}
-static float getFrequencyMaximumHz(const std::shared_ptr<IVibrator>& vibrator,
- int32_t capabilities) {
+static float getFrequencyMaximumHz(const std::shared_ptr<IVibrator>& vibrator, int32_t capabilities,
+ int32_t version) {
std::vector<float> bandwidthAmplitudeMap;
ndk::ScopedAStatus status = vibrator->getBandwidthAmplitudeMap(&bandwidthAmplitudeMap);
- if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
+ if (shouldValidateLegacyFrequencyControlResult(capabilities, version, status)) {
EXPECT_OK(std::move(status));
} else {
EXPECT_UNKNOWN_OR_UNSUPPORTED(std::move(status));
}
float freqMaximumHz = ((bandwidthAmplitudeMap.size() - 1) *
- getFrequencyResolutionHz(vibrator, capabilities)) +
- getFrequencyMinimumHz(vibrator, capabilities);
+ getFrequencyResolutionHz(vibrator, capabilities, version)) +
+ getFrequencyMinimumHz(vibrator, capabilities, version);
return freqMaximumHz;
}
@@ -230,12 +243,16 @@
}
static ActivePwle composeValidActivePwle(const std::shared_ptr<IVibrator>& vibrator,
- int32_t capabilities) {
+ int32_t capabilities, int32_t version) {
float frequencyHz;
if (capabilities & IVibrator::CAP_GET_RESONANT_FREQUENCY) {
frequencyHz = getResonantFrequencyHz(vibrator, capabilities);
} else if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
- frequencyHz = getFrequencyMinimumHz(vibrator, capabilities);
+ if (version < PWLE_V2_MIN_VERSION) {
+ frequencyHz = getFrequencyMinimumHz(vibrator, capabilities, version);
+ } else {
+ frequencyHz = pwle_v2_utils::getPwleV2FrequencyMinHz(vibrator);
+ }
} else {
frequencyHz = 150.0; // default value commonly used
}
@@ -846,23 +863,24 @@
}
TEST_P(VibratorAidl, GetFrequencyResolution) {
- getFrequencyResolutionHz(vibrator, capabilities);
+ getFrequencyResolutionHz(vibrator, capabilities, version);
}
TEST_P(VibratorAidl, GetFrequencyMinimum) {
- getFrequencyMinimumHz(vibrator, capabilities);
+ getFrequencyMinimumHz(vibrator, capabilities, version);
}
TEST_P(VibratorAidl, GetBandwidthAmplitudeMap) {
std::vector<float> bandwidthAmplitudeMap;
ndk::ScopedAStatus status = vibrator->getBandwidthAmplitudeMap(&bandwidthAmplitudeMap);
- if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
+
+ if (shouldValidateLegacyFrequencyControlResult(capabilities, version, status)) {
EXPECT_OK(std::move(status));
ASSERT_FALSE(bandwidthAmplitudeMap.empty());
int minMapSize = (getResonantFrequencyHz(vibrator, capabilities) -
- getFrequencyMinimumHz(vibrator, capabilities)) /
- getFrequencyResolutionHz(vibrator, capabilities);
+ getFrequencyMinimumHz(vibrator, capabilities, version)) /
+ getFrequencyResolutionHz(vibrator, capabilities, version);
ASSERT_GT(bandwidthAmplitudeMap.size(), minMapSize);
for (float e : bandwidthAmplitudeMap) {
@@ -911,7 +929,7 @@
TEST_P(VibratorAidl, ComposeValidPwle) {
if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
- ActivePwle firstActive = composeValidActivePwle(vibrator, capabilities);
+ ActivePwle firstActive = composeValidActivePwle(vibrator, capabilities, version);
std::vector<Braking> supported;
EXPECT_OK(vibrator->getSupportedBraking(&supported));
@@ -921,13 +939,17 @@
firstBraking.braking = isClabSupported ? Braking::CLAB : Braking::NONE;
firstBraking.duration = 100;
- ActivePwle secondActive = composeValidActivePwle(vibrator, capabilities);
+ ActivePwle secondActive = composeValidActivePwle(vibrator, capabilities, version);
if (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) {
- float minFrequencyHz = getFrequencyMinimumHz(vibrator, capabilities);
- float maxFrequencyHz = getFrequencyMaximumHz(vibrator, capabilities);
- float freqResolutionHz = getFrequencyResolutionHz(vibrator, capabilities);
- secondActive.startFrequency = minFrequencyHz + (freqResolutionHz / 2.0f);
- secondActive.endFrequency = maxFrequencyHz - (freqResolutionHz / 3.0f);
+ float minFrequencyHz = getFrequencyMinimumHz(vibrator, capabilities, version);
+ float maxFrequencyHz = getFrequencyMaximumHz(vibrator, capabilities, version);
+ float freqResolutionHz = getFrequencyResolutionHz(vibrator, capabilities, version);
+ // As of API 16 these APIs are deprecated and no longer required to be implemented
+ // with frequency control capability.
+ if (minFrequencyHz >= 0 && maxFrequencyHz >= 0 && freqResolutionHz >= 0) {
+ secondActive.startFrequency = minFrequencyHz + (freqResolutionHz / 2.0f);
+ secondActive.endFrequency = maxFrequencyHz - (freqResolutionHz / 3.0f);
+ }
}
BrakingPwle secondBraking;
secondBraking.braking = Braking::NONE;
@@ -955,7 +977,7 @@
uint32_t durationMs = segmentDurationMaxMs * 2 + 100; // Sum of 2 active and 1 braking below
auto timeout = std::chrono::milliseconds(durationMs) + VIBRATION_CALLBACK_TIMEOUT;
- ActivePwle active = composeValidActivePwle(vibrator, capabilities);
+ ActivePwle active = composeValidActivePwle(vibrator, capabilities, version);
std::vector<Braking> supported;
EXPECT_OK(vibrator->getSupportedBraking(&supported));
@@ -978,7 +1000,7 @@
// test empty queue
EXPECT_ILLEGAL_ARGUMENT(vibrator->composePwle(pwleQueue, nullptr));
- ActivePwle active = composeValidActivePwle(vibrator, capabilities);
+ ActivePwle active = composeValidActivePwle(vibrator, capabilities, version);
PrimitivePwle pwle;
pwle = active;
@@ -996,7 +1018,7 @@
TEST_P(VibratorAidl, ComposePwleAmplitudeParameterBoundary) {
if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
- ActivePwle active = composeValidActivePwle(vibrator, capabilities);
+ ActivePwle active = composeValidActivePwle(vibrator, capabilities, version);
active.startAmplitude = getAmplitudeMax() + 1.0; // Amplitude greater than allowed
active.endAmplitude = getAmplitudeMax() + 1.0; // Amplitude greater than allowed
@@ -1016,11 +1038,18 @@
TEST_P(VibratorAidl, ComposePwleFrequencyParameterBoundary) {
if ((capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) &&
(capabilities & IVibrator::CAP_FREQUENCY_CONTROL)) {
- float freqMinimumHz = getFrequencyMinimumHz(vibrator, capabilities);
- float freqMaximumHz = getFrequencyMaximumHz(vibrator, capabilities);
- float freqResolutionHz = getFrequencyResolutionHz(vibrator, capabilities);
+ float freqMinimumHz = getFrequencyMinimumHz(vibrator, capabilities, version);
+ float freqMaximumHz = getFrequencyMaximumHz(vibrator, capabilities, version);
+ float freqResolutionHz = getFrequencyResolutionHz(vibrator, capabilities, version);
- ActivePwle active = composeValidActivePwle(vibrator, capabilities);
+ // As of API 16 these APIs are deprecated and no longer required to be implemented with
+ // frequency control capability.
+ if (freqMinimumHz < 0 || freqMaximumHz < 0 || freqResolutionHz < 0) {
+ GTEST_SKIP() << "PWLE V1 is not supported, skipping test";
+ return;
+ }
+
+ ActivePwle active = composeValidActivePwle(vibrator, capabilities, version);
active.startFrequency =
freqMaximumHz + freqResolutionHz; // Frequency greater than allowed
active.endFrequency = freqMaximumHz + freqResolutionHz; // Frequency greater than allowed
@@ -1040,7 +1069,7 @@
TEST_P(VibratorAidl, ComposePwleSegmentDurationBoundary) {
if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS) {
- ActivePwle active = composeValidActivePwle(vibrator, capabilities);
+ ActivePwle active = composeValidActivePwle(vibrator, capabilities, version);
int32_t segmentDurationMaxMs;
vibrator->getPwlePrimitiveDurationMax(&segmentDurationMaxMs);
@@ -1052,15 +1081,15 @@
}
}
-TEST_P(VibratorAidl, PwleV2FrequencyToOutputAccelerationMapHasValidFrequencyRange) {
- if (!(capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2)) {
- GTEST_SKIP() << "PWLE V2 not supported, skipping test";
+TEST_P(VibratorAidl, FrequencyToOutputAccelerationMapHasValidFrequencyRange) {
+ if (version < PWLE_V2_MIN_VERSION || !(capabilities & IVibrator::CAP_FREQUENCY_CONTROL)) {
+ GTEST_SKIP() << "Frequency control is not supported, skipping test";
return;
}
- std::vector<PwleV2OutputMapEntry> frequencyToOutputAccelerationMap;
+ std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap;
ndk::ScopedAStatus status =
- vibrator->getPwleV2FrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap);
+ vibrator->getFrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap);
EXPECT_OK(std::move(status));
ASSERT_FALSE(frequencyToOutputAccelerationMap.empty());
auto sharpnessRange =
@@ -1072,6 +1101,15 @@
ASSERT_TRUE(sharpnessRange.first < sharpnessRange.second);
}
+TEST_P(VibratorAidl, FrequencyToOutputAccelerationMapUnsupported) {
+ if ((capabilities & IVibrator::CAP_FREQUENCY_CONTROL)) return;
+
+ std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap;
+
+ EXPECT_UNKNOWN_OR_UNSUPPORTED(
+ vibrator->getFrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap));
+}
+
TEST_P(VibratorAidl, GetPwleV2PrimitiveDurationMaxMillis) {
if (!(capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2)) {
GTEST_SKIP() << "PWLE V2 not supported, skipping test";
@@ -1111,6 +1149,17 @@
ASSERT_LE(durationMs, pwle_v2_utils::COMPOSE_PWLE_V2_MAX_ALLOWED_PRIMITIVE_MIN_DURATION_MS);
}
+TEST_P(VibratorAidl, ValidatePwleV2DependencyOnFrequencyControl) {
+ if (!(capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2)) {
+ GTEST_SKIP() << "PWLE V2 not supported, skipping test";
+ return;
+ }
+
+ // Check if frequency control is supported
+ bool hasFrequencyControl = (capabilities & IVibrator::CAP_FREQUENCY_CONTROL) != 0;
+ ASSERT_TRUE(hasFrequencyControl) << "Frequency control MUST be supported when PWLE V2 is.";
+}
+
TEST_P(VibratorAidl, ComposeValidPwleV2Effect) {
if (!(capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2)) {
GTEST_SKIP() << "PWLE V2 not supported, skipping test";
@@ -1126,12 +1175,13 @@
EXPECT_EQ(capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2, 0)
<< "Vibrator version " << version << " should not report PWLE V2 capability.";
}
- if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2) return;
+ if ((capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2)) return;
- std::vector<PwleV2Primitive> pwleEffect{
- PwleV2Primitive(/*amplitude=*/1.0f, /*frequencyHz=*/100.0f, /*timeMillis=*/50)};
+ CompositePwleV2 composite;
+ composite.pwlePrimitives.emplace_back(/*amplitude=*/1.0f, /*frequencyHz=*/100.0f,
+ /*timeMillis=*/50);
- EXPECT_UNKNOWN_OR_UNSUPPORTED(vibrator->composePwleV2(pwleEffect, nullptr));
+ EXPECT_UNKNOWN_OR_UNSUPPORTED(vibrator->composePwleV2(composite, nullptr));
}
TEST_P(VibratorAidl, ComposeValidPwleV2EffectWithCallback) {
@@ -1150,8 +1200,10 @@
auto timeout = std::chrono::milliseconds(minDuration) + VIBRATION_CALLBACK_TIMEOUT;
float minFrequency = pwle_v2_utils::getPwleV2FrequencyMinHz(vibrator);
- EXPECT_OK(vibrator->composePwleV2(
- {PwleV2Primitive(/*amplitude=*/0.5, minFrequency, minDuration)}, callback));
+ CompositePwleV2 composite;
+ composite.pwlePrimitives.emplace_back(/*amplitude=*/0.5, minFrequency, minDuration);
+
+ EXPECT_OK(vibrator->composePwleV2(composite, callback));
EXPECT_EQ(completionFuture.wait_for(timeout), std::future_status::ready);
EXPECT_OK(vibrator->off());
}
@@ -1177,43 +1229,48 @@
EXPECT_OK(vibrator->getPwleV2PrimitiveDurationMinMillis(&minDurationMs));
EXPECT_OK(vibrator->getPwleV2PrimitiveDurationMaxMillis(&maxDurationMs));
- std::vector<PwleV2Primitive> composePwle;
+ CompositePwleV2 composePwle;
// Negative amplitude
- composePwle.push_back(PwleV2Primitive(/*amplitude=*/-0.8f, /*frequency=*/100, minDurationMs));
+ composePwle.pwlePrimitives.push_back(
+ PwleV2Primitive(/*amplitude=*/-0.8f, /*frequency=*/100, minDurationMs));
EXPECT_ILLEGAL_ARGUMENT(vibrator->composePwleV2(composePwle, nullptr))
<< "Composing PWLE V2 effect with negative amplitude should fail";
- composePwle.clear();
+ composePwle.pwlePrimitives.clear();
// Amplitude exceeding 1.0
- composePwle.push_back(PwleV2Primitive(/*amplitude=*/1.2f, /*frequency=*/100, minDurationMs));
+ composePwle.pwlePrimitives.push_back(
+ PwleV2Primitive(/*amplitude=*/1.2f, /*frequency=*/100, minDurationMs));
EXPECT_ILLEGAL_ARGUMENT(vibrator->composePwleV2(composePwle, nullptr))
<< "Composing PWLE V2 effect with amplitude greater than 1.0 should fail";
- composePwle.clear();
+ composePwle.pwlePrimitives.clear();
// Duration exceeding maximum
- composePwle.push_back(
+ composePwle.pwlePrimitives.push_back(
PwleV2Primitive(/*amplitude=*/0.2f, /*frequency=*/100, maxDurationMs + 10));
EXPECT_ILLEGAL_ARGUMENT(vibrator->composePwleV2(composePwle, nullptr))
<< "Composing PWLE V2 effect with duration exceeding maximum should fail";
- composePwle.clear();
+ composePwle.pwlePrimitives.clear();
// Negative duration
- composePwle.push_back(PwleV2Primitive(/*amplitude=*/0.2f, /*frequency=*/100, /*time=*/-1));
+ composePwle.pwlePrimitives.push_back(
+ PwleV2Primitive(/*amplitude=*/0.2f, /*frequency=*/100, /*time=*/-1));
EXPECT_ILLEGAL_ARGUMENT(vibrator->composePwleV2(composePwle, nullptr))
<< "Composing PWLE V2 effect with negative duration should fail";
- composePwle.clear();
+ composePwle.pwlePrimitives.clear();
// Frequency below minimum
float minFrequency = pwle_v2_utils::getPwleV2FrequencyMinHz(vibrator);
- composePwle.push_back(PwleV2Primitive(/*amplitude=*/0.2f, minFrequency - 1, minDurationMs));
+ composePwle.pwlePrimitives.push_back(
+ PwleV2Primitive(/*amplitude=*/0.2f, minFrequency - 1, minDurationMs));
EXPECT_ILLEGAL_ARGUMENT(vibrator->composePwleV2(composePwle, nullptr))
<< "Composing PWLE V2 effect with frequency below minimum should fail";
- composePwle.clear();
+ composePwle.pwlePrimitives.clear();
// Frequency above maximum
float maxFrequency = pwle_v2_utils::getPwleV2FrequencyMaxHz(vibrator);
- composePwle.push_back(PwleV2Primitive(/*amplitude=*/0.2f, maxFrequency + 1, minDurationMs));
+ composePwle.pwlePrimitives.push_back(
+ PwleV2Primitive(/*amplitude=*/0.2f, maxFrequency + 1, minDurationMs));
EXPECT_ILLEGAL_ARGUMENT(vibrator->composePwleV2(composePwle, nullptr))
<< "Composing PWLE V2 effect with frequency above maximum should fail";
}
diff --git a/vibrator/aidl/vts/pwle_v2_utils.h b/vibrator/aidl/vts/pwle_v2_utils.h
index 2163908..eaa024c 100644
--- a/vibrator/aidl/vts/pwle_v2_utils.h
+++ b/vibrator/aidl/vts/pwle_v2_utils.h
@@ -20,8 +20,8 @@
#include <aidl/android/hardware/vibrator/IVibrator.h>
#include "test_utils.h"
+using aidl::android::hardware::vibrator::FrequencyAccelerationMapEntry;
using aidl::android::hardware::vibrator::IVibrator;
-using aidl::android::hardware::vibrator::PwleV2OutputMapEntry;
using aidl::android::hardware::vibrator::PwleV2Primitive;
namespace aidl {
@@ -116,9 +116,8 @@
}
static float getPwleV2FrequencyMinHz(const std::shared_ptr<IVibrator>& vibrator) {
- std::vector<PwleV2OutputMapEntry> frequencyToOutputAccelerationMap;
- EXPECT_OK(
- vibrator->getPwleV2FrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap));
+ std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap;
+ EXPECT_OK(vibrator->getFrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap));
EXPECT_TRUE(!frequencyToOutputAccelerationMap.empty());
// We can't use ASSERT_TRUE() above because this is a non-void function,
// but we need to return to assure we don't crash from a null dereference.
@@ -134,9 +133,8 @@
}
static float getPwleV2FrequencyMaxHz(const std::shared_ptr<IVibrator>& vibrator) {
- std::vector<PwleV2OutputMapEntry> frequencyToOutputAccelerationMap;
- EXPECT_OK(
- vibrator->getPwleV2FrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap));
+ std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap;
+ EXPECT_OK(vibrator->getFrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap));
EXPECT_TRUE(!frequencyToOutputAccelerationMap.empty());
// We can't use ASSERT_TRUE() above because this is a non-void function,
// but we need to return to assure we don't crash from a null dereference.
@@ -151,8 +149,7 @@
return entry->frequencyHz;
}
-static std::vector<PwleV2Primitive> composeValidPwleV2Effect(
- const std::shared_ptr<IVibrator>& vibrator) {
+static CompositePwleV2 composeValidPwleV2Effect(const std::shared_ptr<IVibrator>& vibrator) {
int32_t minDurationMs;
EXPECT_OK(vibrator->getPwleV2PrimitiveDurationMinMillis(&minDurationMs));
int32_t maxDurationMs;
@@ -162,20 +159,20 @@
int32_t maxCompositionSize;
EXPECT_OK(vibrator->getPwleV2CompositionSizeMax(&maxCompositionSize));
- std::vector<PwleV2Primitive> pwleEffect;
+ CompositePwleV2 composite;
- pwleEffect.emplace_back(0.1f, minFrequency, minDurationMs);
- pwleEffect.emplace_back(0.5f, maxFrequency, maxDurationMs);
+ composite.pwlePrimitives.emplace_back(0.1f, minFrequency, minDurationMs);
+ composite.pwlePrimitives.emplace_back(0.5f, maxFrequency, maxDurationMs);
float variedFrequency = (minFrequency + maxFrequency) / 2.0f;
for (int i = 0; i < maxCompositionSize - 2; i++) {
- pwleEffect.emplace_back(0.7f, variedFrequency, minDurationMs);
+ composite.pwlePrimitives.emplace_back(0.7f, variedFrequency, minDurationMs);
}
- return pwleEffect;
+ return composite;
}
-static std::vector<PwleV2Primitive> composePwleV2EffectWithTooManyPoints(
+static CompositePwleV2 composePwleV2EffectWithTooManyPoints(
const std::shared_ptr<IVibrator>& vibrator) {
int32_t minDurationMs, maxCompositionSize;
EXPECT_OK(vibrator->getPwleV2PrimitiveDurationMinMillis(&minDurationMs));
@@ -187,12 +184,15 @@
std::fill(pwleEffect.begin(), pwleEffect.end(),
PwleV2Primitive(/*amplitude=*/0.2f, maxFrequency, minDurationMs));
- return pwleEffect;
+ CompositePwleV2 composite;
+ composite.pwlePrimitives = pwleEffect;
+
+ return composite;
}
static std::pair<float, float> getPwleV2SharpnessRange(
const std::shared_ptr<IVibrator>& vibrator,
- std::vector<PwleV2OutputMapEntry> freqToOutputAccelerationMap) {
+ std::vector<FrequencyAccelerationMapEntry> freqToOutputAccelerationMap) {
std::pair<float, float> sharpnessRange = {-1, -1};
// Sort the entries by frequency in ascending order
diff --git a/vibrator/aidl/vts/test_utils.h b/vibrator/aidl/vts/test_utils.h
index aaf3211..e884bbd 100644
--- a/vibrator/aidl/vts/test_utils.h
+++ b/vibrator/aidl/vts/test_utils.h
@@ -57,4 +57,17 @@
#error Macro EXPECT_ILLEGAL_ARGUMENT already defined unexpectedly
#endif
+#if !defined(EXPECT_ILLEGAL_STATE)
+#define EXPECT_ILLEGAL_STATE(expression) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (const ::ndk::ScopedAStatus&& _status = (expression); \
+ _status.getExceptionCode() == EX_ILLEGAL_STATE) \
+ ; \
+ else \
+ ADD_FAILURE() << "Expected EX_ILLEGAL_STATE for: " << #expression \
+ << "\n Actual: " << _status
+#else
+#error Macro EXPECT_ILLEGAL_STATE already defined unexpectedly
+#endif
+
#endif // VIBRATOR_HAL_TEST_UTILS_H
diff --git a/wifi/aidl/Android.bp b/wifi/aidl/Android.bp
index 392d2e9..4b7e372 100644
--- a/wifi/aidl/Android.bp
+++ b/wifi/aidl/Android.bp
@@ -29,7 +29,7 @@
"android/hardware/wifi/*.aidl",
],
imports: [
- "android.hardware.wifi.common-V1",
+ "android.hardware.wifi.common-V2",
],
stability: "vintf",
backend: {
@@ -64,5 +64,5 @@
},
],
- frozen: true,
+ frozen: false,
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/Akm.aidl
similarity index 79%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/Akm.aidl
index a5eda52..5baf2e8 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/Akm.aidl
@@ -31,9 +31,16 @@
// 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.vibrator;
+package android.hardware.wifi;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable Akm {
+ const long NONE = 0;
+ const long PASN = (1 << 0) /* 1 */;
+ const long SAE = (1 << 1) /* 2 */;
+ const long FT_EAP_SHA256 = (1 << 2) /* 4 */;
+ const long FT_PSK_SHA256 = (1 << 3) /* 8 */;
+ const long FT_EAP_SHA384 = (1 << 4) /* 16 */;
+ const long FT_PSK_SHA384 = (1 << 5) /* 32 */;
+ const long FILS_EAP_SHA256 = (1 << 6) /* 64 */;
+ const long FILS_EAP_SHA384 = (1 << 7) /* 128 */;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/ApIfaceParams.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/ApIfaceParams.aidl
index a5eda52..50e1bbb 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/ApIfaceParams.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
+package android.hardware.wifi;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable ApIfaceParams {
+ android.hardware.wifi.IfaceConcurrencyType ifaceType;
+ boolean usesMlo;
+ @nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/CipherSuite.aidl
similarity index 86%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/CipherSuite.aidl
index a5eda52..32fb5ba 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/CipherSuite.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
+package android.hardware.wifi;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable CipherSuite {
+ const long NONE = 0;
+ const long CCMP_128 = (1 << 0) /* 1 */;
+ const long CCMP_256 = (1 << 1) /* 2 */;
+ const long GCMP_128 = (1 << 2) /* 4 */;
+ const long GCMP_256 = (1 << 3) /* 8 */;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiApIface.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiApIface.aidl
index e71dde4..af95bee 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiApIface.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiApIface.aidl
@@ -40,4 +40,5 @@
void setCountryCode(in byte[2] code);
void resetToFactoryMacAddress();
void setMacAddress(in byte[6] mac);
+ boolean usesMlo();
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiChip.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiChip.aidl
index 5ed7517..1af0d65 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiChip.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiChip.aidl
@@ -35,7 +35,13 @@
@VintfStability
interface IWifiChip {
void configureChip(in int modeId);
+ /**
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use createApOrBridgedApIfaceWithParams.
+ */
@PropagateAllowBlocking android.hardware.wifi.IWifiApIface createApIface();
+ /**
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use createApOrBridgedApIfaceWithParams.
+ */
@PropagateAllowBlocking android.hardware.wifi.IWifiApIface createBridgedApIface();
@PropagateAllowBlocking android.hardware.wifi.IWifiNanIface createNanIface();
@PropagateAllowBlocking android.hardware.wifi.IWifiP2pIface createP2pIface();
@@ -83,8 +89,12 @@
void triggerSubsystemRestart();
void enableStaChannelForPeerNetwork(in int channelCategoryEnableFlag);
void setMloMode(in android.hardware.wifi.IWifiChip.ChipMloMode mode);
+ /**
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use createApOrBridgedApIfaceWithParams.
+ */
@PropagateAllowBlocking android.hardware.wifi.IWifiApIface createApOrBridgedApIface(in android.hardware.wifi.IfaceConcurrencyType iface, in android.hardware.wifi.common.OuiKeyedData[] vendorData);
void setVoipMode(in android.hardware.wifi.IWifiChip.VoipMode mode);
+ @PropagateAllowBlocking android.hardware.wifi.IWifiApIface createApOrBridgedApIfaceWithParams(in android.hardware.wifi.ApIfaceParams params);
const int NO_POWER_CAP_CONSTANT = 0x7FFFFFFF;
@Backing(type="int") @VintfStability
enum FeatureSetMask {
@@ -98,6 +108,7 @@
SET_AFC_CHANNEL_ALLOWANCE = (1 << 7) /* 128 */,
T2LM_NEGOTIATION = (1 << 8) /* 256 */,
SET_VOIP_MODE = (1 << 9) /* 512 */,
+ MLO_SAP = (1 << 10) /* 1024 */,
}
@VintfStability
parcelable ChipConcurrencyCombinationLimit {
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/PasnConfig.aidl
similarity index 91%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/PasnConfig.aidl
index a5eda52..9b26c97 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/PasnConfig.aidl
@@ -31,9 +31,11 @@
// 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.vibrator;
+package android.hardware.wifi;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable PasnConfig {
+ long baseAkm;
+ long cipherSuite;
+ @nullable byte[] passphrase;
+ @nullable byte[] pmkid;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttCapabilities.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttCapabilities.aidl
index 6c64084..90caa26 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttCapabilities.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttCapabilities.aidl
@@ -47,4 +47,9 @@
boolean ntbInitiatorSupported;
boolean ntbResponderSupported;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ long akmsSupported;
+ long cipherSuitesSupported;
+ boolean secureHeLtfSupported;
+ boolean rangingFrameProtectionSupported;
+ int maxSupportedSecureHeLtfProtocolVersion;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttConfig.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttConfig.aidl
index 3613616..5507280 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttConfig.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttConfig.aidl
@@ -51,4 +51,5 @@
long ntbMinMeasurementTime;
long ntbMaxMeasurementTime;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ @nullable android.hardware.wifi.RttSecureConfig secureConfig;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttResult.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttResult.aidl
index 13202ba..87257be 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttResult.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttResult.aidl
@@ -66,4 +66,9 @@
byte numTxSpatialStreams;
byte numRxSpatialStreams;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ boolean isRangingFrameProtectionEnabled;
+ boolean isSecureLtfEnabled;
+ long baseAkm;
+ long cipherSuite;
+ int secureHeLtfProtocolVersion;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttSecureConfig.aidl
similarity index 89%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttSecureConfig.aidl
index a5eda52..c2d7866 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttSecureConfig.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
+package android.hardware.wifi;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable RttSecureConfig {
+ android.hardware.wifi.PasnConfig pasnConfig;
+ boolean enableSecureHeLtf;
+ boolean enableRangingFrameProtection;
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttStatus.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttStatus.aidl
index 2817497..08bca77 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttStatus.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttStatus.aidl
@@ -52,4 +52,9 @@
FAIL_FTM_PARAM_OVERRIDE = 15,
NAN_RANGING_PROTOCOL_FAILURE = 16,
NAN_RANGING_CONCURRENCY_NOT_SUPPORTED = 17,
+ SECURE_RANGING_FAILURE_INVALID_AKM = 18,
+ SECURE_RANGING_FAILURE_INVALID_CIPHER = 19,
+ SECURE_RANGING_FAILURE_INVALID_CONFIG = 20,
+ SECURE_RANGING_FAILURE_REJECTED = 21,
+ SECURE_RANGING_FAILURE_UNKNOWN = 22,
}
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttType.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttType.aidl
index cb25673..8545d73 100644
--- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttType.aidl
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttType.aidl
@@ -38,4 +38,5 @@
TWO_SIDED = 2,
TWO_SIDED_11MC = TWO_SIDED /* 2 */,
TWO_SIDED_11AZ_NTB = 3,
+ TWO_SIDED_11AZ_NTB_SECURE = 4,
}
diff --git a/wifi/aidl/android/hardware/wifi/Akm.aidl b/wifi/aidl/android/hardware/wifi/Akm.aidl
new file mode 100644
index 0000000..e3a913b
--- /dev/null
+++ b/wifi/aidl/android/hardware/wifi/Akm.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.wifi;
+
+/**
+ * Authentication and Key Management types.
+ */
+@VintfStability
+parcelable Akm {
+ const long NONE = 0;
+ const long PASN = 1 << 0;
+ const long SAE = 1 << 1;
+ const long FT_EAP_SHA256 = 1 << 2;
+ const long FT_PSK_SHA256 = 1 << 3;
+ const long FT_EAP_SHA384 = 1 << 4;
+ const long FT_PSK_SHA384 = 1 << 5;
+ const long FILS_EAP_SHA256 = 1 << 6;
+ const long FILS_EAP_SHA384 = 1 << 7;
+}
diff --git a/wifi/aidl/android/hardware/wifi/ApIfaceParams.aidl b/wifi/aidl/android/hardware/wifi/ApIfaceParams.aidl
new file mode 100644
index 0000000..f075b72
--- /dev/null
+++ b/wifi/aidl/android/hardware/wifi/ApIfaceParams.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.
+ */
+
+package android.hardware.wifi;
+
+import android.hardware.wifi.IfaceConcurrencyType;
+import android.hardware.wifi.common.OuiKeyedData;
+
+/**
+ * Parameters to use for setting up the access point interfaces.
+ */
+@VintfStability
+parcelable ApIfaceParams {
+ /**
+ * IfaceConcurrencyType to be created. Takes one of
+ * |IfaceConcurrencyType.AP| or |IfaceConcurrencyType.AP_BRIDGED|
+ */
+ IfaceConcurrencyType ifaceType;
+ /**
+ * Whether the current iface will be operated on Multi-links on the one MLD device (MLO).
+ */
+ boolean usesMlo;
+ /**
+ * Optional vendor-specific configuration parameters.
+ */
+ @nullable OuiKeyedData[] vendorData;
+}
diff --git a/wifi/aidl/android/hardware/wifi/CipherSuite.aidl b/wifi/aidl/android/hardware/wifi/CipherSuite.aidl
new file mode 100644
index 0000000..02b62e8
--- /dev/null
+++ b/wifi/aidl/android/hardware/wifi/CipherSuite.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.wifi;
+
+/**
+ * Cipher Suite types.
+ */
+@VintfStability
+parcelable CipherSuite {
+ const long NONE = 0;
+ const long CCMP_128 = 1 << 0;
+ const long CCMP_256 = 1 << 1;
+ const long GCMP_128 = 1 << 2;
+ const long GCMP_256 = 1 << 3;
+}
diff --git a/wifi/aidl/android/hardware/wifi/IWifiApIface.aidl b/wifi/aidl/android/hardware/wifi/IWifiApIface.aidl
index b14a800..a350e52 100644
--- a/wifi/aidl/android/hardware/wifi/IWifiApIface.aidl
+++ b/wifi/aidl/android/hardware/wifi/IWifiApIface.aidl
@@ -85,4 +85,11 @@
* |WifiStatusCode.ERROR_UNKNOWN|
*/
void setMacAddress(in byte[6] mac);
+
+ /**
+ * Check if ApIface is for an AP using Multi-Link Operation
+ *
+ * @return true if it is MLO iface, false otherwise.
+ */
+ boolean usesMlo();
}
diff --git a/wifi/aidl/android/hardware/wifi/IWifiChip.aidl b/wifi/aidl/android/hardware/wifi/IWifiChip.aidl
index d12d26c..04f31d2 100644
--- a/wifi/aidl/android/hardware/wifi/IWifiChip.aidl
+++ b/wifi/aidl/android/hardware/wifi/IWifiChip.aidl
@@ -17,6 +17,7 @@
package android.hardware.wifi;
import android.hardware.wifi.AfcChannelAllowance;
+import android.hardware.wifi.ApIfaceParams;
import android.hardware.wifi.IWifiApIface;
import android.hardware.wifi.IWifiChipEventCallback;
import android.hardware.wifi.IWifiNanIface;
@@ -87,6 +88,10 @@
* Chip supports voip mode setting.
*/
SET_VOIP_MODE = 1 << 9,
+ /**
+ * Chip supports Wi-Fi 7 MLO SoftAp.
+ */
+ MLO_SAP = 1 << 10,
}
/**
@@ -429,6 +434,9 @@
* reached the maximum allowed (specified in |ChipIfaceCombination|) number
* of ifaces of the AP type.
*
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use
+ * createApOrBridgedApIfaceWithParams.
+ *
* @return AIDL interface object representing the iface if
* successful, null otherwise.
* @throws ServiceSpecificException with one of the following values:
@@ -446,6 +454,9 @@
* reached the maximum allowed (specified in |ChipIfaceCombination|) number
* of ifaces of the AP type.
*
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use
+ * createApOrBridgedApIfaceWithParams.
+ *
* @return AIDL interface object representing the iface if
* successful, null otherwise.
* @throws ServiceSpecificException with one of the following values:
@@ -1173,6 +1184,9 @@
* reached the maximum allowed (specified in |ChipIfaceCombination|) number
* of ifaces of the AP or AP_BRIDGED type.
*
+ * @deprecated This method is deprecated from AIDL v3, newer HALs should use
+ * createApOrBridgedApIfaceWithParams.
+ *
* @param iface IfaceConcurrencyType to be created. Takes one of
|IfaceConcurrencyType.AP| or |IfaceConcurrencyType.AP_BRIDGED|
* @param vendorData Vendor-provided configuration data as a list of |OuiKeyedData|.
@@ -1206,4 +1220,22 @@
* |WifiStatusCode.ERROR_UNKNOWN|
*/
void setVoipMode(in VoipMode mode);
+
+ /**
+ * Create an AP or bridged AP iface on the chip based on ApIfaceParamss.
+ *
+ * Depending on the mode the chip is configured in, the interface creation
+ * may fail (code: |WifiStatusCode.ERROR_NOT_AVAILABLE|) if we've already
+ * reached the maximum allowed (specified in |ChipIfaceCombination|) number
+ * of ifaces of the AP type.
+ *
+ * @return AIDL interface object representing the iface if
+ * successful, null otherwise.
+ * @throws ServiceSpecificException with one of the following values:
+ * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_NOT_AVAILABLE|
+ */
+ @PropagateAllowBlocking
+ IWifiApIface createApOrBridgedApIfaceWithParams(in ApIfaceParams params);
}
diff --git a/wifi/aidl/android/hardware/wifi/PasnConfig.aidl b/wifi/aidl/android/hardware/wifi/PasnConfig.aidl
new file mode 100644
index 0000000..4c6b5bf
--- /dev/null
+++ b/wifi/aidl/android/hardware/wifi/PasnConfig.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.wifi;
+
+/**
+ * Pre-Association Security Negotiation (PASN) configuration.
+ */
+@VintfStability
+parcelable PasnConfig {
+ /**
+ * Base Authentication and Key Management (AKM) protocol used for PASN as defined in |Akm|.
+ */
+ long baseAkm;
+ /**
+ * Pairwise cipher suite used for the PTKSA (Pairwise Transient Key Security Association)
+ * as defined in |CipherSuite|
+ */
+ long cipherSuite;
+ /**
+ * Passphrase for the base AKM. This can be null based on the AKM type.
+ */
+ @nullable byte[] passphrase;
+ /**
+ * PMKID corresponding to the cached PMK from the base AKM. PMKID can be null if no cached PMK
+ * is present.
+ */
+ @nullable byte[] pmkid;
+}
diff --git a/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl b/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl
index c193924..48e211d 100644
--- a/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl
+++ b/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl
@@ -84,4 +84,24 @@
* that no vendor data is provided.
*/
@nullable OuiKeyedData[] vendorData;
+ /**
+ * Bitmap of |Akm| values indicating the set of supported AKMs.
+ */
+ long akmsSupported;
+ /**
+ * Bitmap of |CipherSuite| values indicating the set of supported pairwise cipher suites.
+ */
+ long cipherSuitesSupported;
+ /**
+ * Whether secure HE-LTF is supported.
+ */
+ boolean secureHeLtfSupported;
+ /**
+ * Whether frame protection for ranging is supported.
+ */
+ boolean rangingFrameProtectionSupported;
+ /**
+ * Maximum supported secure HE-LTF protocol version.
+ */
+ int maxSupportedSecureHeLtfProtocolVersion;
}
diff --git a/wifi/aidl/android/hardware/wifi/RttConfig.aidl b/wifi/aidl/android/hardware/wifi/RttConfig.aidl
index 496ffd2..8dfbea8 100644
--- a/wifi/aidl/android/hardware/wifi/RttConfig.aidl
+++ b/wifi/aidl/android/hardware/wifi/RttConfig.aidl
@@ -19,6 +19,7 @@
import android.hardware.wifi.RttBw;
import android.hardware.wifi.RttPeerType;
import android.hardware.wifi.RttPreamble;
+import android.hardware.wifi.RttSecureConfig;
import android.hardware.wifi.RttType;
import android.hardware.wifi.WifiChannelInfo;
import android.hardware.wifi.common.OuiKeyedData;
@@ -140,4 +141,8 @@
* that no vendor data is provided.
*/
@nullable OuiKeyedData[] vendorData;
+ /**
+ * Secure Ranging configuration
+ */
+ @nullable RttSecureConfig secureConfig;
}
diff --git a/wifi/aidl/android/hardware/wifi/RttResult.aidl b/wifi/aidl/android/hardware/wifi/RttResult.aidl
index 2f9aefe..dd41868 100644
--- a/wifi/aidl/android/hardware/wifi/RttResult.aidl
+++ b/wifi/aidl/android/hardware/wifi/RttResult.aidl
@@ -213,4 +213,25 @@
* that no vendor data is provided.
*/
@nullable OuiKeyedData[] vendorData;
+ /**
+ * Whether ranging frame protection is enabled.
+ */
+ boolean isRangingFrameProtectionEnabled;
+ /**
+ * Whether Secure HE-LTF is enabled.
+ */
+ boolean isSecureLtfEnabled;
+ /**
+ * Base Authentication and Key Management (AKM) protocol used for PASN as defined in |Akm|.
+ */
+ long baseAkm;
+ /**
+ * Pairwise cipher suite used for the PTKSA (Pairwise Transient Key Security Association)
+ * as defined in |CipherSuite|
+ */
+ long cipherSuite;
+ /**
+ * Secure HE-LTF protocol version used.
+ */
+ int secureHeLtfProtocolVersion;
}
diff --git a/wifi/aidl/android/hardware/wifi/RttSecureConfig.aidl b/wifi/aidl/android/hardware/wifi/RttSecureConfig.aidl
new file mode 100644
index 0000000..c10e6b5
--- /dev/null
+++ b/wifi/aidl/android/hardware/wifi/RttSecureConfig.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.
+ */
+
+package android.hardware.wifi;
+
+import android.hardware.wifi.PasnConfig;
+
+/**
+ * RTT secure configuration.
+ */
+@VintfStability
+parcelable RttSecureConfig {
+ /**
+ * Pre-Association Security Negotiation (PASN) configuration.
+ */
+ PasnConfig pasnConfig;
+ /**
+ * Enable secure HE-LTF (High Efficiency Long Training Field).
+ */
+ boolean enableSecureHeLtf;
+ /**
+ * Enable Ranging frame protection.
+ */
+ boolean enableRangingFrameProtection;
+}
diff --git a/wifi/aidl/android/hardware/wifi/RttStatus.aidl b/wifi/aidl/android/hardware/wifi/RttStatus.aidl
index 600165c..94bc9e3 100644
--- a/wifi/aidl/android/hardware/wifi/RttStatus.aidl
+++ b/wifi/aidl/android/hardware/wifi/RttStatus.aidl
@@ -88,4 +88,24 @@
* NAN concurrency not supported (NDP + RTT).
*/
NAN_RANGING_CONCURRENCY_NOT_SUPPORTED = 17,
+ /**
+ * Secure Ranging failed due to invalid AKM (Authentication and Key Management)
+ */
+ SECURE_RANGING_FAILURE_INVALID_AKM = 18,
+ /**
+ * Secure Ranging failed due to invalid Cipher.
+ */
+ SECURE_RANGING_FAILURE_INVALID_CIPHER = 19,
+ /**
+ * Secure Ranging failed due to invalid configuration.
+ */
+ SECURE_RANGING_FAILURE_INVALID_CONFIG = 20,
+ /**
+ * Secure ranging rejected by the AP.
+ */
+ SECURE_RANGING_FAILURE_REJECTED = 21,
+ /**
+ * Secure ranging failure unknown.
+ */
+ SECURE_RANGING_FAILURE_UNKNOWN = 22,
}
diff --git a/wifi/aidl/android/hardware/wifi/RttType.aidl b/wifi/aidl/android/hardware/wifi/RttType.aidl
index 3f1a2f1..d7cf9fe 100644
--- a/wifi/aidl/android/hardware/wifi/RttType.aidl
+++ b/wifi/aidl/android/hardware/wifi/RttType.aidl
@@ -37,4 +37,8 @@
* Two-sided RTT 11az non trigger based (non-TB) type.
*/
TWO_SIDED_11AZ_NTB = 3,
+ /**
+ * Two-sided RTT 11az non trigger based (non-TB) secure type.
+ */
+ TWO_SIDED_11AZ_NTB_SECURE = 4,
}
diff --git a/wifi/aidl/default/Android.bp b/wifi/aidl/default/Android.bp
index 3fcb77f..c2e8541 100644
--- a/wifi/aidl/default/Android.bp
+++ b/wifi/aidl/default/Android.bp
@@ -106,7 +106,7 @@
"libwifi-hal",
"libwifi-system-iface",
"libxml2",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
],
export_include_dirs: ["."],
@@ -138,7 +138,7 @@
"libwifi-hal",
"libwifi-system-iface",
"libxml2",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
],
static_libs: ["android.hardware.wifi-service-lib"],
init_rc: ["android.hardware.wifi-service.rc"],
@@ -167,7 +167,7 @@
"libwifi-hal",
"libwifi-system-iface",
"libxml2",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
],
static_libs: ["android.hardware.wifi-service-lib"],
init_rc: ["android.hardware.wifi-service-lazy.rc"],
@@ -199,8 +199,8 @@
static_libs: [
"libgmock",
"libgtest",
- "android.hardware.wifi-V2-ndk",
- "android.hardware.wifi.common-V1-ndk",
+ "android.hardware.wifi-V3-ndk",
+ "android.hardware.wifi.common-V2-ndk",
"android.hardware.wifi-service-lib",
],
shared_libs: [
diff --git a/wifi/aidl/default/aidl_callback_util.h b/wifi/aidl/default/aidl_callback_util.h
index f8ba53b..2419db9 100644
--- a/wifi/aidl/default/aidl_callback_util.h
+++ b/wifi/aidl/default/aidl_callback_util.h
@@ -45,6 +45,11 @@
~AidlCallbackHandler() { invalidate(); }
bool addCallback(const std::shared_ptr<CallbackType>& cb) {
+ if (cb == nullptr) {
+ LOG(ERROR) << "Unable to register a null callback";
+ return false;
+ }
+
std::unique_lock<std::mutex> lk(callback_handler_lock_);
void* cbPtr = reinterpret_cast<void*>(cb->asBinder().get());
const auto& cbPosition = findCbInSet(cbPtr);
diff --git a/wifi/aidl/default/aidl_struct_util.cpp b/wifi/aidl/default/aidl_struct_util.cpp
index d99edaa..bf6c206 100644
--- a/wifi/aidl/default/aidl_struct_util.cpp
+++ b/wifi/aidl/default/aidl_struct_util.cpp
@@ -61,6 +61,8 @@
return IWifiChip::FeatureSetMask::SET_AFC_CHANNEL_ALLOWANCE;
case WIFI_FEATURE_SET_VOIP_MODE:
return IWifiChip::FeatureSetMask::SET_VOIP_MODE;
+ case WIFI_FEATURE_MLO_SAP:
+ return IWifiChip::FeatureSetMask::MLO_SAP;
};
CHECK(false) << "Unknown legacy feature: " << feature;
return {};
@@ -2476,6 +2478,8 @@
return legacy_hal::RTT_TYPE_2_SIDED_11MC;
case RttType::TWO_SIDED_11AZ_NTB:
return legacy_hal::RTT_TYPE_2_SIDED_11AZ_NTB;
+ case RttType::TWO_SIDED_11AZ_NTB_SECURE:
+ return legacy_hal::RTT_TYPE_2_SIDED_11AZ_NTB_SECURE;
};
CHECK(false);
}
@@ -2489,6 +2493,8 @@
return RttType::TWO_SIDED_11MC;
case legacy_hal::RTT_TYPE_2_SIDED_11AZ_NTB:
return RttType::TWO_SIDED_11AZ_NTB;
+ case legacy_hal::RTT_TYPE_2_SIDED_11AZ_NTB_SECURE:
+ return RttType::TWO_SIDED_11AZ_NTB_SECURE;
};
CHECK(false) << "Unknown legacy type: " << type;
}
@@ -2721,6 +2727,16 @@
return RttStatus::NAN_RANGING_PROTOCOL_FAILURE;
case legacy_hal::RTT_STATUS_NAN_RANGING_CONCURRENCY_NOT_SUPPORTED:
return RttStatus::NAN_RANGING_CONCURRENCY_NOT_SUPPORTED;
+ case legacy_hal::RTT_STATUS_SECURE_RANGING_FAILURE_INVALID_AKM:
+ return RttStatus::SECURE_RANGING_FAILURE_INVALID_AKM;
+ case legacy_hal::RTT_STATUS_SECURE_RANGING_FAILURE_INVALID_CIPHER:
+ return RttStatus::SECURE_RANGING_FAILURE_INVALID_CIPHER;
+ case legacy_hal::RTT_STATUS_SECURE_RANGING_FAILURE_INVALID_CONFIG:
+ return RttStatus::SECURE_RANGING_FAILURE_INVALID_CONFIG;
+ case legacy_hal::RTT_STATUS_SECURE_RANGING_FAILURE_REJECTED:
+ return RttStatus::SECURE_RANGING_FAILURE_REJECTED;
+ case legacy_hal::RTT_STATUS_SECURE_RANGING_FAILURE_UNKNOWN:
+ return RttStatus::SECURE_RANGING_FAILURE_UNKNOWN;
};
CHECK(false) << "Unknown legacy status: " << status;
}
diff --git a/wifi/aidl/default/android.hardware.wifi-service.xml b/wifi/aidl/default/android.hardware.wifi-service.xml
index 3b68c8e..9bfffb6 100644
--- a/wifi/aidl/default/android.hardware.wifi-service.xml
+++ b/wifi/aidl/default/android.hardware.wifi-service.xml
@@ -1,7 +1,7 @@
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.wifi</name>
- <version>2</version>
+ <version>3</version>
<fqname>IWifi/default</fqname>
</hal>
</manifest>
diff --git a/wifi/aidl/default/wifi_ap_iface.cpp b/wifi/aidl/default/wifi_ap_iface.cpp
index 7779750..6a73cc8 100644
--- a/wifi/aidl/default/wifi_ap_iface.cpp
+++ b/wifi/aidl/default/wifi_ap_iface.cpp
@@ -28,10 +28,12 @@
namespace wifi {
using aidl_return_util::validateAndCall;
-WifiApIface::WifiApIface(const std::string& ifname, const std::vector<std::string>& instances,
+WifiApIface::WifiApIface(const std::string& ifname, const bool usesMlo,
+ const std::vector<std::string>& instances,
const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)
: ifname_(ifname),
+ uses_mlo_(usesMlo),
instances_(instances),
legacy_hal_(legacy_hal),
iface_util_(iface_util),
@@ -50,6 +52,10 @@
return ifname_;
}
+bool WifiApIface::usesMlo() {
+ return uses_mlo_;
+}
+
void WifiApIface::removeInstance(std::string instance) {
instances_.erase(std::remove(instances_.begin(), instances_.end(), instance), instances_.end());
}
@@ -72,7 +78,7 @@
ndk::ScopedAStatus WifiApIface::getFactoryMacAddress(std::array<uint8_t, 6>* _aidl_return) {
return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
&WifiApIface::getFactoryMacAddressInternal, _aidl_return,
- instances_.size() > 0 ? instances_[0] : ifname_);
+ getOperatingInstanceName());
}
ndk::ScopedAStatus WifiApIface::resetToFactoryMacAddress() {
@@ -90,14 +96,14 @@
}
ndk::ScopedAStatus WifiApIface::setCountryCodeInternal(const std::array<uint8_t, 2>& code) {
- legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->setCountryCode(
- instances_.size() > 0 ? instances_[0] : ifname_, code);
+ legacy_hal::wifi_error legacy_status =
+ legacy_hal_.lock()->setCountryCode(getOperatingInstanceName(), code);
return createWifiStatusFromLegacyError(legacy_status);
}
ndk::ScopedAStatus WifiApIface::setMacAddressInternal(const std::array<uint8_t, 6>& mac) {
// Support random MAC up to 2 interfaces
- if (instances_.size() == 2) {
+ if (instances_.size() == 2 && !uses_mlo_) {
int rbyte = 1;
for (auto const& intf : instances_) {
std::array<uint8_t, 6> rmac = mac;
@@ -131,7 +137,7 @@
ndk::ScopedAStatus WifiApIface::resetToFactoryMacAddressInternal() {
std::pair<std::array<uint8_t, 6>, ndk::ScopedAStatus> getMacResult;
- if (instances_.size() == 2) {
+ if (instances_.size() == 2 && !uses_mlo_) {
for (auto const& intf : instances_) {
getMacResult = getFactoryMacAddressInternal(intf);
LOG(DEBUG) << "Reset MAC to factory MAC on " << intf;
@@ -166,6 +172,11 @@
return {instances_, ndk::ScopedAStatus::ok()};
}
+ndk::ScopedAStatus WifiApIface::usesMlo(bool* _aidl_return) {
+ *_aidl_return = uses_mlo_;
+ return ndk::ScopedAStatus::ok();
+}
+
} // namespace wifi
} // namespace hardware
} // namespace android
diff --git a/wifi/aidl/default/wifi_ap_iface.h b/wifi/aidl/default/wifi_ap_iface.h
index 7378f98..e07154d 100644
--- a/wifi/aidl/default/wifi_ap_iface.h
+++ b/wifi/aidl/default/wifi_ap_iface.h
@@ -33,13 +33,15 @@
*/
class WifiApIface : public BnWifiApIface {
public:
- WifiApIface(const std::string& ifname, const std::vector<std::string>& instances,
+ WifiApIface(const std::string& ifname, const bool usesMlo,
+ const std::vector<std::string>& instances,
const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util);
// Refer to |WifiChip::invalidate()|.
void invalidate();
bool isValid();
std::string getName();
+ bool usesMlo();
void removeInstance(std::string instance);
// AIDL methods exposed.
@@ -49,6 +51,7 @@
ndk::ScopedAStatus getFactoryMacAddress(std::array<uint8_t, 6>* _aidl_return) override;
ndk::ScopedAStatus resetToFactoryMacAddress() override;
ndk::ScopedAStatus getBridgedInstances(std::vector<std::string>* _aidl_return) override;
+ ndk::ScopedAStatus usesMlo(bool* _aidl_return) override;
private:
// Corresponding worker functions for the AIDL methods.
@@ -61,11 +64,18 @@
std::pair<std::vector<std::string>, ndk::ScopedAStatus> getBridgedInstancesInternal();
std::string ifname_;
+ bool uses_mlo_;
std::vector<std::string> instances_;
std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal_;
std::weak_ptr<iface_util::WifiIfaceUtil> iface_util_;
bool is_valid_;
+ // The mlo is using one interface but owning two link instances.
+ // The operating should be based on interface.
+ inline std::string getOperatingInstanceName() {
+ return (instances_.size() > 0 && !uses_mlo_) ? instances_[0] : ifname_;
+ };
+
DISALLOW_COPY_AND_ASSIGN(WifiApIface);
};
diff --git a/wifi/aidl/default/wifi_chip.cpp b/wifi/aidl/default/wifi_chip.cpp
index fccfc15..045e07d 100644
--- a/wifi/aidl/default/wifi_chip.cpp
+++ b/wifi/aidl/default/wifi_chip.cpp
@@ -369,7 +369,7 @@
ndk::ScopedAStatus WifiChip::createBridgedApIface(std::shared_ptr<IWifiApIface>* _aidl_return) {
return validateAndCall(this, WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
- &WifiChip::createBridgedApIfaceInternal, _aidl_return);
+ &WifiChip::createBridgedApIfaceInternal, _aidl_return, false);
}
ndk::ScopedAStatus WifiChip::createApOrBridgedApIface(
@@ -613,6 +613,13 @@
&WifiChip::setVoipModeInternal, in_mode);
}
+ndk::ScopedAStatus WifiChip::createApOrBridgedApIfaceWithParams(
+ const ApIfaceParams& in_params, std::shared_ptr<IWifiApIface>* _aidl_return) {
+ return validateAndCall(this, WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
+ &WifiChip::createApOrBridgedApIfaceWithParamsInternal, _aidl_return,
+ in_params);
+}
+
void WifiChip::invalidateAndRemoveAllIfaces() {
invalidateAndClearBridgedApAll();
invalidateAndClearAll(ap_ifaces_);
@@ -797,15 +804,15 @@
return ndk::ScopedAStatus::ok();
}
-std::shared_ptr<WifiApIface> WifiChip::newWifiApIface(std::string& ifname) {
+std::shared_ptr<WifiApIface> WifiChip::newWifiApIface(std::string& ifname, bool usesMlo) {
std::vector<std::string> ap_instances;
for (auto const& it : br_ifaces_ap_instances_) {
if (it.first == ifname) {
ap_instances = it.second;
}
}
- std::shared_ptr<WifiApIface> iface =
- ndk::SharedRefBase::make<WifiApIface>(ifname, ap_instances, legacy_hal_, iface_util_);
+ std::shared_ptr<WifiApIface> iface = ndk::SharedRefBase::make<WifiApIface>(
+ ifname, usesMlo, ap_instances, legacy_hal_, iface_util_);
ap_ifaces_.push_back(iface);
for (const auto& callback : event_cb_handler_.getCallbacks()) {
if (!callback->onIfaceAdded(IfaceType::AP, ifname).isOk()) {
@@ -826,47 +833,60 @@
if (!status.isOk()) {
return {std::shared_ptr<WifiApIface>(), std::move(status)};
}
- std::shared_ptr<WifiApIface> iface = newWifiApIface(ifname);
+ std::shared_ptr<WifiApIface> iface = newWifiApIface(ifname, false);
return {iface, ndk::ScopedAStatus::ok()};
}
-std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus>
-WifiChip::createBridgedApIfaceInternal() {
+std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus> WifiChip::createBridgedApIfaceInternal(
+ bool usesMlo) {
if (!canCurrentModeSupportConcurrencyTypeWithCurrentTypes(IfaceConcurrencyType::AP_BRIDGED)) {
return {nullptr, createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE)};
}
- std::vector<std::string> ap_instances = allocateBridgedApInstanceNames();
+ std::string br_ifname;
+ std::vector<std::string> ap_instances = allocateBridgedApInstanceNames(usesMlo);
if (ap_instances.size() < 2) {
LOG(ERROR) << "Fail to allocate two instances";
return {nullptr, createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE)};
}
- std::string br_ifname = kApBridgeIfacePrefix + ap_instances[0];
- for (int i = 0; i < 2; i++) {
- ndk::ScopedAStatus status = createVirtualApInterface(ap_instances[i]);
- if (!status.isOk()) {
- if (i != 0) { // The failure happened when creating second virtual
- // iface.
- legacy_hal_.lock()->deleteVirtualInterface(
- ap_instances.front()); // Remove the first virtual iface.
+ if (usesMlo) {
+ // MLO SoftAp is using single interface with two links. So only need to create 1 interface.
+ br_ifname = allocateApIfaceName();
+ } else {
+ br_ifname = kApBridgeIfacePrefix + ap_instances[0];
+ for (int i = 0; i < 2; i++) {
+ ndk::ScopedAStatus status = createVirtualApInterface(ap_instances[i]);
+ if (!status.isOk()) {
+ if (i != 0) { // The failure happened when creating second virtual
+ // iface.
+ legacy_hal_.lock()->deleteVirtualInterface(
+ ap_instances.front()); // Remove the first virtual iface.
+ }
+ return {nullptr, std::move(status)};
}
- return {nullptr, std::move(status)};
}
}
br_ifaces_ap_instances_[br_ifname] = ap_instances;
- if (!iface_util_->createBridge(br_ifname)) {
- LOG(ERROR) << "Failed createBridge - br_name=" << br_ifname.c_str();
- deleteApIface(br_ifname);
- return {nullptr, createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE)};
- }
- for (auto const& instance : ap_instances) {
- // Bind ap instance interface to AP bridge
- if (!iface_util_->addIfaceToBridge(br_ifname, instance)) {
- LOG(ERROR) << "Failed add if to Bridge - if_name=" << instance.c_str();
+ if (usesMlo) {
+ ndk::ScopedAStatus status = createVirtualApInterface(br_ifname);
+ if (!status.isOk()) {
+ return {nullptr, std::move(status)};
+ }
+ } else {
+ if (!iface_util_->createBridge(br_ifname)) {
+ LOG(ERROR) << "Failed createBridge - br_name=" << br_ifname.c_str();
deleteApIface(br_ifname);
return {nullptr, createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE)};
}
+ for (auto const& instance : ap_instances) {
+ // Bind ap instance interface to AP bridge
+ if (!iface_util_->addIfaceToBridge(br_ifname, instance)) {
+ LOG(ERROR) << "Failed add if to Bridge - if_name=" << instance.c_str();
+ deleteApIface(br_ifname);
+ return {nullptr, createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE)};
+ }
+ }
}
- std::shared_ptr<WifiApIface> iface = newWifiApIface(br_ifname);
+ std::shared_ptr<WifiApIface> iface = newWifiApIface(br_ifname, usesMlo);
return {iface, ndk::ScopedAStatus::ok()};
}
@@ -876,7 +896,18 @@
if (ifaceType == IfaceConcurrencyType::AP) {
return createApIfaceInternal();
} else if (ifaceType == IfaceConcurrencyType::AP_BRIDGED) {
- return createBridgedApIfaceInternal();
+ return createBridgedApIfaceInternal(false);
+ } else {
+ return {nullptr, createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS)};
+ }
+}
+
+std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus>
+WifiChip::createApOrBridgedApIfaceWithParamsInternal(const ApIfaceParams& params) {
+ if (params.ifaceType == IfaceConcurrencyType::AP) {
+ return createApIfaceInternal();
+ } else if (params.ifaceType == IfaceConcurrencyType::AP_BRIDGED) {
+ return createBridgedApIfaceInternal(params.usesMlo);
} else {
return {nullptr, createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS)};
}
@@ -925,23 +956,28 @@
if (!iface.get() || ifInstanceName.empty()) {
return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
}
+
// Requires to remove one of the instance in bridge mode
for (auto const& it : br_ifaces_ap_instances_) {
if (it.first == ifname) {
std::vector<std::string> ap_instances = it.second;
- for (auto const& iface : ap_instances) {
- if (iface == ifInstanceName) {
- if (!iface_util_->removeIfaceFromBridge(it.first, iface)) {
- LOG(ERROR) << "Failed to remove interface: " << ifInstanceName << " from "
- << ifname;
- return createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE);
- }
- legacy_hal::wifi_error legacy_status =
- legacy_hal_.lock()->deleteVirtualInterface(iface);
- if (legacy_status != legacy_hal::WIFI_SUCCESS) {
- LOG(ERROR) << "Failed to del interface: " << iface << " "
- << legacyErrorToString(legacy_status);
- return createWifiStatusFromLegacyError(legacy_status);
+ for (auto const& instance : ap_instances) {
+ if (instance == ifInstanceName) {
+ if (iface->usesMlo()) {
+ LOG(INFO) << "Remove Link " << ifInstanceName << " from " << ifname;
+ } else {
+ if (!iface_util_->removeIfaceFromBridge(it.first, instance)) {
+ LOG(ERROR) << "Failed to remove interface: " << ifInstanceName
+ << " from " << ifname;
+ return createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE);
+ }
+ legacy_hal::wifi_error legacy_status =
+ legacy_hal_.lock()->deleteVirtualInterface(instance);
+ if (legacy_status != legacy_hal::WIFI_SUCCESS) {
+ LOG(ERROR) << "Failed to del interface: " << instance << " "
+ << legacyErrorToString(legacy_status);
+ return createWifiStatusFromLegacyError(legacy_status);
+ }
}
ap_instances.erase(
std::remove(ap_instances.begin(), ap_instances.end(), ifInstanceName),
@@ -1729,7 +1765,7 @@
// If the first active wlan iface is bridged iface.
// Return first instance name.
for (auto const& it : br_ifaces_ap_instances_) {
- if (it.first == ap_ifaces_[0]->getName()) {
+ if (it.first == ap_ifaces_[0]->getName() && !ap_ifaces_[0]->usesMlo()) {
return it.second[0];
}
}
@@ -1782,9 +1818,19 @@
return allocateApOrStaIfaceName(IfaceType::AP, startIdxOfApIface());
}
-std::vector<std::string> WifiChip::allocateBridgedApInstanceNames() {
- // Check if we have a dedicated iface for AP.
- std::vector<std::string> instances = getPredefinedApIfaceNames(true);
+std::vector<std::string> WifiChip::allocateBridgedApInstanceNames(bool usesMlo) {
+ std::vector<std::string> instances;
+ if (usesMlo) {
+ // For MLO AP, the instances are MLO links and it will be maintained in hostapd.
+ // The hostapd will use 0 as an initial link id and 1 as the next.
+ // Considering Android didn't support link reconfiguration. Forcing to use 0 & 1
+ // should work.
+ instances.push_back("0");
+ instances.push_back("1");
+ } else {
+ // Check if we have a dedicated iface for AP.
+ instances = getPredefinedApIfaceNames(true);
+ }
if (instances.size() == 2) {
return instances;
} else {
@@ -1856,11 +1902,14 @@
void WifiChip::invalidateAndClearBridgedApAll() {
for (auto const& it : br_ifaces_ap_instances_) {
- for (auto const& iface : it.second) {
- iface_util_->removeIfaceFromBridge(it.first, iface);
- legacy_hal_.lock()->deleteVirtualInterface(iface);
+ const auto iface = findUsingName(ap_ifaces_, it.first);
+ if (!iface->usesMlo()) {
+ for (auto const& iface : it.second) {
+ iface_util_->removeIfaceFromBridge(it.first, iface);
+ legacy_hal_.lock()->deleteVirtualInterface(iface);
+ }
+ iface_util_->deleteBridge(it.first);
}
- iface_util_->deleteBridge(it.first);
}
br_ifaces_ap_instances_.clear();
}
@@ -1868,16 +1917,19 @@
void WifiChip::deleteApIface(const std::string& if_name) {
if (if_name.empty()) return;
// delete bridged interfaces if any
- for (auto const& it : br_ifaces_ap_instances_) {
- if (it.first == if_name) {
- for (auto const& iface : it.second) {
- iface_util_->removeIfaceFromBridge(if_name, iface);
- legacy_hal_.lock()->deleteVirtualInterface(iface);
+ const auto iface = findUsingName(ap_ifaces_, if_name);
+ if (!iface->usesMlo()) {
+ for (auto const& it : br_ifaces_ap_instances_) {
+ if (it.first == if_name) {
+ for (auto const& instance : it.second) {
+ iface_util_->removeIfaceFromBridge(if_name, instance);
+ legacy_hal_.lock()->deleteVirtualInterface(instance);
+ }
+ iface_util_->deleteBridge(if_name);
+ br_ifaces_ap_instances_.erase(if_name);
+ // ifname is bridged AP, return here.
+ return;
}
- iface_util_->deleteBridge(if_name);
- br_ifaces_ap_instances_.erase(if_name);
- // ifname is bridged AP, return here.
- return;
}
}
diff --git a/wifi/aidl/default/wifi_chip.h b/wifi/aidl/default/wifi_chip.h
index ffd507f..24dd00d 100644
--- a/wifi/aidl/default/wifi_chip.h
+++ b/wifi/aidl/default/wifi_chip.h
@@ -159,6 +159,8 @@
binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
ndk::ScopedAStatus setMloMode(const ChipMloMode in_mode) override;
ndk::ScopedAStatus setVoipMode(const VoipMode in_mode) override;
+ ndk::ScopedAStatus createApOrBridgedApIfaceWithParams(
+ const ApIfaceParams& in_params, std::shared_ptr<IWifiApIface>* _aidl_return) override;
private:
void invalidateAndRemoveAllIfaces();
@@ -178,12 +180,15 @@
std::pair<IWifiChip::ChipDebugInfo, ndk::ScopedAStatus> requestChipDebugInfoInternal();
std::pair<std::vector<uint8_t>, ndk::ScopedAStatus> requestDriverDebugDumpInternal();
std::pair<std::vector<uint8_t>, ndk::ScopedAStatus> requestFirmwareDebugDumpInternal();
- std::shared_ptr<WifiApIface> newWifiApIface(std::string& ifname);
+ std::shared_ptr<WifiApIface> newWifiApIface(std::string& ifname, bool usesMlo);
ndk::ScopedAStatus createVirtualApInterface(const std::string& apVirtIf);
std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus> createApIfaceInternal();
- std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus> createBridgedApIfaceInternal();
+ std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus> createBridgedApIfaceInternal(
+ bool usesMlo);
std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus> createApOrBridgedApIfaceInternal(
IfaceConcurrencyType ifaceType, const std::vector<common::OuiKeyedData>& vendorData);
+ std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus>
+ createApOrBridgedApIfaceWithParamsInternal(const ApIfaceParams& params);
std::pair<std::vector<std::string>, ndk::ScopedAStatus> getApIfaceNamesInternal();
std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus> getApIfaceInternal(
const std::string& ifname);
@@ -258,7 +263,7 @@
std::string getFirstActiveWlanIfaceName();
std::string allocateApOrStaIfaceName(IfaceType type, uint32_t start_idx);
std::string allocateApIfaceName();
- std::vector<std::string> allocateBridgedApInstanceNames();
+ std::vector<std::string> allocateBridgedApInstanceNames(bool usesMlo);
std::string allocateStaIfaceName();
bool writeRingbufferFilesInternal();
std::string getWlanIfaceNameWithType(IfaceType type, unsigned idx);
diff --git a/wifi/aidl/default/wifi_legacy_hal.h b/wifi/aidl/default/wifi_legacy_hal.h
index 3fd567b..aa563cb 100644
--- a/wifi/aidl/default/wifi_legacy_hal.h
+++ b/wifi/aidl/default/wifi_legacy_hal.h
@@ -212,10 +212,16 @@
using ::RTT_STATUS_NAN_RANGING_CONCURRENCY_NOT_SUPPORTED;
using ::RTT_STATUS_NAN_RANGING_PROTOCOL_FAILURE;
using ::RTT_STATUS_NO_WIFI;
+using ::RTT_STATUS_SECURE_RANGING_FAILURE_INVALID_AKM;
+using ::RTT_STATUS_SECURE_RANGING_FAILURE_INVALID_CIPHER;
+using ::RTT_STATUS_SECURE_RANGING_FAILURE_INVALID_CONFIG;
+using ::RTT_STATUS_SECURE_RANGING_FAILURE_REJECTED;
+using ::RTT_STATUS_SECURE_RANGING_FAILURE_UNKNOWN;
using ::RTT_STATUS_SUCCESS;
using ::RTT_TYPE_1_SIDED;
using ::RTT_TYPE_2_SIDED;
using ::RTT_TYPE_2_SIDED_11AZ_NTB;
+using ::RTT_TYPE_2_SIDED_11AZ_NTB_SECURE;
using ::RTT_TYPE_2_SIDED_11MC;
using ::RX_PKT_FATE_DRV_DROP_FILTER;
using ::RX_PKT_FATE_DRV_DROP_INVALID;
diff --git a/wifi/aidl/vts/functional/Android.bp b/wifi/aidl/vts/functional/Android.bp
index 9994d09..429c0c5 100644
--- a/wifi/aidl/vts/functional/Android.bp
+++ b/wifi/aidl/vts/functional/Android.bp
@@ -40,8 +40,8 @@
],
static_libs: [
"VtsHalWifiTargetTestUtil",
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"libwifi-system-iface",
],
test_suites: [
@@ -66,8 +66,8 @@
],
static_libs: [
"VtsHalWifiTargetTestUtil",
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"libwifi-system-iface",
],
test_suites: [
@@ -92,8 +92,8 @@
],
static_libs: [
"VtsHalWifiTargetTestUtil",
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"libwifi-system-iface",
],
test_suites: [
@@ -118,8 +118,8 @@
],
static_libs: [
"VtsHalWifiTargetTestUtil",
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"libwifi-system-iface",
],
test_suites: [
@@ -144,8 +144,8 @@
],
static_libs: [
"VtsHalWifiTargetTestUtil",
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"libwifi-system-iface",
],
test_suites: [
@@ -169,8 +169,8 @@
"libnativehelper",
],
static_libs: [
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"libwifi-system-iface",
],
}
diff --git a/wifi/common/aidl/Android.bp b/wifi/common/aidl/Android.bp
index 0920a55..8ea54be 100644
--- a/wifi/common/aidl/Android.bp
+++ b/wifi/common/aidl/Android.bp
@@ -54,6 +54,6 @@
imports: [],
},
],
- frozen: true,
+ frozen: false,
}
diff --git a/wifi/common/aidl/aidl_api/android.hardware.wifi.common/current/android/hardware/wifi/common/DeauthenticationReasonCode.aidl b/wifi/common/aidl/aidl_api/android.hardware.wifi.common/current/android/hardware/wifi/common/DeauthenticationReasonCode.aidl
new file mode 100644
index 0000000..2404b2c
--- /dev/null
+++ b/wifi/common/aidl/aidl_api/android.hardware.wifi.common/current/android/hardware/wifi/common/DeauthenticationReasonCode.aidl
@@ -0,0 +1,99 @@
+/*
+ * 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.wifi.common;
+@Backing(type="int") @VintfStability
+enum DeauthenticationReasonCode {
+ HOSTAPD_NO_REASON = 0,
+ UNSPECIFIED = 1,
+ PREV_AUTH_NOT_VALID = 2,
+ DEAUTH_LEAVING = 3,
+ DISASSOC_DUE_TO_INACTIVITY = 4,
+ DISASSOC_AP_BUSY = 5,
+ CLASS2_FRAME_FROM_NONAUTH_STA = 6,
+ CLASS3_FRAME_FROM_NONASSOC_STA = 7,
+ DISASSOC_STA_HAS_LEFT = 8,
+ STA_REQ_ASSOC_WITHOUT_AUTH = 9,
+ PWR_CAPABILITY_NOT_VALID = 10,
+ SUPPORTED_CHANNEL_NOT_VALID = 11,
+ BSS_TRANSITION_DISASSOC = 12,
+ INVALID_IE = 13,
+ MICHAEL_MIC_FAILURE = 14,
+ FOURWAY_HANDSHAKE_TIMEOUT = 15,
+ GROUP_KEY_UPDATE_TIMEOUT = 16,
+ IE_IN_4WAY_DIFFERS = 17,
+ GROUP_CIPHER_NOT_VALID = 18,
+ PAIRWISE_CIPHER_NOT_VALID = 19,
+ AKMP_NOT_VALID = 20,
+ UNSUPPORTED_RSN_IE_VERSION = 21,
+ INVALID_RSN_IE_CAPAB = 22,
+ IEEE_802_1X_AUTH_FAILED = 23,
+ CIPHER_SUITE_REJECTED = 24,
+ TDLS_TEARDOWN_UNREACHABLE = 25,
+ TDLS_TEARDOWN_UNSPECIFIED = 26,
+ SSP_REQUESTED_DISASSOC = 27,
+ NO_SSP_ROAMING_AGREEMENT = 28,
+ BAD_CIPHER_OR_AKM = 29,
+ NOT_AUTHORIZED_THIS_LOCATION = 30,
+ SERVICE_CHANGE_PRECLUDES_TS = 31,
+ UNSPECIFIED_QOS_REASON = 32,
+ NOT_ENOUGH_BANDWIDTH = 33,
+ DISASSOC_LOW_ACK = 34,
+ EXCEEDED_TXOP = 35,
+ STA_LEAVING = 36,
+ END_TS_BA_DLS = 37,
+ UNKNOWN_TS_BA = 38,
+ TIMEOUT = 39,
+ PEERKEY_MISMATCH = 45,
+ AUTHORIZED_ACCESS_LIMIT_REACHED = 46,
+ EXTERNAL_SERVICE_REQUIREMENTS = 47,
+ INVALID_FT_ACTION_FRAME_COUNT = 48,
+ INVALID_PMKID = 49,
+ INVALID_MDE = 50,
+ INVALID_FTE = 51,
+ MESH_PEERING_CANCELLED = 52,
+ MESH_MAX_PEERS = 53,
+ MESH_CONFIG_POLICY_VIOLATION = 54,
+ MESH_CLOSE_RCVD = 55,
+ MESH_MAX_RETRIES = 56,
+ MESH_CONFIRM_TIMEOUT = 57,
+ MESH_INVALID_GTK = 58,
+ MESH_INCONSISTENT_PARAMS = 59,
+ MESH_INVALID_SECURITY_CAP = 60,
+ MESH_PATH_ERROR_NO_PROXY_INFO = 61,
+ MESH_PATH_ERROR_NO_FORWARDING_INFO = 62,
+ MESH_PATH_ERROR_DEST_UNREACHABLE = 63,
+ MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS = 64,
+ MESH_CHANNEL_SWITCH_REGULATORY_REQ = 65,
+ MESH_CHANNEL_SWITCH_UNSPECIFIED = 66,
+}
diff --git a/wifi/common/aidl/android/hardware/wifi/common/DeauthenticationReasonCode.aidl b/wifi/common/aidl/android/hardware/wifi/common/DeauthenticationReasonCode.aidl
new file mode 100644
index 0000000..95eb31d
--- /dev/null
+++ b/wifi/common/aidl/android/hardware/wifi/common/DeauthenticationReasonCode.aidl
@@ -0,0 +1,90 @@
+/*
+ * 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.wifi.common;
+
+/**
+ * Reason codes (IEEE Std 802.11-2016, 9.4.1.7, Table 9-45).
+ *
+ * Note: HOSTAPD_NO_REASON is the default return from hostapd, even though it
+ * does not appear in the IEEE spec.
+ */
+@VintfStability
+@Backing(type="int")
+enum DeauthenticationReasonCode {
+ HOSTAPD_NO_REASON = 0,
+ UNSPECIFIED = 1,
+ PREV_AUTH_NOT_VALID = 2,
+ DEAUTH_LEAVING = 3,
+ DISASSOC_DUE_TO_INACTIVITY = 4,
+ DISASSOC_AP_BUSY = 5,
+ CLASS2_FRAME_FROM_NONAUTH_STA = 6,
+ CLASS3_FRAME_FROM_NONASSOC_STA = 7,
+ DISASSOC_STA_HAS_LEFT = 8,
+ STA_REQ_ASSOC_WITHOUT_AUTH = 9,
+ PWR_CAPABILITY_NOT_VALID = 10,
+ SUPPORTED_CHANNEL_NOT_VALID = 11,
+ BSS_TRANSITION_DISASSOC = 12,
+ INVALID_IE = 13,
+ MICHAEL_MIC_FAILURE = 14,
+ FOURWAY_HANDSHAKE_TIMEOUT = 15,
+ GROUP_KEY_UPDATE_TIMEOUT = 16,
+ IE_IN_4WAY_DIFFERS = 17,
+ GROUP_CIPHER_NOT_VALID = 18,
+ PAIRWISE_CIPHER_NOT_VALID = 19,
+ AKMP_NOT_VALID = 20,
+ UNSUPPORTED_RSN_IE_VERSION = 21,
+ INVALID_RSN_IE_CAPAB = 22,
+ IEEE_802_1X_AUTH_FAILED = 23,
+ CIPHER_SUITE_REJECTED = 24,
+ TDLS_TEARDOWN_UNREACHABLE = 25,
+ TDLS_TEARDOWN_UNSPECIFIED = 26,
+ SSP_REQUESTED_DISASSOC = 27,
+ NO_SSP_ROAMING_AGREEMENT = 28,
+ BAD_CIPHER_OR_AKM = 29,
+ NOT_AUTHORIZED_THIS_LOCATION = 30,
+ SERVICE_CHANGE_PRECLUDES_TS = 31,
+ UNSPECIFIED_QOS_REASON = 32,
+ NOT_ENOUGH_BANDWIDTH = 33,
+ DISASSOC_LOW_ACK = 34,
+ EXCEEDED_TXOP = 35,
+ STA_LEAVING = 36,
+ END_TS_BA_DLS = 37,
+ UNKNOWN_TS_BA = 38,
+ TIMEOUT = 39,
+ PEERKEY_MISMATCH = 45,
+ AUTHORIZED_ACCESS_LIMIT_REACHED = 46,
+ EXTERNAL_SERVICE_REQUIREMENTS = 47,
+ INVALID_FT_ACTION_FRAME_COUNT = 48,
+ INVALID_PMKID = 49,
+ INVALID_MDE = 50,
+ INVALID_FTE = 51,
+ MESH_PEERING_CANCELLED = 52,
+ MESH_MAX_PEERS = 53,
+ MESH_CONFIG_POLICY_VIOLATION = 54,
+ MESH_CLOSE_RCVD = 55,
+ MESH_MAX_RETRIES = 56,
+ MESH_CONFIRM_TIMEOUT = 57,
+ MESH_INVALID_GTK = 58,
+ MESH_INCONSISTENT_PARAMS = 59,
+ MESH_INVALID_SECURITY_CAP = 60,
+ MESH_PATH_ERROR_NO_PROXY_INFO = 61,
+ MESH_PATH_ERROR_NO_FORWARDING_INFO = 62,
+ MESH_PATH_ERROR_DEST_UNREACHABLE = 63,
+ MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS = 64,
+ MESH_CHANNEL_SWITCH_REGULATORY_REQ = 65,
+ MESH_CHANNEL_SWITCH_UNSPECIFIED = 66,
+}
diff --git a/wifi/hostapd/aidl/Android.bp b/wifi/hostapd/aidl/Android.bp
index 88f4ef2..e580573 100644
--- a/wifi/hostapd/aidl/Android.bp
+++ b/wifi/hostapd/aidl/Android.bp
@@ -29,7 +29,7 @@
"android/hardware/wifi/hostapd/*.aidl",
],
imports: [
- "android.hardware.wifi.common-V1",
+ "android.hardware.wifi.common-V2",
],
stability: "vintf",
backend: {
diff --git a/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/ClientInfo.aidl b/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/ClientInfo.aidl
index c4d62b6..c4db789 100644
--- a/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/ClientInfo.aidl
+++ b/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/ClientInfo.aidl
@@ -38,4 +38,5 @@
String apIfaceInstance;
byte[] clientAddress;
boolean isConnected;
+ android.hardware.wifi.common.DeauthenticationReasonCode disconnectReasonCode;
}
diff --git a/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/IfaceParams.aidl b/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/IfaceParams.aidl
index 8da3441..7b67102 100644
--- a/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/IfaceParams.aidl
+++ b/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/IfaceParams.aidl
@@ -39,5 +39,5 @@
android.hardware.wifi.hostapd.ChannelParams[] channelParams;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
@nullable String[] instanceIdentities;
- boolean isMlo;
+ boolean usesMlo;
}
diff --git a/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/NetworkParams.aidl b/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/NetworkParams.aidl
index 4554223..b6c5cf2 100644
--- a/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/NetworkParams.aidl
+++ b/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/NetworkParams.aidl
@@ -40,4 +40,5 @@
String passphrase;
boolean isMetered;
byte[] vendorElements;
+ boolean isClientIsolationEnabled;
}
diff --git a/wifi/hostapd/aidl/android/hardware/wifi/hostapd/ClientInfo.aidl b/wifi/hostapd/aidl/android/hardware/wifi/hostapd/ClientInfo.aidl
index 7bed658..a7ca1ec 100644
--- a/wifi/hostapd/aidl/android/hardware/wifi/hostapd/ClientInfo.aidl
+++ b/wifi/hostapd/aidl/android/hardware/wifi/hostapd/ClientInfo.aidl
@@ -16,6 +16,8 @@
package android.hardware.wifi.hostapd;
+import android.hardware.wifi.common.DeauthenticationReasonCode;
+
/**
* Parameters to control the channel selection for the interface.
*/
@@ -42,4 +44,9 @@
* True when client connected, false when client disconnected.
*/
boolean isConnected;
+
+ /**
+ * Reason for client disconnect from soft ap.
+ */
+ DeauthenticationReasonCode disconnectReasonCode;
}
diff --git a/wifi/hostapd/aidl/android/hardware/wifi/hostapd/IfaceParams.aidl b/wifi/hostapd/aidl/android/hardware/wifi/hostapd/IfaceParams.aidl
index bb646e3..f4e4647 100644
--- a/wifi/hostapd/aidl/android/hardware/wifi/hostapd/IfaceParams.aidl
+++ b/wifi/hostapd/aidl/android/hardware/wifi/hostapd/IfaceParams.aidl
@@ -46,7 +46,7 @@
*/
@nullable String[] instanceIdentities;
/**
- * Whether the current iface is MLO.
+ * Whether the current iface is using multi-link operation.
*/
- boolean isMlo;
+ boolean usesMlo;
}
diff --git a/wifi/hostapd/aidl/android/hardware/wifi/hostapd/NetworkParams.aidl b/wifi/hostapd/aidl/android/hardware/wifi/hostapd/NetworkParams.aidl
index 47d9e6f..acc2cad 100644
--- a/wifi/hostapd/aidl/android/hardware/wifi/hostapd/NetworkParams.aidl
+++ b/wifi/hostapd/aidl/android/hardware/wifi/hostapd/NetworkParams.aidl
@@ -52,4 +52,8 @@
* one or more elements). Example: byte[]{ 221, 4, 17, 34, 51, 1 }
*/
byte[] vendorElements;
+ /**
+ * Whether the network uses client isolation.
+ */
+ boolean isClientIsolationEnabled;
}
diff --git a/wifi/hostapd/aidl/lint-baseline.xml b/wifi/hostapd/aidl/lint-baseline.xml
index 4329e12..23fe690 100644
--- a/wifi/hostapd/aidl/lint-baseline.xml
+++ b/wifi/hostapd/aidl/lint-baseline.xml
@@ -63,4 +63,22 @@
file="out/soong/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V3-java-source/gen/android/hardware/wifi/hostapd/IHostapdCallback.java"/>
</issue>
-</issues>
\ No newline at end of file
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `android.os.Binder#markVintfStability`"
+ errorLine1=" this.markVintfStability();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/soong/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V4-java-source/gen/android/hardware/wifi/hostapd/IHostapd.java"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `android.os.Binder#markVintfStability`"
+ errorLine1=" this.markVintfStability();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="out/soong/.intermediates/hardware/interfaces/wifi/hostapd/aidl/android.hardware.wifi.hostapd-V4-java-source/gen/android/hardware/wifi/hostapd/IHostapdCallback.java"/>
+ </issue>
+
+</issues>
diff --git a/wifi/hostapd/aidl/vts/functional/Android.bp b/wifi/hostapd/aidl/vts/functional/Android.bp
index bf1b0d0..de31e14 100644
--- a/wifi/hostapd/aidl/vts/functional/Android.bp
+++ b/wifi/hostapd/aidl/vts/functional/Android.bp
@@ -37,8 +37,8 @@
"android.hardware.wifi@1.4",
"android.hardware.wifi@1.5",
"android.hardware.wifi@1.6",
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"libwifi-system",
"libwifi-system-iface",
"VtsHalWifiTargetTestUtil",
diff --git a/wifi/legacy_headers/include/hardware_legacy/rtt.h b/wifi/legacy_headers/include/hardware_legacy/rtt.h
index 426abe0..93ea145 100644
--- a/wifi/legacy_headers/include/hardware_legacy/rtt.h
+++ b/wifi/legacy_headers/include/hardware_legacy/rtt.h
@@ -7,24 +7,33 @@
/* Ranging status */
typedef enum {
- RTT_STATUS_SUCCESS = 0,
- RTT_STATUS_FAILURE = 1, // general failure status
- RTT_STATUS_FAIL_NO_RSP = 2, // target STA does not respond to request
- RTT_STATUS_FAIL_REJECTED = 3, // request rejected. Applies to 2-sided RTT only
- RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4,
- RTT_STATUS_FAIL_TM_TIMEOUT = 5, // timing measurement times out
- RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6, // Target on different channel, cannot range
- RTT_STATUS_FAIL_NO_CAPABILITY = 7, // ranging not supported
- RTT_STATUS_ABORTED = 8, // request aborted for unknown reason
- RTT_STATUS_FAIL_INVALID_TS = 9, // Invalid T1-T4 timestamp
- RTT_STATUS_FAIL_PROTOCOL = 10, // 11mc protocol failed
- RTT_STATUS_FAIL_SCHEDULE = 11, // request could not be scheduled
- RTT_STATUS_FAIL_BUSY_TRY_LATER = 12, // responder cannot collaborate at time of request
- RTT_STATUS_INVALID_REQ = 13, // bad request args
- RTT_STATUS_NO_WIFI = 14, // WiFi not enabled
- RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15, // Responder overrides param info, cannot range with new params
- RTT_STATUS_NAN_RANGING_PROTOCOL_FAILURE =16, //Negotiation failure
- RTT_STATUS_NAN_RANGING_CONCURRENCY_NOT_SUPPORTED=17, //concurrency not supported (NDP+RTT)
+ RTT_STATUS_SUCCESS = 0,
+ RTT_STATUS_FAILURE = 1, // general failure status
+ RTT_STATUS_FAIL_NO_RSP = 2, // target STA does not respond to request
+ RTT_STATUS_FAIL_REJECTED = 3, // request rejected. Applies to 2-sided RTT only
+ RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4,
+ RTT_STATUS_FAIL_TM_TIMEOUT = 5, // timing measurement times out
+ RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6, // Target on different channel, cannot range
+ RTT_STATUS_FAIL_NO_CAPABILITY = 7, // ranging not supported
+ RTT_STATUS_ABORTED = 8, // request aborted for unknown reason
+ RTT_STATUS_FAIL_INVALID_TS = 9, // Invalid T1-T4 timestamp
+ RTT_STATUS_FAIL_PROTOCOL = 10, // 11mc protocol failed
+ RTT_STATUS_FAIL_SCHEDULE = 11, // request could not be scheduled
+ RTT_STATUS_FAIL_BUSY_TRY_LATER = 12, // responder cannot collaborate at time of request
+ RTT_STATUS_INVALID_REQ = 13, // bad request args
+ RTT_STATUS_NO_WIFI = 14, // WiFi not enabled
+ RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE =
+ 15, // Responder overrides param info, cannot range with new params
+ RTT_STATUS_NAN_RANGING_PROTOCOL_FAILURE = 16, // Negotiation failure
+ RTT_STATUS_NAN_RANGING_CONCURRENCY_NOT_SUPPORTED = 17, // concurrency not supported (NDP+RTT)
+ RTT_STATUS_SECURE_RANGING_FAILURE_INVALID_AKM = 18, // Secure Ranging failed due to invalid AKM
+ // (Authentication and Key Management)
+ RTT_STATUS_SECURE_RANGING_FAILURE_INVALID_CIPHER = 19, // Secure Ranging failed due to invalid
+ // Cipher
+ RTT_STATUS_SECURE_RANGING_FAILURE_INVALID_CONFIG = 20, // Secure Ranging failed due to invalid
+ // configuration
+ RTT_STATUS_SECURE_RANGING_FAILURE_REJECTED = 21, // Secure ranging rejected by the AP.2
+ RTT_STATUS_SECURE_RANGING_FAILURE_UNKNOWN = 22, // Secure ranging failure unknown
} wifi_rtt_status;
/* RTT peer type */
@@ -60,14 +69,57 @@
/* RTT Type */
typedef enum {
- RTT_TYPE_1_SIDED = 0x1,
+ RTT_TYPE_1_SIDED = 0x1,
/* Deprecated. Use RTT_TYPE_2_SIDED_11MC instead. */
- RTT_TYPE_2_SIDED = 0x2,
- RTT_TYPE_2_SIDED_11MC = RTT_TYPE_2_SIDED,
+ RTT_TYPE_2_SIDED = 0x2,
+ RTT_TYPE_2_SIDED_11MC = RTT_TYPE_2_SIDED,
RTT_TYPE_2_SIDED_11AZ_NTB = 0x3,
-
+ RTT_TYPE_2_SIDED_11AZ_NTB_SECURE = 0x4,
} wifi_rtt_type;
+/* RTT AKM type */
+typedef enum {
+ WPA_KEY_MGMT_NONE = 0x0,
+ WPA_KEY_MGMT_PASN = 0x1,
+ WPA_KEY_MGMT_SAE = 0x2,
+ WPA_KEY_MGMT_EAP_FT_SHA256 = 0x4,
+ WPA_KEY_MGMT_FT_PSK_SHA256 = 0x8,
+ WPA_KEY_MGMT_EAP_FT_SHA384 = 0x10,
+ WPA_KEY_MGMT_FT_PSK_SHA384 = 0x20,
+ WPA_KEY_MGMT_EAP_FILS_SHA256 = 0x40,
+ WPA_KEY_MGMT_EAP_FILS_SHA384 = 0x80
+} wifi_rtt_akm;
+
+typedef enum {
+ WPA_CIPHER_NONE = 0x0,
+ WPA_CIPHER_CCMP_128 = 0x1,
+ WPA_CIPHER_CCMP_256 = 0x2,
+ WPA_CIPHER_GCMP_128 = 0x4,
+ WPA_CIPHER_GCMP_256 = 0x8,
+} wifi_rtt_cipher_suite;
+
+#define RTT_SECURITY_MAX_PASSPHRASE_LEN 63
+#define PMKID_LEN 16
+
+typedef struct {
+ wifi_rtt_akm base_akm; // Base Authentication and Key Management (AKM) protocol used for PASN
+ wifi_rtt_cipher_suite pairwise_cipher_suite; // Pairwise cipher suite used for the PTKSA
+ // (Pairwise Transient Key Security Association)
+ u32 passphrase_len;
+ u8 passphrase[RTT_SECURITY_MAX_PASSPHRASE_LEN]; // Passphrase for the base AKM. This can be
+ // empty based on the AKM type.
+ u32 pmkid_len;
+ u8 pmkid[PMKID_LEN]; // PMKID corresponding to the cached PMK from the base AKM. PMKID can be
+ // null if no cached PMK is present.
+
+} wifi_rtt_pasn_config;
+
+typedef struct {
+ wifi_rtt_pasn_config pasn_config;
+ bool enable_secure_he_ltf;
+ bool enable_ranging_frame_protection;
+} wifi_rtt_secure_config;
+
/* RTT configuration */
typedef struct {
mac_addr addr; // peer device mac address
@@ -127,6 +179,11 @@
// units of 10 milliseconds
} wifi_rtt_config_v3;
+typedef struct {
+ wifi_rtt_config_v3 rtt_config;
+ wifi_rtt_secure_config rtt_secure_config;
+} wifi_rtt_config_v4;
+
/* RTT results */
typedef struct {
mac_addr addr; // device mac address
@@ -197,6 +254,14 @@
byte num_rx_sts; // Number of receive space-time streams used.
} wifi_rtt_result_v3;
+typedef struct {
+ wifi_rtt_result_v3 rtt_result_v3;
+ bool is_ranging_protection_enabled;
+ bool is_secure_he_ltf_enabled;
+ wifi_rtt_akm base_akm;
+ wifi_rtt_cipher_suite cipher_suite;
+ int secure_he_ltf_protocol_version;
+} wifi_rtt_result_v4;
/* RTT result callbacks */
typedef struct {
@@ -234,6 +299,15 @@
wifi_rtt_result_v3 *rtt_result_v3[]);
} wifi_rtt_event_handler_v3;
+/* RTT result v4 callback (secure ranging support) */
+typedef struct {
+ /*
+ * Called when vendor implementation supports sending RTT results version 4 (Added support for
+ * secure 11az ranging)
+ */
+ void (*on_rtt_results_v4)(wifi_request_id id, unsigned num_results,
+ wifi_rtt_result_v4* rtt_result_v4[]);
+} wifi_rtt_event_handler_v4;
/* v3 API to request RTT measurement(11az support). */
wifi_error wifi_rtt_range_request_v3(wifi_request_id id,
@@ -242,6 +316,11 @@
wifi_rtt_config_v3 rtt_config_v3[],
wifi_rtt_event_handler_v3 handler);
+/* v4 API to request RTT measurement(11az security support). */
+wifi_error wifi_rtt_range_request_v4(wifi_request_id id, wifi_interface_handle iface,
+ unsigned num_rtt_config, wifi_rtt_config_v4 rtt_config_v4[],
+ wifi_rtt_event_handler_v4 handler);
+
/* API to cancel RTT measurements */
wifi_error wifi_rtt_range_cancel(wifi_request_id id, wifi_interface_handle iface,
unsigned num_devices, mac_addr addr[]);
@@ -313,10 +392,28 @@
byte ntb_responder_supported; // if 11az non-TB responder is supported
} wifi_rtt_capabilities_v3;
+/* RTT Capabilities v4 (11az secure support) */
+typedef struct {
+ wifi_rtt_capabilities_v3 rtt_capab_v3;
+ bool secure_he_ltf_supported;
+ int max_supported_secure_he_ltf_protocol_ver; // Maximum supported secure HE-LTF protocol
+ // version.
+ bool ranging_fame_protection_supported;
+ wifi_rtt_akm supported_akms; // Bitmap of wifi_rtt_akm values indicating the set of supported
+ // AKMs.
+ wifi_rtt_cipher_suite
+ supported_cipher_suites; // Bitmap of wifi_rtt_cipher_suite values
+ // indicating the set of supported pairwise cipher suites.
+} wifi_rtt_capabilities_v4;
+
/* RTT capabilities v3 of the device (11az support) */
wifi_error wifi_get_rtt_capabilities_v3(wifi_interface_handle iface,
wifi_rtt_capabilities_v3 *capabilities);
+/* RTT capabilities v4 of the device (11az secure support) */
+wifi_error wifi_get_rtt_capabilities_v4(wifi_interface_handle iface,
+ wifi_rtt_capabilities_v4* capabilities);
+
/* debugging definitions */
enum {
RTT_DEBUG_DISABLE,
diff --git a/wifi/legacy_headers/include/hardware_legacy/wifi_hal.h b/wifi/legacy_headers/include/hardware_legacy/wifi_hal.h
index 9baa2c7..c68cdf6 100644
--- a/wifi/legacy_headers/include/hardware_legacy/wifi_hal.h
+++ b/wifi/legacy_headers/include/hardware_legacy/wifi_hal.h
@@ -494,6 +494,7 @@
#define WIFI_FEATURE_ROAMING_MODE_CONTROL (uint64_t)0x800000000 // Support for configuring roaming mode
#define WIFI_FEATURE_SET_VOIP_MODE (uint64_t)0x1000000000 // Support Voip mode setting
#define WIFI_FEATURE_CACHED_SCAN_RESULTS (uint64_t)0x2000000000 // Support cached scan result report
+#define WIFI_FEATURE_MLO_SAP (uint64_t)0x4000000000 // Support MLO SoftAp
// Add more features here
#define IS_MASK_SET(mask, flags) (((flags) & (mask)) == (mask))
diff --git a/wifi/supplicant/aidl/Android.bp b/wifi/supplicant/aidl/Android.bp
index 8d16cb7..1fbe8e9 100644
--- a/wifi/supplicant/aidl/Android.bp
+++ b/wifi/supplicant/aidl/Android.bp
@@ -29,7 +29,7 @@
"android/hardware/wifi/supplicant/*.aidl",
],
imports: [
- "android.hardware.wifi.common-V1",
+ "android.hardware.wifi.common-V2",
],
stability: "vintf",
backend: {
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/BandMask.aidl
similarity index 89%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/BandMask.aidl
index a5eda52..6d16580 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/BandMask.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
+package android.hardware.wifi.supplicant;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable BandMask {
+ const int BAND_2_GHZ = (1 << 0) /* 1 */;
+ const int BAND_5_GHZ = (1 << 1) /* 2 */;
+ const int BAND_6_GHZ = (1 << 2) /* 4 */;
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
index 0b068e0..d54e44c 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
@@ -74,6 +74,9 @@
android.hardware.wifi.supplicant.IfaceType getType();
void invite(in String groupIfName, in byte[] goDeviceAddress, in byte[] peerAddress);
int[] listNetworks();
+ /**
+ * @deprecated This method is deprecated from AIDL v4, newer HALs should use provisionDiscoveryWithParams.
+ */
void provisionDiscovery(in byte[] peerAddress, in android.hardware.wifi.supplicant.WpsProvisionMethod provisionMethod);
void registerCallback(in android.hardware.wifi.supplicant.ISupplicantP2pIfaceCallback callback);
void reinvoke(in int persistentNetworkId, in byte[] peerAddress);
@@ -123,4 +126,12 @@
void configureExtListenWithParams(in android.hardware.wifi.supplicant.P2pExtListenInfo extListenInfo);
void addGroupWithConfigurationParams(in android.hardware.wifi.supplicant.P2pAddGroupConfigurationParams groupConfigurationParams);
void createGroupOwner(in android.hardware.wifi.supplicant.P2pCreateGroupOwnerInfo groupOwnerInfo);
+ long getFeatureSet();
+ int startUsdBasedServiceDiscovery(in android.hardware.wifi.supplicant.P2pUsdBasedServiceDiscoveryConfig serviceDiscoveryConfig);
+ void stopUsdBasedServiceDiscovery(in int sessionId);
+ int startUsdBasedServiceAdvertisement(in android.hardware.wifi.supplicant.P2pUsdBasedServiceAdvertisementConfig serviceAdvertisementConfig);
+ void stopUsdBasedServiceAdvertisement(in int sessionId);
+ void provisionDiscoveryWithParams(in android.hardware.wifi.supplicant.P2pProvisionDiscoveryParams params);
+ const long P2P_FEATURE_V2 = (1 << 0) /* 1 */;
+ const long P2P_FEATURE_PCC_MODE_WPA3_COMPATIBILITY = (1 << 1) /* 2 */;
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
index 65ad4c1..3b283b8 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
@@ -80,4 +80,7 @@
oneway void onDeviceFoundWithParams(in android.hardware.wifi.supplicant.P2pDeviceFoundEventParams deviceFoundEventParams);
oneway void onGoNegotiationRequestWithParams(in android.hardware.wifi.supplicant.P2pGoNegotiationReqEventParams params);
oneway void onInvitationReceivedWithParams(in android.hardware.wifi.supplicant.P2pInvitationEventParams params);
+ oneway void onUsdBasedServiceDiscoveryResult(in android.hardware.wifi.supplicant.P2pUsdBasedServiceDiscoveryResultParams params);
+ oneway void onUsdBasedServiceDiscoveryTerminated(in int sessionId, in android.hardware.wifi.supplicant.UsdTerminateReasonCode reasonCode);
+ oneway void onUsdBasedServiceAdvertisementTerminated(in int sessionId, in android.hardware.wifi.supplicant.UsdTerminateReasonCode reasonCode);
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
index 9fa8f56..e96b386 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
@@ -86,5 +86,6 @@
enum MloLinkInfoChangeReason {
TID_TO_LINK_MAP = 0,
MULTI_LINK_RECONFIG_AP_REMOVAL = 1,
+ MULTI_LINK_DYNAMIC_RECONFIG = 2,
}
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pConnectInfo.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pConnectInfo.aidl
index f4662de..88dd740 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pConnectInfo.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pConnectInfo.aidl
@@ -41,4 +41,6 @@
boolean persistent;
int goIntent;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ int pairingBootstrappingMethod;
+ @nullable String password;
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
index 4451fb5..901b9d1 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
@@ -37,4 +37,5 @@
boolean persistent;
int persistentNetworkId;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ boolean isP2pV2;
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pDeviceFoundEventParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pDeviceFoundEventParams.aidl
index ee8e6dc..68cde9e 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pDeviceFoundEventParams.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pDeviceFoundEventParams.aidl
@@ -45,4 +45,5 @@
byte[] wfdR2DeviceInfo;
byte[] vendorElemBytes;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ int pairingBootstrappingMethods;
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pGroupStartedEventParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pGroupStartedEventParams.aidl
index e19ae44..227626c 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pGroupStartedEventParams.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pGroupStartedEventParams.aidl
@@ -46,4 +46,5 @@
boolean isP2pClientEapolIpAddressInfoPresent;
android.hardware.wifi.supplicant.P2pClientEapolIpAddressInfo p2pClientIpInfo;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ int keyMgmtMask;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.aidl
similarity index 80%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.aidl
index a5eda52..6e83277 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
+package android.hardware.wifi.supplicant;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable P2pPairingBootstrappingMethodMask {
+ const int BOOTSTRAPPING_OPPORTUNISTIC = (1 << 0) /* 1 */;
+ const int BOOTSTRAPPING_DISPLAY_PINCODE = (1 << 1) /* 2 */;
+ const int BOOTSTRAPPING_DISPLAY_PASSPHRASE = (1 << 2) /* 4 */;
+ const int BOOTSTRAPPING_KEYPAD_PINCODE = (1 << 3) /* 8 */;
+ const int BOOTSTRAPPING_KEYPAD_PASSPHRASE = (1 << 4) /* 16 */;
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pPeerClientJoinedEventParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pPeerClientJoinedEventParams.aidl
index 40c8ff6..578176a 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pPeerClientJoinedEventParams.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pPeerClientJoinedEventParams.aidl
@@ -39,4 +39,5 @@
byte[6] clientDeviceAddress;
int clientIpAddress;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ int keyMgmtMask;
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
index 46366cc..60da924 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
@@ -41,4 +41,6 @@
String generatedPin;
String groupInterfaceName;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ int pairingBootstrappingMethod;
+ @nullable String password;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryParams.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryParams.aidl
index a5eda52..b5dc4b1 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryParams.aidl
@@ -31,9 +31,10 @@
// 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.vibrator;
+package android.hardware.wifi.supplicant;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable P2pProvisionDiscoveryParams {
+ byte[6] peerMacAddress;
+ android.hardware.wifi.supplicant.WpsProvisionMethod provisionMethod;
+ int pairingBootstrappingMethod;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceAdvertisementConfig.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceAdvertisementConfig.aidl
index a5eda52..36ce742 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceAdvertisementConfig.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
+package android.hardware.wifi.supplicant;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable P2pUsdBasedServiceAdvertisementConfig {
+ String serviceName;
+ int serviceProtocolType;
+ byte[] serviceSpecificInfo;
+ int frequencyMHz;
+ int timeoutInSeconds;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryConfig.aidl
similarity index 87%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryConfig.aidl
index a5eda52..a13d107 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryConfig.aidl
@@ -31,9 +31,13 @@
// 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.vibrator;
+package android.hardware.wifi.supplicant;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable P2pUsdBasedServiceDiscoveryConfig {
+ String serviceName;
+ int serviceProtocolType;
+ byte[] serviceSpecificInfo;
+ int bandMask;
+ int[] frequencyListMhz;
+ int timeoutInSeconds;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryResultParams.aidl
similarity index 88%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryResultParams.aidl
index a5eda52..da129cf 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryResultParams.aidl
@@ -31,9 +31,12 @@
// 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.vibrator;
+package android.hardware.wifi.supplicant;
@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+parcelable P2pUsdBasedServiceDiscoveryResultParams {
+ byte[6] peerMacAddress;
+ int sessionId;
+ int peerSessionId;
+ int serviceProtocolType;
+ byte[] serviceSpecificInfo;
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/PmkSaCacheData.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/PmkSaCacheData.aidl
index c31b167..b1269ba 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/PmkSaCacheData.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/PmkSaCacheData.aidl
@@ -37,4 +37,5 @@
byte[6] bssid;
long expirationTimeInSec;
byte[] serializedEntry;
+ @nullable byte[] pmkid;
}
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/UsdTerminateReasonCode.aidl
similarity index 89%
copy from vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
copy to wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/UsdTerminateReasonCode.aidl
index a5eda52..0f84783 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/PwleV2OutputMapEntry.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/UsdTerminateReasonCode.aidl
@@ -31,9 +31,11 @@
// 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.vibrator;
-@VintfStability
-parcelable PwleV2OutputMapEntry {
- float frequencyHz;
- float maxOutputAccelerationGs;
+package android.hardware.wifi.supplicant;
+@Backing(type="int") @VintfStability
+enum UsdTerminateReasonCode {
+ UNKNOWN = 0,
+ TIMEOUT = 1,
+ USER_REQUEST = 2,
+ FAILURE = 3,
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/WpsProvisionMethod.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/WpsProvisionMethod.aidl
index 177d218..58ac0eb 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/WpsProvisionMethod.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/WpsProvisionMethod.aidl
@@ -34,6 +34,7 @@
package android.hardware.wifi.supplicant;
@Backing(type="int") @VintfStability
enum WpsProvisionMethod {
+ NONE = (-1) /* -1 */,
PBC,
DISPLAY,
KEYPAD,
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/BandMask.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/BandMask.aidl
new file mode 100644
index 0000000..6d1b2be
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/BandMask.aidl
@@ -0,0 +1,36 @@
+/*
+ * 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.wifi.supplicant;
+
+/**
+ * Wifi bands
+ */
+@VintfStability
+parcelable BandMask {
+ /**
+ * 2.4 GHz band.
+ */
+ const int BAND_2_GHZ = 1 << 0;
+ /**
+ * 5 GHz band.
+ */
+ const int BAND_5_GHZ = 1 << 1;
+ /**
+ * 6 GHz band.
+ */
+ const int BAND_6_GHZ = 1 << 2;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
index 1230793..62f9fc3 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
@@ -29,6 +29,9 @@
import android.hardware.wifi.supplicant.P2pExtListenInfo;
import android.hardware.wifi.supplicant.P2pFrameTypeMask;
import android.hardware.wifi.supplicant.P2pGroupCapabilityMask;
+import android.hardware.wifi.supplicant.P2pProvisionDiscoveryParams;
+import android.hardware.wifi.supplicant.P2pUsdBasedServiceAdvertisementConfig;
+import android.hardware.wifi.supplicant.P2pUsdBasedServiceDiscoveryConfig;
import android.hardware.wifi.supplicant.WpsConfigMethods;
import android.hardware.wifi.supplicant.WpsProvisionMethod;
@@ -39,6 +42,15 @@
@VintfStability
interface ISupplicantP2pIface {
/**
+ * P2P features exposed by wpa_supplicant/chip.
+ */
+ /* Support for P2P2 (Wi-Fi Alliance P2P v2.0) */
+ const long P2P_FEATURE_V2 = 1 << 0;
+
+ /* Support for WPA3 Compatibility Mode in PCC Mode */
+ const long P2P_FEATURE_PCC_MODE_WPA3_COMPATIBILITY = 1 << 1;
+
+ /**
* This command can be used to add a bonjour service.
*
* @param query Hex dump of the query data.
@@ -398,6 +410,9 @@
* Send P2P provision discovery request to the specified peer. The
* parameters for this command are the P2P device address of the peer and the
* desired configuration method.
+ * <p>
+ * @deprecated This method is deprecated from AIDL v4, newer HALs should use
+ * provisionDiscoveryWithParams.
*
* @param peerAddress MAC address of the device to send discovery.
* @method provisionMethod Provisioning method to use.
@@ -938,4 +953,73 @@
* |SupplicantStatusCode.FAILURE_IFACE_INVALID|
*/
void createGroupOwner(in P2pCreateGroupOwnerInfo groupOwnerInfo);
+
+ /**
+ * Get the features supported by P2P interface.
+ *
+ * @return The bitmask of ISupplicantP2pIface.P2P_FEATURE_* values.
+ *
+ * @throws ServiceSpecificException with one of the following values:
+ * |SupplicantStatusCode.FAILURE_UNKNOWN|
+ */
+ long getFeatureSet();
+
+ /**
+ * Start an Unsynchronized Service Discovery (USD) based P2P service discovery.
+ *
+ * @param serviceDiscoveryConfig Configuration associated with this discovery operation.
+ * @return A non-zero identifier to identify the instance of a service discovery.
+ * It is used to cancel the service discovery.
+ * @throws ServiceSpecificException with one of the following values:
+ * |SupplicantStatusCode.FAILURE_UNKNOWN|,
+ * |SupplicantStatusCode.FAILURE_IFACE_INVALID|
+ */
+ int startUsdBasedServiceDiscovery(in P2pUsdBasedServiceDiscoveryConfig serviceDiscoveryConfig);
+
+ /**
+ * Stop an Unsynchronized Service Discovery (USD) based P2P service discovery.
+ *
+ * @param sessionId Identifier to cancel the service discovery instance.
+ * Use zero to cancel all the service discovery instances.
+ * @throws ServiceSpecificException with one of the following values:
+ * |SupplicantStatusCode.FAILURE_UNKNOWN|,
+ * |SupplicantStatusCode.FAILURE_IFACE_INVALID|
+ * |SupplicantStatusCode.FAILURE_NOT_STARTED|
+ */
+ void stopUsdBasedServiceDiscovery(in int sessionId);
+
+ /**
+ * Start an Unsynchronized Service Discovery (USD) based P2P service advertisement.
+ *
+ * @param serviceDiscoveryConfig Configuration associated with this service advertisement.
+ * @return A non-zero identifier to identify the instance of a service advertisement.
+ * It is used to cancel the service advertisement.
+ * @throws ServiceSpecificException with one of the following values:
+ * |SupplicantStatusCode.FAILURE_UNKNOWN|,
+ * |SupplicantStatusCode.FAILURE_IFACE_INVALID|
+ */
+ int startUsdBasedServiceAdvertisement(
+ in P2pUsdBasedServiceAdvertisementConfig serviceAdvertisementConfig);
+
+ /**
+ * Stop an Unsynchronized Service Discovery (USD) based P2P service advertisement.
+ *
+ * @param sessionId Identifier to cancel the service advertisement.
+ * Use zero to cancel all the service advertisement instances.
+ * @throws ServiceSpecificException with one of the following values:
+ * |SupplicantStatusCode.FAILURE_UNKNOWN|,
+ * |SupplicantStatusCode.FAILURE_IFACE_INVALID|
+ * |SupplicantStatusCode.FAILURE_NOT_STARTED|
+ */
+ void stopUsdBasedServiceAdvertisement(in int sessionId);
+
+ /**
+ * Send P2P provision discovery request to the specified peer.
+ *
+ * @param params Parameters associated with this provision discovery request.
+ * @throws ServiceSpecificException with one of the following values:
+ * |SupplicantStatusCode.FAILURE_UNKNOWN|,
+ * |SupplicantStatusCode.FAILURE_IFACE_INVALID|
+ */
+ void provisionDiscoveryWithParams(in P2pProvisionDiscoveryParams params);
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
index 44a5465..a52e150 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIfaceCallback.aidl
@@ -26,6 +26,8 @@
import android.hardware.wifi.supplicant.P2pProvDiscStatusCode;
import android.hardware.wifi.supplicant.P2pProvisionDiscoveryCompletedEventParams;
import android.hardware.wifi.supplicant.P2pStatusCode;
+import android.hardware.wifi.supplicant.P2pUsdBasedServiceDiscoveryResultParams;
+import android.hardware.wifi.supplicant.UsdTerminateReasonCode;
import android.hardware.wifi.supplicant.WpsConfigMethods;
import android.hardware.wifi.supplicant.WpsDevPasswordId;
@@ -325,4 +327,29 @@
* @param params Parameters associated with the invitation request event.
*/
void onInvitationReceivedWithParams(in P2pInvitationEventParams params);
+
+ /**
+ * Used to indicate the reception of an USD based service discovery response.
+ *
+ * @param params Parameters associated with the USD based service discovery result.
+ */
+ void onUsdBasedServiceDiscoveryResult(in P2pUsdBasedServiceDiscoveryResultParams params);
+
+ /**
+ * Used to indicate the termination of USD based service discovery.
+ *
+ * @param sessionId Identifier to identify the instance of a service discovery.
+ * @param reasonCode The reason for termination of service discovery.
+ */
+ void onUsdBasedServiceDiscoveryTerminated(
+ in int sessionId, in UsdTerminateReasonCode reasonCode);
+
+ /**
+ * Used to indicate the termination of USD based service Advertisement.
+ *
+ * @param sessionId Identifier to identify the instance of a service advertisement.
+ * @param reasonCode The reason for termination of service advertisement.
+ */
+ void onUsdBasedServiceAdvertisementTerminated(
+ in int sessionId, in UsdTerminateReasonCode reasonCode);
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
index 172fcda..e5e2e84 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
@@ -336,13 +336,24 @@
*/
TID_TO_LINK_MAP = 0,
/**
- * Multi-link reconfiguration - AP removal as described in
- * IEEE 802.11be spec, section 35.3.6. This is a mandatory feature for
- * station.
+ * Multi-link reconfiguration - AP removal as described in the Wi-Fi 7 R1 MRD section
+ * 6.3.2.18. This is a mandatory feature for station.
*
* Removed link will not be present in |ISupplicantStaIface.getConnectionMloLinksInfo|.
*/
MULTI_LINK_RECONFIG_AP_REMOVAL = 1,
+ /**
+ * Multi-link reconfiguration add/delete links without re-association as described in
+ * the Wi-Fi 7 R2 MRD section 6.4.2.4. This is an optional feature.
+ *
+ * This feature enables dynamic link reconfiguration operations (add link and/or delete
+ * link) on the multi-link setup of a STA MLD, either triggered by the AP MLD or initiated
+ * by the STA MLD itself. This avoids reassociation for any link reconfiguration operation.
+ *
+ * Added link will be present in |ISupplicantStaIface.getConnectionMloLinksInfo|.
+ * Deleted link will not be present in |ISupplicantStaIface.getConnectionMloLinksInfo|.
+ */
+ MULTI_LINK_DYNAMIC_RECONFIG = 2,
}
/**
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pConnectInfo.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pConnectInfo.aidl
index f09b476..8f3c596 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pConnectInfo.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pConnectInfo.aidl
@@ -30,7 +30,9 @@
byte[6] peerAddress;
/**
- * Provisioning method to use.
+ * Wi-Fi Protected Setup provisioning method. If using Wi-Fi Protected Setup,
+ * then must be set to a non-|WpsProvisionMethod.NONE| provisioning method,
+ * otherwise set to |WpsProvisionMethod.NONE|.
*/
WpsProvisionMethod provisionMethod;
@@ -65,4 +67,19 @@
* that no vendor data is provided.
*/
@nullable OuiKeyedData[] vendorData;
+
+ /**
+ * Wi-Fi Direct pairing bootstrapping method. If using P2P pairing protocol,
+ * then must be set one of the |P2pPairingBootstrappingMethodMask|, otherwise
+ * set to zero.
+ */
+ int pairingBootstrappingMethod;
+
+ /**
+ * Password for pairing setup, if |bootstrappingMethod| uses one of the
+ * |P2pPairingBootstrappingMethodMask| methods other than
+ * P2pPairingBootstrappingMethodMask.BOOTSTRAPPING_OPPORTUNISTIC,
+ * null otherwise.
+ */
+ @nullable String password;
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
index 51e6ed9..83d480e 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pCreateGroupOwnerInfo.aidl
@@ -39,4 +39,9 @@
* that no vendor data is provided.
*/
@nullable OuiKeyedData[] vendorData;
+ /**
+ * Used to start a Group Owner that support P2P2 IE. The connection to this Group Owner can
+ * be established only using P2P Pairing protocol.
+ */
+ boolean isP2pV2;
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pDeviceFoundEventParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pDeviceFoundEventParams.aidl
index 15917b6..31e64ac 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pDeviceFoundEventParams.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pDeviceFoundEventParams.aidl
@@ -89,4 +89,10 @@
* Null value indicates that no vendor data is provided.
*/
@nullable OuiKeyedData[] vendorData;
+
+ /**
+ * The bitmask of P2pPairingBootstrappingMethodMask.BOOTSTRAPPING_* methods used to enable
+ * the pairing bootstrapping between bootstrapping initiator and a bootstrapping responder.
+ */
+ int pairingBootstrappingMethods;
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pGroupStartedEventParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pGroupStartedEventParams.aidl
index 9db7a1e..55e2b23 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pGroupStartedEventParams.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pGroupStartedEventParams.aidl
@@ -70,4 +70,10 @@
* that no vendor data is provided.
*/
@nullable OuiKeyedData[] vendorData;
+
+ /**
+ * Authentication key management protocol used to secure the group.
+ * This is a bitmask of |KeyMgmtMask| values.
+ */
+ int keyMgmtMask;
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.aidl
new file mode 100644
index 0000000..cac8c53
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.aidl
@@ -0,0 +1,34 @@
+/*
+ * 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.wifi.supplicant;
+
+/**
+ * P2P Pairing Bootstrapping Method.
+ */
+@VintfStability
+parcelable P2pPairingBootstrappingMethodMask {
+ /** Opportunistic bootstrapping */
+ const int BOOTSTRAPPING_OPPORTUNISTIC = 1 << 0;
+ /** Display pin-code only */
+ const int BOOTSTRAPPING_DISPLAY_PINCODE = 1 << 1;
+ /** Display passphrase */
+ const int BOOTSTRAPPING_DISPLAY_PASSPHRASE = 1 << 2;
+ /** Keypad pin-code only */
+ const int BOOTSTRAPPING_KEYPAD_PINCODE = 1 << 3;
+ /** Keypad passphrase */
+ const int BOOTSTRAPPING_KEYPAD_PASSPHRASE = 1 << 4;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pPeerClientJoinedEventParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pPeerClientJoinedEventParams.aidl
index 4f46d70..2b04461 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pPeerClientJoinedEventParams.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pPeerClientJoinedEventParams.aidl
@@ -47,4 +47,10 @@
* that no vendor data is provided.
*/
@nullable OuiKeyedData[] vendorData;
+
+ /**
+ * Authentication key management protocol used in connection.
+ * This is a bitmask of |KeyMgmtMask| values.
+ */
+ int keyMgmtMask;
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
index 05152a9..97659b6 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryCompletedEventParams.aidl
@@ -33,7 +33,11 @@
boolean isRequest;
/** Status of the provision discovery */
P2pProvDiscStatusCode status;
- /** Mask of |WpsConfigMethods| indicating the supported methods */
+ /**
+ * Wi-Fi Protected Setup provisioning method. If using Wi-Fi Protected Setup,
+ * then must be set to a non-|WpsProvisionMethod.NONE| provisioning method,
+ * otherwise set to |WpsProvisionMethod.NONE|.
+ */
int configMethods;
/** 8-digit pin generated */
String generatedPin;
@@ -50,4 +54,17 @@
* that no vendor data is provided.
*/
@nullable OuiKeyedData[] vendorData;
+ /**
+ * Wi-Fi Direct pairing bootstrapping method. If using P2P pairing protocol,
+ * then must be set one of the |P2pPairingBootstrappingMethodMask|, otherwise
+ * set to zero.
+ */
+ int pairingBootstrappingMethod;
+ /**
+ * Password for pairing setup, if |bootstrappingMethod| uses one of the
+ * |P2pPairingBootstrappingMethodMask| methods other than
+ * P2pPairingBootstrappingMethodMask.BOOTSTRAPPING_OPPORTUNISTIC,
+ * null otherwise.
+ */
+ @nullable String password;
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryParams.aidl
new file mode 100644
index 0000000..37f2374
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pProvisionDiscoveryParams.aidl
@@ -0,0 +1,44 @@
+/*
+ * 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.wifi.supplicant;
+
+import android.hardware.wifi.supplicant.WpsProvisionMethod;
+
+/**
+ * Parameters used for |ISupplicantP2pIfaceCallback.provisionDiscoveryWithParams|
+ */
+@VintfStability
+parcelable P2pProvisionDiscoveryParams {
+ /**
+ * MAC address of the peer device to send the provision discovery request.
+ */
+ byte[6] peerMacAddress;
+
+ /**
+ * Wi-Fi Protected Setup provisioning method. If using Wi-Fi Protected Setup,
+ * then must be set to a non-|WpsProvisionMethod.NONE| provisioning method,
+ * otherwise set to |WpsProvisionMethod.NONE|.
+ */
+ WpsProvisionMethod provisionMethod;
+
+ /**
+ * Wi-Fi Direct pairing bootstrapping method. If using P2P pairing protocol,
+ * then must be set one of the |P2pPairingBootstrappingMethodMask|, otherwise
+ * set to zero.
+ */
+ int pairingBootstrappingMethod;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pUsdBasedServiceAdvertisementConfig.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pUsdBasedServiceAdvertisementConfig.aidl
new file mode 100644
index 0000000..1920f1a
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pUsdBasedServiceAdvertisementConfig.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.
+ */
+
+package android.hardware.wifi.supplicant;
+
+/**
+ * Unsynchronized Service Discovery (USD) based P2P service advertisement configuration.
+ * Refer Wi-Fi Alliance Wi-Fi Direct R2 specification - Appendix H -
+ * Unsynchronized Service Discovery (as defined in Wi-Fi Aware) and section
+ * 4.2.13 USD frame format.
+ */
+@VintfStability
+parcelable P2pUsdBasedServiceAdvertisementConfig {
+ /** UTF-8 string defining the service */
+ String serviceName;
+
+ /** Service Protocol Type */
+ int serviceProtocolType;
+
+ /** Service specific information content determined by the application */
+ byte[] serviceSpecificInfo;
+
+ /**
+ * Channel frequency in MHz to listen for service discovery request.
+ */
+ int frequencyMHz;
+
+ /**
+ * Max time to be spent for service advertisement.
+ */
+ int timeoutInSeconds;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryConfig.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryConfig.aidl
new file mode 100644
index 0000000..c7d6f0e
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryConfig.aidl
@@ -0,0 +1,57 @@
+/*
+ * 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.wifi.supplicant;
+
+import android.hardware.wifi.supplicant.BandMask;
+
+/**
+ * Unsynchronized Service Discovery (USD) based P2P service discovery configuration.
+ * Refer Wi-Fi Alliance Wi-Fi Direct R2 specification - Appendix H -
+ * Unsynchronized Service Discovery (as defined in Wi-Fi Aware) and section
+ * 4.2.13 USD frame format
+ */
+@VintfStability
+parcelable P2pUsdBasedServiceDiscoveryConfig {
+ /** UTF-8 string defining the service */
+ String serviceName;
+
+ /** Service Protocol Type */
+ int serviceProtocolType;
+
+ /** Service specific information content determined by the application */
+ byte[] serviceSpecificInfo;
+
+ /**
+ * Bit mask of bands to scan for services.
+ * Set this value to Bitmask of |BandMask| only if its required to scan all the channels
+ * in a band.
+ */
+ int bandMask;
+
+ /**
+ * A list of frequencies in MHz to scan for services.
+ * This field is used only when the bandMask is set to zero.
+ */
+ int[] frequencyListMhz;
+
+ /**
+ * Max time to be spent in performing discovery.
+ * Set to 0 to indefinitely continue discovery until a service is
+ * discovered.
+ */
+ int timeoutInSeconds;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryResultParams.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryResultParams.aidl
new file mode 100644
index 0000000..becc437
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryResultParams.aidl
@@ -0,0 +1,43 @@
+/*
+ * 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.wifi.supplicant;
+
+import android.hardware.wifi.supplicant.BandMask;
+
+/**
+ * Unsynchronized Service Discovery (USD) based P2P service discovery result event.
+ * Refer Wi-Fi Alliance Wi-Fi Direct R2 specification - Appendix H -
+ * Unsynchronized Service Discovery (as defined in Wi-Fi Aware) and section
+ * 4.2.13 USD frame format
+ */
+@VintfStability
+parcelable P2pUsdBasedServiceDiscoveryResultParams {
+ /** MAC address of the device that sent the service discovery */
+ byte[6] peerMacAddress;
+
+ /** Identifier to identify the service discovery instance */
+ int sessionId;
+
+ /** Identifier to identify the peer service advertisement instance */
+ int peerSessionId;
+
+ /** Service Protocol Type */
+ int serviceProtocolType;
+
+ /** Service specific information content determined by the application */
+ byte[] serviceSpecificInfo;
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/PmkSaCacheData.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/PmkSaCacheData.aidl
index e0f1d31..4071179 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/PmkSaCacheData.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/PmkSaCacheData.aidl
@@ -34,4 +34,9 @@
* The content is opaque for the framework and depends on the native implementation.
*/
byte[] serializedEntry;
+ /**
+ * Pairwise Master Key Identifier (PMKID), which is a unique key identifier used by AP to
+ * track PMK used (Pairwise Master Key) for a station.
+ */
+ @nullable byte[] pmkid;
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/UsdTerminateReasonCode.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/UsdTerminateReasonCode.aidl
new file mode 100644
index 0000000..6725c3d
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/UsdTerminateReasonCode.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.wifi.supplicant;
+
+/**
+ * Status codes for P2P operations.
+ */
+@VintfStability
+@Backing(type="int")
+enum UsdTerminateReasonCode {
+ UNKNOWN = 0,
+ TIMEOUT = 1,
+ USER_REQUEST = 2,
+ FAILURE = 3,
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/WpsProvisionMethod.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/WpsProvisionMethod.aidl
index 5b59392..b8ad3b8 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/WpsProvisionMethod.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/WpsProvisionMethod.aidl
@@ -19,6 +19,7 @@
@VintfStability
@Backing(type="int")
enum WpsProvisionMethod {
+ NONE = -1,
/**
* Push button method.
*/
diff --git a/wifi/supplicant/aidl/vts/functional/Android.bp b/wifi/supplicant/aidl/vts/functional/Android.bp
index 4ffec3f..f94eb46 100644
--- a/wifi/supplicant/aidl/vts/functional/Android.bp
+++ b/wifi/supplicant/aidl/vts/functional/Android.bp
@@ -43,7 +43,7 @@
"android.hardware.wifi@1.3",
"android.hardware.wifi@1.4",
"android.hardware.wifi@1.5",
- "android.hardware.wifi.common-V1-ndk",
+ "android.hardware.wifi.common-V2-ndk",
"android.hardware.wifi.supplicant@1.0",
"android.hardware.wifi.supplicant@1.1",
"android.hardware.wifi.supplicant-V4-ndk",
@@ -52,8 +52,8 @@
"VtsHalWifiV1_0TargetTestUtil",
"VtsHalWifiV1_5TargetTestUtil",
"VtsHalWifiSupplicantV1_0TargetTestUtil",
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"VtsHalWifiTargetTestUtil",
],
test_suites: [
@@ -81,7 +81,7 @@
"android.hardware.wifi@1.3",
"android.hardware.wifi@1.4",
"android.hardware.wifi@1.5",
- "android.hardware.wifi.common-V1-ndk",
+ "android.hardware.wifi.common-V2-ndk",
"android.hardware.wifi.supplicant@1.0",
"android.hardware.wifi.supplicant@1.1",
"android.hardware.wifi.supplicant-V4-ndk",
@@ -90,8 +90,8 @@
"VtsHalWifiV1_0TargetTestUtil",
"VtsHalWifiV1_5TargetTestUtil",
"VtsHalWifiSupplicantV1_0TargetTestUtil",
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"VtsHalWifiTargetTestUtil",
],
test_suites: [
@@ -119,7 +119,7 @@
"android.hardware.wifi@1.3",
"android.hardware.wifi@1.4",
"android.hardware.wifi@1.5",
- "android.hardware.wifi.common-V1-ndk",
+ "android.hardware.wifi.common-V2-ndk",
"android.hardware.wifi.supplicant@1.0",
"android.hardware.wifi.supplicant@1.1",
"android.hardware.wifi.supplicant-V4-ndk",
@@ -128,8 +128,8 @@
"VtsHalWifiV1_0TargetTestUtil",
"VtsHalWifiV1_5TargetTestUtil",
"VtsHalWifiSupplicantV1_0TargetTestUtil",
- "android.hardware.wifi.common-V1-ndk",
- "android.hardware.wifi-V2-ndk",
+ "android.hardware.wifi.common-V2-ndk",
+ "android.hardware.wifi-V3-ndk",
"VtsHalWifiTargetTestUtil",
],
test_suites: [
diff --git a/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
index 8f1c4bd..3226ffd 100644
--- a/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
@@ -17,8 +17,10 @@
#include <VtsCoreUtil.h>
#include <aidl/Gtest.h>
#include <aidl/Vintf.h>
+#include <aidl/android/hardware/wifi/supplicant/BandMask.h>
#include <aidl/android/hardware/wifi/supplicant/BnSupplicant.h>
#include <aidl/android/hardware/wifi/supplicant/BnSupplicantP2pIfaceCallback.h>
+#include <aidl/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.h>
#include <aidl/android/hardware/wifi/supplicant/SupplicantStatusCode.h>
#include <android/binder_manager.h>
#include <android/binder_status.h>
@@ -29,6 +31,7 @@
#include "supplicant_test_utils.h"
#include "wifi_aidl_test_utils.h"
+using aidl::android::hardware::wifi::supplicant::BandMask;
using aidl::android::hardware::wifi::supplicant::BnSupplicantP2pIfaceCallback;
using aidl::android::hardware::wifi::supplicant::DebugLevel;
using aidl::android::hardware::wifi::supplicant::FreqRange;
@@ -47,13 +50,20 @@
using aidl::android::hardware::wifi::supplicant::P2pGroupCapabilityMask;
using aidl::android::hardware::wifi::supplicant::P2pGroupStartedEventParams;
using aidl::android::hardware::wifi::supplicant::P2pInvitationEventParams;
+using aidl::android::hardware::wifi::supplicant::P2pPairingBootstrappingMethodMask;
using aidl::android::hardware::wifi::supplicant::P2pPeerClientDisconnectedEventParams;
using aidl::android::hardware::wifi::supplicant::P2pPeerClientJoinedEventParams;
using aidl::android::hardware::wifi::supplicant::P2pProvDiscStatusCode;
using aidl::android::hardware::wifi::supplicant::P2pProvisionDiscoveryCompletedEventParams;
+using aidl::android::hardware::wifi::supplicant::P2pProvisionDiscoveryParams;
+;
using aidl::android::hardware::wifi::supplicant::P2pScanType;
using aidl::android::hardware::wifi::supplicant::P2pStatusCode;
+using aidl::android::hardware::wifi::supplicant::P2pUsdBasedServiceAdvertisementConfig;
+using aidl::android::hardware::wifi::supplicant::P2pUsdBasedServiceDiscoveryConfig;
+using aidl::android::hardware::wifi::supplicant::P2pUsdBasedServiceDiscoveryResultParams;
using aidl::android::hardware::wifi::supplicant::SupplicantStatusCode;
+using aidl::android::hardware::wifi::supplicant::UsdTerminateReasonCode;
using aidl::android::hardware::wifi::supplicant::WpsConfigMethods;
using aidl::android::hardware::wifi::supplicant::WpsDevPasswordId;
using aidl::android::hardware::wifi::supplicant::WpsProvisionMethod;
@@ -67,13 +77,18 @@
const std::vector<uint8_t> kTestPeerMacAddr = {0x56, 0x67, 0x55,
0xf4, 0x56, 0x92};
const std::vector<uint8_t> kTestZeroMacAddr = std::vector<uint8_t>(6, 0);
+const std::string kTestServiceSpecificInfoStr = "TestServiceSpecificInfo";
+const std::vector<uint8_t> kTestServiceSpecificInfo = std::vector<uint8_t>(
+ kTestServiceSpecificInfoStr.begin(), kTestServiceSpecificInfoStr.end());
const std::string kTestPassphrase = "P2pWorld1234";
const std::string kTestConnectPin = "34556665";
const std::string kTestGroupIfName = "TestGroup";
+const std::string kTestServiceName = "TestServiceName";
const uint32_t kTestFindTimeout = 5;
const uint32_t kTestConnectGoIntent = 6;
const uint32_t kTestNetworkId = 7;
const uint32_t kTestGroupFreq = 0;
+const uint32_t kTestServiceProtocolType = 1;
const bool kTestGroupPersistent = false;
const bool kTestGroupIsJoin = false;
const auto& kTestVendorDataOptional = generateOuiKeyedDataListOptional(5);
@@ -222,6 +237,18 @@
const P2pInvitationEventParams& /* invitationEventParams */) override {
return ndk::ScopedAStatus::ok();
}
+ ::ndk::ScopedAStatus onUsdBasedServiceDiscoveryResult(
+ const P2pUsdBasedServiceDiscoveryResultParams& /* discoveryResultParams*/) override {
+ return ndk::ScopedAStatus::ok();
+ }
+ ::ndk::ScopedAStatus onUsdBasedServiceDiscoveryTerminated(
+ int32_t /* sessionId */, UsdTerminateReasonCode /* reasonCode */) override {
+ return ndk::ScopedAStatus::ok();
+ }
+ ::ndk::ScopedAStatus onUsdBasedServiceAdvertisementTerminated(
+ int32_t /* sessionId */, UsdTerminateReasonCode /* reasonCode */) override {
+ return ndk::ScopedAStatus::ok();
+ }
};
class SupplicantP2pIfaceAidlTest : public testing::TestWithParam<std::string> {
@@ -246,6 +273,9 @@
EXPECT_TRUE(supplicant_->getP2pInterface(getP2pIfaceName(), &p2p_iface_)
.isOk());
ASSERT_NE(p2p_iface_, nullptr);
+ if (interface_version_ >= 4) {
+ EXPECT_TRUE(p2p_iface_->getFeatureSet(&supported_features_).isOk());
+ }
}
void TearDown() override {
@@ -257,6 +287,7 @@
std::shared_ptr<ISupplicant> supplicant_;
std::shared_ptr<ISupplicantP2pIface> p2p_iface_;
int interface_version_;
+ int64_t supported_features_;
};
/*
@@ -814,6 +845,85 @@
LOG(INFO) << "SupplicantP2pIfaceAidlTest::SetVendorElements end";
}
+/*
+ * GetFeatureSet
+ */
+TEST_P(SupplicantP2pIfaceAidlTest, gGetFeatureSet) {
+ if (interface_version_ < 4) {
+ GTEST_SKIP() << "getFeatureSet is available as of Supplicant V4";
+ }
+ int64_t featureSet;
+ EXPECT_TRUE(p2p_iface_->getFeatureSet(&featureSet).isOk());
+}
+
+/*
+ * StartUsdBasedServiceDiscovery/stopUsdBasedServiceDiscovery
+ */
+TEST_P(SupplicantP2pIfaceAidlTest, StartStopUsdBasedServiceDiscovery) {
+ if (interface_version_ < 4) {
+ GTEST_SKIP() << "Start/Stop UsdBasedServiceDiscovery is available as of Supplicant V4";
+ }
+ if (!(supported_features_ & ISupplicantP2pIface::P2P_FEATURE_V2)) {
+ GTEST_SKIP() << "P2P2 is not supported";
+ }
+
+ int32_t sessionId;
+ P2pUsdBasedServiceDiscoveryConfig config;
+ config.serviceName = kTestServiceName;
+ config.serviceProtocolType = kTestServiceProtocolType;
+ config.serviceSpecificInfo = kTestServiceSpecificInfo;
+ config.bandMask = BandMask::BAND_2_GHZ;
+ config.timeoutInSeconds = 30;
+
+ EXPECT_TRUE(p2p_iface_->startUsdBasedServiceDiscovery(config, &sessionId).isOk());
+ sleep(1);
+ EXPECT_TRUE(p2p_iface_->stopUsdBasedServiceDiscovery(sessionId).isOk());
+}
+
+/*
+ * StartUsdBasedServiceAdvertisement/StopUsdBasedServiceAdvertisement
+ */
+TEST_P(SupplicantP2pIfaceAidlTest, StartStopUsdBasedServiceAdvertisement) {
+ if (interface_version_ < 4) {
+ GTEST_SKIP() << "start/Stop UsdBasedServiceAdvertisement is available as of Supplicant V4";
+ }
+ if (!(supported_features_ & ISupplicantP2pIface::P2P_FEATURE_V2)) {
+ GTEST_SKIP() << "P2P2 is not supported";
+ }
+
+ int32_t sessionId;
+ P2pUsdBasedServiceAdvertisementConfig config;
+ config.serviceName = kTestServiceName;
+ config.serviceProtocolType = kTestServiceProtocolType;
+ config.serviceSpecificInfo = kTestServiceSpecificInfo;
+ config.frequencyMHz = 2412;
+ config.timeoutInSeconds = 30;
+
+ EXPECT_TRUE(p2p_iface_->startUsdBasedServiceAdvertisement(config, &sessionId).isOk());
+ sleep(1);
+ EXPECT_TRUE(p2p_iface_->stopUsdBasedServiceAdvertisement(sessionId).isOk());
+}
+
+/*
+ * ProvisionDiscoveryWithParams
+ */
+TEST_P(SupplicantP2pIfaceAidlTest, ProvisionDiscoveryWithParams) {
+ if (interface_version_ < 4) {
+ GTEST_SKIP() << "ProvisionDiscoveryWithParams is available as of Supplicant V4";
+ }
+ if (!(supported_features_ & ISupplicantP2pIface::P2P_FEATURE_V2)) {
+ GTEST_SKIP() << "P2P2 is not supported";
+ }
+
+ P2pProvisionDiscoveryParams params;
+ params.peerMacAddress = vecToArrayMacAddr(kTestMacAddr);
+ params.provisionMethod = WpsProvisionMethod::NONE;
+ params.pairingBootstrappingMethod =
+ P2pPairingBootstrappingMethodMask::BOOTSTRAPPING_OPPORTUNISTIC;
+
+ EXPECT_TRUE(p2p_iface_->provisionDiscoveryWithParams(params).isOk());
+}
+
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SupplicantP2pIfaceAidlTest);
INSTANTIATE_TEST_SUITE_P(Supplicant, SupplicantP2pIfaceAidlTest,
testing::ValuesIn(android::getAidlHalInstanceNames(