Merge "Add audio device type MULTICHANNEL_GROUP" into main
diff --git a/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp b/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp
index f89cb40..a0e43bc 100644
--- a/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp
@@ -48,27 +48,23 @@
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int, Visualizer::ScalingMode,
Visualizer::MeasurementMode, int>;
-class VisualizerParamTest : public ::testing::TestWithParam<VisualizerParamTestParam>,
- public EffectHelper {
+class VisualizerTestHelper : public EffectHelper {
public:
- VisualizerParamTest()
- : mCaptureSize(std::get<PARAM_CAPTURE_SIZE>(GetParam())),
- mScalingMode(std::get<PARAM_SCALING_MODE>(GetParam())),
- mMeasurementMode(std::get<PARAM_MEASUREMENT_MODE>(GetParam())),
- mLatency(std::get<PARAM_LATENCY>(GetParam())) {
- std::tie(mFactory, mDescriptor) = std::get<PARAM_INSTANCE_NAME>(GetParam());
-
- size_t channelCount =
- getChannelCount(AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
- AudioChannelLayout::LAYOUT_STEREO));
- mBufferSizeInFrames = kInputFrameCount * channelCount;
- mInputBuffer.resize(mBufferSizeInFrames);
- generateInputBuffer(mInputBuffer, 0, true, channelCount, kMaxAudioSampleValue);
-
- mOutputBuffer.resize(mBufferSizeInFrames);
+ VisualizerTestHelper(
+ std::pair<std::shared_ptr<IFactory>, Descriptor> descPair = {}, int captureSize = 128,
+ int latency = 0,
+ Visualizer::ScalingMode scalingMode = Visualizer::ScalingMode::NORMALIZED,
+ Visualizer::MeasurementMode measurementMode = Visualizer::MeasurementMode::NONE)
+ : mCaptureSize(captureSize),
+ mLatency(latency),
+ mScalingMode(scalingMode),
+ mMeasurementMode(measurementMode),
+ mInputBuffer(mBufferSizeInFrames),
+ mOutputBuffer(mBufferSizeInFrames) {
+ std::tie(mFactory, mDescriptor) = descPair;
}
- void SetUp() override {
+ void SetUpVisualizer() {
ASSERT_NE(nullptr, mFactory);
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
@@ -80,28 +76,14 @@
mVersion = EffectFactoryHelper::getHalVersion(mFactory);
}
- void TearDown() override {
+ void TearDownVisualizer() {
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
mOpenEffectReturn = IEffect::OpenEffectReturn{};
}
- static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
- std::shared_ptr<IFactory> mFactory;
- std::shared_ptr<IEffect> mEffect;
- Descriptor mDescriptor;
- int mCaptureSize;
- Visualizer::ScalingMode mScalingMode = Visualizer::ScalingMode::NORMALIZED;
- Visualizer::MeasurementMode mMeasurementMode = Visualizer::MeasurementMode::NONE;
- int mLatency = 0;
- int mVersion = 0;
- std::vector<float> mInputBuffer;
- std::vector<float> mOutputBuffer;
- size_t mBufferSizeInFrames;
- IEffect::OpenEffectReturn mOpenEffectReturn;
- bool mAllParamsValid = true;
-
- void SetAndGetParameters() {
+ void SetAndGetParameters(bool* allParamsValid = nullptr) {
+ if (allParamsValid != nullptr) *allParamsValid = true;
for (auto& it : mCommonTags) {
auto& tag = it.first;
auto& vs = it.second;
@@ -111,7 +93,9 @@
ASSERT_STATUS(EX_NONE, mEffect->getDescriptor(&desc));
const bool valid = isParameterValid<Visualizer, Range::visualizer>(vs, desc);
const binder_exception_t expected = valid ? EX_NONE : EX_ILLEGAL_ARGUMENT;
- if (expected == EX_ILLEGAL_ARGUMENT) mAllParamsValid = false;
+ if (expected == EX_ILLEGAL_ARGUMENT && allParamsValid != nullptr) {
+ *allParamsValid = false;
+ }
// set parameter
Parameter expectParam;
@@ -155,6 +139,44 @@
{Visualizer::latencyMs, Visualizer::make<Visualizer::latencyMs>(latency)});
}
+ static constexpr long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
+ const size_t mChannelCount =
+ getChannelCount(AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
+ AudioChannelLayout::LAYOUT_STEREO));
+ const size_t mBufferSizeInFrames = kInputFrameCount * mChannelCount;
+ const int mCaptureSize;
+ const int mLatency;
+ const Visualizer::ScalingMode mScalingMode;
+ const Visualizer::MeasurementMode mMeasurementMode;
+ int mVersion;
+ std::vector<float> mInputBuffer;
+ std::vector<float> mOutputBuffer;
+ std::shared_ptr<IEffect> mEffect;
+ std::shared_ptr<IFactory> mFactory;
+ Descriptor mDescriptor;
+ IEffect::OpenEffectReturn mOpenEffectReturn;
+
+ private:
+ std::vector<std::pair<Visualizer::Tag, Visualizer>> mCommonTags;
+ void CleanUp() { mCommonTags.clear(); }
+};
+
+class VisualizerParamTest : public ::testing::TestWithParam<VisualizerParamTestParam>,
+ public VisualizerTestHelper {
+ public:
+ VisualizerParamTest()
+ : VisualizerTestHelper(std::get<PARAM_INSTANCE_NAME>(GetParam()),
+ std::get<PARAM_CAPTURE_SIZE>(GetParam()),
+ std::get<PARAM_LATENCY>(GetParam()),
+ std::get<PARAM_SCALING_MODE>(GetParam()),
+ std::get<PARAM_MEASUREMENT_MODE>(GetParam())) {
+ generateInputBuffer(mInputBuffer, 0, true, mChannelCount, kMaxAudioSampleValue);
+ }
+
+ void SetUp() override { SetUpVisualizer(); }
+
+ void TearDown() override { TearDownVisualizer(); }
+
static std::unordered_set<Visualizer::MeasurementMode> getMeasurementModeValues() {
return {ndk::enum_range<Visualizer::MeasurementMode>().begin(),
ndk::enum_range<Visualizer::MeasurementMode>().end()};
@@ -164,10 +186,6 @@
return {ndk::enum_range<Visualizer::ScalingMode>().begin(),
ndk::enum_range<Visualizer::ScalingMode>().end()};
}
-
- private:
- std::vector<std::pair<Visualizer::Tag, Visualizer>> mCommonTags;
- void CleanUp() { mCommonTags.clear(); }
};
TEST_P(VisualizerParamTest, SetAndGetCaptureSize) {
@@ -192,11 +210,13 @@
TEST_P(VisualizerParamTest, testCaptureSampleBufferSizeAndOutput) {
SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
+
+ bool allParamsValid = true;
ASSERT_NO_FATAL_FAILURE(addCaptureSizeParam(mCaptureSize));
ASSERT_NO_FATAL_FAILURE(addScalingModeParam(mScalingMode));
ASSERT_NO_FATAL_FAILURE(addMeasurementModeParam(mMeasurementMode));
ASSERT_NO_FATAL_FAILURE(addLatencyParam(mLatency));
- ASSERT_NO_FATAL_FAILURE(SetAndGetParameters());
+ ASSERT_NO_FATAL_FAILURE(SetAndGetParameters(&allParamsValid));
Parameter getParam;
Parameter::Id id;
@@ -209,7 +229,7 @@
&mOpenEffectReturn, mVersion));
ASSERT_EQ(mInputBuffer, mOutputBuffer);
- if (mAllParamsValid) {
+ if (allParamsValid) {
std::vector<uint8_t> captureBuffer = getParam.get<Parameter::specific>()
.get<Parameter::Specific::visualizer>()
.get<Visualizer::captureSampleBuffer>();
diff --git a/audio/aidl/vts/VtsHalVolumeTargetTest.cpp b/audio/aidl/vts/VtsHalVolumeTargetTest.cpp
index 2c21d2e..4300801 100644
--- a/audio/aidl/vts/VtsHalVolumeTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalVolumeTargetTest.cpp
@@ -108,16 +108,13 @@
* Here we focus on specific parameter checking, general IEffect interfaces testing performed in
* VtsAudioEffectTargetTest.
*/
-enum ParamName { PARAM_INSTANCE_NAME, PARAM_LEVEL, PARAM_MUTE };
-using VolumeParamTestParam =
- std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int, bool>;
+enum VolumeLevelParamName { PARAM_INSTANCE_NAME, PARAM_LEVEL };
+using VolumeLevelTestParam = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int>;
-class VolumeParamTest : public ::testing::TestWithParam<VolumeParamTestParam>,
- public VolumeControlHelper {
+class VolumeLevelParamTest : public ::testing::TestWithParam<VolumeLevelTestParam>,
+ public VolumeControlHelper {
public:
- VolumeParamTest()
- : mParamLevel(std::get<PARAM_LEVEL>(GetParam())),
- mParamMute(std::get<PARAM_MUTE>(GetParam())) {
+ VolumeLevelParamTest() : mParamLevel(std::get<PARAM_LEVEL>(GetParam())) {
std::tie(mFactory, mDescriptor) = std::get<PARAM_INSTANCE_NAME>(GetParam());
}
@@ -125,13 +122,31 @@
void TearDown() override { TearDownVolumeControl(); }
int mParamLevel = 0;
- bool mParamMute = false;
};
-TEST_P(VolumeParamTest, SetAndGetParams) {
+TEST_P(VolumeLevelParamTest, SetAndGetParams) {
ASSERT_NO_FATAL_FAILURE(
setAndVerifyParameters(Volume::levelDb, mParamLevel,
isLevelValid(mParamLevel) ? EX_NONE : EX_ILLEGAL_ARGUMENT));
+}
+
+enum VolumeMuteParamName { MUTE_PARAM_INSTANCE_NAME, PARAM_MUTE };
+using VolumeMuteTestParam = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, bool>;
+
+class VolumeMuteParamTest : public ::testing::TestWithParam<VolumeMuteTestParam>,
+ public VolumeControlHelper {
+ public:
+ VolumeMuteParamTest() : mParamMute(std::get<PARAM_MUTE>(GetParam())) {
+ std::tie(mFactory, mDescriptor) = std::get<MUTE_PARAM_INSTANCE_NAME>(GetParam());
+ }
+
+ void SetUp() override { ASSERT_NO_FATAL_FAILURE(SetUpVolumeControl()); }
+ void TearDown() override { TearDownVolumeControl(); }
+
+ bool mParamMute = false;
+};
+
+TEST_P(VolumeMuteParamTest, SetAndGetParams) {
ASSERT_NO_FATAL_FAILURE(setAndVerifyParameters(Volume::mute, mParamMute, EX_NONE));
}
@@ -298,25 +313,40 @@
std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> kDescPair;
INSTANTIATE_TEST_SUITE_P(
- VolumeTest, VolumeParamTest,
+ VolumeTest, VolumeLevelParamTest,
::testing::Combine(
testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidVolume())),
testing::ValuesIn(
EffectHelper::getTestValueSet<Volume, int, Range::volume, Volume::levelDb>(
- kDescPair, EffectHelper::expandTestValueBasic<int>)),
- testing::Bool() /* mute */),
- [](const testing::TestParamInfo<VolumeParamTest::ParamType>& info) {
+ kDescPair, EffectHelper::expandTestValueBasic<int>))),
+ [](const testing::TestParamInfo<VolumeLevelParamTest::ParamType>& info) {
auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
std::string level = std::to_string(std::get<PARAM_LEVEL>(info.param));
- std::string mute = std::to_string(std::get<PARAM_MUTE>(info.param));
- std::string name = getPrefix(descriptor) + "_level" + level + "_mute" + mute;
+ std::string name = getPrefix(descriptor) + "_level" + level;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
-GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VolumeParamTest);
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VolumeLevelParamTest);
+
+INSTANTIATE_TEST_SUITE_P(
+ VolumeTest, VolumeMuteParamTest,
+ ::testing::Combine(
+ testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
+ IFactory::descriptor, getEffectTypeUuidVolume())),
+ testing::Bool() /* mute */),
+ [](const testing::TestParamInfo<VolumeMuteParamTest::ParamType>& info) {
+ auto descriptor = std::get<MUTE_PARAM_INSTANCE_NAME>(info.param).second;
+ std::string mute = std::to_string(std::get<PARAM_MUTE>(info.param));
+ std::string name = getPrefix(descriptor) + "_mute" + mute;
+ std::replace_if(
+ name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
+ return name;
+ });
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VolumeMuteParamTest);
INSTANTIATE_TEST_SUITE_P(VolumeTest, VolumeDataTest,
testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
diff --git a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.aidl
new file mode 100644
index 0000000..2685f58
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioDeviceConfiguration.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFadeConfiguration.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFadeConfiguration.aidl
new file mode 100644
index 0000000..0a3c677
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioFadeConfiguration.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZone.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZone.aidl
new file mode 100644
index 0000000..2cb1760
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZone.aidl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneConfig.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneConfig.aidl
new file mode 100644
index 0000000..3fd37bc
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneConfig.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContext.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContext.aidl
new file mode 100644
index 0000000..0f8b946
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContext.aidl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable AudioZoneContext {
+ List<android.hardware.automotive.audiocontrol.AudioZoneContextInfo> audioContextInfos;
+}
diff --git a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.aidl
new file mode 100644
index 0000000..01ab1be
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneContextInfo.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneFadeConfiguration.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneFadeConfiguration.aidl
new file mode 100644
index 0000000..f3f32bf
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/AudioZoneFadeConfiguration.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/DeviceToContextEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/DeviceToContextEntry.aidl
new file mode 100644
index 0000000..923b0bd
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/DeviceToContextEntry.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable DeviceToContextEntry {
+ List<String> contextNames;
+ android.media.audio.common.AudioPort device;
+}
diff --git a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeConfiguration.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeConfiguration.aidl
new file mode 100644
index 0000000..2c978e7
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeConfiguration.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeState.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeState.aidl
new file mode 100644
index 0000000..9b25dfb
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/FadeState.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.aidl
new file mode 100644
index 0000000..901078c
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/RoutingDeviceConfiguration.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+enum RoutingDeviceConfiguration {
+ DEFAULT_AUDIO_ROUTING,
+ DYNAMIC_AUDIO_ROUTING,
+ CONFIGURABLE_AUDIO_ENGINE_ROUTING,
+}
diff --git a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/TransientFadeConfigurationEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/TransientFadeConfigurationEntry.aidl
new file mode 100644
index 0000000..72b247b
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/TransientFadeConfigurationEntry.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfiguration.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfiguration.aidl
new file mode 100644
index 0000000..50b76a1
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfiguration.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.automotive.audiocontrol;
+@JavaDerive(equals=true, toString=true) @VintfStability
+parcelable VolumeActivationConfiguration {
+ @nullable String name;
+ List<android.hardware.automotive.audiocontrol.VolumeActivationConfigurationEntry> volumeActivationEntries;
+}
diff --git a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfigurationEntry.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfigurationEntry.aidl
new file mode 100644
index 0000000..d457e57
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeActivationConfigurationEntry.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeGroupConfig.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeGroupConfig.aidl
new file mode 100644
index 0000000..cc90bbe
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeGroupConfig.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.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/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeInvocationType.aidl b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/android/hardware/automotive/audiocontrol/VolumeInvocationType.aidl
new file mode 100644
index 0000000..8ce8491
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/current/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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.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..6e646a6 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,218 @@
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) {
+ if (!contextInRoute.contains(ToString(context))) {
+ continue;
+ }
+ message = " Context can not repeat for the same DeviceToContextEntry";
+ return false;
+ }
+ 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 +526,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/evs/1.0/vts/functional/Android.bp b/automotive/evs/1.0/vts/functional/Android.bp
index f1b57d7..bad193b 100644
--- a/automotive/evs/1.0/vts/functional/Android.bp
+++ b/automotive/evs/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_perception_virtualization",
// 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"
diff --git a/automotive/evs/1.1/vts/functional/Android.bp b/automotive/evs/1.1/vts/functional/Android.bp
index 18687bf..8f9d5c7 100644
--- a/automotive/evs/1.1/vts/functional/Android.bp
+++ b/automotive/evs/1.1/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_perception_virtualization",
// 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"
diff --git a/automotive/evs/aidl/vts/Android.bp b/automotive/evs/aidl/vts/Android.bp
index e50c913..79905fa 100644
--- a/automotive/evs/aidl/vts/Android.bp
+++ b/automotive/evs/aidl/vts/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_perception_virtualization",
// 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"
diff --git a/automotive/sv/1.0/vts/functional/Android.bp b/automotive/sv/1.0/vts/functional/Android.bp
index e94893c..4ea5aff 100644
--- a/automotive/sv/1.0/vts/functional/Android.bp
+++ b/automotive/sv/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_perception_virtualization",
// 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"
@@ -45,7 +46,10 @@
"android.hidl.memory@1.0",
"libhidlmemory",
],
- test_suites: ["general-tests", "vts"],
+ test_suites: [
+ "general-tests",
+ "vts",
+ ],
cflags: [
"-O0",
"-g",
diff --git a/biometrics/face/1.0/vts/functional/Android.bp b/biometrics/face/1.0/vts/functional/Android.bp
index 259c4ec..4c06121 100644
--- a/biometrics/face/1.0/vts/functional/Android.bp
+++ b/biometrics/face/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_biometrics_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"
diff --git a/biometrics/fingerprint/2.1/vts/functional/Android.bp b/biometrics/fingerprint/2.1/vts/functional/Android.bp
index 68b3360..819feb4 100644
--- a/biometrics/fingerprint/2.1/vts/functional/Android.bp
+++ b/biometrics/fingerprint/2.1/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_biometrics_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"
diff --git a/biometrics/fingerprint/2.2/vts/functional/Android.bp b/biometrics/fingerprint/2.2/vts/functional/Android.bp
index 02f833a..11315fa 100644
--- a/biometrics/fingerprint/2.2/vts/functional/Android.bp
+++ b/biometrics/fingerprint/2.2/vts/functional/Android.bp
@@ -15,6 +15,7 @@
*/
package {
+ default_team: "trendy_team_biometrics_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"
diff --git a/bluetooth/1.0/vts/functional/Android.bp b/bluetooth/1.0/vts/functional/Android.bp
index 768142c..7d76b89 100644
--- a/bluetooth/1.0/vts/functional/Android.bp
+++ b/bluetooth/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_bluetooth",
// 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"
diff --git a/bluetooth/1.1/vts/functional/Android.bp b/bluetooth/1.1/vts/functional/Android.bp
index 7f56647..6b3a3e7 100644
--- a/bluetooth/1.1/vts/functional/Android.bp
+++ b/bluetooth/1.1/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_bluetooth",
// 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"
diff --git a/bluetooth/aidl/vts/Android.bp b/bluetooth/aidl/vts/Android.bp
index c69ced4..a08bdfc 100644
--- a/bluetooth/aidl/vts/Android.bp
+++ b/bluetooth/aidl/vts/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_bluetooth",
// 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"
diff --git a/bluetooth/audio/2.0/vts/functional/Android.bp b/bluetooth/audio/2.0/vts/functional/Android.bp
index f5cb956..65ad8d0 100644
--- a/bluetooth/audio/2.0/vts/functional/Android.bp
+++ b/bluetooth/audio/2.0/vts/functional/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_bluetooth",
// 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"
diff --git a/bluetooth/audio/2.1/vts/functional/Android.bp b/bluetooth/audio/2.1/vts/functional/Android.bp
index cea7326..de858fc 100644
--- a/bluetooth/audio/2.1/vts/functional/Android.bp
+++ b/bluetooth/audio/2.1/vts/functional/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_bluetooth",
// 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"
diff --git a/bluetooth/audio/aidl/vts/Android.bp b/bluetooth/audio/aidl/vts/Android.bp
index 884062a..b0b095d 100644
--- a/bluetooth/audio/aidl/vts/Android.bp
+++ b/bluetooth/audio/aidl/vts/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_bluetooth",
// 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"
diff --git a/bluetooth/finder/aidl/vts/Android.bp b/bluetooth/finder/aidl/vts/Android.bp
index 6b0285e..49d2d45 100644
--- a/bluetooth/finder/aidl/vts/Android.bp
+++ b/bluetooth/finder/aidl/vts/Android.bp
@@ -13,6 +13,7 @@
// limitations under the License.
package {
+ default_team: "trendy_team_bluetooth",
default_applicable_licenses: ["hardware_interfaces_license"],
}
diff --git a/bluetooth/lmp_event/aidl/vts/Android.bp b/bluetooth/lmp_event/aidl/vts/Android.bp
index b89351e..a137434 100644
--- a/bluetooth/lmp_event/aidl/vts/Android.bp
+++ b/bluetooth/lmp_event/aidl/vts/Android.bp
@@ -1,5 +1,6 @@
cc_test {
name: "VtsHalLmpEventTargetTest",
+ team: "trendy_team_bluetooth",
defaults: [
"VtsHalTargetTestDefaults",
"use_libaidlvintf_gtest_helper_static",
diff --git a/bluetooth/ranging/aidl/vts/Android.bp b/bluetooth/ranging/aidl/vts/Android.bp
index ead9992..9984ce8 100644
--- a/bluetooth/ranging/aidl/vts/Android.bp
+++ b/bluetooth/ranging/aidl/vts/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_bluetooth",
default_applicable_licenses: ["hardware_interfaces_license"],
}
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/CameraMetadataTag.aidl b/camera/metadata/aidl/aidl_api/android.hardware.camera.metadata/current/android/hardware/camera/metadata/CameraMetadataTag.aidl
index 9321ec0..8387c81 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,
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/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl b/camera/metadata/aidl/android/hardware/camera/metadata/CameraMetadataTag.aidl
index 236bcaf..98897a2 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
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/cas/1.0/vts/functional/Android.bp b/cas/1.0/vts/functional/Android.bp
index 560230b..1817371 100644
--- a/cas/1.0/vts/functional/Android.bp
+++ b/cas/1.0/vts/functional/Android.bp
@@ -15,7 +15,7 @@
//
package {
- default_team: "trendy_team_android_media_codec_framework",
+ 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"
diff --git a/cas/1.1/vts/functional/Android.bp b/cas/1.1/vts/functional/Android.bp
index b267f53..f95f9b3 100644
--- a/cas/1.1/vts/functional/Android.bp
+++ b/cas/1.1/vts/functional/Android.bp
@@ -15,7 +15,7 @@
//
package {
- default_team: "trendy_team_android_media_codec_framework",
+ 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"
diff --git a/cas/1.2/vts/functional/Android.bp b/cas/1.2/vts/functional/Android.bp
index 0a83ad4..3b1cfb1 100644
--- a/cas/1.2/vts/functional/Android.bp
+++ b/cas/1.2/vts/functional/Android.bp
@@ -15,7 +15,7 @@
//
package {
- default_team: "trendy_team_android_media_codec_framework",
+ 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"
diff --git a/compatibility_matrices/compatibility_matrix.202504.xml b/compatibility_matrices/compatibility_matrix.202504.xml
index aee1d38..6429246 100644
--- a/compatibility_matrices/compatibility_matrix.202504.xml
+++ b/compatibility_matrices/compatibility_matrix.202504.xml
@@ -396,7 +396,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.radio.data</name>
- <version>3</version>
+ <version>3-4</version>
<interface>
<name>IRadioData</name>
<instance>slot1</instance>
@@ -476,7 +476,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.radio.ims.media</name>
- <version>2</version>
+ <version>2-3</version>
<interface>
<name>IImsMedia</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/contexthub/1.0/vts/functional/Android.bp b/contexthub/1.0/vts/functional/Android.bp
index 5949f8d..3bc3597 100644
--- a/contexthub/1.0/vts/functional/Android.bp
+++ b/contexthub/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_context_hub",
// 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"
diff --git a/contexthub/1.1/vts/functional/Android.bp b/contexthub/1.1/vts/functional/Android.bp
index b2961c4..5e0779d 100644
--- a/contexthub/1.1/vts/functional/Android.bp
+++ b/contexthub/1.1/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_context_hub",
// 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"
diff --git a/contexthub/1.2/vts/functional/Android.bp b/contexthub/1.2/vts/functional/Android.bp
index c923f42..cdf348f 100644
--- a/contexthub/1.2/vts/functional/Android.bp
+++ b/contexthub/1.2/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_context_hub",
// 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"
diff --git a/gatekeeper/aidl/software/file_contexts b/gatekeeper/aidl/software/file_contexts
index 23a62ea..cc4180e 100644
--- a/gatekeeper/aidl/software/file_contexts
+++ b/gatekeeper/aidl/software/file_contexts
@@ -1,3 +1,3 @@
(/.*)? u:object_r:vendor_file:s0
/etc(/.*)? u:object_r:vendor_configs_file:s0
-/bin/hw/android\.hardware\.gatekeeper-service\.nonsecure u:object_r:hal_gatekeeper_remote_exec:s0
+/bin/hw/android\.hardware\.gatekeeper-service\.nonsecure u:object_r:hal_gatekeeper_default_exec:s0
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/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..c71c010 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
@@ -97,5 +97,6 @@
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 INVALID_CONFIGURATION = 0x7fffffff;
}
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
index 213e8e9..9650334 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
@@ -93,6 +93,10 @@
* 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;
/**
* Integer.MAX_VALUE is reserved for the invalid configuration.
@@ -558,6 +562,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 +588,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.
*/
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/power/aidl/android/hardware/power/SupportInfo.aidl b/power/aidl/android/hardware/power/SupportInfo.aidl
index 9486f02..46bcdd3 100644
--- a/power/aidl/android/hardware/power/SupportInfo.aidl
+++ b/power/aidl/android/hardware/power/SupportInfo.aidl
@@ -29,7 +29,7 @@
* 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 if a client should be able to index the bitset like
+ * 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.
diff --git a/radio/aidl/Android.bp b/radio/aidl/Android.bp
index f60c484..517ad86 100644
--- a/radio/aidl/Android.bp
+++ b/radio/aidl/Android.bp
@@ -105,7 +105,7 @@
},
],
- frozen: true,
+ frozen: false,
}
aidl_interface {
@@ -320,7 +320,7 @@
stability: "vintf",
imports: [
"android.hardware.radio-V3",
- "android.hardware.radio.data-V3",
+ "android.hardware.radio.data-V4",
],
backend: {
cpp: {
@@ -347,7 +347,7 @@
},
],
- frozen: true,
+ frozen: false,
}
aidl_interface {
diff --git a/radio/aidl/aidl_api/android.hardware.radio.data/current/android/hardware/radio/data/ApnTypes.aidl b/radio/aidl/aidl_api/android.hardware.radio.data/current/android/hardware/radio/data/ApnTypes.aidl
index 782dbbf..27561b9 100644
--- a/radio/aidl/aidl_api/android.hardware.radio.data/current/android/hardware/radio/data/ApnTypes.aidl
+++ b/radio/aidl/aidl_api/android.hardware.radio.data/current/android/hardware/radio/data/ApnTypes.aidl
@@ -52,4 +52,6 @@
BIP = (1 << 13) /* 8192 */,
ENTERPRISE = (1 << 14) /* 16384 */,
RCS = (1 << 15) /* 32768 */,
+ OEM_PAID = (1 << 16) /* 65536 */,
+ OEM_PRIVATE = (1 << 17) /* 131072 */,
}
diff --git a/radio/aidl/android/hardware/radio/data/ApnTypes.aidl b/radio/aidl/android/hardware/radio/data/ApnTypes.aidl
index 2a0c263..bea8bcf 100644
--- a/radio/aidl/android/hardware/radio/data/ApnTypes.aidl
+++ b/radio/aidl/android/hardware/radio/data/ApnTypes.aidl
@@ -91,16 +91,12 @@
* APN type for RCS (Rich Communication Services)
*/
RCS = 1 << 15,
-
/**
* APN type for OEM_PAID networks (Automotive PANS)
*/
- // TODO(b/366194627): enable once HAL unfreezes
- // OEM_PAID = 1 << 16,
-
+ OEM_PAID = 1 << 16,
/**
* APN type for OEM_PRIVATE networks (Automotive PANS)
*/
- // TODO(b/366194627): enable once HAL unfreezes
- // OEM_PRIVATE = 1 << 17,
+ OEM_PRIVATE = 1 << 17,
}
diff --git a/radio/aidl/compat/libradiocompat/Android.bp b/radio/aidl/compat/libradiocompat/Android.bp
index d78455e..3fbd398 100644
--- a/radio/aidl/compat/libradiocompat/Android.bp
+++ b/radio/aidl/compat/libradiocompat/Android.bp
@@ -22,8 +22,25 @@
default_applicable_licenses: ["hardware_interfaces_license"],
}
+cc_defaults {
+ name: "android.hardware.radio-library.aidl_deps",
+ shared_libs: [
+ "android.hardware.radio.config-V3-ndk",
+ "android.hardware.radio.data-V4-ndk",
+ "android.hardware.radio.ims-V2-ndk",
+ "android.hardware.radio.ims.media-V3-ndk",
+ "android.hardware.radio.messaging-V3-ndk",
+ "android.hardware.radio.modem-V3-ndk",
+ "android.hardware.radio.network-V3-ndk",
+ "android.hardware.radio.sap-V1-ndk",
+ "android.hardware.radio.sim-V3-ndk",
+ "android.hardware.radio.voice-V3-ndk",
+ ],
+}
+
cc_library {
name: "android.hardware.radio-library.compat",
+ defaults: ["android.hardware.radio-library.aidl_deps"],
relative_install_path: "hw",
vendor: true,
cflags: [
@@ -32,20 +49,10 @@
"-DANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION",
],
shared_libs: [
- "android.hardware.radio.config-V3-ndk",
"android.hardware.radio.config@1.0",
"android.hardware.radio.config@1.1",
"android.hardware.radio.config@1.2",
"android.hardware.radio.config@1.3",
- "android.hardware.radio.data-V3-ndk",
- "android.hardware.radio.ims-V2-ndk",
- "android.hardware.radio.ims.media-V2-ndk",
- "android.hardware.radio.messaging-V3-ndk",
- "android.hardware.radio.modem-V3-ndk",
- "android.hardware.radio.network-V3-ndk",
- "android.hardware.radio.sap-V1-ndk",
- "android.hardware.radio.sim-V3-ndk",
- "android.hardware.radio.voice-V3-ndk",
"android.hardware.radio@1.0",
"android.hardware.radio@1.1",
"android.hardware.radio@1.2",
diff --git a/radio/aidl/compat/service/Android.bp b/radio/aidl/compat/service/Android.bp
index c8bbd4c..3d46d4f 100644
--- a/radio/aidl/compat/service/Android.bp
+++ b/radio/aidl/compat/service/Android.bp
@@ -24,6 +24,7 @@
cc_binary {
name: "android.hardware.radio-service.compat",
+ defaults: ["android.hardware.radio-library.aidl_deps"],
relative_install_path: "hw",
init_rc: ["radio-compat.rc"],
vintf_fragments: ["radio-compat.xml"],
@@ -35,20 +36,10 @@
],
shared_libs: [
"android.hardware.radio-library.compat",
- "android.hardware.radio.config-V3-ndk",
"android.hardware.radio.config@1.0",
"android.hardware.radio.config@1.1",
"android.hardware.radio.config@1.2",
"android.hardware.radio.config@1.3",
- "android.hardware.radio.data-V3-ndk",
- "android.hardware.radio.ims-V2-ndk",
- "android.hardware.radio.ims.media-V2-ndk",
- "android.hardware.radio.messaging-V3-ndk",
- "android.hardware.radio.modem-V3-ndk",
- "android.hardware.radio.network-V3-ndk",
- "android.hardware.radio.sap-V1-ndk",
- "android.hardware.radio.sim-V3-ndk",
- "android.hardware.radio.voice-V3-ndk",
"android.hardware.radio@1.0",
"android.hardware.radio@1.1",
"android.hardware.radio@1.2",
diff --git a/radio/aidl/vts/Android.bp b/radio/aidl/vts/Android.bp
index 9521068..37e0ba8 100644
--- a/radio/aidl/vts/Android.bp
+++ b/radio/aidl/vts/Android.bp
@@ -79,9 +79,9 @@
static_libs: [
"android.hardware.radio-V3-ndk",
"android.hardware.radio.config-V3-ndk",
- "android.hardware.radio.data-V3-ndk",
+ "android.hardware.radio.data-V4-ndk",
"android.hardware.radio.ims-V2-ndk",
- "android.hardware.radio.ims.media-V2-ndk",
+ "android.hardware.radio.ims.media-V3-ndk",
"android.hardware.radio.messaging-V3-ndk",
"android.hardware.radio.modem-V3-ndk",
"android.hardware.radio.network-V3-ndk",
diff --git a/security/keymint/aidl/default/Android.bp b/security/keymint/aidl/default/Android.bp
index 22a46ed..a7066de 100644
--- a/security/keymint/aidl/default/Android.bp
+++ b/security/keymint/aidl/default/Android.bp
@@ -97,9 +97,6 @@
"libkmr_hal_nonsecure",
"libkmr_ta_nonsecure",
],
- required: [
- "android.hardware.hardware_keystore.xml",
- ],
vintf_fragment_modules: [
"android.hardware.security.keymint-service.xml",
"android.hardware.security.sharedsecret-service.xml",
diff --git a/security/keymint/aidl/default/file_contexts b/security/keymint/aidl/default/file_contexts
index dce7e3c..41b02d5 100644
--- a/security/keymint/aidl/default/file_contexts
+++ b/security/keymint/aidl/default/file_contexts
@@ -1,3 +1,3 @@
(/.*)? u:object_r:vendor_file:s0
/etc(/.*)? u:object_r:vendor_configs_file:s0
-/bin/hw/android\.hardware\.security\.keymint-service\.nonsecure u:object_r:hal_keymint_rust_exec:s0
+/bin/hw/android\.hardware\.security\.keymint-service\.nonsecure u:object_r:hal_keymint_default_exec:s0
diff --git a/security/keymint/support/Android.bp b/security/keymint/support/Android.bp
index c6e35ab..f313cf3 100644
--- a/security/keymint/support/Android.bp
+++ b/security/keymint/support/Android.bp
@@ -126,6 +126,7 @@
],
shared_libs: [
"libbase",
+ "libbinder_ndk",
"libcppbor",
"libcppcose_rkp",
"libcrypto",
diff --git a/security/keymint/support/include/remote_prov/MockIRemotelyProvisionedComponent.h b/security/keymint/support/include/remote_prov/MockIRemotelyProvisionedComponent.h
new file mode 100644
index 0000000..4fa39c2
--- /dev/null
+++ b/security/keymint/support/include/remote_prov/MockIRemotelyProvisionedComponent.h
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <aidl/android/hardware/security/keymint/IRemotelyProvisionedComponent.h>
+#include <aidl/android/hardware/security/keymint/RpcHardwareInfo.h>
+#include <android-base/properties.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <cstdint>
+
+namespace aidl::android::hardware::security::keymint::remote_prov {
+
+using ::ndk::ScopedAStatus;
+
+class MockIRemotelyProvisionedComponent : public IRemotelyProvisionedComponentDefault {
+ public:
+ MOCK_METHOD(ScopedAStatus, getHardwareInfo, (RpcHardwareInfo * _aidl_return), (override));
+ MOCK_METHOD(ScopedAStatus, generateEcdsaP256KeyPair,
+ (bool in_testMode, MacedPublicKey* out_macedPublicKey,
+ std::vector<uint8_t>* _aidl_return),
+ (override));
+ MOCK_METHOD(ScopedAStatus, generateCertificateRequest,
+ (bool in_testMode, const std::vector<MacedPublicKey>& in_keysToSign,
+ const std::vector<uint8_t>& in_endpointEncryptionCertChain,
+ const std::vector<uint8_t>& in_challenge, DeviceInfo* out_deviceInfo,
+ ProtectedData* out_protectedData, std::vector<uint8_t>* _aidl_return),
+ (override));
+ MOCK_METHOD(ScopedAStatus, generateCertificateRequestV2,
+ (const std::vector<MacedPublicKey>& in_keysToSign,
+ const std::vector<uint8_t>& in_challenge, std::vector<uint8_t>* _aidl_return),
+ (override));
+ MOCK_METHOD(ScopedAStatus, getInterfaceVersion, (int32_t* _aidl_return), (override));
+ MOCK_METHOD(ScopedAStatus, getInterfaceHash, (std::string * _aidl_return), (override));
+};
+
+} // namespace aidl::android::hardware::security::keymint::remote_prov
\ No newline at end of file
diff --git a/security/keymint/support/include/remote_prov/remote_prov_utils.h b/security/keymint/support/include/remote_prov/remote_prov_utils.h
index b56c90a..caeb7ff 100644
--- a/security/keymint/support/include/remote_prov/remote_prov_utils.h
+++ b/security/keymint/support/include/remote_prov/remote_prov_utils.h
@@ -94,6 +94,13 @@
const std::string RKPVM_INSTANCE_NAME =
"android.hardware.security.keymint.IRemotelyProvisionedComponent/avf";
+/**
+ * Returns the portion of an instance name after the /
+ * e.g. for "android.hardware.security.keymint.IRemotelyProvisionedComponent/avf",
+ * it returns "avf".
+ */
+std::string deviceSuffix(const std::string& name);
+
struct EekChain {
bytevec chain;
bytevec last_pubkey;
@@ -184,7 +191,9 @@
ErrMsgOr<std::unique_ptr<cppbor::Array>> verifyFactoryCsr(
const cppbor::Array& keysToSign, const std::vector<uint8_t>& csr,
IRemotelyProvisionedComponent* provisionable, const std::string& instanceName,
- const std::vector<uint8_t>& challenge, bool allowDegenerate = true);
+ const std::vector<uint8_t>& challenge, bool allowDegenerate = true,
+ bool requireUdsCerts = false);
+
/**
* Verify the CSR as if the device is a final production sample.
*/
diff --git a/security/keymint/support/remote_prov_utils.cpp b/security/keymint/support/remote_prov_utils.cpp
index 497f478..464d912 100644
--- a/security/keymint/support/remote_prov_utils.cpp
+++ b/security/keymint/support/remote_prov_utils.cpp
@@ -52,8 +52,8 @@
using X509_Ptr = bssl::UniquePtr<X509>;
using CRYPTO_BUFFER_Ptr = bssl::UniquePtr<CRYPTO_BUFFER>;
-std::string device_suffix(const std::string& name) {
- size_t pos = name.find('/');
+std::string deviceSuffix(const std::string& name) {
+ size_t pos = name.rfind('/');
if (pos == std::string::npos) {
return name;
}
@@ -344,15 +344,18 @@
}
auto chain =
- hwtrust::DiceChain::Verify(encodedBcc, kind, allowAnyMode, device_suffix(instanceName));
- if (!chain.ok()) return chain.error().message();
-
+ hwtrust::DiceChain::Verify(encodedBcc, kind, allowAnyMode, deviceSuffix(instanceName));
+ if (!chain.ok()) {
+ return chain.error().message();
+ }
if (!allowDegenerate && !chain->IsProper()) {
return "DICE chain is degenerate";
}
auto keys = chain->CosePublicKeys();
- if (!keys.ok()) return keys.error().message();
+ if (!keys.ok()) {
+ return keys.error().message();
+ }
std::vector<BccEntryData> result;
for (auto& key : *keys) {
result.push_back({std::move(key)});
@@ -857,7 +860,8 @@
return rawPubKey;
}
-std::string validateUdsCerts(const cppbor::Map& udsCerts, const bytevec& udsCoseKeyBytes) {
+std::optional<std::string> validateUdsCerts(const cppbor::Map& udsCerts,
+ const bytevec& udsCoseKeyBytes) {
for (const auto& [signerName, udsCertChain] : udsCerts) {
if (!signerName || !signerName->asTstr()) {
return "Signer Name must be a Tstr.";
@@ -874,8 +878,9 @@
return leafPubKey.message();
}
auto coseKey = CoseKey::parse(udsCoseKeyBytes);
- if (!coseKey) return coseKey.moveMessage();
-
+ if (!coseKey) {
+ return coseKey.moveMessage();
+ }
auto curve = coseKey->getIntValue(CoseKey::CURVE);
if (!curve) {
return "CoseKey must contain curve.";
@@ -883,7 +888,9 @@
bytevec udsPub;
if (curve == CoseKeyCurve::P256 || curve == CoseKeyCurve::P384) {
auto pubKey = coseKey->getEcPublicKey();
- if (!pubKey) return pubKey.moveMessage();
+ if (!pubKey) {
+ return pubKey.moveMessage();
+ }
// convert public key to uncompressed form by prepending 0x04 at begin.
pubKey->insert(pubKey->begin(), 0x04);
udsPub = pubKey.moveValue();
@@ -900,7 +907,7 @@
return "Leaf public key in UDS certificate chain doesn't match UDS public key.";
}
}
- return "";
+ return std::nullopt;
}
ErrMsgOr<std::unique_ptr<cppbor::Array>> parseAndValidateCsrPayload(
@@ -1016,7 +1023,8 @@
const std::vector<uint8_t>& challenge,
const std::string& instanceName,
bool allowAnyMode = false,
- bool allowDegenerate = true) {
+ bool allowDegenerate = true,
+ bool requireUdsCerts = false) {
auto [parsedRequest, _, csrErrMsg] = cppbor::parse(request);
if (!parsedRequest) {
return csrErrMsg;
@@ -1038,8 +1046,12 @@
if (!version || version->value() != 1U) {
return "AuthenticatedRequest version must be an unsigned integer and must be equal to 1.";
}
+
if (!udsCerts) {
- return "AuthenticatedRequest UdsCerts must be an Map.";
+ return "AuthenticatedRequest UdsCerts must be a Map.";
+ }
+ if (requireUdsCerts && udsCerts->size() == 0) {
+ return "AuthenticatedRequest UdsCerts must not be empty.";
}
if (!diceCertChain) {
return "AuthenticatedRequest DiceCertChain must be an Array.";
@@ -1060,15 +1072,20 @@
return diceContents.message() + "\n" + prettyPrint(diceCertChain);
}
+ if (!diceCertChain->get(0)->asMap()) {
+ return "AuthenticatedRequest The first entry in DiceCertChain must be a Map.";
+ }
auto udsPub = diceCertChain->get(0)->asMap()->encode();
- auto& kmDiceKey = diceContents->back().pubKey;
-
auto error = validateUdsCerts(*udsCerts, udsPub);
- if (!error.empty()) {
- return error;
+ if (error) {
+ return *error;
}
- auto signedPayload = verifyAndParseCoseSign1(signedData, kmDiceKey, {} /* aad */);
+ if (diceContents->empty()) {
+ return "AuthenticatedRequest DiceContents must not be empty.";
+ }
+ auto& kmDiceKey = diceContents->back().pubKey;
+ auto signedPayload = verifyAndParseCoseSign1(signedData, kmDiceKey, /*aad=*/{});
if (!signedPayload) {
return signedPayload.message();
}
@@ -1081,13 +1098,11 @@
return payload;
}
-ErrMsgOr<std::unique_ptr<cppbor::Array>> verifyCsr(const cppbor::Array& keysToSign,
- const std::vector<uint8_t>& csr,
- IRemotelyProvisionedComponent* provisionable,
- const std::string& instanceName,
- const std::vector<uint8_t>& challenge,
- bool isFactory, bool allowAnyMode = false,
- bool allowDegenerate = true) {
+ErrMsgOr<std::unique_ptr<cppbor::Array>> verifyCsr(
+ const cppbor::Array& keysToSign, const std::vector<uint8_t>& csr,
+ IRemotelyProvisionedComponent* provisionable, const std::string& instanceName,
+ const std::vector<uint8_t>& challenge, bool isFactory, bool allowAnyMode = false,
+ bool allowDegenerate = true, bool requireUdsCerts = false) {
RpcHardwareInfo info;
provisionable->getHardwareInfo(&info);
if (info.versionNumber != 3) {
@@ -1095,8 +1110,9 @@
") does not match expected version (3).";
}
- auto csrPayload = parseAndValidateAuthenticatedRequest(csr, challenge, instanceName,
- allowAnyMode, allowDegenerate);
+ auto csrPayload = parseAndValidateAuthenticatedRequest(
+ csr, challenge, instanceName, allowAnyMode, allowDegenerate, requireUdsCerts);
+
if (!csrPayload) {
return csrPayload.message();
}
@@ -1107,9 +1123,9 @@
ErrMsgOr<std::unique_ptr<cppbor::Array>> verifyFactoryCsr(
const cppbor::Array& keysToSign, const std::vector<uint8_t>& csr,
IRemotelyProvisionedComponent* provisionable, const std::string& instanceName,
- const std::vector<uint8_t>& challenge, bool allowDegenerate) {
+ const std::vector<uint8_t>& challenge, bool allowDegenerate, bool requireUdsCerts) {
return verifyCsr(keysToSign, csr, provisionable, instanceName, challenge, /*isFactory=*/true,
- /*allowAnyMode=*/false, allowDegenerate);
+ /*allowAnyMode=*/false, allowDegenerate, requireUdsCerts);
}
ErrMsgOr<std::unique_ptr<cppbor::Array>> verifyProductionCsr(
@@ -1153,7 +1169,7 @@
auto encodedDiceChain = diceCertChain->encode();
auto chain = hwtrust::DiceChain::Verify(encodedDiceChain, *diceChainKind,
- /*allowAnyMode=*/false, device_suffix(instanceName));
+ /*allowAnyMode=*/false, deviceSuffix(instanceName));
if (!chain.ok()) return chain.error().message();
return chain->IsProper();
}
diff --git a/security/keymint/support/remote_prov_utils_test.cpp b/security/keymint/support/remote_prov_utils_test.cpp
index 8b18b29..8ffb149 100644
--- a/security/keymint/support/remote_prov_utils_test.cpp
+++ b/security/keymint/support/remote_prov_utils_test.cpp
@@ -25,6 +25,7 @@
#include <keymaster/logger.h>
#include <keymaster/remote_provisioning_utils.h>
#include <openssl/curve25519.h>
+#include <remote_prov/MockIRemotelyProvisionedComponent.h>
#include <remote_prov/remote_prov_utils.h>
#include <algorithm>
@@ -41,6 +42,11 @@
using ::testing::ElementsAreArray;
using byte_view = std::span<const uint8_t>;
+using ::cppbor::Array;
+using ::cppbor::parse;
+using ::ndk::SharedRefBase;
+using ::testing::NotNull;
+
inline const std::vector<uint8_t> kDegenerateBcc{
0x82, 0xa5, 0x01, 0x01, 0x03, 0x27, 0x04, 0x81, 0x02, 0x20, 0x06, 0x21, 0x58, 0x20, 0xf5,
0x5a, 0xfb, 0x28, 0x06, 0x48, 0x68, 0xea, 0x49, 0x3e, 0x47, 0x80, 0x1d, 0xfe, 0x1f, 0xfc,
@@ -76,6 +82,252 @@
0x50, 0x12, 0x82, 0x37, 0xfe, 0xa4, 0x07, 0xc3, 0xd5, 0xc3, 0x78, 0xcc, 0xf9, 0xef, 0xe1,
0x95, 0x38, 0x9f, 0xb0, 0x79, 0x16, 0x4c, 0x4a, 0x23, 0xc4, 0xdc, 0x35, 0x4e, 0x0f};
+// The challenge that is in kKeysToSignForCsrWithUdsCerts and kCsrWithUdsCerts
+inline const std::vector<uint8_t> kChallenge{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+ 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20};
+
+inline const std::vector<uint8_t> kKeysToSignForCsrWithUdsCerts{
+ 0x82, 0xa6, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01, 0x21, 0x58, 0x20, 0x35, 0xeb, 0x56, 0xed,
+ 0x62, 0x13, 0x6a, 0x41, 0x89, 0xf6, 0x72, 0xa6, 0xf1, 0x5c, 0xd1, 0xf6, 0x34, 0xbd, 0x81,
+ 0xdb, 0x2e, 0x0b, 0x4d, 0xf6, 0x69, 0x6f, 0xa6, 0xf3, 0xce, 0x27, 0x2c, 0x78, 0x22, 0x58,
+ 0x20, 0xac, 0xa9, 0x9f, 0x62, 0x81, 0x58, 0xc7, 0x10, 0xd7, 0xb5, 0xa8, 0xa0, 0x7b, 0x11,
+ 0xf5, 0x75, 0xdb, 0xd9, 0xa2, 0x1d, 0x86, 0x34, 0xc6, 0xf4, 0x23, 0x79, 0xcc, 0x8a, 0x87,
+ 0x3c, 0xb2, 0xd0, 0x23, 0x58, 0x20, 0x0f, 0x2c, 0x5a, 0xb7, 0xe1, 0x3b, 0x24, 0xa3, 0x4f,
+ 0xaa, 0x49, 0x51, 0xfc, 0x8c, 0xd0, 0x35, 0x43, 0x7c, 0x21, 0xfa, 0x7d, 0x56, 0x97, 0x69,
+ 0xe1, 0x81, 0xf5, 0x88, 0x15, 0x33, 0xa0, 0x7f, 0xa6, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01,
+ 0x21, 0x58, 0x20, 0xb5, 0xcc, 0xd9, 0x4f, 0x7a, 0xe2, 0xca, 0xac, 0xfe, 0xa5, 0x65, 0x0c,
+ 0x6a, 0xa8, 0x16, 0x45, 0x40, 0x41, 0x1c, 0xb2, 0x64, 0xcd, 0x34, 0xe8, 0x37, 0x88, 0xb9,
+ 0x9a, 0xb3, 0xc3, 0xfd, 0x6a, 0x22, 0x58, 0x20, 0x5e, 0xbe, 0xff, 0x98, 0x60, 0x6e, 0x1d,
+ 0x6b, 0x42, 0x60, 0x59, 0xe9, 0x42, 0x95, 0xc8, 0x2e, 0xc5, 0xb6, 0x66, 0x4a, 0x53, 0xf1,
+ 0x73, 0x02, 0xcb, 0x89, 0x8a, 0x2a, 0xc9, 0xa5, 0xa3, 0x39, 0x23, 0x58, 0x21, 0x00, 0xdb,
+ 0xda, 0x3c, 0x3e, 0x27, 0x71, 0x5e, 0xd0, 0x2b, 0x09, 0xb8, 0x6f, 0xe2, 0x2c, 0xdd, 0x0a,
+ 0xbf, 0x1d, 0x94, 0x36, 0xd2, 0x33, 0x88, 0x6e, 0x66, 0x05, 0x21, 0x92, 0x64, 0x79, 0xa9,
+ 0x10};
+
+inline const std::vector<uint8_t> kCsrWithUdsCerts{
+ 0x84, 0x01, 0xa1, 0x70, 0x74, 0x65, 0x73, 0x74, 0x2d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72,
+ 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0x59, 0x01, 0x6c, 0x30, 0x82, 0x01, 0x68, 0x30, 0x82,
+ 0x01, 0x1a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x7b, 0x30, 0x05, 0x06, 0x03, 0x2b,
+ 0x65, 0x70, 0x30, 0x2b, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c,
+ 0x46, 0x61, 0x6b, 0x65, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x09, 0x46, 0x61, 0x6b, 0x65, 0x20, 0x52, 0x6f,
+ 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x34, 0x31, 0x30, 0x31, 0x37, 0x31, 0x39, 0x32,
+ 0x33, 0x30, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x34, 0x31, 0x31, 0x31, 0x36, 0x31, 0x39, 0x32,
+ 0x33, 0x30, 0x39, 0x5a, 0x30, 0x2b, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a,
+ 0x13, 0x0c, 0x46, 0x61, 0x6b, 0x65, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x31,
+ 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x09, 0x46, 0x61, 0x6b, 0x65, 0x20,
+ 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21,
+ 0x00, 0x20, 0xc5, 0xfa, 0x42, 0xe9, 0x23, 0xd3, 0x72, 0x83, 0x96, 0xc5, 0x73, 0x1e, 0xec,
+ 0x07, 0x39, 0x4f, 0xc8, 0xb7, 0xd1, 0x9f, 0x77, 0xb6, 0x0b, 0x59, 0x9e, 0x62, 0xc0, 0xec,
+ 0x06, 0x06, 0xad, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,
+ 0x16, 0x04, 0x14, 0xec, 0x36, 0x07, 0x83, 0xf0, 0xda, 0x23, 0xfc, 0x0f, 0xb1, 0x08, 0xd0,
+ 0x60, 0x97, 0xc1, 0x9a, 0x14, 0x54, 0xbf, 0x63, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,
+ 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xec, 0x36, 0x07, 0x83, 0xf0, 0xda, 0x23, 0xfc, 0x0f,
+ 0xb1, 0x08, 0xd0, 0x60, 0x97, 0xc1, 0x9a, 0x14, 0x54, 0xbf, 0x63, 0x30, 0x0f, 0x06, 0x03,
+ 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e,
+ 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30,
+ 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x41, 0x00, 0x41, 0xfa, 0x27, 0xfd, 0xe3, 0x42,
+ 0x89, 0x43, 0x68, 0x92, 0x48, 0x39, 0xb1, 0x93, 0x93, 0x8b, 0x69, 0x16, 0x50, 0xbe, 0xc0,
+ 0xc5, 0x83, 0xd6, 0x1e, 0x4b, 0x2f, 0x6e, 0x18, 0x32, 0x78, 0xfe, 0x35, 0x78, 0xed, 0x6d,
+ 0xc8, 0x36, 0xb2, 0x4e, 0x0d, 0x10, 0x23, 0xab, 0x28, 0x32, 0xa1, 0xfc, 0x83, 0x2a, 0xa3,
+ 0xca, 0xe1, 0xca, 0x82, 0xd2, 0x5f, 0xf1, 0x7f, 0xf2, 0xba, 0xbe, 0x86, 0x0b, 0x59, 0x01,
+ 0x70, 0x30, 0x82, 0x01, 0x6c, 0x30, 0x82, 0x01, 0x1e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,
+ 0x02, 0x01, 0xc8, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x30, 0x2b, 0x31, 0x15, 0x30,
+ 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x46, 0x61, 0x6b, 0x65, 0x20, 0x43, 0x6f,
+ 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
+ 0x09, 0x46, 0x61, 0x6b, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x32,
+ 0x34, 0x31, 0x30, 0x31, 0x37, 0x31, 0x39, 0x32, 0x33, 0x30, 0x39, 0x5a, 0x17, 0x0d, 0x32,
+ 0x34, 0x31, 0x31, 0x31, 0x36, 0x31, 0x39, 0x32, 0x33, 0x30, 0x39, 0x5a, 0x30, 0x2e, 0x31,
+ 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x46, 0x61, 0x6b, 0x65, 0x20,
+ 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x13, 0x0c, 0x46, 0x61, 0x6b, 0x65, 0x20, 0x43, 0x68, 0x69, 0x70, 0x73, 0x65, 0x74,
+ 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00, 0x14, 0xf4, 0x4a,
+ 0x88, 0x56, 0x9f, 0xc0, 0xf5, 0x1f, 0xe5, 0xef, 0xfb, 0xf4, 0x06, 0xbc, 0xb1, 0xe4, 0x4a,
+ 0x37, 0xe5, 0x07, 0xf8, 0x65, 0x95, 0x55, 0x54, 0xfd, 0x90, 0xf9, 0x8b, 0xa7, 0xc6, 0xa3,
+ 0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xef,
+ 0x05, 0x40, 0x0a, 0x1b, 0x74, 0x3e, 0x4d, 0x2e, 0x22, 0xf5, 0x66, 0x0c, 0xd7, 0xf9, 0xb8,
+ 0x8e, 0x81, 0x3d, 0xab, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16,
+ 0x80, 0x14, 0xec, 0x36, 0x07, 0x83, 0xf0, 0xda, 0x23, 0xfc, 0x0f, 0xb1, 0x08, 0xd0, 0x60,
+ 0x97, 0xc1, 0x9a, 0x14, 0x54, 0xbf, 0x63, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,
+ 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,
+ 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x05, 0x06, 0x03, 0x2b,
+ 0x65, 0x70, 0x03, 0x41, 0x00, 0x64, 0x32, 0x42, 0x06, 0xa7, 0x11, 0xb0, 0x67, 0x81, 0x73,
+ 0x19, 0x70, 0xb6, 0x60, 0x1c, 0xd2, 0x43, 0xde, 0x42, 0xec, 0x71, 0x4d, 0x6e, 0xa8, 0xed,
+ 0x6f, 0xe2, 0x59, 0x3e, 0xa3, 0x45, 0x82, 0x8b, 0x25, 0x25, 0xf9, 0xc6, 0xb3, 0xf5, 0xb5,
+ 0x3d, 0x11, 0x7d, 0xcf, 0xf2, 0x50, 0x22, 0xff, 0x2b, 0xc5, 0x14, 0x94, 0x64, 0xbf, 0xbf,
+ 0x52, 0x69, 0xb1, 0xfe, 0x07, 0x81, 0x83, 0xb3, 0x0d, 0x82, 0xa5, 0x01, 0x01, 0x03, 0x27,
+ 0x20, 0x06, 0x21, 0x58, 0x20, 0x14, 0xf4, 0x4a, 0x88, 0x56, 0x9f, 0xc0, 0xf5, 0x1f, 0xe5,
+ 0xef, 0xfb, 0xf4, 0x06, 0xbc, 0xb1, 0xe4, 0x4a, 0x37, 0xe5, 0x07, 0xf8, 0x65, 0x95, 0x55,
+ 0x54, 0xfd, 0x90, 0xf9, 0x8b, 0xa7, 0xc6, 0x23, 0x58, 0x20, 0x8d, 0x38, 0x0d, 0x38, 0xcb,
+ 0x76, 0x73, 0xef, 0x13, 0xd1, 0x08, 0x02, 0xa5, 0x0e, 0xd2, 0x16, 0xd4, 0x0f, 0x2c, 0x29,
+ 0xf8, 0xd0, 0x20, 0xb8, 0x6a, 0x7f, 0xa2, 0xd1, 0x1e, 0xeb, 0xd1, 0x5c, 0x84, 0x43, 0xa1,
+ 0x01, 0x27, 0xa0, 0x59, 0x01, 0x27, 0xa9, 0x01, 0x66, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72,
+ 0x02, 0x67, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x00, 0x47, 0x44, 0x50, 0x58,
+ 0x20, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x3a, 0x00, 0x47, 0x44, 0x52, 0x58, 0x20, 0xb8, 0x96, 0x54, 0xe2, 0x2c,
+ 0xa4, 0xd2, 0x4a, 0x9c, 0x0e, 0x45, 0x11, 0xc8, 0xf2, 0x63, 0xf0, 0x66, 0x0d, 0x2e, 0x20,
+ 0x48, 0x96, 0x90, 0x14, 0xf4, 0x54, 0x63, 0xc4, 0xf4, 0x39, 0x30, 0x38, 0x3a, 0x00, 0x47,
+ 0x44, 0x53, 0x55, 0xa1, 0x3a, 0x00, 0x01, 0x11, 0x71, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6f,
+ 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x00, 0x47, 0x44, 0x54, 0x58,
+ 0x20, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x3a, 0x00, 0x47, 0x44, 0x56, 0x41, 0x01, 0x3a, 0x00, 0x47, 0x44, 0x57,
+ 0x58, 0x70, 0xa6, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01, 0x21, 0x58, 0x20, 0x76, 0x82, 0x58,
+ 0xce, 0x99, 0x1c, 0x29, 0xa1, 0x81, 0x3e, 0x22, 0xe3, 0x02, 0x13, 0xea, 0x2a, 0x25, 0x2e,
+ 0x20, 0x14, 0xeb, 0x45, 0x0d, 0xb8, 0xdb, 0x8c, 0x38, 0xef, 0xeb, 0x25, 0xd6, 0x31, 0x22,
+ 0x58, 0x20, 0xbe, 0x55, 0xba, 0x87, 0x17, 0xc2, 0x5b, 0xb6, 0x56, 0xff, 0x4b, 0xf0, 0x8a,
+ 0x98, 0x57, 0x86, 0xa4, 0x36, 0x0a, 0x90, 0x38, 0xce, 0x66, 0xec, 0xcb, 0x25, 0x30, 0x29,
+ 0x83, 0x02, 0x02, 0xc0, 0x23, 0x58, 0x20, 0x73, 0xdf, 0xc3, 0x4a, 0xe4, 0x2e, 0xbd, 0x04,
+ 0x09, 0xec, 0x91, 0xc7, 0xe7, 0xf1, 0xec, 0x55, 0x10, 0x7e, 0xd1, 0x36, 0x5e, 0x9d, 0x11,
+ 0x71, 0x27, 0xee, 0x30, 0x7b, 0x04, 0x45, 0x5f, 0x95, 0x3a, 0x00, 0x47, 0x44, 0x58, 0x41,
+ 0x20, 0x58, 0x40, 0x44, 0x7f, 0x1a, 0x67, 0x16, 0xa0, 0x49, 0xfe, 0x2c, 0xde, 0x87, 0x38,
+ 0xef, 0xb9, 0xe0, 0x19, 0x25, 0x7d, 0xcc, 0x39, 0x53, 0x27, 0xbd, 0x2c, 0x04, 0x6c, 0xe3,
+ 0x5c, 0x5e, 0xd6, 0x27, 0x09, 0xb9, 0xf7, 0x8c, 0x2b, 0xd2, 0x68, 0xc3, 0xf1, 0x23, 0xcf,
+ 0xc6, 0xfc, 0x21, 0xb3, 0x52, 0x48, 0xe6, 0x8a, 0x89, 0x3e, 0x37, 0x24, 0x13, 0x23, 0x80,
+ 0xb2, 0xc7, 0xa7, 0xc6, 0xf1, 0xec, 0x04, 0x84, 0x43, 0xa1, 0x01, 0x26, 0xa0, 0x59, 0x02,
+ 0x0f, 0x82, 0x58, 0x20, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
+ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
+ 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x59, 0x01, 0xe9, 0x84, 0x03, 0x67, 0x6b, 0x65, 0x79,
+ 0x6d, 0x69, 0x6e, 0x74, 0xae, 0x65, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x66, 0x47, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x65, 0x66, 0x75, 0x73, 0x65, 0x64, 0x01, 0x65, 0x6d, 0x6f, 0x64, 0x65,
+ 0x6c, 0x65, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x66, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x66,
+ 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x67, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x65,
+ 0x70, 0x69, 0x78, 0x65, 0x6c, 0x68, 0x76, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x65,
+ 0x67, 0x72, 0x65, 0x65, 0x6e, 0x6a, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+ 0x6e, 0x62, 0x31, 0x32, 0x6c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72,
+ 0x65, 0x72, 0x66, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x6d, 0x76, 0x62, 0x6d, 0x65, 0x74,
+ 0x61, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x4f, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
+ 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72,
+ 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x63, 0x74, 0x65, 0x65, 0x70, 0x62,
+ 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c,
+ 0x1a, 0x01, 0x34, 0x8c, 0x62, 0x70, 0x62, 0x6f, 0x6f, 0x74, 0x6c, 0x6f, 0x61, 0x64, 0x65,
+ 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x72,
+ 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x65,
+ 0x76, 0x65, 0x6c, 0x1a, 0x01, 0x34, 0x8c, 0x61, 0x72, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72,
+ 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x01, 0x34,
+ 0x8c, 0x63, 0x82, 0xa6, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01, 0x21, 0x58, 0x20, 0x35, 0xeb,
+ 0x56, 0xed, 0x62, 0x13, 0x6a, 0x41, 0x89, 0xf6, 0x72, 0xa6, 0xf1, 0x5c, 0xd1, 0xf6, 0x34,
+ 0xbd, 0x81, 0xdb, 0x2e, 0x0b, 0x4d, 0xf6, 0x69, 0x6f, 0xa6, 0xf3, 0xce, 0x27, 0x2c, 0x78,
+ 0x22, 0x58, 0x20, 0xac, 0xa9, 0x9f, 0x62, 0x81, 0x58, 0xc7, 0x10, 0xd7, 0xb5, 0xa8, 0xa0,
+ 0x7b, 0x11, 0xf5, 0x75, 0xdb, 0xd9, 0xa2, 0x1d, 0x86, 0x34, 0xc6, 0xf4, 0x23, 0x79, 0xcc,
+ 0x8a, 0x87, 0x3c, 0xb2, 0xd0, 0x23, 0x58, 0x20, 0x0f, 0x2c, 0x5a, 0xb7, 0xe1, 0x3b, 0x24,
+ 0xa3, 0x4f, 0xaa, 0x49, 0x51, 0xfc, 0x8c, 0xd0, 0x35, 0x43, 0x7c, 0x21, 0xfa, 0x7d, 0x56,
+ 0x97, 0x69, 0xe1, 0x81, 0xf5, 0x88, 0x15, 0x33, 0xa0, 0x7f, 0xa6, 0x01, 0x02, 0x03, 0x26,
+ 0x20, 0x01, 0x21, 0x58, 0x20, 0xb5, 0xcc, 0xd9, 0x4f, 0x7a, 0xe2, 0xca, 0xac, 0xfe, 0xa5,
+ 0x65, 0x0c, 0x6a, 0xa8, 0x16, 0x45, 0x40, 0x41, 0x1c, 0xb2, 0x64, 0xcd, 0x34, 0xe8, 0x37,
+ 0x88, 0xb9, 0x9a, 0xb3, 0xc3, 0xfd, 0x6a, 0x22, 0x58, 0x20, 0x5e, 0xbe, 0xff, 0x98, 0x60,
+ 0x6e, 0x1d, 0x6b, 0x42, 0x60, 0x59, 0xe9, 0x42, 0x95, 0xc8, 0x2e, 0xc5, 0xb6, 0x66, 0x4a,
+ 0x53, 0xf1, 0x73, 0x02, 0xcb, 0x89, 0x8a, 0x2a, 0xc9, 0xa5, 0xa3, 0x39, 0x23, 0x58, 0x21,
+ 0x00, 0xdb, 0xda, 0x3c, 0x3e, 0x27, 0x71, 0x5e, 0xd0, 0x2b, 0x09, 0xb8, 0x6f, 0xe2, 0x2c,
+ 0xdd, 0x0a, 0xbf, 0x1d, 0x94, 0x36, 0xd2, 0x33, 0x88, 0x6e, 0x66, 0x05, 0x21, 0x92, 0x64,
+ 0x79, 0xa9, 0x10, 0x58, 0x40, 0x87, 0xcf, 0xaa, 0x82, 0x6a, 0xba, 0x25, 0x8b, 0x81, 0xd8,
+ 0x14, 0xca, 0xbd, 0xf4, 0x67, 0xdf, 0xc8, 0x2c, 0xa1, 0x04, 0x57, 0x99, 0xa0, 0x54, 0xe7,
+ 0x9b, 0xb2, 0xd0, 0xaf, 0xdd, 0x07, 0x46, 0x0a, 0xd7, 0xbd, 0xa7, 0xf9, 0xa8, 0x0c, 0x08,
+ 0x1e, 0x9c, 0xae, 0x73, 0x4c, 0x22, 0x6e, 0x56, 0x8b, 0xe4, 0x91, 0x54, 0xa4, 0x7a, 0xb0,
+ 0xf5, 0xe4, 0x5d, 0xa9, 0x8f, 0xae, 0x43, 0x95, 0x7a};
+
+inline const std::vector<uint8_t> kKeysToSignForCsrWithoutUdsCerts = {
+ 0x82, 0xa6, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01, 0x21, 0x58, 0x20, 0x50, 0x43, 0xb4, 0xf1,
+ 0xc1, 0x7f, 0x17, 0xc6, 0x3b, 0x56, 0x27, 0x63, 0x03, 0x18, 0x78, 0x9d, 0x63, 0x93, 0x3b,
+ 0x98, 0xed, 0x55, 0x8c, 0x87, 0x1b, 0xd7, 0x89, 0xb6, 0x81, 0x92, 0x5f, 0x24, 0x22, 0x58,
+ 0x20, 0xd5, 0x24, 0x93, 0xda, 0x3e, 0x32, 0x17, 0xfa, 0xe8, 0x8d, 0x1e, 0xa9, 0xe0, 0x84,
+ 0x4e, 0x1c, 0x6a, 0xef, 0x9a, 0xe3, 0xbe, 0x1d, 0xf1, 0x14, 0xe0, 0x9e, 0x82, 0xc8, 0x92,
+ 0x1a, 0x3a, 0x69, 0x23, 0x58, 0x20, 0x29, 0xcb, 0x16, 0x78, 0x61, 0x35, 0x92, 0x3f, 0x71,
+ 0xc4, 0x66, 0x61, 0xd4, 0xd4, 0x20, 0x8a, 0x86, 0x1e, 0xb0, 0x2b, 0x2f, 0x4f, 0x13, 0xb4,
+ 0x0d, 0x89, 0x60, 0x87, 0x77, 0xac, 0x1a, 0x0f, 0xa6, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01,
+ 0x21, 0x58, 0x20, 0x4b, 0xcc, 0x7a, 0x09, 0x99, 0x76, 0xe7, 0xfa, 0x06, 0xb9, 0x19, 0x22,
+ 0x15, 0x3b, 0x9f, 0xa8, 0x34, 0x77, 0x24, 0x27, 0x8c, 0x8a, 0x97, 0x61, 0xf3, 0x6f, 0x29,
+ 0x74, 0x4e, 0x9a, 0x66, 0x23, 0x22, 0x58, 0x20, 0x8f, 0xa8, 0xaf, 0x2b, 0x02, 0x3a, 0xd4,
+ 0x8a, 0xa2, 0x9d, 0x25, 0xa8, 0x01, 0xe7, 0xbd, 0x61, 0x25, 0x88, 0xb4, 0xc9, 0xce, 0x05,
+ 0x43, 0xcc, 0x0d, 0x38, 0x7d, 0xe2, 0xda, 0x03, 0xb3, 0x33, 0x23, 0x58, 0x21, 0x00, 0xc8,
+ 0x67, 0xb8, 0xbe, 0xc4, 0x1c, 0xca, 0x3c, 0x73, 0x3c, 0xbf, 0x52, 0xb2, 0x5a, 0x64, 0x9e,
+ 0x9f, 0xae, 0xc6, 0x9f, 0x02, 0x2f, 0xee, 0x92, 0x1d, 0xdb, 0x01, 0x77, 0x27, 0x12, 0x84,
+ 0x14};
+
+inline const std::vector<uint8_t> kCsrWithoutUdsCerts{
+ 0x84, 0x01, 0xa0, 0x82, 0xa6, 0x01, 0x02, 0x03, 0x38, 0x22, 0x20, 0x02, 0x21, 0x58, 0x30,
+ 0x21, 0x09, 0x81, 0xb2, 0x4c, 0x8e, 0x23, 0x63, 0x46, 0xe5, 0x32, 0x1e, 0x1b, 0xa3, 0x39,
+ 0x47, 0xd1, 0x19, 0x91, 0xc5, 0xe1, 0xd0, 0x51, 0xa4, 0x4e, 0x6d, 0xfd, 0x21, 0x46, 0xf3,
+ 0x65, 0x6b, 0xd3, 0xec, 0x20, 0x21, 0xf8, 0xef, 0x39, 0x50, 0x0a, 0xfc, 0x6d, 0x18, 0xf8,
+ 0x90, 0x1c, 0xc8, 0x22, 0x58, 0x30, 0x80, 0x1f, 0xd8, 0xe3, 0x64, 0x51, 0x48, 0x66, 0xa5,
+ 0xad, 0x05, 0xcb, 0xe4, 0xee, 0x0f, 0x20, 0xc1, 0xca, 0x84, 0xc2, 0xe0, 0xcc, 0x22, 0x06,
+ 0x7c, 0x5e, 0x2c, 0xb3, 0x3b, 0x52, 0xd4, 0xe7, 0xc1, 0xe2, 0x57, 0x9d, 0x8a, 0xa6, 0x5c,
+ 0x08, 0xbb, 0x77, 0x07, 0xa8, 0x39, 0xba, 0x9f, 0x5f, 0x23, 0x58, 0x31, 0x00, 0xff, 0x5f,
+ 0xa3, 0x03, 0x87, 0x70, 0xe5, 0xf0, 0x69, 0xcd, 0x0a, 0x32, 0x9e, 0x4a, 0xe8, 0x07, 0x1f,
+ 0x26, 0xb9, 0x8a, 0x01, 0x83, 0xfe, 0xb9, 0x21, 0x22, 0x49, 0x9d, 0x9f, 0x78, 0x48, 0xf4,
+ 0x24, 0x87, 0xe8, 0x4d, 0xab, 0xd5, 0xe9, 0xd6, 0x90, 0x49, 0x4b, 0x42, 0xb4, 0x68, 0xac,
+ 0xf1, 0x84, 0x44, 0xa1, 0x01, 0x38, 0x22, 0xa0, 0x59, 0x01, 0x28, 0xa9, 0x01, 0x66, 0x69,
+ 0x73, 0x73, 0x75, 0x65, 0x72, 0x02, 0x67, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a,
+ 0x00, 0x47, 0x44, 0x50, 0x58, 0x20, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x3a, 0x00, 0x47, 0x44, 0x52, 0x58, 0x20,
+ 0xb8, 0x96, 0x54, 0xe2, 0x2c, 0xa4, 0xd2, 0x4a, 0x9c, 0x0e, 0x45, 0x11, 0xc8, 0xf2, 0x63,
+ 0xf0, 0x66, 0x0d, 0x2e, 0x20, 0x48, 0x96, 0x90, 0x14, 0xf4, 0x54, 0x63, 0xc4, 0xf4, 0x39,
+ 0x30, 0x38, 0x3a, 0x00, 0x47, 0x44, 0x53, 0x55, 0xa1, 0x3a, 0x00, 0x01, 0x11, 0x71, 0x6e,
+ 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3a,
+ 0x00, 0x47, 0x44, 0x54, 0x58, 0x20, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x3a, 0x00, 0x47, 0x44, 0x56, 0x41, 0x01,
+ 0x3a, 0x00, 0x47, 0x44, 0x57, 0x58, 0x71, 0xa6, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01, 0x21,
+ 0x58, 0x20, 0x2d, 0x41, 0x43, 0x19, 0xf2, 0x91, 0x58, 0x12, 0x65, 0x2e, 0x96, 0xb5, 0x9d,
+ 0x12, 0x18, 0x58, 0x54, 0x11, 0xed, 0x41, 0x30, 0xef, 0xa4, 0xee, 0x69, 0x8f, 0x0c, 0x6e,
+ 0xe6, 0x27, 0xc5, 0x20, 0x22, 0x58, 0x20, 0x21, 0x0e, 0x8f, 0x83, 0xe5, 0xeb, 0x40, 0x89,
+ 0xc2, 0x0a, 0x43, 0x6c, 0x9f, 0xa8, 0x4e, 0xe0, 0xba, 0x9e, 0xba, 0x4f, 0xe3, 0x27, 0xc4,
+ 0xbd, 0x41, 0xa0, 0xd6, 0xe9, 0x55, 0x54, 0x17, 0x78, 0x23, 0x58, 0x21, 0x00, 0xb6, 0x33,
+ 0x44, 0x98, 0xa7, 0x1c, 0x90, 0x13, 0xcc, 0x42, 0x71, 0x43, 0x29, 0xe5, 0xe1, 0x57, 0x89,
+ 0x7a, 0x39, 0x17, 0x7c, 0xcc, 0x03, 0xac, 0xd3, 0x1b, 0xd2, 0xae, 0x29, 0x5f, 0xd6, 0xf8,
+ 0x3a, 0x00, 0x47, 0x44, 0x58, 0x41, 0x20, 0x58, 0x60, 0xc4, 0x54, 0xad, 0x40, 0xa2, 0x07,
+ 0xc7, 0x80, 0xbd, 0x41, 0x77, 0x5d, 0xa7, 0xa2, 0xef, 0xef, 0x92, 0x67, 0x24, 0xab, 0xa1,
+ 0x4a, 0x5e, 0x4f, 0x73, 0xfb, 0x5c, 0x1f, 0xe6, 0x46, 0x2f, 0xb9, 0x1b, 0x71, 0x86, 0x87,
+ 0x29, 0xc4, 0x66, 0xb7, 0x3e, 0x85, 0x13, 0x9a, 0xa3, 0xf8, 0xfc, 0x63, 0x26, 0xe0, 0xba,
+ 0x0b, 0xe0, 0x9b, 0x2e, 0x7d, 0x06, 0x06, 0xb8, 0x2f, 0xdd, 0x0c, 0xa5, 0x90, 0x1c, 0x10,
+ 0x1c, 0x55, 0xf9, 0x65, 0xf6, 0x26, 0x40, 0x41, 0xaf, 0x5c, 0x16, 0x03, 0xf3, 0xee, 0x8d,
+ 0x72, 0x2c, 0x6b, 0x1e, 0xb3, 0x1f, 0x96, 0x97, 0x34, 0x61, 0x0d, 0x5c, 0xe4, 0x94, 0x6a,
+ 0x84, 0x43, 0xa1, 0x01, 0x26, 0xa0, 0x59, 0x02, 0x0f, 0x82, 0x58, 0x20, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
+ 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x59,
+ 0x01, 0xe9, 0x84, 0x03, 0x67, 0x6b, 0x65, 0x79, 0x6d, 0x69, 0x6e, 0x74, 0xae, 0x65, 0x62,
+ 0x72, 0x61, 0x6e, 0x64, 0x66, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x65, 0x66, 0x75, 0x73,
+ 0x65, 0x64, 0x01, 0x65, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x65, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
+ 0x66, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x66, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x67,
+ 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x65, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x68, 0x76,
+ 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x65, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x6a, 0x6f,
+ 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x62, 0x31, 0x32, 0x6c, 0x6d, 0x61,
+ 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x66, 0x47, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x6d, 0x76, 0x62, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73,
+ 0x74, 0x4f, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd,
+ 0xee, 0xff, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x65, 0x76,
+ 0x65, 0x6c, 0x63, 0x74, 0x65, 0x65, 0x70, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x61, 0x74,
+ 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x01, 0x34, 0x8c, 0x62, 0x70, 0x62,
+ 0x6f, 0x6f, 0x74, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x66, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x72, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f,
+ 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x01, 0x34, 0x8c,
+ 0x61, 0x72, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f,
+ 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x01, 0x34, 0x8c, 0x63, 0x82, 0xa6, 0x01, 0x02, 0x03,
+ 0x26, 0x20, 0x01, 0x21, 0x58, 0x20, 0x50, 0x43, 0xb4, 0xf1, 0xc1, 0x7f, 0x17, 0xc6, 0x3b,
+ 0x56, 0x27, 0x63, 0x03, 0x18, 0x78, 0x9d, 0x63, 0x93, 0x3b, 0x98, 0xed, 0x55, 0x8c, 0x87,
+ 0x1b, 0xd7, 0x89, 0xb6, 0x81, 0x92, 0x5f, 0x24, 0x22, 0x58, 0x20, 0xd5, 0x24, 0x93, 0xda,
+ 0x3e, 0x32, 0x17, 0xfa, 0xe8, 0x8d, 0x1e, 0xa9, 0xe0, 0x84, 0x4e, 0x1c, 0x6a, 0xef, 0x9a,
+ 0xe3, 0xbe, 0x1d, 0xf1, 0x14, 0xe0, 0x9e, 0x82, 0xc8, 0x92, 0x1a, 0x3a, 0x69, 0x23, 0x58,
+ 0x20, 0x29, 0xcb, 0x16, 0x78, 0x61, 0x35, 0x92, 0x3f, 0x71, 0xc4, 0x66, 0x61, 0xd4, 0xd4,
+ 0x20, 0x8a, 0x86, 0x1e, 0xb0, 0x2b, 0x2f, 0x4f, 0x13, 0xb4, 0x0d, 0x89, 0x60, 0x87, 0x77,
+ 0xac, 0x1a, 0x0f, 0xa6, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01, 0x21, 0x58, 0x20, 0x4b, 0xcc,
+ 0x7a, 0x09, 0x99, 0x76, 0xe7, 0xfa, 0x06, 0xb9, 0x19, 0x22, 0x15, 0x3b, 0x9f, 0xa8, 0x34,
+ 0x77, 0x24, 0x27, 0x8c, 0x8a, 0x97, 0x61, 0xf3, 0x6f, 0x29, 0x74, 0x4e, 0x9a, 0x66, 0x23,
+ 0x22, 0x58, 0x20, 0x8f, 0xa8, 0xaf, 0x2b, 0x02, 0x3a, 0xd4, 0x8a, 0xa2, 0x9d, 0x25, 0xa8,
+ 0x01, 0xe7, 0xbd, 0x61, 0x25, 0x88, 0xb4, 0xc9, 0xce, 0x05, 0x43, 0xcc, 0x0d, 0x38, 0x7d,
+ 0xe2, 0xda, 0x03, 0xb3, 0x33, 0x23, 0x58, 0x21, 0x00, 0xc8, 0x67, 0xb8, 0xbe, 0xc4, 0x1c,
+ 0xca, 0x3c, 0x73, 0x3c, 0xbf, 0x52, 0xb2, 0x5a, 0x64, 0x9e, 0x9f, 0xae, 0xc6, 0x9f, 0x02,
+ 0x2f, 0xee, 0x92, 0x1d, 0xdb, 0x01, 0x77, 0x27, 0x12, 0x84, 0x14, 0x58, 0x40, 0x6c, 0xd5,
+ 0x66, 0x0a, 0x99, 0xdd, 0x32, 0x47, 0x50, 0x1f, 0x5d, 0x46, 0x40, 0x8a, 0x60, 0x25, 0xa0,
+ 0x1b, 0x3c, 0x2a, 0xcf, 0xa1, 0x92, 0x1a, 0xdc, 0x81, 0xaa, 0xb0, 0x0f, 0xf2, 0xe6, 0x94,
+ 0xce, 0x3d, 0xff, 0xac, 0x25, 0x44, 0xea, 0xf7, 0x0a, 0x89, 0x9d, 0xc4, 0x7e, 0xe5, 0x02,
+ 0xa7, 0xb6, 0xc2, 0x40, 0x06, 0x65, 0xc5, 0xff, 0x19, 0xc5, 0xcd, 0x1c, 0xd5, 0x78, 0x01,
+ 0xd4, 0xb8};
+
inline bool equal_byte_views(const byte_view& view1, const byte_view& view2) {
return std::equal(view1.begin(), view1.end(), view2.begin(), view2.end());
}
@@ -304,5 +556,79 @@
/*allowAnyMode=*/false, /*allowDegenerate=*/false,
DEFAULT_INSTANCE_NAME));
}
+
+TEST(RemoteProvUtilsTest, requireUdsCertsWhenPresent) {
+ auto [keysToSignPtr, _, errMsg] = cppbor::parse(kKeysToSignForCsrWithUdsCerts);
+ ASSERT_TRUE(keysToSignPtr) << "Error: " << errMsg;
+
+ auto mockRpc = SharedRefBase::make<MockIRemotelyProvisionedComponent>();
+ EXPECT_CALL(*mockRpc, getHardwareInfo(NotNull())).WillRepeatedly([](RpcHardwareInfo* hwInfo) {
+ hwInfo->versionNumber = 3;
+ return ScopedAStatus::ok();
+ });
+
+ const auto keysToSign = keysToSignPtr->asArray();
+ auto csr = verifyFactoryCsr(*keysToSign, kCsrWithUdsCerts, mockRpc.get(), "default", kChallenge,
+ /*allowDegenerate=*/false, /*requireUdsCerts=*/true);
+ ASSERT_TRUE(csr) << csr.message();
+}
+
+TEST(RemoteProvUtilsTest, dontRequireUdsCertsWhenPresent) {
+ auto [keysToSignPtr, _, errMsg] = cppbor::parse(kKeysToSignForCsrWithUdsCerts);
+ ASSERT_TRUE(keysToSignPtr) << "Error: " << errMsg;
+
+ auto mockRpc = SharedRefBase::make<MockIRemotelyProvisionedComponent>();
+ EXPECT_CALL(*mockRpc, getHardwareInfo(NotNull())).WillRepeatedly([](RpcHardwareInfo* hwInfo) {
+ hwInfo->versionNumber = 3;
+ return ScopedAStatus::ok();
+ });
+
+ const auto* keysToSign = keysToSignPtr->asArray();
+ auto csr = verifyFactoryCsr(*keysToSign, kCsrWithUdsCerts, mockRpc.get(), DEFAULT_INSTANCE_NAME,
+ kChallenge,
+ /*allowDegenerate=*/false, /*requireUdsCerts=*/false);
+ ASSERT_TRUE(csr) << csr.message();
+}
+
+TEST(RemoteProvUtilsTest, requireUdsCertsWhenNotPresent) {
+ auto mockRpc = SharedRefBase::make<MockIRemotelyProvisionedComponent>();
+ EXPECT_CALL(*mockRpc, getHardwareInfo(NotNull())).WillRepeatedly([](RpcHardwareInfo* hwInfo) {
+ hwInfo->versionNumber = 3;
+ return ScopedAStatus::ok();
+ });
+
+ auto csr = verifyFactoryCsr(/*keysToSign=*/Array(), kCsrWithoutUdsCerts, mockRpc.get(),
+ DEFAULT_INSTANCE_NAME, kChallenge, /*allowDegenerate=*/false,
+ /*requireUdsCerts=*/true);
+ ASSERT_FALSE(csr);
+ ASSERT_THAT(csr.message(), testing::HasSubstr("UdsCerts must not be empty"));
+}
+
+TEST(RemoteProvUtilsTest, dontRequireUdsCertsWhenNotPresent) {
+ auto [keysToSignPtr, _, errMsg] = cppbor::parse(
+ kKeysToSignForCsrWithoutUdsCerts.data(),
+ kKeysToSignForCsrWithoutUdsCerts.data() + kKeysToSignForCsrWithoutUdsCerts.size());
+ ASSERT_TRUE(keysToSignPtr) << "Error: " << errMsg;
+
+ auto mockRpc = SharedRefBase::make<MockIRemotelyProvisionedComponent>();
+ EXPECT_CALL(*mockRpc, getHardwareInfo(NotNull())).WillRepeatedly([](RpcHardwareInfo* hwInfo) {
+ hwInfo->versionNumber = 3;
+ return ScopedAStatus::ok();
+ });
+
+ const auto* keysToSign = keysToSignPtr->asArray();
+ auto csr = verifyFactoryCsr(*keysToSign, kCsrWithoutUdsCerts, mockRpc.get(),
+ DEFAULT_INSTANCE_NAME, kChallenge,
+ /*allowDegenerate=*/false, /*requireUdsCerts=*/false);
+ ASSERT_TRUE(csr) << csr.message();
+}
+
+TEST(RemoteProvUtilsTest, parseFullyQualifiedInstanceNames) {
+ ASSERT_EQ(deviceSuffix(RKPVM_INSTANCE_NAME), "avf");
+ ASSERT_EQ(deviceSuffix(DEFAULT_INSTANCE_NAME), "default");
+ ASSERT_EQ(deviceSuffix("default"), "default");
+ ASSERT_EQ(deviceSuffix("//the/last/one"), "one");
+}
+
} // namespace
} // namespace aidl::android::hardware::security::keymint::remote_prov
diff --git a/sensors/1.0/vts/functional/Android.bp b/sensors/1.0/vts/functional/Android.bp
index d53179a..b042907 100644
--- a/sensors/1.0/vts/functional/Android.bp
+++ b/sensors/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_sensors",
// 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"
diff --git a/sensors/2.0/vts/functional/Android.bp b/sensors/2.0/vts/functional/Android.bp
index 62eaf6b..a62a0e7 100644
--- a/sensors/2.0/vts/functional/Android.bp
+++ b/sensors/2.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_sensors",
// 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"
diff --git a/sensors/2.1/vts/functional/Android.bp b/sensors/2.1/vts/functional/Android.bp
index 61cfd14..e8777e5 100644
--- a/sensors/2.1/vts/functional/Android.bp
+++ b/sensors/2.1/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_sensors",
// 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"
diff --git a/tetheroffload/aidl/vts/functional/Android.bp b/tetheroffload/aidl/vts/functional/Android.bp
index 74edab0..a379cf7 100644
--- a/tetheroffload/aidl/vts/functional/Android.bp
+++ b/tetheroffload/aidl/vts/functional/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_pixel_connectivity_networking",
default_applicable_licenses: ["Android-Apache-2.0"],
}
diff --git a/tetheroffload/config/1.0/vts/functional/Android.bp b/tetheroffload/config/1.0/vts/functional/Android.bp
index fe03d8f..cbc0bb2 100644
--- a/tetheroffload/config/1.0/vts/functional/Android.bp
+++ b/tetheroffload/config/1.0/vts/functional/Android.bp
@@ -13,6 +13,7 @@
// limitations under the License.
package {
+ default_team: "trendy_team_pixel_connectivity_networking",
// 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"
diff --git a/tetheroffload/control/1.0/vts/functional/Android.bp b/tetheroffload/control/1.0/vts/functional/Android.bp
index dc3b00c..8aa625e 100644
--- a/tetheroffload/control/1.0/vts/functional/Android.bp
+++ b/tetheroffload/control/1.0/vts/functional/Android.bp
@@ -13,6 +13,7 @@
// limitations under the License.
package {
+ default_team: "trendy_team_pixel_connectivity_networking",
// 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"
diff --git a/tetheroffload/control/1.1/vts/functional/Android.bp b/tetheroffload/control/1.1/vts/functional/Android.bp
index 3eea59b..01731dd 100644
--- a/tetheroffload/control/1.1/vts/functional/Android.bp
+++ b/tetheroffload/control/1.1/vts/functional/Android.bp
@@ -13,6 +13,7 @@
// limitations under the License.
package {
+ default_team: "trendy_team_pixel_connectivity_networking",
// 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"
diff --git a/tv/input/1.0/vts/functional/Android.bp b/tv/input/1.0/vts/functional/Android.bp
index fad1c90..57d81e2 100644
--- a/tv/input/1.0/vts/functional/Android.bp
+++ b/tv/input/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_interactive_tv",
// 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"
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..1f273eb
--- /dev/null
+++ b/tv/mediaquality/aidl/Android.bp
@@ -0,0 +1,30 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "hardware_interfaces_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["hardware_interfaces_license"],
+}
+
+aidl_interface {
+ name: "android.hardware.tv.mediaquality",
+ vendor_available: true,
+ owner: "haofanw",
+ srcs: [
+ "android/hardware/tv/mediaquality/*.aidl",
+ ],
+ stability: "vintf",
+ backend: {
+ java: {
+ sdk_version: "module_current",
+ },
+ ndk: {
+ enabled: true,
+ },
+ rust: {
+ enabled: true,
+ },
+ },
+ frozen: false,
+}
diff --git a/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl
new file mode 100644
index 0000000..6e8b23a
--- /dev/null
+++ b/tv/mediaquality/aidl/aidl_api/android.hardware.tv.mediaquality/current/android/hardware/tv/mediaquality/IMediaQuality.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.tv.mediaquality;
+@VintfStability
+interface IMediaQuality {
+ void setAmbientLightDetectionEnabled(in boolean enabled);
+ boolean getAmbientLightDetectionEnabled();
+}
diff --git a/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl
new file mode 100644
index 0000000..f75d6d1
--- /dev/null
+++ b/tv/mediaquality/aidl/android/hardware/tv/mediaquality/IMediaQuality.aidl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.tv.mediaquality;
+
+/**
+ * Interface for the media quality service
+ */
+@VintfStability
+interface IMediaQuality {
+ /**
+ * Sets the ambient backlight detection enabled or disabled. The ambient backlight is the
+ * projection of light against the wall driven by the current content playing. Enable will
+ * detects the Ambient backlight metadata and ambient control app can control the related
+ * device as configured before.
+ *
+ * @param enabled True to enable the ambient light detection, false to disable.
+ */
+ void setAmbientLightDetectionEnabled(in boolean enabled);
+
+ /**
+ * Gets the ambient light detection enabled status. The ambient light is enabled by
+ * calling setAmbientLightDetectionEnabled(in boolean enabled). True to enable the ambient
+ * light detection and False to disable the ambient light detection.
+ *
+ * @return True if the ambient light detection is enabled, false otherwise.
+ */
+ boolean getAmbientLightDetectionEnabled();
+}
diff --git a/tv/mediaquality/aidl/default/Android.bp b/tv/mediaquality/aidl/default/Android.bp
new file mode 100644
index 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..c739ac8
--- /dev/null
+++ b/tv/mediaquality/aidl/default/hal/media_quality_hal_impl.rs
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+//! This module implements the IMediaQuality AIDL interface.
+
+use android_hardware_tv_mediaquality::aidl::android::hardware::tv::mediaquality::{
+ IMediaQuality::IMediaQuality,
+};
+use binder::Interface;
+use std::sync::{Arc, Mutex};
+/// Defined so we can implement the IMediaQuality AIDL interface.
+pub struct MediaQualityService {
+ ambient_light_enabled: Arc<Mutex<bool>>
+}
+
+impl MediaQualityService {
+
+ /// Create a new instance of the MediaQualityService.
+ pub fn new() -> Self {
+ Self {
+ ambient_light_enabled: Arc::new(Mutex::new(false)),
+ }
+ }
+}
+
+impl Interface for MediaQualityService {}
+
+impl IMediaQuality for MediaQualityService {
+ fn setAmbientLightDetectionEnabled(&self, enabled: bool) -> binder::Result<()> {
+ println!("Received enabled: {}", enabled);
+ let mut ambient_light_enabled = self.ambient_light_enabled.lock().unwrap();
+ *ambient_light_enabled = enabled;
+ Ok(())
+ }
+
+ fn getAmbientLightDetectionEnabled(&self) -> binder::Result<bool> {
+ let ambient_light_enabled = self.ambient_light_enabled.lock().unwrap();
+ Ok(*ambient_light_enabled)
+ }
+}
diff --git a/tv/mediaquality/aidl/default/hal/mod.rs b/tv/mediaquality/aidl/default/hal/mod.rs
new file mode 100644
index 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..b44740f
--- /dev/null
+++ b/tv/mediaquality/aidl/vts/functional/Android.bp
@@ -0,0 +1,41 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_team: "trendy_team_tv_os",
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "hardware_interfaces_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["hardware_interfaces_license"],
+}
+
+cc_test {
+ name: "VtsHalMediaQualityTargetTest",
+ defaults: [
+ "VtsHalTargetTestDefaults",
+ "use_libaidlvintf_gtest_helper_static",
+ ],
+ srcs: ["VtsHalMediaQualityTest.cpp"],
+ shared_libs: [
+ "libbinder",
+ ],
+ static_libs: [
+ "android.hardware.tv.mediaquality-V1-cpp",
+ ],
+ test_suites: [
+ "vts",
+ ],
+}
diff --git a/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp b/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp
new file mode 100644
index 0000000..5934e14
--- /dev/null
+++ b/tv/mediaquality/aidl/vts/functional/VtsHalMediaQualityTest.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ambient_intelligence_light_aidl_hal_test"
+
+#include <aidl/Gtest.h>
+#include <aidl/Vintf.h>
+#include <android/hardware/tv/mediaquality/IMediaQuality.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+#include <gtest/gtest.h>
+#include <hidl/GtestPrinter.h>
+#include <hidl/ServiceManagement.h>
+
+using android::ProcessState;
+using android::sp;
+using android::String16;
+using android::binder::Status;
+using android::hardware::hidl_vec;
+using android::hardware::Return;
+using android::hardware::Void;
+using android::hardware::tv::mediaquality::IMediaQuality;
+
+#define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk())
+#define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk())
+
+class MediaQualityAidl : public testing::TestWithParam<std::string> {
+ public:
+ void SetUp() override {
+ mediaquality = android::waitForDeclaredService<IMediaQuality>(String16(GetParam().c_str()));
+ ASSERT_NE(mediaquality, nullptr);
+ }
+
+ sp<IMediaQuality> mediaquality;
+
+ void TearDown() override {}
+};
+
+TEST_P(MediaQualityAidl, TestSetAmbientLightDetectionEnabled) {
+ ASSERT_OK(mediaquality->setAmbientLightDetectionEnabled(true));
+}
+
+TEST_P(MediaQualityAidl, TestGetAmbientLightDetectionEnabled) {
+ bool enabled;
+ Status status = mediaquality->getAmbientLightDetectionEnabled(&enabled);
+ ASSERT_TRUE(status.isOk());
+ ASSERT_TRUE(enabled);
+}
+
+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/1.0/vts/functional/Android.bp b/tv/tuner/1.0/vts/functional/Android.bp
index 6187c73..9f3466a 100644
--- a/tv/tuner/1.0/vts/functional/Android.bp
+++ b/tv/tuner/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_interactive_tv",
// 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"
diff --git a/tv/tuner/1.1/vts/functional/Android.bp b/tv/tuner/1.1/vts/functional/Android.bp
index ac835a4..90b2494 100644
--- a/tv/tuner/1.1/vts/functional/Android.bp
+++ b/tv/tuner/1.1/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_interactive_tv",
// 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"
diff --git a/tv/tuner/aidl/vts/functional/Android.bp b/tv/tuner/aidl/vts/functional/Android.bp
index 0057b6f..4c961ad 100644
--- a/tv/tuner/aidl/vts/functional/Android.bp
+++ b/tv/tuner/aidl/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_interactive_tv",
// 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"
diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/Akm.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/Akm.aidl
new file mode 100644
index 0000000..5baf2e8
--- /dev/null
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/Akm.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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;
+@VintfStability
+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/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/CipherSuite.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/CipherSuite.aidl
new file mode 100644
index 0000000..32fb5ba
--- /dev/null
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/CipherSuite.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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;
+@VintfStability
+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/PasnConfig.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/PasnConfig.aidl
new file mode 100644
index 0000000..9b26c97
--- /dev/null
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/PasnConfig.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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;
+@VintfStability
+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..6197585 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,8 @@
boolean ntbInitiatorSupported;
boolean ntbResponderSupported;
@nullable android.hardware.wifi.common.OuiKeyedData[] vendorData;
+ long akmsSupported;
+ long cipherSuitesSupported;
+ boolean secureHeLtfSupported;
+ boolean rangingFrameProtectionSupported;
}
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/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttSecureConfig.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttSecureConfig.aidl
new file mode 100644
index 0000000..c2d7866
--- /dev/null
+++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/RttSecureConfig.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.wifi;
+@VintfStability
+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/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/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..0cf048d 100644
--- a/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl
+++ b/wifi/aidl/android/hardware/wifi/RttCapabilities.aidl
@@ -84,4 +84,20 @@
* 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;
}
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/aidl_struct_util.cpp b/wifi/aidl/default/aidl_struct_util.cpp
index 0455be7..bf6c206 100644
--- a/wifi/aidl/default/aidl_struct_util.cpp
+++ b/wifi/aidl/default/aidl_struct_util.cpp
@@ -2478,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);
}
@@ -2491,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;
}
@@ -2723,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/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/legacy_headers/include/hardware_legacy/rtt.h b/wifi/legacy_headers/include/hardware_legacy/rtt.h
index 426abe0..631821d 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_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,26 @@
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_ltf_supported;
+ 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/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/BandMask.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/BandMask.aidl
new file mode 100644
index 0000000..6d16580
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/BandMask.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.wifi.supplicant;
+@VintfStability
+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 0462fd3..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);
@@ -124,6 +127,11 @@
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/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/P2pPairingBootstrappingMethodMask.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.aidl
new file mode 100644
index 0000000..6e83277
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pPairingBootstrappingMethodMask.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.supplicant;
+@VintfStability
+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/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/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryParams.aidl
new file mode 100644
index 0000000..b5dc4b1
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pProvisionDiscoveryParams.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.wifi.supplicant;
+@VintfStability
+parcelable P2pProvisionDiscoveryParams {
+ byte[6] peerMacAddress;
+ android.hardware.wifi.supplicant.WpsProvisionMethod provisionMethod;
+ int pairingBootstrappingMethod;
+}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceAdvertisementConfig.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceAdvertisementConfig.aidl
new file mode 100644
index 0000000..36ce742
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceAdvertisementConfig.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.supplicant;
+@VintfStability
+parcelable P2pUsdBasedServiceAdvertisementConfig {
+ String serviceName;
+ int serviceProtocolType;
+ byte[] serviceSpecificInfo;
+ int frequencyMHz;
+ int timeoutInSeconds;
+}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryConfig.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryConfig.aidl
new file mode 100644
index 0000000..a13d107
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryConfig.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.supplicant;
+@VintfStability
+parcelable P2pUsdBasedServiceDiscoveryConfig {
+ String serviceName;
+ int serviceProtocolType;
+ byte[] serviceSpecificInfo;
+ int bandMask;
+ int[] frequencyListMhz;
+ int timeoutInSeconds;
+}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryResultParams.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryResultParams.aidl
new file mode 100644
index 0000000..da129cf
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/P2pUsdBasedServiceDiscoveryResultParams.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.supplicant;
+@VintfStability
+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/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/UsdTerminateReasonCode.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/UsdTerminateReasonCode.aidl
new file mode 100644
index 0000000..0f84783
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/UsdTerminateReasonCode.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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// 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.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 6a9406a..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;
@@ -407,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.
@@ -957,4 +963,63 @@
* |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/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/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/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/supplicant_p2p_iface_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
index a8132aa..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_;
};
/*
@@ -815,9 +846,9 @@
}
/*
- * getFeatureSet
+ * GetFeatureSet
*/
-TEST_P(SupplicantP2pIfaceAidlTest, getFeatureSet) {
+TEST_P(SupplicantP2pIfaceAidlTest, gGetFeatureSet) {
if (interface_version_ < 4) {
GTEST_SKIP() << "getFeatureSet is available as of Supplicant V4";
}
@@ -825,6 +856,74 @@
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(