diff --git a/vibrator/aidl/default/Vibrator.cpp b/vibrator/aidl/default/Vibrator.cpp index 4f020a017a..4f8c2b84f0 100644 --- a/vibrator/aidl/default/Vibrator.cpp +++ b/vibrator/aidl/default/Vibrator.cpp @@ -543,6 +543,14 @@ float getPwleV2FrequencyMaxHz(std::vector frequencyToOutpu ndk::ScopedAStatus Vibrator::composePwleV2(const std::vector& composite, const std::shared_ptr& callback) { + int32_t capabilities = 0; + if (!getCapabilities(&capabilities).isOk()) { + return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE); + } + if ((capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2) == 0) { + return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_UNSUPPORTED_OPERATION)); + } + int compositionSizeMax; getPwleV2CompositionSizeMax(&compositionSizeMax); if (composite.size() <= 0 || composite.size() > compositionSizeMax) { diff --git a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp index ffd38b1cf4..33e8660b5f 100644 --- a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp +++ b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp @@ -89,6 +89,7 @@ const std::vector kInvalidPrimitives = { static constexpr std::chrono::milliseconds VIBRATION_CALLBACK_TIMEOUT = 100ms; static constexpr int32_t VENDOR_EFFECTS_MIN_VERSION = 3; +static constexpr int32_t PWLE_V2_MIN_VERSION = 3; static std::vector findVibratorManagerNames() { std::vector names; @@ -1117,6 +1118,17 @@ TEST_P(VibratorAidl, ComposeValidPwleV2Effect) { EXPECT_OK(vibrator->off()); } +TEST_P(VibratorAidl, ComposePwleV2Unsupported) { + if (version < PWLE_V2_MIN_VERSION) { + EXPECT_EQ(capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2, 0) + << "Vibrator version " << version << " should not report PWLE V2 capability."; + } + if (capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2) return; + + EXPECT_UNKNOWN_OR_UNSUPPORTED( + vibrator->composePwleV2(pwle_v2_utils::composeValidPwleV2Effect(vibrator), nullptr)); +} + TEST_P(VibratorAidl, ComposeValidPwleV2EffectWithCallback) { if (!(capabilities & IVibrator::CAP_COMPOSE_PWLE_EFFECTS_V2)) { GTEST_SKIP() << "PWLE V2 not supported, skipping test";