Merge "Fix VENDOR_MASK constant" into main
diff --git a/audio/aidl/default/apex/com.android.hardware.audio/Android.bp b/audio/aidl/default/apex/com.android.hardware.audio/Android.bp
index 9c91e27..2ece7a1 100644
--- a/audio/aidl/default/apex/com.android.hardware.audio/Android.bp
+++ b/audio/aidl/default/apex/com.android.hardware.audio/Android.bp
@@ -38,6 +38,7 @@
"libpreprocessingaidl",
"libpresetreverbsw",
"libreverbaidl",
+ "libspatializersw",
"libvirtualizersw",
"libvisualizeraidl",
"libvolumesw",
diff --git a/audio/aidl/default/spatializer/Android.bp b/audio/aidl/default/spatializer/Android.bp
index 400629e..2c229fe 100644
--- a/audio/aidl/default/spatializer/Android.bp
+++ b/audio/aidl/default/spatializer/Android.bp
@@ -35,6 +35,6 @@
],
relative_install_path: "soundfx",
visibility: [
- "//hardware/interfaces/audio/aidl/default",
+ "//hardware/interfaces/audio/aidl/default:__subpackages__",
],
}
diff --git a/audio/aidl/default/spatializer/SpatializerSw.cpp b/audio/aidl/default/spatializer/SpatializerSw.cpp
index 6d3c4bd..ef86ddb 100644
--- a/audio/aidl/default/spatializer/SpatializerSw.cpp
+++ b/audio/aidl/default/spatializer/SpatializerSw.cpp
@@ -108,6 +108,8 @@
ndk::ScopedAStatus SpatializerSw::getParameterSpecific(const Parameter::Id& id,
Parameter::Specific* specific) {
+ RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
+
auto tag = id.getTag();
RETURN_IF(Parameter::Id::spatializerTag != tag, EX_ILLEGAL_ARGUMENT, "wrongIdTag");
auto spatializerId = id.get<Parameter::Id::spatializerTag>();
diff --git a/bluetooth/audio/aidl/default/A2dpOffloadAudioProvider.cpp b/bluetooth/audio/aidl/default/A2dpOffloadAudioProvider.cpp
index c7761c5..1eb6a6d 100644
--- a/bluetooth/audio/aidl/default/A2dpOffloadAudioProvider.cpp
+++ b/bluetooth/audio/aidl/default/A2dpOffloadAudioProvider.cpp
@@ -120,6 +120,12 @@
ndk::ScopedAStatus A2dpOffloadAudioProvider::parseA2dpConfiguration(
const CodecId& codec_id, const std::vector<uint8_t>& configuration,
CodecParameters* codec_parameters, A2dpStatus* _aidl_return) {
+ if (!kEnableA2dpCodecExtensibility) {
+ // parseA2dpConfiguration must not be implemented if A2dp codec
+ // extensibility is not supported.
+ return ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION);
+ }
+
auto codec = codec_factory_.GetCodec(codec_id);
if (!codec) {
LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
@@ -136,6 +142,12 @@
const std::vector<A2dpRemoteCapabilities>& remote_a2dp_capabilities,
const A2dpConfigurationHint& hint,
std::optional<audio::A2dpConfiguration>* _aidl_return) {
+ if (!kEnableA2dpCodecExtensibility) {
+ // getA2dpConfiguration must not be implemented if A2dp codec
+ // extensibility is not supported.
+ return ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION);
+ }
+
*_aidl_return = std::nullopt;
A2dpConfiguration avdtp_configuration;
diff --git a/bluetooth/audio/aidl/default/BluetoothAudioProvider.h b/bluetooth/audio/aidl/default/BluetoothAudioProvider.h
index 2c21440..866eaeb 100644
--- a/bluetooth/audio/aidl/default/BluetoothAudioProvider.h
+++ b/bluetooth/audio/aidl/default/BluetoothAudioProvider.h
@@ -35,6 +35,23 @@
namespace bluetooth {
namespace audio {
+/// Enable flag for the reference implementation for A2dp Codec
+/// Extensibility.
+///
+/// A2dp Codec extensibility cannot be enabled until the following
+/// requirements are fulfilled.
+///
+/// 1. The Bluetooth controller must support the HCI Requirements
+/// v1.04 or later, and must support the vendor HCI command
+/// A2DP Offload Start (v2), A2DP Offload Stop (v2) as indicated
+/// by the field a2dp_offload_v2 of the vendor capabilities.
+///
+/// 2. The implementation of the provider must be completed with
+/// DSP configuration for streaming.
+enum : bool {
+ kEnableA2dpCodecExtensibility = false,
+};
+
class BluetoothAudioProvider : public BnBluetoothAudioProvider {
public:
BluetoothAudioProvider();
diff --git a/bluetooth/audio/aidl/default/BluetoothAudioProviderFactory.cpp b/bluetooth/audio/aidl/default/BluetoothAudioProviderFactory.cpp
index c7c6e6d..584640b 100644
--- a/bluetooth/audio/aidl/default/BluetoothAudioProviderFactory.cpp
+++ b/bluetooth/audio/aidl/default/BluetoothAudioProviderFactory.cpp
@@ -159,6 +159,12 @@
if (session_type == SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
session_type == SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
+ if (!kEnableA2dpCodecExtensibility) {
+ // Implementing getProviderInfo equates supporting
+ // A2dp codec extensibility.
+ return ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION);
+ }
+
auto& provider_info = _aidl_return->emplace();
provider_info.name = a2dp_offload_codec_factory_.name;
diff --git a/broadcastradio/aidl/default/test/Android.bp b/broadcastradio/aidl/default/test/Android.bp
index 9e1b89d..a33fb70 100644
--- a/broadcastradio/aidl/default/test/Android.bp
+++ b/broadcastradio/aidl/default/test/Android.bp
@@ -15,6 +15,7 @@
*/
package {
+ default_team: "trendy_team_aaos_framework",
default_applicable_licenses: ["Android-Apache-2.0"],
}
diff --git a/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp b/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp
index 5fce61a..78fcf27 100644
--- a/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp
+++ b/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp
@@ -132,6 +132,37 @@
return false;
}
+ std::optional<utils::ProgramInfoSet> getProgramList() {
+ ProgramFilter emptyFilter = {};
+ return getProgramList(emptyFilter);
+ }
+
+ std::optional<utils::ProgramInfoSet> getProgramList(const ProgramFilter& filter) {
+ mTunerCallback->reset();
+
+ auto startResult = mBroadcastRadioHal->startProgramListUpdates(filter);
+
+ EXPECT_TRUE(startResult.isOk());
+
+ if (!startResult.isOk()) {
+ return std::nullopt;
+ }
+ EXPECT_TRUE(mTunerCallback->waitProgramReady());
+
+ auto stopResult = mBroadcastRadioHal->stopProgramListUpdates();
+
+ EXPECT_TRUE(stopResult.isOk());
+
+ return mTunerCallback->getProgramList();
+ }
+
+ void switchToFmBand() {
+ ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+ mTunerCallback->reset();
+ ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
+ verifyUpdatedProgramInfo(kFmSel1);
+ }
+
std::shared_ptr<BroadcastRadio> mBroadcastRadioHal;
std::shared_ptr<MockBroadcastRadioCallback> mTunerCallback;
};
@@ -326,10 +357,7 @@
}
TEST_F(DefaultBroadcastRadioHalTest, StepWithoutTunerCallback) {
- ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
- mTunerCallback->reset();
- ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
- verifyUpdatedProgramInfo(kFmSel1);
+ switchToFmBand();
mBroadcastRadioHal->unsetTunerCallback();
auto halResult = mBroadcastRadioHal->step(/* directionUp= */ false);
@@ -337,6 +365,85 @@
ASSERT_EQ(halResult.getServiceSpecificError(), utils::resultToInt(Result::INVALID_STATE));
}
+TEST_F(DefaultBroadcastRadioHalTest, SeekUpWithoutSkipSubchannel) {
+ ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+ mTunerCallback->reset();
+ ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq1Sel1).isOk());
+ verifyUpdatedProgramInfo(kFmHdFreq1Sel1);
+
+ auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ true, /* skipSubChannel= */ false);
+
+ ASSERT_TRUE(halResult.isOk());
+ verifyUpdatedProgramInfo(kFmHdFreq1Sel2);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, SeekUpWithSkipSubchannel) {
+ ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+ mTunerCallback->reset();
+ ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq1Sel1).isOk());
+ verifyUpdatedProgramInfo(kFmHdFreq1Sel1);
+
+ auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ true, /* skipSubChannel= */ true);
+
+ ASSERT_TRUE(halResult.isOk());
+ verifyUpdatedProgramInfo(kFmSel2);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, SeekUpFromLastProgramInProgramList) {
+ ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+ mTunerCallback->reset();
+ ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq2Sel1).isOk());
+ verifyUpdatedProgramInfo(kFmHdFreq2Sel1);
+
+ auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ true, /* skipSubChannel= */ true);
+
+ ASSERT_TRUE(halResult.isOk());
+ verifyUpdatedProgramInfo(kFmSel1);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, SeekDownWithoutSkipSubchannel) {
+ ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+ mTunerCallback->reset();
+ ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq1Sel2).isOk());
+ verifyUpdatedProgramInfo(kFmHdFreq1Sel2);
+
+ auto halResult =
+ mBroadcastRadioHal->seek(/* directionUp= */ false, /* skipSubChannel= */ false);
+
+ ASSERT_TRUE(halResult.isOk());
+ verifyUpdatedProgramInfo(kFmHdFreq1Sel1);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, SeekDownWithSkipSubchannel) {
+ ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+ mTunerCallback->reset();
+ ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq1Sel2).isOk());
+ verifyUpdatedProgramInfo(kFmHdFreq1Sel2);
+
+ auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ false, /* skipSubChannel= */ true);
+
+ ASSERT_TRUE(halResult.isOk());
+ verifyUpdatedProgramInfo(kFmSel1);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, SeekDownWithFirstProgramInProgramList) {
+ switchToFmBand();
+
+ auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ false, /* skipSubChannel= */ true);
+
+ ASSERT_TRUE(halResult.isOk());
+ verifyUpdatedProgramInfo(kFmHdFreq2Sel1);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, SeekWithoutTunerCallback) {
+ switchToFmBand();
+ mBroadcastRadioHal->unsetTunerCallback();
+
+ auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ false, /* skipSubChannel= */ true);
+
+ ASSERT_EQ(halResult.getServiceSpecificError(), utils::resultToInt(Result::INVALID_STATE));
+}
+
TEST_F(DefaultBroadcastRadioHalTest, Cancel) {
ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
mTunerCallback->reset();
@@ -348,4 +455,63 @@
mTunerCallback->reset();
}
+TEST_F(DefaultBroadcastRadioHalTest, SetConfigFlag) {
+ ConfigFlag flag = ConfigFlag::FORCE_MONO;
+
+ auto setResult = mBroadcastRadioHal->setConfigFlag(flag, /* value= */ true);
+
+ ASSERT_TRUE(setResult.isOk());
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, GetConfigFlag) {
+ bool gotValue = false;
+ ConfigFlag flag = ConfigFlag::FORCE_MONO;
+ mBroadcastRadioHal->setConfigFlag(flag, /* value= */ true);
+
+ auto getResult = mBroadcastRadioHal->isConfigFlagSet(flag, &gotValue);
+
+ ASSERT_TRUE(getResult.isOk());
+ ASSERT_TRUE(gotValue);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, StartProgramListUpdatesWithEmptyFilter) {
+ switchToFmBand();
+
+ auto programList = getProgramList();
+
+ ASSERT_TRUE(programList.has_value());
+ for (auto it = programList->begin(); it != programList->end(); it++) {
+ EXPECT_EQ(utils::getBand(utils::getAmFmFrequency(it->selector)), utils::FrequencyBand::FM);
+ }
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, StartProgramListUpdatesWithAmFmFilter) {
+ ProgramFilter amFmFilter = {.identifierTypes = {IdentifierType::AMFM_FREQUENCY_KHZ},
+ .identifiers = {},
+ .includeCategories = false,
+ .excludeModifications = false};
+ switchToFmBand();
+
+ auto programList = getProgramList(amFmFilter);
+
+ ASSERT_TRUE(programList.has_value());
+ for (auto it = programList->begin(); it != programList->end(); it++) {
+ EXPECT_TRUE(utils::hasId(it->selector, IdentifierType::AMFM_FREQUENCY_KHZ));
+ EXPECT_EQ(utils::getBand(utils::getAmFmFrequency(it->selector)), utils::FrequencyBand::FM);
+ }
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, StartProgramListUpdatesWhenHdIsDisabled) {
+ switchToFmBand();
+ mBroadcastRadioHal->setConfigFlag(ConfigFlag::FORCE_ANALOG_FM, /* value= */ true);
+
+ auto programList = getProgramList();
+
+ ASSERT_TRUE(programList.has_value());
+ for (auto it = programList->begin(); it != programList->end(); it++) {
+ EXPECT_FALSE(utils::hasId(it->selector, IdentifierType::HD_STATION_ID_EXT));
+ EXPECT_EQ(utils::getBand(utils::getAmFmFrequency(it->selector)), utils::FrequencyBand::FM);
+ }
+}
+
} // namespace aidl::android::hardware::broadcastradio
diff --git a/broadcastradio/aidl/default/test/MockBroadcastRadioCallback.cpp b/broadcastradio/aidl/default/test/MockBroadcastRadioCallback.cpp
index 48f65fc..963f8bf 100644
--- a/broadcastradio/aidl/default/test/MockBroadcastRadioCallback.cpp
+++ b/broadcastradio/aidl/default/test/MockBroadcastRadioCallback.cpp
@@ -49,8 +49,16 @@
return ndk::ScopedAStatus::ok();
}
-ScopedAStatus MockBroadcastRadioCallback::onProgramListUpdated(
- [[maybe_unused]] const ProgramListChunk& chunk) {
+ScopedAStatus MockBroadcastRadioCallback::onProgramListUpdated(const ProgramListChunk& chunk) {
+ {
+ std::lock_guard<std::mutex> lk(mLock);
+ updateProgramList(chunk, &mProgramList);
+ }
+
+ if (chunk.complete) {
+ mOnProgramListReadyFlag.notify();
+ }
+
return ndk::ScopedAStatus::ok();
}
@@ -76,8 +84,13 @@
return mOnCurrentProgramInfoChangedFlag.wait();
}
+bool MockBroadcastRadioCallback::waitProgramReady() {
+ return mOnProgramListReadyFlag.wait();
+}
+
void MockBroadcastRadioCallback::reset() {
mOnCurrentProgramInfoChangedFlag.reset();
+ mOnProgramListReadyFlag.reset();
}
bool MockBroadcastRadioCallback::isTunerFailed() {
@@ -90,4 +103,9 @@
return mCurrentProgramInfo;
}
+utils::ProgramInfoSet MockBroadcastRadioCallback::getProgramList() {
+ std::lock_guard<std::mutex> lk(mLock);
+ return mProgramList;
+}
+
} // namespace aidl::android::hardware::broadcastradio
diff --git a/broadcastradio/aidl/default/test/MockBroadcastRadioCallback.h b/broadcastradio/aidl/default/test/MockBroadcastRadioCallback.h
index 2ae03e3..4415842 100644
--- a/broadcastradio/aidl/default/test/MockBroadcastRadioCallback.h
+++ b/broadcastradio/aidl/default/test/MockBroadcastRadioCallback.h
@@ -49,10 +49,12 @@
ScopedAStatus onConfigFlagUpdated(ConfigFlag in_flag, bool in_value) override;
bool waitOnCurrentProgramInfoChangedCallback();
+ bool waitProgramReady();
bool isTunerFailed();
void reset();
ProgramInfo getCurrentProgramInfo();
+ utils::ProgramInfoSet getProgramList();
private:
class CallbackFlag final {
@@ -98,6 +100,7 @@
ProgramInfo mCurrentProgramInfo GUARDED_BY(mLock);
utils::ProgramInfoSet mProgramList GUARDED_BY(mLock);
CallbackFlag mOnCurrentProgramInfoChangedFlag = CallbackFlag(IBroadcastRadio::TUNER_TIMEOUT_MS);
+ CallbackFlag mOnProgramListReadyFlag = CallbackFlag(IBroadcastRadio::LIST_COMPLETE_TIMEOUT_MS);
};
} // namespace aidl::android::hardware::broadcastradio
diff --git a/broadcastradio/common/utilsaidl/Android.bp b/broadcastradio/common/utilsaidl/Android.bp
index 4814778..e3bdfdd 100644
--- a/broadcastradio/common/utilsaidl/Android.bp
+++ b/broadcastradio/common/utilsaidl/Android.bp
@@ -20,6 +20,7 @@
// all of the 'license_kinds' from "hardware_interfaces_license"
// to get the below license kinds:
// SPDX-license-identifier-Apache-2.0
+ default_team: "trendy_team_aaos_framework",
default_applicable_licenses: ["hardware_interfaces_license"],
}
diff --git a/compatibility_matrices/Android.bp b/compatibility_matrices/Android.bp
index b21fe54..dd502ba 100644
--- a/compatibility_matrices/Android.bp
+++ b/compatibility_matrices/Android.bp
@@ -82,11 +82,3 @@
"kernel_config_v_6.6",
],
}
-
-vintf_compatibility_matrix {
- name: "framework_compatibility_matrix.tmp.xml",
- stem: "compatibility_matrix.tmp.xml",
- srcs: [
- "compatibility_matrix.tmp.xml",
- ],
-}
diff --git a/compatibility_matrices/Android.mk b/compatibility_matrices/Android.mk
index 76dbdd6..639abf9 100644
--- a/compatibility_matrices/Android.mk
+++ b/compatibility_matrices/Android.mk
@@ -112,7 +112,7 @@
ifeq ($(RELEASE_AIDL_USE_UNFROZEN),true)
my_system_matrix_deps += \
framework_compatibility_matrix.202404.xml \
- framework_compatibility_matrix.tmp.xml
+
endif
my_framework_matrix_deps += \
diff --git a/compatibility_matrices/bump.py b/compatibility_matrices/bump.py
index 88b7a42..a5a453b 100755
--- a/compatibility_matrices/bump.py
+++ b/compatibility_matrices/bump.py
@@ -16,8 +16,6 @@
#
"""
Creates the next compatibility matrix.
-
-Requires libvintf Level.h to be updated before executing this script.
"""
import argparse
@@ -44,44 +42,33 @@
self.top = pathlib.Path(os.environ["ANDROID_BUILD_TOP"])
self.interfaces_dir = self.top / "hardware/interfaces"
- self.current_level = cmdline_args.current
+ self.current_level = cmdline_args.current_level
+ self.current_letter = cmdline_args.current_letter
self.current_module_name = f"framework_compatibility_matrix.{self.current_level}.xml"
self.current_xml = self.interfaces_dir / f"compatibility_matrices/compatibility_matrix.{self.current_level}.xml"
+ self.device_module_name = "framework_compatibility_matrix.device.xml"
- self.next_level = cmdline_args.next
+ self.next_level = cmdline_args.next_level
+ self.next_letter = cmdline_args.next_letter
self.next_module_name = f"framework_compatibility_matrix.{self.next_level}.xml"
self.next_xml = self.interfaces_dir / f"compatibility_matrices/compatibility_matrix.{self.next_level}.xml"
- self.level_to_letter = self.get_level_to_letter_mapping()
- print("Found level mapping in libvintf Level.h:", self.level_to_letter)
-
def run(self):
self.bump_kernel_configs()
self.copy_matrix()
self.edit_android_bp()
self.edit_android_mk()
- def get_level_to_letter_mapping(self):
- levels_file = self.top / "system/libvintf/include/vintf/Level.h"
- with open(levels_file) as f:
- lines = f.readlines()
- pairs = [
- line.split("=", maxsplit=2) for line in lines if "=" in line
- ]
- return {
- level.strip().removesuffix(","): letter.strip()
- for letter, level in pairs
- }
-
def bump_kernel_configs(self):
check_call([
self.top / "kernel/configs/tools/bump.py",
- self.level_to_letter[self.current_level].lower(),
- self.level_to_letter[self.next_level].lower(),
+ self.current_letter,
+ self.next_letter,
])
def copy_matrix(self):
- shutil.copyfile(self.current_xml, self.next_xml)
+ with open(self.current_xml) as f_current, open(self.next_xml, "w") as f_next:
+ f_next.write(f_current.read().replace(f"level=\"{self.current_level}\"", f"level=\"{self.next_level}\""))
def edit_android_bp(self):
android_bp = self.interfaces_dir / "compatibility_matrices/Android.bp"
@@ -100,7 +87,7 @@
next_kernel_configs = check_output(
"""grep -rh name: | sed -E 's/^.*"(.*)".*/\\1/g'""",
cwd=self.top / "kernel/configs" /
- self.level_to_letter[self.next_level].lower(),
+ self.next_letter,
text=True,
shell=True,
).splitlines()
@@ -124,31 +111,38 @@
def edit_android_mk(self):
android_mk = self.interfaces_dir / "compatibility_matrices/Android.mk"
+ lines = []
with open(android_mk) as f:
if self.next_module_name in f.read():
return
f.seek(0)
- lines = f.readlines()
- current_module_line_number = None
- for line_number, line in enumerate(lines):
- if self.current_module_name in line:
- current_module_line_number = line_number
- break
- assert current_module_line_number is not None
- lines.insert(current_module_line_number + 1,
- f" {self.next_module_name} \\\n")
+ for line in f:
+ if f" {self.device_module_name} \\\n" in line:
+ lines.append(f" {self.current_module_name} \\\n")
+
+ if self.current_module_name in line:
+ lines.append(f" {self.next_module_name} \\\n")
+ else:
+ lines.append(line)
+
with open(android_mk, "w") as f:
f.write("".join(lines))
def main():
parser = argparse.ArgumentParser(description=__doc__)
- parser.add_argument("current",
+ parser.add_argument("current_level",
type=str,
help="VINTF level of the current version (e.g. 9)")
- parser.add_argument("next",
+ parser.add_argument("next_level",
type=str,
help="VINTF level of the next version (e.g. 10)")
+ parser.add_argument("current_letter",
+ type=str,
+ help="Letter of the API level of the current version (e.g. v)")
+ parser.add_argument("next_letter",
+ type=str,
+ help="Letter of the API level of the next version (e.g. w)")
cmdline_args = parser.parse_args()
Bump(cmdline_args).run()
diff --git a/compatibility_matrices/compatibility_matrix.tmp.xml b/compatibility_matrices/compatibility_matrix.tmp.xml
deleted file mode 100644
index 85e3c4c..0000000
--- a/compatibility_matrices/compatibility_matrix.tmp.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<compatibility-matrix version="1.0" type="framework" level="202404">
- <!-- This file holds the HIDL media.c2 interface while it
- is being deprecated. This will be removed after the flag ramping
- complete. This interface is not allowed in the 202404 vendor interface -->
- <hal format="hidl" optional="true">
- <name>android.hardware.media.c2</name>
- <version>1.0-2</version>
- <interface>
- <name>IComponentStore</name>
- <instance>software</instance>
- <regex-instance>default[0-9]*</regex-instance>
- <regex-instance>vendor[0-9]*_software</regex-instance>
- </interface>
- </hal>
- <hal format="hidl" optional="true">
- <name>android.hardware.media.c2</name>
- <version>1.0</version>
- <interface>
- <name>IConfigurable</name>
- <instance>default</instance>
- <instance>software</instance>
- </interface>
- </hal>
-</compatibility-matrix>
diff --git a/graphics/mapper/stable-c/vts/VtsHalGraphicsMapperStableC_TargetTest.cpp b/graphics/mapper/stable-c/vts/VtsHalGraphicsMapperStableC_TargetTest.cpp
index b329de2..1e0c427 100644
--- a/graphics/mapper/stable-c/vts/VtsHalGraphicsMapperStableC_TargetTest.cpp
+++ b/graphics/mapper/stable-c/vts/VtsHalGraphicsMapperStableC_TargetTest.cpp
@@ -166,7 +166,8 @@
auto status = mAllocator->getIMapperLibrarySuffix(&mapperSuffix);
ASSERT_TRUE(status.isOk()) << "Failed to get IMapper library suffix";
std::string lib_name = "mapper." + mapperSuffix + ".so";
- void* so = android_load_sphal_library(lib_name.c_str(), RTLD_LOCAL | RTLD_NOW);
+ void* so = AServiceManager_openDeclaredPassthroughHal("mapper", mapperSuffix.c_str(),
+ RTLD_LOCAL | RTLD_NOW);
ASSERT_NE(nullptr, so) << "Failed to load " << lib_name;
mIMapperLoader = (AIMapper_loadIMapperFn)dlsym(so, "AIMapper_loadIMapper");
ASSERT_NE(nullptr, mIMapperLoader) << "AIMapper_locaIMapper missing from " << lib_name;
diff --git a/keymaster/4.0/vts/functional/HmacKeySharingTest.cpp b/keymaster/4.0/vts/functional/HmacKeySharingTest.cpp
index 1bff076..a076438 100644
--- a/keymaster/4.0/vts/functional/HmacKeySharingTest.cpp
+++ b/keymaster/4.0/vts/functional/HmacKeySharingTest.cpp
@@ -51,7 +51,7 @@
};
using KeymasterVec = std::vector<sp<IKeymasterDevice>>;
- using ByteString = std::basic_string<uint8_t>;
+ using ByteString = std::vector<uint8_t>;
// using NonceVec = std::vector<HidlBuf>;
GetParamsResult getHmacSharingParameters(IKeymasterDevice& keymaster) {
@@ -98,7 +98,7 @@
std::vector<ByteString> copyNonces(const hidl_vec<HmacSharingParameters>& paramsVec) {
std::vector<ByteString> nonces;
for (auto& param : paramsVec) {
- nonces.emplace_back(param.nonce.data(), param.nonce.size());
+ nonces.emplace_back(param.nonce.data(), param.nonce.data() + param.nonce.size());
}
return nonces;
}
diff --git a/neuralnetworks/aidl/utils/src/Conversions.cpp b/neuralnetworks/aidl/utils/src/Conversions.cpp
index 47c72b4..9f920bb 100644
--- a/neuralnetworks/aidl/utils/src/Conversions.cpp
+++ b/neuralnetworks/aidl/utils/src/Conversions.cpp
@@ -421,7 +421,7 @@
return createSharedMemoryFromAHWB(ahwb, /*takeOwnership=*/true);
#else // __ANDROID__
- LOG(FATAL) << "GeneralResult<SharedMemory> unvalidatedConvert(const aidl_hal::Memory& "
+ LOG(ERROR) << "GeneralResult<SharedMemory> unvalidatedConvert(const aidl_hal::Memory& "
"memory): Not Available on Host Build";
return NN_ERROR() << "createFromHandle failed";
#endif // __ANDROID__
@@ -732,7 +732,7 @@
};
return Memory::make<Memory::Tag::hardwareBuffer>(std::move(hardwareBuffer));
#else // __ANDROID__
- LOG(FATAL) << "nn::GeneralResult<Memory> unvalidatedConvert(const nn::Memory::HardwareBuffer& "
+ LOG(ERROR) << "nn::GeneralResult<Memory> unvalidatedConvert(const nn::Memory::HardwareBuffer& "
"memory): Not Available on Host Build";
(void)memory;
return (NN_ERROR() << "unvalidatedConvert failed").operator nn::GeneralResult<Memory>();
diff --git a/radio/aidl/vts/radio_network_test.cpp b/radio/aidl/vts/radio_network_test.cpp
index d95de0d..5cb0158 100644
--- a/radio/aidl/vts/radio_network_test.cpp
+++ b/radio/aidl/vts/radio_network_test.cpp
@@ -237,8 +237,10 @@
{RadioError::RADIO_NOT_AVAILABLE, RadioError::INVALID_STATE,
RadioError::SIM_ABSENT, RadioError::INTERNAL_ERR, RadioError::NONE});
- ASSERT_TRUE(radioRsp_network->usageSetting == UsageSetting::VOICE_CENTRIC ||
- radioRsp_network->usageSetting == UsageSetting::DATA_CENTRIC);
+ if (radioRsp_network->rspInfo.error == RadioError::NONE) {
+ ASSERT_TRUE(radioRsp_network->usageSetting == UsageSetting::VOICE_CENTRIC ||
+ radioRsp_network->usageSetting == UsageSetting::DATA_CENTRIC);
+ }
}
void RadioNetworkTest::testSetUsageSetting_InvalidValues(std::vector<RadioError> errors) {
diff --git a/security/keymint/aidl/vts/functional/KeyMintTest.cpp b/security/keymint/aidl/vts/functional/KeyMintTest.cpp
index e098aca..0b7627c 100644
--- a/security/keymint/aidl/vts/functional/KeyMintTest.cpp
+++ b/security/keymint/aidl/vts/functional/KeyMintTest.cpp
@@ -1064,32 +1064,53 @@
TEST_P(NewKeyGenerationTest, RsaWithSpecifiedValidity) {
vector<uint8_t> key_blob;
vector<KeyCharacteristics> key_characteristics;
- ASSERT_EQ(ErrorCode::OK,
- GenerateKey(AuthorizationSetBuilder()
- .RsaSigningKey(2048, 65537)
- .Digest(Digest::NONE)
- .Padding(PaddingMode::NONE)
- .Authorization(TAG_CERTIFICATE_NOT_BEFORE,
- 1183806000000 /* 2007-07-07T11:00:00Z */)
- .Authorization(TAG_CERTIFICATE_NOT_AFTER,
- 1916049600000 /* 2030-09-19T12:00:00Z */),
- &key_blob, &key_characteristics));
- ASSERT_GT(cert_chain_.size(), 0);
+ vector<uint64_t> test_vector_not_before_millis = {
+ 458046000000, /* 1984-07-07T11:00:00Z */
+ 1183806000000, /* 2007-07-07T11:00:00Z */
+ 1924991999000, /* 2030-12-31T23:59:59Z */
+ 3723753599000, /* 2087-12-31T23:59:59Z */
+ 26223868799000, /* 2800-12-31T23:59:59Z */
+ 45157996799000, /* 3400-12-31T23:59:59Z */
+ 60719587199000, /* 3894-02-15T23:59:59Z */
+ 95302051199000, /* 4989-12-31T23:59:59Z */
+ 86182012799000, /* 4700-12-31T23:59:59Z */
+ 111427574399000, /* 5500-12-31T23:59:59Z */
+ 136988668799000, /* 6310-12-31T23:59:59Z */
+ 139828895999000, /* 6400-12-31T23:59:59Z */
+ 169839503999000, /* 7351-12-31T23:59:59Z */
+ 171385804799000, /* 7400-12-31T23:59:59Z */
+ 190320019199000, /* 8000-12-31T23:59:59Z */
+ 193475692799000, /* 8100-12-31T23:59:59Z */
+ 242515209599000, /* 9654-12-31T23:59:59Z */
+ 250219065599000, /* 9899-02-15T23:59:59Z */
+ };
+ for (auto notBefore : test_vector_not_before_millis) {
+ uint64_t notAfter = notBefore + 378691200000 /* 12 years milliseconds*/;
+ ASSERT_EQ(ErrorCode::OK,
+ GenerateKey(AuthorizationSetBuilder()
+ .RsaSigningKey(2048, 65537)
+ .Digest(Digest::NONE)
+ .Padding(PaddingMode::NONE)
+ .Authorization(TAG_CERTIFICATE_NOT_BEFORE, notBefore)
+ .Authorization(TAG_CERTIFICATE_NOT_AFTER, notAfter),
+ &key_blob, &key_characteristics));
+ ASSERT_GT(cert_chain_.size(), 0);
- X509_Ptr cert(parse_cert_blob(cert_chain_[0].encodedCertificate));
- ASSERT_TRUE(!!cert.get());
+ X509_Ptr cert(parse_cert_blob(cert_chain_[0].encodedCertificate));
+ ASSERT_TRUE(!!cert.get());
- const ASN1_TIME* not_before = X509_get0_notBefore(cert.get());
- ASSERT_NE(not_before, nullptr);
- time_t not_before_time;
- ASSERT_EQ(ASN1_TIME_to_time_t(not_before, ¬_before_time), 1);
- EXPECT_EQ(not_before_time, 1183806000);
+ const ASN1_TIME* not_before = X509_get0_notBefore(cert.get());
+ ASSERT_NE(not_before, nullptr);
+ time_t not_before_time;
+ ASSERT_EQ(ASN1_TIME_to_time_t(not_before, ¬_before_time), 1);
+ EXPECT_EQ(not_before_time, (notBefore / 1000));
- const ASN1_TIME* not_after = X509_get0_notAfter(cert.get());
- ASSERT_NE(not_after, nullptr);
- time_t not_after_time;
- ASSERT_EQ(ASN1_TIME_to_time_t(not_after, ¬_after_time), 1);
- EXPECT_EQ(not_after_time, 1916049600);
+ const ASN1_TIME* not_after = X509_get0_notAfter(cert.get());
+ ASSERT_NE(not_after, nullptr);
+ time_t not_after_time;
+ ASSERT_EQ(ASN1_TIME_to_time_t(not_after, ¬_after_time), 1);
+ EXPECT_EQ(not_after_time, (notAfter / 1000));
+ }
}
/*
diff --git a/security/keymint/support/remote_prov_utils_test.cpp b/security/keymint/support/remote_prov_utils_test.cpp
index 630f7bb..89469f1 100644
--- a/security/keymint/support/remote_prov_utils_test.cpp
+++ b/security/keymint/support/remote_prov_utils_test.cpp
@@ -14,20 +14,23 @@
* limitations under the License.
*/
-#include "cppbor.h"
-#include "keymaster/cppcose/cppcose.h"
#include <aidl/android/hardware/security/keymint/RpcHardwareInfo.h>
#include <android-base/properties.h>
+#include <cppbor.h>
#include <cppbor_parse.h>
-#include <cstdint>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <keymaster/android_keymaster_utils.h>
+#include <keymaster/cppcose/cppcose.h>
#include <keymaster/logger.h>
#include <keymaster/remote_provisioning_utils.h>
#include <openssl/curve25519.h>
#include <remote_prov/remote_prov_utils.h>
+#include <algorithm>
+#include <cstdint>
+#include <span>
+
namespace aidl::android::hardware::security::keymint::remote_prov {
namespace {
@@ -36,7 +39,11 @@
using ::keymaster::kStatusInvalidEek;
using ::keymaster::StatusOr;
using ::testing::ElementsAreArray;
-using byte_view = std::basic_string_view<uint8_t>;
+using byte_view = std::span<const uint8_t>;
+
+inline bool equal_byte_views(const byte_view& view1, const byte_view& view2) {
+ return std::equal(view1.begin(), view1.end(), view2.begin(), view2.end());
+}
struct KeyInfoEcdsa {
CoseKeyCurve curve;
@@ -44,7 +51,8 @@
byte_view pubKeyY;
bool operator==(const KeyInfoEcdsa& other) const {
- return curve == other.curve && pubKeyX == other.pubKeyX && pubKeyY == other.pubKeyY;
+ return curve == other.curve && equal_byte_views(pubKeyX, other.pubKeyX) &&
+ equal_byte_views(pubKeyY, other.pubKeyY);
}
};
diff --git a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp
index c88cb59..6c6846f 100644
--- a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp
+++ b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp
@@ -109,6 +109,11 @@
ASSERT_TRUE(vibrator->getCapabilities(&capabilities).isOk());
}
+ virtual void TearDown() override {
+ // Reset vibrator state between tests.
+ EXPECT_TRUE(vibrator->off().isOk());
+ }
+
sp<IVibrator> vibrator;
int32_t capabilities;
};
@@ -429,189 +434,202 @@
}
TEST_P(VibratorAidl, ComposeValidPrimitives) {
- if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
- std::vector<CompositePrimitive> supported;
- int32_t maxDelay, maxSize;
+ if (!(capabilities & IVibrator::CAP_COMPOSE_EFFECTS)) {
+ GTEST_SKIP() << "CAP_COMPOSE_EFFECTS not supported";
+ }
- ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
- EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionDelayMax(&maxDelay).exceptionCode());
- EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionSizeMax(&maxSize).exceptionCode());
+ std::vector<CompositePrimitive> supported;
+ int32_t maxDelay, maxSize;
- std::vector<CompositeEffect> composite;
+ ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
+ EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionDelayMax(&maxDelay).exceptionCode());
+ EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionSizeMax(&maxSize).exceptionCode());
- for (auto primitive : supported) {
- CompositeEffect effect;
+ std::vector<CompositeEffect> composite;
- effect.delayMs = std::rand() % (maxDelay + 1);
- effect.primitive = primitive;
- effect.scale = static_cast<float>(std::rand()) / static_cast<float>(RAND_MAX);
- composite.emplace_back(effect);
+ for (int i = 0; i < supported.size(); i++) {
+ auto primitive = supported[i];
+ float t = static_cast<float>(i + 1) / supported.size();
+ CompositeEffect effect;
- if (composite.size() == maxSize) {
- EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
- composite.clear();
- vibrator->off();
- }
+ effect.delayMs = maxDelay * t;
+ effect.primitive = primitive;
+ effect.scale = t;
+
+ if (composite.size() == maxSize) {
+ break;
}
+ }
- if (composite.size() != 0) {
- EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
- vibrator->off();
- }
+ if (composite.size() != 0) {
+ EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
+ EXPECT_TRUE(vibrator->off().isOk());
}
}
TEST_P(VibratorAidl, ComposeUnsupportedPrimitives) {
- if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
- auto unsupported = kInvalidPrimitives;
- std::vector<CompositePrimitive> supported;
+ if (!(capabilities & IVibrator::CAP_COMPOSE_EFFECTS)) {
+ GTEST_SKIP() << "CAP_COMPOSE_EFFECTS not supported";
+ }
- ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
+ auto unsupported = kInvalidPrimitives;
+ std::vector<CompositePrimitive> supported;
- for (auto primitive : kCompositePrimitives) {
- bool isPrimitiveSupported =
+ ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
+
+ for (auto primitive : kCompositePrimitives) {
+ bool isPrimitiveSupported =
std::find(supported.begin(), supported.end(), primitive) != supported.end();
- if (!isPrimitiveSupported) {
- unsupported.push_back(primitive);
- }
+ if (!isPrimitiveSupported) {
+ unsupported.push_back(primitive);
}
+ }
- for (auto primitive : unsupported) {
- std::vector<CompositeEffect> composite(1);
+ for (auto primitive : unsupported) {
+ std::vector<CompositeEffect> composite(1);
- for (auto &effect : composite) {
- effect.delayMs = 0;
- effect.primitive = primitive;
- effect.scale = 1.0f;
- }
- Status status = vibrator->compose(composite, nullptr);
- EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
- vibrator->off();
+ for (auto& effect : composite) {
+ effect.delayMs = 0;
+ effect.primitive = primitive;
+ effect.scale = 1.0f;
}
+ Status status = vibrator->compose(composite, nullptr);
+ EXPECT_TRUE(isUnknownOrUnsupported(status)) << status;
}
}
TEST_P(VibratorAidl, ComposeScaleBoundary) {
- if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
- std::vector<CompositeEffect> composite(1);
- CompositeEffect &effect = composite[0];
-
- effect.delayMs = 0;
- effect.primitive = CompositePrimitive::CLICK;
-
- effect.scale = std::nextafter(0.0f, -1.0f);
- EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
- vibrator->compose(composite, nullptr).exceptionCode());
-
- effect.scale = 0.0f;
- EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
-
- effect.scale = 1.0f;
- EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
-
- effect.scale = std::nextafter(1.0f, 2.0f);
- EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
- vibrator->compose(composite, nullptr).exceptionCode());
-
- vibrator->off();
+ if (!(capabilities & IVibrator::CAP_COMPOSE_EFFECTS)) {
+ GTEST_SKIP() << "CAP_COMPOSE_EFFECTS not supported";
}
+
+ std::vector<CompositeEffect> composite(1);
+ CompositeEffect& effect = composite[0];
+
+ effect.delayMs = 0;
+ effect.primitive = CompositePrimitive::CLICK;
+
+ effect.scale = std::nextafter(0.0f, -1.0f);
+ EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT, vibrator->compose(composite, nullptr).exceptionCode());
+
+ effect.scale = 0.0f;
+ EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
+ EXPECT_TRUE(vibrator->off().isOk());
+
+ effect.scale = 1.0f;
+ EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
+ EXPECT_TRUE(vibrator->off().isOk());
+
+ effect.scale = std::nextafter(1.0f, 2.0f);
+ EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT, vibrator->compose(composite, nullptr).exceptionCode());
}
TEST_P(VibratorAidl, ComposeDelayBoundary) {
- if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
- int32_t maxDelay;
-
- EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionDelayMax(&maxDelay).exceptionCode());
-
- std::vector<CompositeEffect> composite(1);
- CompositeEffect effect;
-
- effect.delayMs = 1;
- effect.primitive = CompositePrimitive::CLICK;
- effect.scale = 1.0f;
-
- std::fill(composite.begin(), composite.end(), effect);
- EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
-
- effect.delayMs = maxDelay + 1;
-
- std::fill(composite.begin(), composite.end(), effect);
- EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
- vibrator->compose(composite, nullptr).exceptionCode());
- vibrator->off();
+ if (!(capabilities & IVibrator::CAP_COMPOSE_EFFECTS)) {
+ GTEST_SKIP() << "CAP_COMPOSE_EFFECTS not supported";
}
+
+ int32_t maxDelay;
+
+ EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionDelayMax(&maxDelay).exceptionCode());
+
+ std::vector<CompositeEffect> composite(1);
+ CompositeEffect& effect = composite[0];
+
+ effect.primitive = CompositePrimitive::CLICK;
+ effect.scale = 1.0f;
+
+ effect.delayMs = 0;
+ EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
+ EXPECT_TRUE(vibrator->off().isOk());
+
+ effect.delayMs = 1;
+ EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
+ EXPECT_TRUE(vibrator->off().isOk());
+
+ effect.delayMs = maxDelay;
+ EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
+ EXPECT_TRUE(vibrator->off().isOk());
+
+ effect.delayMs = maxDelay + 1;
+ EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT, vibrator->compose(composite, nullptr).exceptionCode());
}
TEST_P(VibratorAidl, ComposeSizeBoundary) {
- if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
- int32_t maxSize;
-
- EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionSizeMax(&maxSize).exceptionCode());
-
- std::vector<CompositeEffect> composite(maxSize);
- CompositeEffect effect;
-
- effect.delayMs = 1;
- effect.primitive = CompositePrimitive::CLICK;
- effect.scale = 1.0f;
-
- std::fill(composite.begin(), composite.end(), effect);
- EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
-
- composite.emplace_back(effect);
- EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
- vibrator->compose(composite, nullptr).exceptionCode());
- vibrator->off();
+ if (!(capabilities & IVibrator::CAP_COMPOSE_EFFECTS)) {
+ GTEST_SKIP() << "CAP_COMPOSE_EFFECTS not supported";
}
+
+ int32_t maxSize;
+
+ EXPECT_EQ(Status::EX_NONE, vibrator->getCompositionSizeMax(&maxSize).exceptionCode());
+
+ std::vector<CompositeEffect> composite(maxSize);
+ CompositeEffect effect;
+
+ effect.delayMs = 1;
+ effect.primitive = CompositePrimitive::CLICK;
+ effect.scale = 1.0f;
+
+ std::fill(composite.begin(), composite.end(), effect);
+ EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, nullptr).exceptionCode());
+ EXPECT_TRUE(vibrator->off().isOk());
+
+ composite.emplace_back(effect);
+ EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT, vibrator->compose(composite, nullptr).exceptionCode());
}
TEST_P(VibratorAidl, ComposeCallback) {
- if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
- std::vector<CompositePrimitive> supported;
+ if (!(capabilities & IVibrator::CAP_COMPOSE_EFFECTS)) {
+ GTEST_SKIP() << "CAP_COMPOSE_EFFECTS not supported";
+ }
- ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
+ std::vector<CompositePrimitive> supported;
- for (auto primitive : supported) {
- if (primitive == CompositePrimitive::NOOP) {
- continue;
- }
+ ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk());
- std::promise<void> completionPromise;
- std::future<void> completionFuture{completionPromise.get_future()};
- sp<CompletionCallback> callback =
- new CompletionCallback([&completionPromise] { completionPromise.set_value(); });
- CompositeEffect effect;
- std::vector<CompositeEffect> composite;
- int32_t durationMs;
- std::chrono::milliseconds duration;
- std::chrono::time_point<high_resolution_clock> start, end;
- std::chrono::milliseconds elapsed;
-
- effect.delayMs = 0;
- effect.primitive = primitive;
- effect.scale = 1.0f;
- composite.emplace_back(effect);
-
- EXPECT_EQ(Status::EX_NONE,
- vibrator->getPrimitiveDuration(primitive, &durationMs).exceptionCode())
- << toString(primitive);
- duration = std::chrono::milliseconds(durationMs);
-
- start = high_resolution_clock::now();
- EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, callback).exceptionCode())
- << toString(primitive);
-
- // TODO(b/261130361): Investigate why latency from driver and hardware will cause test
- // to fail when wait duration is ~40ms or less.
- EXPECT_EQ(completionFuture.wait_for(duration + std::chrono::milliseconds(50)),
- std::future_status::ready)
- << toString(primitive);
- end = high_resolution_clock::now();
-
- elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
- EXPECT_GE(elapsed.count(), duration.count()) << toString(primitive);
+ for (auto primitive : supported) {
+ if (primitive == CompositePrimitive::NOOP) {
+ continue;
}
+
+ std::promise<void> completionPromise;
+ std::future<void> completionFuture{completionPromise.get_future()};
+ sp<CompletionCallback> callback =
+ new CompletionCallback([&completionPromise] { completionPromise.set_value(); });
+ CompositeEffect effect;
+ std::vector<CompositeEffect> composite;
+ int32_t durationMs;
+ std::chrono::milliseconds duration;
+ std::chrono::time_point<high_resolution_clock> start, end;
+ std::chrono::milliseconds elapsed;
+
+ effect.delayMs = 0;
+ effect.primitive = primitive;
+ effect.scale = 1.0f;
+ composite.emplace_back(effect);
+
+ EXPECT_EQ(Status::EX_NONE,
+ vibrator->getPrimitiveDuration(primitive, &durationMs).exceptionCode())
+ << toString(primitive);
+ duration = std::chrono::milliseconds(durationMs);
+
+ start = high_resolution_clock::now();
+ EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, callback).exceptionCode())
+ << toString(primitive);
+
+ // TODO(b/261130361): Investigate why latency from driver and hardware will cause test
+ // to fail when wait duration is ~40ms or less.
+ EXPECT_EQ(completionFuture.wait_for(duration + std::chrono::milliseconds(50)),
+ std::future_status::ready)
+ << toString(primitive);
+ end = high_resolution_clock::now();
+
+ elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
+ EXPECT_GE(elapsed.count(), duration.count()) << toString(primitive);
+
+ EXPECT_TRUE(vibrator->off().isOk());
}
}
diff --git a/vibrator/bench/benchmark.cpp b/vibrator/bench/benchmark.cpp
index e19dc6f..b96e06d 100644
--- a/vibrator/bench/benchmark.cpp
+++ b/vibrator/bench/benchmark.cpp
@@ -118,6 +118,7 @@
});
if (!supported) {
+ state->SkipWithMessage("performApi returned UNSUPPORTED_OPERATION");
return;
}
@@ -140,16 +141,17 @@
}
};
-#define BENCHMARK_WRAPPER(fixt, test, code) \
- BENCHMARK_DEFINE_F(fixt, test) \
- /* NOLINTNEXTLINE */ \
- (State & state) { \
- if (!mVibrator) { \
- return; \
- } \
- \
- code \
- } \
+#define BENCHMARK_WRAPPER(fixt, test, code) \
+ BENCHMARK_DEFINE_F(fixt, test) \
+ /* NOLINTNEXTLINE */ \
+ (State & state) { \
+ if (!mVibrator) { \
+ state.SkipWithMessage("HAL unavailable"); \
+ return; \
+ } \
+ \
+ code \
+ } \
BENCHMARK_REGISTER_F(fixt, test)->Apply(fixt::DefaultConfig)->Apply(fixt::DefaultArgs)
using VibratorBench_V1_0 = VibratorBench<V1_0::IVibrator>;
@@ -186,6 +188,7 @@
uint8_t amplitude = UINT8_MAX;
if (!mVibrator->supportsAmplitudeControl()) {
+ state.SkipWithMessage("Amplitude control unavailable");
return;
}
@@ -227,6 +230,7 @@
bool enable = true;
if (!mVibrator->supportsExternalControl()) {
+ state.SkipWithMessage("external control unavailable");
return;
}
@@ -240,6 +244,7 @@
BENCHMARK_WRAPPER(VibratorBench_V1_3, supportsExternalAmplitudeControl, {
if (!mVibrator->supportsExternalControl()) {
+ state.SkipWithMessage("external control unavailable");
return;
}
@@ -256,12 +261,14 @@
uint8_t amplitude = UINT8_MAX;
if (!mVibrator->supportsExternalControl()) {
+ state.SkipWithMessage("external control unavailable");
return;
}
mVibrator->setExternalControl(true);
if (!mVibrator->supportsAmplitudeControl()) {
+ state.SkipWithMessage("amplitude control unavailable");
return;
}
@@ -328,6 +335,7 @@
int32_t capabilities = 0;
mVibrator->getCapabilities(&capabilities);
if ((capabilities & Aidl::IVibrator::CAP_AMPLITUDE_CONTROL) == 0) {
+ state.SkipWithMessage("amplitude control unavailable");
return;
}
@@ -345,6 +353,7 @@
int32_t capabilities = 0;
mVibrator->getCapabilities(&capabilities);
if ((capabilities & Aidl::IVibrator::CAP_EXTERNAL_CONTROL) == 0) {
+ state.SkipWithMessage("external control unavailable");
return;
}
@@ -361,6 +370,7 @@
mVibrator->getCapabilities(&capabilities);
if ((capabilities & Aidl::IVibrator::CAP_EXTERNAL_CONTROL) == 0 ||
(capabilities & Aidl::IVibrator::CAP_EXTERNAL_AMPLITUDE_CONTROL) == 0) {
+ state.SkipWithMessage("external amplitude control unavailable");
return;
}
@@ -423,6 +433,7 @@
int32_t capabilities = 0;
mVibrator->getCapabilities(&capabilities);
if ((capabilities & Aidl::IVibrator::CAP_ALWAYS_ON_CONTROL) == 0) {
+ state.SkipWithMessage("always on control unavailable");
return;
}
@@ -433,6 +444,7 @@
std::vector<Aidl::Effect> supported;
mVibrator->getSupportedAlwaysOnEffects(&supported);
if (std::find(supported.begin(), supported.end(), effect) == supported.end()) {
+ state.SkipWithMessage("always on effects unavailable");
return;
}
@@ -448,6 +460,7 @@
int32_t capabilities = 0;
mVibrator->getCapabilities(&capabilities);
if ((capabilities & Aidl::IVibrator::CAP_ALWAYS_ON_CONTROL) == 0) {
+ state.SkipWithMessage("always on control unavailable");
return;
}
@@ -458,6 +471,7 @@
std::vector<Aidl::Effect> supported;
mVibrator->getSupportedAlwaysOnEffects(&supported);
if (std::find(supported.begin(), supported.end(), effect) == supported.end()) {
+ state.SkipWithMessage("always on effects unavailable");
return;
}
@@ -481,6 +495,7 @@
std::vector<Aidl::Effect> supported;
mVibrator->getSupportedEffects(&supported);
if (std::find(supported.begin(), supported.end(), effect) == supported.end()) {
+ state.SkipWithMessage("effects unavailable");
return;
}
@@ -527,6 +542,7 @@
int32_t capabilities = 0;
mVibrator->getCapabilities(&capabilities);
if ((capabilities & Aidl::IVibrator::CAP_COMPOSE_EFFECTS) == 0) {
+ state.SkipWithMessage("compose effects unavailable");
return;
}
@@ -536,6 +552,7 @@
std::vector<Aidl::CompositePrimitive> supported;
mVibrator->getSupportedPrimitives(&supported);
if (std::find(supported.begin(), supported.end(), primitive) == supported.end()) {
+ state.SkipWithMessage("supported primitives unavailable");
return;
}
@@ -548,6 +565,7 @@
int32_t capabilities = 0;
mVibrator->getCapabilities(&capabilities);
if ((capabilities & Aidl::IVibrator::CAP_COMPOSE_EFFECTS) == 0) {
+ state.SkipWithMessage("compose effects unavailable");
return;
}
@@ -559,6 +577,7 @@
std::vector<Aidl::CompositePrimitive> supported;
mVibrator->getSupportedPrimitives(&supported);
if (std::find(supported.begin(), supported.end(), effect.primitive) == supported.end()) {
+ state.SkipWithMessage("supported primitives unavailable");
return;
}
diff --git a/wifi/common/aidl/Android.bp b/wifi/common/aidl/Android.bp
index 11acb4f..a941869 100644
--- a/wifi/common/aidl/Android.bp
+++ b/wifi/common/aidl/Android.bp
@@ -13,6 +13,7 @@
// limitations under the License.
package {
+ default_team: "trendy_team_fwk_wifi_hal",
// 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/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_p2p_iface_aidl_test.cpp
index 2e22807..82e3128 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
@@ -35,9 +35,12 @@
using aidl::android::hardware::wifi::supplicant::ISupplicant;
using aidl::android::hardware::wifi::supplicant::ISupplicantP2pIface;
using aidl::android::hardware::wifi::supplicant::MiracastMode;
+using aidl::android::hardware::wifi::supplicant::P2pAddGroupConfigurationParams;
using aidl::android::hardware::wifi::supplicant::P2pConnectInfo;
+using aidl::android::hardware::wifi::supplicant::P2pCreateGroupOwnerInfo;
using aidl::android::hardware::wifi::supplicant::P2pDeviceFoundEventParams;
using aidl::android::hardware::wifi::supplicant::P2pDiscoveryInfo;
+using aidl::android::hardware::wifi::supplicant::P2pExtListenInfo;
using aidl::android::hardware::wifi::supplicant::P2pFrameTypeMask;
using aidl::android::hardware::wifi::supplicant::P2pGoNegotiationReqEventParams;
using aidl::android::hardware::wifi::supplicant::P2pGroupCapabilityMask;
@@ -72,7 +75,7 @@
const uint32_t kTestGroupFreq = 0;
const bool kTestGroupPersistent = false;
const bool kTestGroupIsJoin = false;
-const auto& kTestVendorData = generateOuiKeyedDataList(5);
+const auto& kTestVendorDataOptional = generateOuiKeyedDataListOptional(5);
} // namespace
@@ -535,6 +538,43 @@
}
/*
+ * CreateGroupOwner
+ */
+TEST_P(SupplicantP2pIfaceAidlTest, CreateGroupOwner) {
+ if (interface_version_ < 3) {
+ GTEST_SKIP() << "createGroupOwner is available as of Supplicant V3";
+ }
+
+ P2pCreateGroupOwnerInfo info;
+ info.persistent = false;
+ info.persistentNetworkId = kTestNetworkId;
+ info.vendorData = kTestVendorDataOptional;
+
+ EXPECT_TRUE(p2p_iface_->createGroupOwner(info).isOk());
+}
+
+/*
+ * AddGroupWithConfigurationParams
+ */
+TEST_P(SupplicantP2pIfaceAidlTest, AddGroupWithConfigurationParams) {
+ if (interface_version_ < 3) {
+ GTEST_SKIP() << "addGroupWithConfigurationParams is available as of Supplicant V3";
+ }
+
+ P2pAddGroupConfigurationParams params;
+ params.ssid = kTestSsid;
+ params.passphrase = kTestPassphrase;
+ params.isPersistent = kTestGroupPersistent;
+ params.frequencyMHzOrBand = kTestGroupFreq;
+ params.goInterfaceAddress = vecToArrayMacAddr(kTestZeroMacAddr);
+ params.joinExistingGroup = kTestGroupIsJoin;
+ params.keyMgmtMask = 0;
+ params.vendorData = kTestVendorDataOptional;
+
+ EXPECT_TRUE(p2p_iface_->addGroupWithConfigurationParams(params).isOk());
+}
+
+/*
* Find
*/
TEST_P(SupplicantP2pIfaceAidlTest, Find) {
@@ -565,7 +605,7 @@
P2pDiscoveryInfo discoveryParams;
discoveryParams.timeoutInSec = kTestFindTimeout;
- discoveryParams.vendorData = kTestVendorData;
+ discoveryParams.vendorData = kTestVendorDataOptional;
discoveryParams.scanType = P2pScanType::FULL;
EXPECT_TRUE(p2p_iface_->findWithParams(discoveryParams).isOk());
@@ -624,7 +664,7 @@
connectInfo.joinExistingGroup = true;
connectInfo.persistent = false;
connectInfo.goIntent = kTestConnectGoIntent;
- connectInfo.vendorData = kTestVendorData;
+ connectInfo.vendorData = kTestVendorDataOptional;
std::string pin;
EXPECT_TRUE(p2p_iface_->connectWithParams(connectInfo, &pin).isOk());
@@ -690,6 +730,22 @@
}
/*
+ * ConfigureExtListenWithParams
+ */
+TEST_P(SupplicantP2pIfaceAidlTest, ConfigureExtListenWithParams) {
+ if (interface_version_ < 3) {
+ GTEST_SKIP() << "configureExtListenWithParams is available as of Supplicant V3";
+ }
+
+ P2pExtListenInfo info;
+ info.periodMs = 400;
+ info.intervalMs = 400;
+ info.vendorData = kTestVendorDataOptional;
+
+ EXPECT_TRUE(p2p_iface_->configureExtListenWithParams(info).isOk());
+}
+
+/*
* FlushServices
*/
TEST_P(SupplicantP2pIfaceAidlTest, FlushServices) {
diff --git a/wifi/supplicant/aidl/vts/functional/supplicant_sta_network_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_sta_network_aidl_test.cpp
index e5e9735..a541f8f 100644
--- a/wifi/supplicant/aidl/vts/functional/supplicant_sta_network_aidl_test.cpp
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_sta_network_aidl_test.cpp
@@ -72,6 +72,7 @@
const KeyMgmtMask kTestKeyMgmt =
static_cast<KeyMgmtMask>(static_cast<uint32_t>(KeyMgmtMask::WPA_PSK) |
static_cast<uint32_t>(KeyMgmtMask::WPA_EAP));
+const auto& kTestVendorData = generateOuiKeyedDataList(5);
} // namespace
@@ -834,6 +835,16 @@
EXPECT_TRUE(sta_network_->disableEht().isOk());
}
+/*
+ * SetVendorData
+ */
+TEST_P(SupplicantStaNetworkAidlTest, SetVendorData) {
+ if (interface_version_ < 3) {
+ GTEST_SKIP() << "setVendorData is available as of Supplicant V3";
+ }
+ EXPECT_TRUE(sta_network_->setVendorData(kTestVendorData).isOk());
+}
+
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SupplicantStaNetworkAidlTest);
INSTANTIATE_TEST_SUITE_P(Supplicant, SupplicantStaNetworkAidlTest,
testing::ValuesIn(android::getAidlHalInstanceNames(
diff --git a/wifi/supplicant/aidl/vts/functional/supplicant_test_utils.h b/wifi/supplicant/aidl/vts/functional/supplicant_test_utils.h
index b38e669..51793fd 100644
--- a/wifi/supplicant/aidl/vts/functional/supplicant_test_utils.h
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_test_utils.h
@@ -102,7 +102,7 @@
return arrayAddr;
}
-std::optional<OuiKeyedData> generateOuiKeyedData(int oui) {
+OuiKeyedData generateOuiKeyedData(int oui) {
PersistableBundle bundle;
bundle.putString("stringKey", "stringValue");
bundle.putInt("intKey", 12345);
@@ -110,13 +110,27 @@
OuiKeyedData data;
data.oui = oui;
data.vendorData = bundle;
- return std::optional<OuiKeyedData>{data};
+ return data;
}
-std::optional<std::vector<std::optional<OuiKeyedData>>> generateOuiKeyedDataList(int size) {
- std::vector<std::optional<OuiKeyedData>> dataList;
+std::vector<OuiKeyedData> generateOuiKeyedDataList(int size) {
+ std::vector<OuiKeyedData> dataList;
for (int i = 0; i < size; i++) {
dataList.push_back(generateOuiKeyedData(i + 1));
}
+ return dataList;
+}
+
+// Wraps generateOuiKeyedData result in std::optional
+std::optional<OuiKeyedData> generateOuiKeyedDataOptional(int oui) {
+ return std::optional<OuiKeyedData>{generateOuiKeyedData(oui)};
+}
+
+// Generate OuiKeyedData list fully wrapped in std::optional
+std::optional<std::vector<std::optional<OuiKeyedData>>> generateOuiKeyedDataListOptional(int size) {
+ std::vector<std::optional<OuiKeyedData>> dataList;
+ for (int i = 0; i < size; i++) {
+ dataList.push_back(generateOuiKeyedDataOptional(i + 1));
+ }
return std::optional<std::vector<std::optional<OuiKeyedData>>>{dataList};
}