diff options
54 files changed, 495 insertions, 2112 deletions
diff --git a/cmds/idlcli/Android.bp b/cmds/idlcli/Android.bp index 36dcbca0a3..b87ef2dc36 100644 --- a/cmds/idlcli/Android.bp +++ b/cmds/idlcli/Android.bp @@ -25,13 +25,8 @@ cc_defaults { name: "idlcli-defaults", shared_libs: [ "android.hardware.vibrator-V3-ndk", - "android.hardware.vibrator@1.0", - "android.hardware.vibrator@1.1", - "android.hardware.vibrator@1.2", - "android.hardware.vibrator@1.3", "libbase", "libbinder_ndk", - "libhidlbase", "liblog", "libutils", ], diff --git a/cmds/idlcli/utils.h b/cmds/idlcli/utils.h index 262f2e50b6..dc52c57987 100644 --- a/cmds/idlcli/utils.h +++ b/cmds/idlcli/utils.h @@ -18,7 +18,6 @@ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_UTILS_H_ #include <android/binder_enums.h> -#include <hidl/HidlSupport.h> #include <iomanip> #include <iostream> diff --git a/cmds/idlcli/vibrator.h b/cmds/idlcli/vibrator.h index b9434950f6..1a9993e5e7 100644 --- a/cmds/idlcli/vibrator.h +++ b/cmds/idlcli/vibrator.h @@ -22,102 +22,30 @@ #include <aidl/android/hardware/vibrator/IVibratorManager.h> #include <android/binder_manager.h> #include <android/binder_process.h> -#include <android/hardware/vibrator/1.3/IVibrator.h> #include "IdlCli.h" #include "utils.h" namespace android { -using hardware::Return; +using ::aidl::android::hardware::vibrator::IVibrator; using idlcli::IdlCli; -static constexpr int NUM_TRIES = 2; - -// Creates a Return<R> with STATUS::EX_NULL_POINTER. -template <class R> -inline R NullptrStatus() { - using ::android::hardware::Status; - return Status::fromExceptionCode(Status::EX_NULL_POINTER); -} - -template <> -inline ndk::ScopedAStatus NullptrStatus() { - return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_NULL_POINTER)); -} - -template <typename I> inline auto getService(std::string name) { - const auto instance = std::string() + I::descriptor + "/" + name; + const auto instance = std::string() + IVibrator::descriptor + "/" + name; auto vibBinder = ndk::SpAIBinder(AServiceManager_checkService(instance.c_str())); - return I::fromBinder(vibBinder); -} - -template <> -inline auto getService<android::hardware::vibrator::V1_0::IVibrator>(std::string name) { - return android::hardware::vibrator::V1_0::IVibrator::getService(name); -} - -template <> -inline auto getService<android::hardware::vibrator::V1_1::IVibrator>(std::string name) { - return android::hardware::vibrator::V1_1::IVibrator::getService(name); -} - -template <> -inline auto getService<android::hardware::vibrator::V1_2::IVibrator>(std::string name) { - return android::hardware::vibrator::V1_2::IVibrator::getService(name); -} - -template <> -inline auto getService<android::hardware::vibrator::V1_3::IVibrator>(std::string name) { - return android::hardware::vibrator::V1_3::IVibrator::getService(name); + return IVibrator::fromBinder(vibBinder); } -template <typename I> -using shared_ptr = std::invoke_result_t<decltype(getService<I>)&, std::string>; - -template <typename I> -class HalWrapper { -public: - static std::unique_ptr<HalWrapper> Create() { - // Assume that if getService returns a nullptr, HAL is not available on the - // device. - const auto name = IdlCli::Get().getName(); - auto hal = getService<I>(name.empty() ? "default" : name); - return hal ? std::unique_ptr<HalWrapper>(new HalWrapper(std::move(hal))) : nullptr; - } - - template <class R, class... Args0, class... Args1> - R call(R (I::*fn)(Args0...), Args1&&... args1) { - return (*mHal.*fn)(std::forward<Args1>(args1)...); - } - -private: - HalWrapper(shared_ptr<I>&& hal) : mHal(std::move(hal)) {} - -private: - shared_ptr<I> mHal; -}; - -template <typename I> static auto getHal() { - static auto sHalWrapper = HalWrapper<I>::Create(); - return sHalWrapper.get(); -} - -template <class R, class I, class... Args0, class... Args1> -R halCall(R (I::*fn)(Args0...), Args1&&... args1) { - auto hal = getHal<I>(); - return hal ? hal->call(fn, std::forward<Args1>(args1)...) : NullptrStatus<R>(); + // Assume that if getService returns a nullptr, HAL is not available on the device. + const auto name = IdlCli::Get().getName(); + return getService(name.empty() ? "default" : name); } namespace idlcli { namespace vibrator { -namespace V1_0 = ::android::hardware::vibrator::V1_0; -namespace V1_1 = ::android::hardware::vibrator::V1_1; -namespace V1_2 = ::android::hardware::vibrator::V1_2; -namespace V1_3 = ::android::hardware::vibrator::V1_3; namespace aidl = ::aidl::android::hardware::vibrator; class VibratorCallback : public aidl::BnVibratorCallback { diff --git a/cmds/idlcli/vibrator/CommandAlwaysOnDisable.cpp b/cmds/idlcli/vibrator/CommandAlwaysOnDisable.cpp index 9afa300c2b..cae690945c 100644 --- a/cmds/idlcli/vibrator/CommandAlwaysOnDisable.cpp +++ b/cmds/idlcli/vibrator/CommandAlwaysOnDisable.cpp @@ -51,21 +51,17 @@ class CommandAlwaysOnDisable : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::alwaysOnDisable, mId); - - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + auto status = hal->alwaysOnDisable(mId); + + std::cout << "Status: " << status.getDescription() << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } int32_t mId; diff --git a/cmds/idlcli/vibrator/CommandAlwaysOnEnable.cpp b/cmds/idlcli/vibrator/CommandAlwaysOnEnable.cpp index bb7f9f284a..410ca52068 100644 --- a/cmds/idlcli/vibrator/CommandAlwaysOnEnable.cpp +++ b/cmds/idlcli/vibrator/CommandAlwaysOnEnable.cpp @@ -72,21 +72,17 @@ class CommandAlwaysOnEnable : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::alwaysOnEnable, mId, mEffect, mStrength); - - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + auto status = hal->alwaysOnEnable(mId, mEffect, mStrength); + + std::cout << "Status: " << status.getDescription() << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } int32_t mId; diff --git a/cmds/idlcli/vibrator/CommandCompose.cpp b/cmds/idlcli/vibrator/CommandCompose.cpp index eb9008b68e..41acb98a95 100644 --- a/cmds/idlcli/vibrator/CommandCompose.cpp +++ b/cmds/idlcli/vibrator/CommandCompose.cpp @@ -89,7 +89,7 @@ class CommandCompose : public Command { } Status doMain(Args && /*args*/) override { - auto hal = getHal<aidl::IVibrator>(); + auto hal = getHal(); if (!hal) { return UNAVAILABLE; @@ -104,7 +104,7 @@ class CommandCompose : public Command { callback = ndk::SharedRefBase::make<VibratorCallback>(); } - auto status = hal->call(&aidl::IVibrator::compose, mComposite, callback); + auto status = hal->compose(mComposite, callback); if (status.isOk() && callback) { callback->waitForComplete(); diff --git a/cmds/idlcli/vibrator/CommandComposePwle.cpp b/cmds/idlcli/vibrator/CommandComposePwle.cpp index b8308ce16f..5f6bf8677e 100644 --- a/cmds/idlcli/vibrator/CommandComposePwle.cpp +++ b/cmds/idlcli/vibrator/CommandComposePwle.cpp @@ -163,7 +163,7 @@ class CommandComposePwle : public Command { } Status doMain(Args && /*args*/) override { - auto hal = getHal<aidl::IVibrator>(); + auto hal = getHal(); if (!hal) { return UNAVAILABLE; @@ -178,7 +178,7 @@ class CommandComposePwle : public Command { callback = ndk::SharedRefBase::make<VibratorCallback>(); } - auto status = hal->call(&aidl::IVibrator::composePwle, mCompositePwle, callback); + auto status = hal->composePwle(mCompositePwle, callback); if (status.isOk() && callback) { callback->waitForComplete(); diff --git a/cmds/idlcli/vibrator/CommandComposePwleV2.cpp b/cmds/idlcli/vibrator/CommandComposePwleV2.cpp index 6d3cf84a2e..bd682eacae 100644 --- a/cmds/idlcli/vibrator/CommandComposePwleV2.cpp +++ b/cmds/idlcli/vibrator/CommandComposePwleV2.cpp @@ -108,7 +108,7 @@ class CommandComposePwleV2 : public Command { } Status doMain(Args&& /*args*/) override { - auto hal = getHal<aidl::IVibrator>(); + auto hal = getHal(); if (!hal) { return UNAVAILABLE; @@ -123,7 +123,7 @@ class CommandComposePwleV2 : public Command { callback = ndk::SharedRefBase::make<VibratorCallback>(); } - auto status = hal->call(&aidl::IVibrator::composePwleV2, mCompositePwle, callback); + auto status = hal->composePwleV2(mCompositePwle, callback); if (status.isOk() && callback) { callback->waitForComplete(); diff --git a/cmds/idlcli/vibrator/CommandGetBandwidthAmplitudeMap.cpp b/cmds/idlcli/vibrator/CommandGetBandwidthAmplitudeMap.cpp index aa01a11237..44115e9a97 100644 --- a/cmds/idlcli/vibrator/CommandGetBandwidthAmplitudeMap.cpp +++ b/cmds/idlcli/vibrator/CommandGetBandwidthAmplitudeMap.cpp @@ -44,29 +44,38 @@ class CommandGetBandwidthAmplitudeMap : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; + auto hal = getHal(); + + if (!hal) { + return UNAVAILABLE; + } + std::vector<float> bandwidthAmplitude; float frequencyMinimumHz; float frequencyResolutionHz; - Status ret; - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = - hal->call(&aidl::IVibrator::getBandwidthAmplitudeMap, &bandwidthAmplitude); - statusStr = status.getDescription(); - ret = (status.isOk() ? OK : ERROR); + auto status = hal->getBandwidthAmplitudeMap(&bandwidthAmplitude); - status = hal->call(&aidl::IVibrator::getFrequencyMinimum, &frequencyMinimumHz); - ret = (status.isOk() ? OK : ERROR); + if (!status.isOk()) { + std::cout << "Status: " << status.getDescription() << std::endl; + return ERROR; + } - status = - hal->call(&aidl::IVibrator::getFrequencyResolution, &frequencyResolutionHz); - ret = (status.isOk() ? OK : ERROR); - } else { - return UNAVAILABLE; + status = hal->getFrequencyMinimum(&frequencyMinimumHz); + + if (!status.isOk()) { + std::cout << "Status: " << status.getDescription() << std::endl; + return ERROR; } - std::cout << "Status: " << statusStr << std::endl; + status = hal->getFrequencyResolution(&frequencyResolutionHz); + + if (!status.isOk()) { + std::cout << "Status: " << status.getDescription() << std::endl; + return ERROR; + } + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Bandwidth Amplitude Map: " << std::endl; float frequency = frequencyMinimumHz; for (auto &e : bandwidthAmplitude) { @@ -74,7 +83,7 @@ class CommandGetBandwidthAmplitudeMap : public Command { frequency += frequencyResolutionHz; } - return ret; + return OK; } }; diff --git a/cmds/idlcli/vibrator/CommandGetCapabilities.cpp b/cmds/idlcli/vibrator/CommandGetCapabilities.cpp index 303a9895e4..507d871cac 100644 --- a/cmds/idlcli/vibrator/CommandGetCapabilities.cpp +++ b/cmds/idlcli/vibrator/CommandGetCapabilities.cpp @@ -42,22 +42,19 @@ class CommandGetCapabilities : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - int32_t cap; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getCapabilities, &cap); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + int32_t cap; + auto status = hal->getCapabilities(&cap); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Capabilities: " << std::bitset<32>(cap) << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetCompositionDelayMax.cpp b/cmds/idlcli/vibrator/CommandGetCompositionDelayMax.cpp index 10508bd4dc..1c1eb3c6ff 100644 --- a/cmds/idlcli/vibrator/CommandGetCompositionDelayMax.cpp +++ b/cmds/idlcli/vibrator/CommandGetCompositionDelayMax.cpp @@ -44,22 +44,19 @@ class CommandGetCompositionDelayMax : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - int32_t maxDelayMs; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getCompositionDelayMax, &maxDelayMs); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + int32_t maxDelayMs; + auto status = hal->getCompositionDelayMax(&maxDelayMs); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Max Delay: " << maxDelayMs << " ms" << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetCompositionSizeMax.cpp b/cmds/idlcli/vibrator/CommandGetCompositionSizeMax.cpp index 900cb18809..cfd4c53ceb 100644 --- a/cmds/idlcli/vibrator/CommandGetCompositionSizeMax.cpp +++ b/cmds/idlcli/vibrator/CommandGetCompositionSizeMax.cpp @@ -44,22 +44,19 @@ class CommandGetCompositionSizeMax : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - int32_t maxSize; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getCompositionSizeMax, &maxSize); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + int32_t maxSize; + auto status = hal->getCompositionSizeMax(&maxSize); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Max Size: " << maxSize << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetFrequencyMinimum.cpp b/cmds/idlcli/vibrator/CommandGetFrequencyMinimum.cpp index 504c6482ad..2a614466ab 100644 --- a/cmds/idlcli/vibrator/CommandGetFrequencyMinimum.cpp +++ b/cmds/idlcli/vibrator/CommandGetFrequencyMinimum.cpp @@ -44,22 +44,19 @@ class CommandGetFrequencyMinimum : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - float frequencyMinimumHz; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getFrequencyMinimum, &frequencyMinimumHz); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + float frequencyMinimumHz; + auto status = hal->getFrequencyMinimum(&frequencyMinimumHz); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Minimum Frequency: " << frequencyMinimumHz << " Hz" << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetFrequencyResolution.cpp b/cmds/idlcli/vibrator/CommandGetFrequencyResolution.cpp index de358385a0..157d6bf732 100644 --- a/cmds/idlcli/vibrator/CommandGetFrequencyResolution.cpp +++ b/cmds/idlcli/vibrator/CommandGetFrequencyResolution.cpp @@ -44,23 +44,19 @@ class CommandGetFrequencyResolution : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - float frequencyResolutionHz; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = - hal->call(&aidl::IVibrator::getFrequencyResolution, &frequencyResolutionHz); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + float frequencyResolutionHz; + auto status = hal->getFrequencyResolution(&frequencyResolutionHz); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Frequency Resolution: " << frequencyResolutionHz << " Hz" << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetFrequencyToOutputAccelerationMap.cpp b/cmds/idlcli/vibrator/CommandGetFrequencyToOutputAccelerationMap.cpp index 2edd0caf2e..2eb45100db 100644 --- a/cmds/idlcli/vibrator/CommandGetFrequencyToOutputAccelerationMap.cpp +++ b/cmds/idlcli/vibrator/CommandGetFrequencyToOutputAccelerationMap.cpp @@ -46,26 +46,22 @@ class CommandGetFrequencyToOutputAccelerationMap : public Command { } Status doMain(Args&& /*args*/) override { - std::string statusStr; - std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap; - Status ret; - - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getFrequencyToOutputAccelerationMap, - &frequencyToOutputAccelerationMap); - statusStr = status.getDescription(); - ret = (status.isOk() ? OK : ERROR); - } else { + auto hal = getHal(); + + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + std::vector<FrequencyAccelerationMapEntry> frequencyToOutputAccelerationMap; + auto status = hal->getFrequencyToOutputAccelerationMap(&frequencyToOutputAccelerationMap); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Frequency to Output Amplitude Map: " << std::endl; for (auto& entry : frequencyToOutputAccelerationMap) { std::cout << entry.frequencyHz << " " << entry.maxOutputAccelerationGs << std::endl; } - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetPrimitiveDuration.cpp b/cmds/idlcli/vibrator/CommandGetPrimitiveDuration.cpp index 460d39e64f..c957f6b316 100644 --- a/cmds/idlcli/vibrator/CommandGetPrimitiveDuration.cpp +++ b/cmds/idlcli/vibrator/CommandGetPrimitiveDuration.cpp @@ -57,22 +57,19 @@ class CommandGetPrimitiveDuration : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - int32_t duration; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getPrimitiveDuration, mPrimitive, &duration); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + int32_t duration; + auto status = hal->getPrimitiveDuration(mPrimitive, &duration); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Duration: " << duration << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } CompositePrimitive mPrimitive; diff --git a/cmds/idlcli/vibrator/CommandGetPwleCompositionSizeMax.cpp b/cmds/idlcli/vibrator/CommandGetPwleCompositionSizeMax.cpp index b2c35519eb..c1b027833b 100644 --- a/cmds/idlcli/vibrator/CommandGetPwleCompositionSizeMax.cpp +++ b/cmds/idlcli/vibrator/CommandGetPwleCompositionSizeMax.cpp @@ -44,22 +44,19 @@ class CommandGetPwleCompositionSizeMax : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - int32_t maxSize; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getPwleCompositionSizeMax, &maxSize); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + int32_t maxSize; + auto status = hal->getPwleCompositionSizeMax(&maxSize); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Max Size: " << maxSize << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetPwlePrimitiveDurationMax.cpp b/cmds/idlcli/vibrator/CommandGetPwlePrimitiveDurationMax.cpp index 90819731c4..ed00ba0c13 100644 --- a/cmds/idlcli/vibrator/CommandGetPwlePrimitiveDurationMax.cpp +++ b/cmds/idlcli/vibrator/CommandGetPwlePrimitiveDurationMax.cpp @@ -44,22 +44,19 @@ class CommandGetPwlePrimitiveDurationMax : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - int32_t maxDurationMs; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getPwlePrimitiveDurationMax, &maxDurationMs); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + int32_t maxDurationMs; + auto status = hal->getPwlePrimitiveDurationMax(&maxDurationMs); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Primitive duration max: " << maxDurationMs << " ms" << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetPwleV2CompositionSizeMax.cpp b/cmds/idlcli/vibrator/CommandGetPwleV2CompositionSizeMax.cpp index cca072c46f..f780b8bfd7 100644 --- a/cmds/idlcli/vibrator/CommandGetPwleV2CompositionSizeMax.cpp +++ b/cmds/idlcli/vibrator/CommandGetPwleV2CompositionSizeMax.cpp @@ -44,22 +44,19 @@ class CommandGetPwleV2CompositionSizeMax : public Command { } Status doMain(Args&& /*args*/) override { - std::string statusStr; - int32_t maxSize; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getPwleV2CompositionSizeMax, &maxSize); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + int32_t maxSize; + auto status = hal->getPwleV2CompositionSizeMax(&maxSize); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Max Size: " << maxSize << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetPwleV2PrimitiveDurationMaxMillis.cpp b/cmds/idlcli/vibrator/CommandGetPwleV2PrimitiveDurationMaxMillis.cpp index dbbfe1a6d4..e84e969e7c 100644 --- a/cmds/idlcli/vibrator/CommandGetPwleV2PrimitiveDurationMaxMillis.cpp +++ b/cmds/idlcli/vibrator/CommandGetPwleV2PrimitiveDurationMaxMillis.cpp @@ -44,23 +44,19 @@ class CommandGetPwleV2PrimitiveDurationMaxMillis : public Command { } Status doMain(Args&& /*args*/) override { - std::string statusStr; - int32_t maxDurationMs; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getPwleV2PrimitiveDurationMaxMillis, - &maxDurationMs); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + int32_t maxDurationMs; + auto status = hal->getPwleV2PrimitiveDurationMaxMillis(&maxDurationMs); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Primitive duration max: " << maxDurationMs << " ms" << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetPwleV2PrimitiveDurationMinMillis.cpp b/cmds/idlcli/vibrator/CommandGetPwleV2PrimitiveDurationMinMillis.cpp index 09225c49c4..448fd2adc2 100644 --- a/cmds/idlcli/vibrator/CommandGetPwleV2PrimitiveDurationMinMillis.cpp +++ b/cmds/idlcli/vibrator/CommandGetPwleV2PrimitiveDurationMinMillis.cpp @@ -44,23 +44,19 @@ class CommandGetPwleV2PrimitiveDurationMinMillis : public Command { } Status doMain(Args&& /*args*/) override { - std::string statusStr; - int32_t minDurationMs; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getPwleV2PrimitiveDurationMinMillis, - &minDurationMs); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + int32_t minDurationMs; + auto status = hal->getPwleV2PrimitiveDurationMinMillis(&minDurationMs); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Primitive duration min: " << minDurationMs << " ms" << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetQFactor.cpp b/cmds/idlcli/vibrator/CommandGetQFactor.cpp index a2681e905b..e04bad9384 100644 --- a/cmds/idlcli/vibrator/CommandGetQFactor.cpp +++ b/cmds/idlcli/vibrator/CommandGetQFactor.cpp @@ -42,22 +42,19 @@ class CommandGetQFactor : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - float qFactor; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getQFactor, &qFactor); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + float qFactor; + auto status = hal->getQFactor(&qFactor); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Q Factor: " << qFactor << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetResonantFrequency.cpp b/cmds/idlcli/vibrator/CommandGetResonantFrequency.cpp index 81a6391de5..e222ea656e 100644 --- a/cmds/idlcli/vibrator/CommandGetResonantFrequency.cpp +++ b/cmds/idlcli/vibrator/CommandGetResonantFrequency.cpp @@ -44,22 +44,19 @@ class CommandGetResonantFrequency : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - float resonantFrequencyHz; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getResonantFrequency, &resonantFrequencyHz); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + float resonantFrequencyHz; + auto status = hal->getResonantFrequency(&resonantFrequencyHz); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Resonant Frequency: " << resonantFrequencyHz << " Hz" << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetSupportedAlwaysOnEffects.cpp b/cmds/idlcli/vibrator/CommandGetSupportedAlwaysOnEffects.cpp index edfcd9195a..9b05540fce 100644 --- a/cmds/idlcli/vibrator/CommandGetSupportedAlwaysOnEffects.cpp +++ b/cmds/idlcli/vibrator/CommandGetSupportedAlwaysOnEffects.cpp @@ -44,25 +44,22 @@ class CommandGetSupportedAlwaysOnEffects : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - std::vector<Effect> effects; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getSupportedAlwaysOnEffects, &effects); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + std::vector<Effect> effects; + auto status = hal->getSupportedAlwaysOnEffects(&effects); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Effects:" << std::endl; for (auto &e : effects) { std::cout << " " << toString(e) << std::endl; } - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetSupportedBraking.cpp b/cmds/idlcli/vibrator/CommandGetSupportedBraking.cpp index b326e07c22..f95f682fc0 100644 --- a/cmds/idlcli/vibrator/CommandGetSupportedBraking.cpp +++ b/cmds/idlcli/vibrator/CommandGetSupportedBraking.cpp @@ -44,25 +44,22 @@ class CommandGetSupportedBraking : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - std::vector<Braking> braking; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getSupportedBraking, &braking); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + std::vector<Braking> braking; + auto status = hal->getSupportedBraking(&braking); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Braking Mechanisms:" << std::endl; for (auto &e : braking) { std::cout << " " << toString(e) << std::endl; } - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetSupportedEffects.cpp b/cmds/idlcli/vibrator/CommandGetSupportedEffects.cpp index 7658f22def..05de1b87cf 100644 --- a/cmds/idlcli/vibrator/CommandGetSupportedEffects.cpp +++ b/cmds/idlcli/vibrator/CommandGetSupportedEffects.cpp @@ -44,25 +44,22 @@ class CommandGetSupportedEffects : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - std::vector<Effect> effects; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getSupportedEffects, &effects); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + std::vector<Effect> effects; + auto status = hal->getSupportedEffects(&effects); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Effects:" << std::endl; for (auto &e : effects) { std::cout << " " << toString(e) << std::endl; } - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandGetSupportedPrimitives.cpp b/cmds/idlcli/vibrator/CommandGetSupportedPrimitives.cpp index d101681914..0f33f0f2e9 100644 --- a/cmds/idlcli/vibrator/CommandGetSupportedPrimitives.cpp +++ b/cmds/idlcli/vibrator/CommandGetSupportedPrimitives.cpp @@ -44,25 +44,22 @@ class CommandGetSupportedPrimitives : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - std::vector<CompositePrimitive> primitives; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::getSupportedPrimitives, &primitives); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + std::vector<CompositePrimitive> primitives; + auto status = hal->getSupportedPrimitives(&primitives); + + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Primitives:" << std::endl; for (auto &e : primitives) { std::cout << " " << toString(e) << std::endl; } - return ret; + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandOff.cpp b/cmds/idlcli/vibrator/CommandOff.cpp index cedb9fec06..e55b44a9c8 100644 --- a/cmds/idlcli/vibrator/CommandOff.cpp +++ b/cmds/idlcli/vibrator/CommandOff.cpp @@ -42,24 +42,17 @@ class CommandOff : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - Status ret; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::off); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else if (auto hal = getHal<V1_0::IVibrator>()) { - auto status = hal->call(&V1_0::IVibrator::off); - statusStr = toString(status); - ret = status.isOk() && status == V1_0::Status::OK ? OK : ERROR; - } else { + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + auto status = hal->off(); - return ret; + std::cout << "Status: " << status.getDescription() << std::endl; + + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandOn.cpp b/cmds/idlcli/vibrator/CommandOn.cpp index 8212fc14a7..856c219750 100644 --- a/cmds/idlcli/vibrator/CommandOn.cpp +++ b/cmds/idlcli/vibrator/CommandOn.cpp @@ -67,34 +67,27 @@ class CommandOn : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - Status ret; - std::shared_ptr<VibratorCallback> callback; + auto hal = getHal(); - if (auto hal = getHal<aidl::IVibrator>()) { - ABinderProcess_setThreadPoolMaxThreadCount(1); - ABinderProcess_startThreadPool(); + if (!hal) { + return UNAVAILABLE; + } - int32_t cap; - hal->call(&aidl::IVibrator::getCapabilities, &cap); + std::shared_ptr<VibratorCallback> callback; - if (mBlocking && (cap & aidl::IVibrator::CAP_ON_CALLBACK)) { - callback = ndk::SharedRefBase::make<VibratorCallback>(); - } + ABinderProcess_setThreadPoolMaxThreadCount(1); + ABinderProcess_startThreadPool(); - auto status = hal->call(&aidl::IVibrator::on, mDuration, callback); + int32_t cap; + hal->getCapabilities(&cap); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else if (auto hal = getHal<V1_0::IVibrator>()) { - auto status = hal->call(&V1_0::IVibrator::on, mDuration); - statusStr = toString(status); - ret = status.isOk() && status == V1_0::Status::OK ? OK : ERROR; - } else { - return UNAVAILABLE; + if (mBlocking && (cap & aidl::IVibrator::CAP_ON_CALLBACK)) { + callback = ndk::SharedRefBase::make<VibratorCallback>(); } - if (ret == OK && mBlocking) { + auto status = hal->on(mDuration, callback); + + if (status.isOk() && mBlocking) { if (callback) { callback->waitForComplete(); } else { @@ -102,9 +95,9 @@ class CommandOn : public Command { } } - std::cout << "Status: " << statusStr << std::endl; + std::cout << "Status: " << status.getDescription() << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } bool mBlocking; diff --git a/cmds/idlcli/vibrator/CommandPerform.cpp b/cmds/idlcli/vibrator/CommandPerform.cpp index c897686cbe..0a354e2c5a 100644 --- a/cmds/idlcli/vibrator/CommandPerform.cpp +++ b/cmds/idlcli/vibrator/CommandPerform.cpp @@ -28,34 +28,6 @@ class CommandVibrator; namespace vibrator { -/* - * The following static asserts are only relevant here because the argument - * parser uses a single implementation for determining the string names. - */ -static_assert(static_cast<uint8_t>(V1_0::EffectStrength::LIGHT) == - static_cast<uint8_t>(aidl::EffectStrength::LIGHT)); -static_assert(static_cast<uint8_t>(V1_0::EffectStrength::MEDIUM) == - static_cast<uint8_t>(aidl::EffectStrength::MEDIUM)); -static_assert(static_cast<uint8_t>(V1_0::EffectStrength::STRONG) == - static_cast<uint8_t>(aidl::EffectStrength::STRONG)); -static_assert(static_cast<uint8_t>(V1_3::Effect::CLICK) == - static_cast<uint8_t>(aidl::Effect::CLICK)); -static_assert(static_cast<uint8_t>(V1_3::Effect::DOUBLE_CLICK) == - static_cast<uint8_t>(aidl::Effect::DOUBLE_CLICK)); -static_assert(static_cast<uint8_t>(V1_3::Effect::TICK) == static_cast<uint8_t>(aidl::Effect::TICK)); -static_assert(static_cast<uint8_t>(V1_3::Effect::THUD) == static_cast<uint8_t>(aidl::Effect::THUD)); -static_assert(static_cast<uint8_t>(V1_3::Effect::POP) == static_cast<uint8_t>(aidl::Effect::POP)); -static_assert(static_cast<uint8_t>(V1_3::Effect::HEAVY_CLICK) == - static_cast<uint8_t>(aidl::Effect::HEAVY_CLICK)); -static_assert(static_cast<uint8_t>(V1_3::Effect::RINGTONE_1) == - static_cast<uint8_t>(aidl::Effect::RINGTONE_1)); -static_assert(static_cast<uint8_t>(V1_3::Effect::RINGTONE_2) == - static_cast<uint8_t>(aidl::Effect::RINGTONE_2)); -static_assert(static_cast<uint8_t>(V1_3::Effect::RINGTONE_15) == - static_cast<uint8_t>(aidl::Effect::RINGTONE_15)); -static_assert(static_cast<uint8_t>(V1_3::Effect::TEXTURE_TICK) == - static_cast<uint8_t>(aidl::Effect::TEXTURE_TICK)); - using aidl::Effect; using aidl::EffectStrength; @@ -107,61 +79,31 @@ class CommandPerform : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; + auto hal = getHal(); + + if (!hal) { + return UNAVAILABLE; + } + uint32_t lengthMs; - Status ret; std::shared_ptr<VibratorCallback> callback; - if (auto hal = getHal<aidl::IVibrator>()) { - ABinderProcess_setThreadPoolMaxThreadCount(1); - ABinderProcess_startThreadPool(); + ABinderProcess_setThreadPoolMaxThreadCount(1); + ABinderProcess_startThreadPool(); - int32_t cap; - hal->call(&aidl::IVibrator::getCapabilities, &cap); + int32_t cap; + hal->getCapabilities(&cap); - if (mBlocking && (cap & aidl::IVibrator::CAP_PERFORM_CALLBACK)) { - callback = ndk::SharedRefBase::make<VibratorCallback>(); - } - - int32_t aidlLengthMs; - auto status = hal->call(&aidl::IVibrator::perform, mEffect, mStrength, callback, - &aidlLengthMs); + if (mBlocking && (cap & aidl::IVibrator::CAP_PERFORM_CALLBACK)) { + callback = ndk::SharedRefBase::make<VibratorCallback>(); + } - statusStr = status.getDescription(); - lengthMs = static_cast<uint32_t>(aidlLengthMs); - ret = status.isOk() ? OK : ERROR; - } else { - Return<void> hidlRet; - V1_0::Status status; - auto callback = [&status, &lengthMs](V1_0::Status retStatus, uint32_t retLengthMs) { - status = retStatus; - lengthMs = retLengthMs; - }; - - if (auto hal = getHal<V1_3::IVibrator>()) { - hidlRet = - hal->call(&V1_3::IVibrator::perform_1_3, static_cast<V1_3::Effect>(mEffect), - static_cast<V1_0::EffectStrength>(mStrength), callback); - } else if (auto hal = getHal<V1_2::IVibrator>()) { - hidlRet = - hal->call(&V1_2::IVibrator::perform_1_2, static_cast<V1_2::Effect>(mEffect), - static_cast<V1_0::EffectStrength>(mStrength), callback); - } else if (auto hal = getHal<V1_1::IVibrator>()) { - hidlRet = hal->call(&V1_1::IVibrator::perform_1_1, - static_cast<V1_1::Effect_1_1>(mEffect), - static_cast<V1_0::EffectStrength>(mStrength), callback); - } else if (auto hal = getHal<V1_0::IVibrator>()) { - hidlRet = hal->call(&V1_0::IVibrator::perform, static_cast<V1_0::Effect>(mEffect), - static_cast<V1_0::EffectStrength>(mStrength), callback); - } else { - return UNAVAILABLE; - } + int32_t aidlLengthMs; + auto status = hal->perform(mEffect, mStrength, callback, &aidlLengthMs); - statusStr = toString(status); - ret = hidlRet.isOk() && status == V1_0::Status::OK ? OK : ERROR; - } + lengthMs = static_cast<uint32_t>(aidlLengthMs); - if (ret == OK && mBlocking) { + if (status.isOk() && mBlocking) { if (callback) { callback->waitForComplete(); } else { @@ -169,10 +111,10 @@ class CommandPerform : public Command { } } - std::cout << "Status: " << statusStr << std::endl; + std::cout << "Status: " << status.getDescription() << std::endl; std::cout << "Length: " << lengthMs << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } bool mBlocking; diff --git a/cmds/idlcli/vibrator/CommandSetAmplitude.cpp b/cmds/idlcli/vibrator/CommandSetAmplitude.cpp index 8b8058c4fd..8050723729 100644 --- a/cmds/idlcli/vibrator/CommandSetAmplitude.cpp +++ b/cmds/idlcli/vibrator/CommandSetAmplitude.cpp @@ -50,25 +50,17 @@ class CommandSetAmplitude : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - Status ret; - - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::setAmplitude, - static_cast<float>(mAmplitude) / UINT8_MAX); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else if (auto hal = getHal<V1_0::IVibrator>()) { - auto status = hal->call(&V1_0::IVibrator::setAmplitude, mAmplitude); - statusStr = toString(status); - ret = status.isOk() && status == V1_0::Status::OK ? OK : ERROR; - } else { + auto hal = getHal(); + + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + auto status = hal->setAmplitude(static_cast<float>(mAmplitude) / UINT8_MAX); + + std::cout << "Status: " << status.getDescription() << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } uint8_t mAmplitude; diff --git a/cmds/idlcli/vibrator/CommandSetExternalControl.cpp b/cmds/idlcli/vibrator/CommandSetExternalControl.cpp index 179579310a..8f8d4b7641 100644 --- a/cmds/idlcli/vibrator/CommandSetExternalControl.cpp +++ b/cmds/idlcli/vibrator/CommandSetExternalControl.cpp @@ -48,24 +48,17 @@ class CommandSetExternalControl : public Command { } Status doMain(Args && /*args*/) override { - std::string statusStr; - Status ret; - - if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::setExternalControl, mEnable); - statusStr = status.getDescription(); - ret = status.isOk() ? OK : ERROR; - } else if (auto hal = getHal<V1_3::IVibrator>()) { - auto status = hal->call(&V1_3::IVibrator::setExternalControl, mEnable); - statusStr = toString(status); - ret = status.isOk() && status == V1_0::Status::OK ? OK : ERROR; - } else { + auto hal = getHal(); + + if (!hal) { return UNAVAILABLE; } - std::cout << "Status: " << statusStr << std::endl; + auto status = hal->setExternalControl(mEnable); + + std::cout << "Status: " << status.getDescription() << std::endl; - return ret; + return status.isOk() ? OK : ERROR; } bool mEnable; diff --git a/cmds/idlcli/vibrator/CommandSupportsAmplitudeControl.cpp b/cmds/idlcli/vibrator/CommandSupportsAmplitudeControl.cpp index cdc529a2f3..31ee954f63 100644 --- a/cmds/idlcli/vibrator/CommandSupportsAmplitudeControl.cpp +++ b/cmds/idlcli/vibrator/CommandSupportsAmplitudeControl.cpp @@ -42,15 +42,22 @@ class CommandSupportsAmplitudeControl : public Command { } Status doMain(Args && /*args*/) override { - auto ret = halCall(&V1_0::IVibrator::supportsAmplitudeControl); + auto hal = getHal(); - if (!ret.isOk()) { + if (!hal) { return UNAVAILABLE; } - std::cout << "Result: " << std::boolalpha << ret << std::endl; + int32_t cap; - return OK; + auto status = hal->getCapabilities(&cap); + + bool hasAmplitudeControl = cap & IVibrator::CAP_AMPLITUDE_CONTROL; + + std::cout << "Status: " << status.getDescription() << std::endl; + std::cout << "Result: " << std::boolalpha << hasAmplitudeControl << std::endl; + + return status.isOk() ? OK : ERROR; } }; diff --git a/cmds/idlcli/vibrator/CommandSupportsExternalControl.cpp b/cmds/idlcli/vibrator/CommandSupportsExternalControl.cpp index ed15d76286..f0c542cfe3 100644 --- a/cmds/idlcli/vibrator/CommandSupportsExternalControl.cpp +++ b/cmds/idlcli/vibrator/CommandSupportsExternalControl.cpp @@ -42,15 +42,22 @@ class CommandSupportsExternalControl : public Command { } Status doMain(Args && /*args*/) override { - auto ret = halCall(&V1_3::IVibrator::supportsExternalControl); + auto hal = getHal(); - if (!ret.isOk()) { + if (!hal) { return UNAVAILABLE; } - std::cout << "Result: " << std::boolalpha << ret << std::endl; + int32_t cap; - return OK; + auto status = hal->getCapabilities(&cap); + + bool hasExternalControl = cap & IVibrator::CAP_EXTERNAL_CONTROL; + + std::cout << "Status: " << status.getDescription() << std::endl; + std::cout << "Result: " << std::boolalpha << hasExternalControl << std::endl; + + return status.isOk() ? OK : ERROR; } }; diff --git a/data/etc/Android.bp b/data/etc/Android.bp index 0ac5266a0c..f320504551 100644 --- a/data/etc/Android.bp +++ b/data/etc/Android.bp @@ -119,12 +119,24 @@ prebuilt_etc { } prebuilt_etc { + name: "android.hardware.nfc.ese.prebuilt.xml", + src: "android.hardware.nfc.ese.xml", + defaults: ["frameworks_native_data_etc_defaults"], +} + +prebuilt_etc { name: "android.hardware.nfc.hce.prebuilt.xml", src: "android.hardware.nfc.hce.xml", defaults: ["frameworks_native_data_etc_defaults"], } prebuilt_etc { + name: "android.hardware.nfc.hcef.prebuilt.xml", + src: "android.hardware.nfc.hcef.xml", + defaults: ["frameworks_native_data_etc_defaults"], +} + +prebuilt_etc { name: "android.hardware.reboot_escrow.prebuilt.xml", src: "android.hardware.reboot_escrow.xml", defaults: ["frameworks_native_data_etc_defaults"], @@ -511,6 +523,12 @@ prebuilt_etc { } prebuilt_etc { + name: "com.nxp.mifare.prebuilt.xml", + src: "com.nxp.mifare.xml", + defaults: ["frameworks_native_data_etc_defaults"], +} + +prebuilt_etc { name: "go_handheld_core_hardware.prebuilt.xml", src: "go_handheld_core_hardware.xml", defaults: ["frameworks_native_data_etc_defaults"], diff --git a/libs/binder/tests/parcel_fuzzer/Android.bp b/libs/binder/tests/parcel_fuzzer/Android.bp index cac054eb1b..457eaa5a76 100644 --- a/libs/binder/tests/parcel_fuzzer/Android.bp +++ b/libs/binder/tests/parcel_fuzzer/Android.bp @@ -109,6 +109,9 @@ cc_library_static { "libcutils", "libutils", ], + header_libs: [ + "libaidl_transactions", + ], local_include_dirs: ["include_random_parcel"], export_include_dirs: ["include_random_parcel"], } diff --git a/libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp b/libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp index 02e69cc371..11aa76891b 100644 --- a/libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp +++ b/libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp @@ -13,6 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +#include <aidl/transaction_ids.h> #include <fuzzbinder/libbinder_driver.h> #include <fuzzbinder/random_parcel.h> @@ -31,6 +33,28 @@ void fuzzService(const sp<IBinder>& binder, FuzzedDataProvider&& provider) { fuzzService(std::vector<sp<IBinder>>{binder}, std::move(provider)); } +uint32_t getCode(FuzzedDataProvider& provider) { + if (provider.ConsumeBool()) { + return provider.ConsumeIntegral<uint32_t>(); + } + + // Most of the AIDL services will have small set of transaction codes. + if (provider.ConsumeBool()) { + return provider.ConsumeIntegralInRange<uint32_t>(0, 100); + } + + if (provider.ConsumeBool()) { + return provider.PickValueInArray<uint32_t>( + {IBinder::DUMP_TRANSACTION, IBinder::PING_TRANSACTION, + IBinder::SHELL_COMMAND_TRANSACTION, IBinder::INTERFACE_TRANSACTION, + IBinder::SYSPROPS_TRANSACTION, IBinder::EXTENSION_TRANSACTION, + IBinder::TWEET_TRANSACTION, IBinder::LIKE_TRANSACTION}); + } + + return provider.ConsumeIntegralInRange<uint32_t>(aidl::kLastMetaMethodId, + aidl::kFirstMetaMethodId); +} + void fuzzService(const std::vector<sp<IBinder>>& binders, FuzzedDataProvider&& provider) { RandomParcelOptions options{ .extraBinders = binders, @@ -61,16 +85,7 @@ void fuzzService(const std::vector<sp<IBinder>>& binders, FuzzedDataProvider&& p } while (provider.remaining_bytes() > 0) { - // Most of the AIDL services will have small set of transaction codes. - // TODO(b/295942369) : Add remaining transact codes from IBinder.h - uint32_t code = provider.ConsumeBool() ? provider.ConsumeIntegral<uint32_t>() - : provider.ConsumeBool() - ? provider.ConsumeIntegralInRange<uint32_t>(0, 100) - : provider.PickValueInArray<uint32_t>( - {IBinder::DUMP_TRANSACTION, IBinder::PING_TRANSACTION, - IBinder::SHELL_COMMAND_TRANSACTION, IBinder::INTERFACE_TRANSACTION, - IBinder::SYSPROPS_TRANSACTION, IBinder::EXTENSION_TRANSACTION, - IBinder::TWEET_TRANSACTION, IBinder::LIKE_TRANSACTION}); + uint32_t code = getCode(provider); uint32_t flags = provider.ConsumeIntegral<uint32_t>(); Parcel data; // for increased fuzz coverage diff --git a/libs/input/input_flags.aconfig b/libs/input/input_flags.aconfig index 9d387fe1ec..fc859cb0f8 100644 --- a/libs/input/input_flags.aconfig +++ b/libs/input/input_flags.aconfig @@ -148,13 +148,6 @@ flag { } flag { - name: "include_relative_axis_values_for_captured_touchpads" - namespace: "input" - description: "Include AXIS_RELATIVE_X and AXIS_RELATIVE_Y values when reporting touches from captured touchpads." - bug: "330522990" -} - -flag { name: "enable_per_device_input_latency_metrics" namespace: "input" description: "Capture input latency metrics on a per device granular level using histograms." diff --git a/opengl/libs/EGL/MultifileBlobCache.cpp b/opengl/libs/EGL/MultifileBlobCache.cpp index 04c525e93d..7faf361c08 100644 --- a/opengl/libs/EGL/MultifileBlobCache.cpp +++ b/opengl/libs/EGL/MultifileBlobCache.cpp @@ -356,7 +356,7 @@ void MultifileBlobCache::set(const void* key, EGLsizeiANDROID keySize, const voi // If we're going to be over the cache limit, kick off a trim to clear space if (getTotalSize() + fileSize > mMaxTotalSize || getTotalEntries() + 1 > mMaxTotalEntries) { - ALOGV("SET: Cache is full, calling trimCache to clear space"); + ALOGW("SET: Cache is full, calling trimCache to clear space"); trimCache(); } diff --git a/services/inputflinger/reader/mapper/CapturedTouchpadEventConverter.cpp b/services/inputflinger/reader/mapper/CapturedTouchpadEventConverter.cpp index dd46bbc543..d796af158b 100644 --- a/services/inputflinger/reader/mapper/CapturedTouchpadEventConverter.cpp +++ b/services/inputflinger/reader/mapper/CapturedTouchpadEventConverter.cpp @@ -25,8 +25,6 @@ #include <linux/input-event-codes.h> #include <log/log_main.h> -namespace input_flags = com::android::input::flags; - namespace android { namespace { @@ -119,15 +117,10 @@ std::string CapturedTouchpadEventConverter::dump() const { } void CapturedTouchpadEventConverter::populateMotionRanges(InputDeviceInfo& info) const { - if (input_flags::include_relative_axis_values_for_captured_touchpads()) { - tryAddRawMotionRangeWithRelative(/*byref*/ info, AMOTION_EVENT_AXIS_X, - AMOTION_EVENT_AXIS_RELATIVE_X, ABS_MT_POSITION_X); - tryAddRawMotionRangeWithRelative(/*byref*/ info, AMOTION_EVENT_AXIS_Y, - AMOTION_EVENT_AXIS_RELATIVE_Y, ABS_MT_POSITION_Y); - } else { - tryAddRawMotionRange(/*byref*/ info, AMOTION_EVENT_AXIS_X, ABS_MT_POSITION_X); - tryAddRawMotionRange(/*byref*/ info, AMOTION_EVENT_AXIS_Y, ABS_MT_POSITION_Y); - } + tryAddRawMotionRangeWithRelative(/*byref*/ info, AMOTION_EVENT_AXIS_X, + AMOTION_EVENT_AXIS_RELATIVE_X, ABS_MT_POSITION_X); + tryAddRawMotionRangeWithRelative(/*byref*/ info, AMOTION_EVENT_AXIS_Y, + AMOTION_EVENT_AXIS_RELATIVE_Y, ABS_MT_POSITION_Y); tryAddRawMotionRange(/*byref*/ info, AMOTION_EVENT_AXIS_TOUCH_MAJOR, ABS_MT_TOUCH_MAJOR); tryAddRawMotionRange(/*byref*/ info, AMOTION_EVENT_AXIS_TOUCH_MINOR, ABS_MT_TOUCH_MINOR); tryAddRawMotionRange(/*byref*/ info, AMOTION_EVENT_AXIS_TOOL_MAJOR, ABS_MT_WIDTH_MAJOR); @@ -213,13 +206,11 @@ std::list<NotifyArgs> CapturedTouchpadEventConverter::sync(nsecs_t when, nsecs_t } out.push_back( makeMotionArgs(when, readTime, AMOTION_EVENT_ACTION_MOVE, coords, properties)); - if (input_flags::include_relative_axis_values_for_captured_touchpads()) { - // For any further events we send from this sync, the pointers won't have moved relative - // to the positions we just reported in this MOVE event, so zero out the relative axes. - for (PointerCoords& pointer : coords) { - pointer.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, 0); - pointer.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, 0); - } + // For any further events we send from this sync, the pointers won't have moved relative to + // the positions we just reported in this MOVE event, so zero out the relative axes. + for (PointerCoords& pointer : coords) { + pointer.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, 0); + pointer.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, 0); } } @@ -275,9 +266,7 @@ std::list<NotifyArgs> CapturedTouchpadEventConverter::sync(nsecs_t when, nsecs_t /*flags=*/cancel ? AMOTION_EVENT_FLAG_CANCELED : 0)); freePointerIdForSlot(slotNumber); - if (input_flags::include_relative_axis_values_for_captured_touchpads()) { - mPreviousCoordsForSlotNumber.erase(slotNumber); - } + mPreviousCoordsForSlotNumber.erase(slotNumber); coords.erase(coords.begin() + indexToRemove); properties.erase(properties.begin() + indexToRemove); // Now that we've removed some coords and properties, we might have to update the slot @@ -336,15 +325,13 @@ PointerCoords CapturedTouchpadEventConverter::makePointerCoordsForSlot(size_t sl coords.clear(); coords.setAxisValue(AMOTION_EVENT_AXIS_X, slot.getX()); coords.setAxisValue(AMOTION_EVENT_AXIS_Y, slot.getY()); - if (input_flags::include_relative_axis_values_for_captured_touchpads()) { - if (auto it = mPreviousCoordsForSlotNumber.find(slotNumber); - it != mPreviousCoordsForSlotNumber.end()) { - auto [oldX, oldY] = it->second; - coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, slot.getX() - oldX); - coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, slot.getY() - oldY); - } - mPreviousCoordsForSlotNumber[slotNumber] = std::make_pair(slot.getX(), slot.getY()); + if (auto it = mPreviousCoordsForSlotNumber.find(slotNumber); + it != mPreviousCoordsForSlotNumber.end()) { + auto [oldX, oldY] = it->second; + coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, slot.getX() - oldX); + coords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, slot.getY() - oldY); } + mPreviousCoordsForSlotNumber[slotNumber] = std::make_pair(slot.getX(), slot.getY()); coords.setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, slot.getTouchMajor()); coords.setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, slot.getTouchMinor()); diff --git a/services/inputflinger/tests/CapturedTouchpadEventConverter_test.cpp b/services/inputflinger/tests/CapturedTouchpadEventConverter_test.cpp index 353011aa5c..c6246d9eec 100644 --- a/services/inputflinger/tests/CapturedTouchpadEventConverter_test.cpp +++ b/services/inputflinger/tests/CapturedTouchpadEventConverter_test.cpp @@ -33,8 +33,6 @@ #include "TestEventMatchers.h" #include "TestInputListener.h" -namespace input_flags = com::android::input::flags; - namespace android { using testing::AllOf; @@ -50,8 +48,6 @@ public: mReader(mFakeEventHub, mFakePolicy, mFakeListener), mDevice(newDevice()), mDeviceContext(*mDevice, EVENTHUB_ID) { - input_flags::include_relative_axis_values_for_captured_touchpads(true); - const size_t slotCount = 8; mFakeEventHub->addAbsoluteAxis(EVENTHUB_ID, ABS_MT_SLOT, 0, slotCount - 1, 0, 0, 0); mAccumulator.configure(mDeviceContext, slotCount, /*usingSlotsProtocol=*/true); diff --git a/services/inputflinger/tests/KeyboardInputMapper_test.cpp b/services/inputflinger/tests/KeyboardInputMapper_test.cpp index 40bbd3468e..d4b15bca48 100644 --- a/services/inputflinger/tests/KeyboardInputMapper_test.cpp +++ b/services/inputflinger/tests/KeyboardInputMapper_test.cpp @@ -691,32 +691,163 @@ TEST_F(KeyboardInputMapperUnitTest, Process_GestureEventToSetFlagKeepTouchMode) expectSingleKeyArg(argsList).flags); } -TEST_F_WITH_FLAGS(KeyboardInputMapperUnitTest, WakeBehavior_AlphabeticKeyboard, - REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(com::android::input::flags, - enable_alphabetic_keyboard_wake))) { - // For internal alphabetic devices, keys will trigger wake on key down. +// --- KeyboardInputMapperUnitTest_WakeFlagOverride --- + +class KeyboardInputMapperUnitTest_WakeFlagOverride : public KeyboardInputMapperUnitTest { +protected: + virtual void SetUp() override { + SetUp(/*wakeFlag=*/com::android::input::flags::enable_alphabetic_keyboard_wake()); + } + + void SetUp(bool wakeFlag) { + mWakeFlagInitialValue = com::android::input::flags::enable_alphabetic_keyboard_wake(); + com::android::input::flags::enable_alphabetic_keyboard_wake(wakeFlag); + KeyboardInputMapperUnitTest::SetUp(); + } + + void TearDown() override { + com::android::input::flags::enable_alphabetic_keyboard_wake(mWakeFlagInitialValue); + KeyboardInputMapperUnitTest::TearDown(); + } + + bool mWakeFlagInitialValue; +}; + +// --- KeyboardInputMapperUnitTest_NonAlphabeticKeyboard_WakeFlagEnabled --- + +class KeyboardInputMapperUnitTest_NonAlphabeticKeyboard_WakeFlagEnabled + : public KeyboardInputMapperUnitTest_WakeFlagOverride { +protected: + void SetUp() override { + KeyboardInputMapperUnitTest_WakeFlagOverride::SetUp(/*wakeFlag=*/true); + } +}; + +TEST_F(KeyboardInputMapperUnitTest_NonAlphabeticKeyboard_WakeFlagEnabled, + NonAlphabeticDevice_WakeBehavior) { + // For internal non-alphabetic devices keys will not trigger wake. addKeyByEvdevCode(KEY_A, AKEYCODE_A); addKeyByEvdevCode(KEY_HOME, AKEYCODE_HOME); addKeyByEvdevCode(KEY_PLAYPAUSE, AKEYCODE_MEDIA_PLAY_PAUSE); std::list<NotifyArgs> argsList = processKeyAndSync(ARBITRARY_TIME, KEY_A, 1); - ASSERT_EQ(POLICY_FLAG_WAKE, expectSingleKeyArg(argsList).policyFlags); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); argsList = processKeyAndSync(ARBITRARY_TIME + 1, KEY_A, 0); - ASSERT_EQ(uint32_t(0), expectSingleKeyArg(argsList).policyFlags); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); argsList = processKeyAndSync(ARBITRARY_TIME, KEY_HOME, 1); - ASSERT_EQ(POLICY_FLAG_WAKE, expectSingleKeyArg(argsList).policyFlags); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); argsList = processKeyAndSync(ARBITRARY_TIME + 1, KEY_HOME, 0); - ASSERT_EQ(uint32_t(0), expectSingleKeyArg(argsList).policyFlags); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); argsList = processKeyAndSync(ARBITRARY_TIME, KEY_PLAYPAUSE, 1); - ASSERT_EQ(POLICY_FLAG_WAKE, expectSingleKeyArg(argsList).policyFlags); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); argsList = processKeyAndSync(ARBITRARY_TIME + 1, KEY_PLAYPAUSE, 0); - ASSERT_EQ(uint32_t(0), expectSingleKeyArg(argsList).policyFlags); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); +} + +// --- KeyboardInputMapperUnitTest_AlphabeticKeyboard_WakeFlagEnabled --- + +class KeyboardInputMapperUnitTest_AlphabeticKeyboard_WakeFlagEnabled + : public KeyboardInputMapperUnitTest_WakeFlagOverride { +protected: + void SetUp() override { + KeyboardInputMapperUnitTest_WakeFlagOverride::SetUp(/*wakeFlag=*/true); + + ON_CALL((*mDevice), getKeyboardType).WillByDefault(Return(KeyboardType::ALPHABETIC)); + } +}; + +TEST_F(KeyboardInputMapperUnitTest_AlphabeticKeyboard_WakeFlagEnabled, WakeBehavior) { + // For internal alphabetic devices, keys will trigger wake on key down when + // flag is enabled. + addKeyByEvdevCode(KEY_A, AKEYCODE_A); + addKeyByEvdevCode(KEY_HOME, AKEYCODE_HOME); + addKeyByEvdevCode(KEY_PLAYPAUSE, AKEYCODE_MEDIA_PLAY_PAUSE); + + std::list<NotifyArgs> argsList = processKeyAndSync(ARBITRARY_TIME, KEY_A, 1); + EXPECT_THAT(argsList, + ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(POLICY_FLAG_WAKE)))); + + argsList = processKeyAndSync(ARBITRARY_TIME + 1, KEY_A, 0); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); + + argsList = processKeyAndSync(ARBITRARY_TIME, KEY_HOME, 1); + EXPECT_THAT(argsList, + ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(POLICY_FLAG_WAKE)))); + + argsList = processKeyAndSync(ARBITRARY_TIME + 1, KEY_HOME, 0); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); + + argsList = processKeyAndSync(ARBITRARY_TIME, KEY_PLAYPAUSE, 1); + EXPECT_THAT(argsList, + ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(POLICY_FLAG_WAKE)))); + + argsList = processKeyAndSync(ARBITRARY_TIME + 1, KEY_PLAYPAUSE, 0); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); +} + +TEST_F(KeyboardInputMapperUnitTest_AlphabeticKeyboard_WakeFlagEnabled, WakeBehavior_UnknownKey) { + // For internal alphabetic devices, unknown keys will trigger wake on key down when + // flag is enabled. + + const int32_t USAGE_UNKNOWN = 0x07ffff; + EXPECT_CALL(mMockEventHub, mapKey(EVENTHUB_ID, KEY_UNKNOWN, USAGE_UNKNOWN, _, _, _, _)) + .WillRepeatedly(Return(NAME_NOT_FOUND)); + + // Key down with unknown scan code or usage code. + std::list<NotifyArgs> argsList = process(ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN); + argsList += process(ARBITRARY_TIME, EV_KEY, KEY_UNKNOWN, 1); + EXPECT_THAT(argsList, + ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(POLICY_FLAG_WAKE)))); + + // Key up with unknown scan code or usage code. + argsList = process(ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN); + argsList += process(ARBITRARY_TIME + 1, EV_KEY, KEY_UNKNOWN, 0); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); +} + +// --- KeyboardInputMapperUnitTest_AlphabeticDevice_AlphabeticKeyboardWakeDisabled --- + +class KeyboardInputMapperUnitTest_AlphabeticKeyboard_WakeFlagDisabled + : public KeyboardInputMapperUnitTest_WakeFlagOverride { +protected: + void SetUp() override { + KeyboardInputMapperUnitTest_WakeFlagOverride::SetUp(/*wakeFlag=*/false); + + ON_CALL((*mDevice), getKeyboardType).WillByDefault(Return(KeyboardType::ALPHABETIC)); + } +}; + +TEST_F(KeyboardInputMapperUnitTest_AlphabeticKeyboard_WakeFlagDisabled, WakeBehavior) { + // For internal alphabetic devices, keys will not trigger wake when flag is + // disabled. + + addKeyByEvdevCode(KEY_A, AKEYCODE_A); + addKeyByEvdevCode(KEY_HOME, AKEYCODE_HOME); + addKeyByEvdevCode(KEY_PLAYPAUSE, AKEYCODE_MEDIA_PLAY_PAUSE); + + std::list<NotifyArgs> argsList = processKeyAndSync(ARBITRARY_TIME, KEY_A, 1); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); + + argsList = processKeyAndSync(ARBITRARY_TIME + 1, KEY_A, 0); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); + + argsList = processKeyAndSync(ARBITRARY_TIME, KEY_HOME, 1); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); + + argsList = processKeyAndSync(ARBITRARY_TIME + 1, KEY_HOME, 0); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); + + argsList = processKeyAndSync(ARBITRARY_TIME, KEY_PLAYPAUSE, 1); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); + + argsList = processKeyAndSync(ARBITRARY_TIME + 1, KEY_PLAYPAUSE, 0); + EXPECT_THAT(argsList, ElementsAre(VariantWith<NotifyKeyArgs>(WithPolicyFlags(0U)))); } // --- KeyboardInputMapperTest --- diff --git a/services/vibratorservice/Android.bp b/services/vibratorservice/Android.bp index 4735ae5897..ed03cfc3f5 100644 --- a/services/vibratorservice/Android.bp +++ b/services/vibratorservice/Android.bp @@ -42,14 +42,9 @@ cc_library_shared { shared_libs: [ "libbinder_ndk", - "libhidlbase", "liblog", "libutils", "android.hardware.vibrator-V3-ndk", - "android.hardware.vibrator@1.0", - "android.hardware.vibrator@1.1", - "android.hardware.vibrator@1.2", - "android.hardware.vibrator@1.3", ], cflags: [ diff --git a/services/vibratorservice/VibratorHalController.cpp b/services/vibratorservice/VibratorHalController.cpp index 283a5f0301..302e3e1299 100644 --- a/services/vibratorservice/VibratorHalController.cpp +++ b/services/vibratorservice/VibratorHalController.cpp @@ -18,8 +18,6 @@ #include <aidl/android/hardware/vibrator/IVibrator.h> #include <android/binder_manager.h> -#include <android/hardware/vibrator/1.3/IVibrator.h> -#include <hardware/vibrator.h> #include <utils/Log.h> @@ -31,15 +29,10 @@ using aidl::android::hardware::vibrator::CompositeEffect; using aidl::android::hardware::vibrator::CompositePrimitive; using aidl::android::hardware::vibrator::Effect; using aidl::android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::IVibrator; using std::chrono::milliseconds; -namespace V1_0 = android::hardware::vibrator::V1_0; -namespace V1_1 = android::hardware::vibrator::V1_1; -namespace V1_2 = android::hardware::vibrator::V1_2; -namespace V1_3 = android::hardware::vibrator::V1_3; -namespace Aidl = aidl::android::hardware::vibrator; - namespace android { namespace vibrator { @@ -53,9 +46,9 @@ std::shared_ptr<HalWrapper> connectHal(std::shared_ptr<CallbackScheduler> schedu return nullptr; } - auto serviceName = std::string(Aidl::IVibrator::descriptor) + "/default"; + auto serviceName = std::string(IVibrator::descriptor) + "/default"; if (AServiceManager_isDeclared(serviceName.c_str())) { - std::shared_ptr<Aidl::IVibrator> hal = Aidl::IVibrator::fromBinder( + std::shared_ptr<IVibrator> hal = IVibrator::fromBinder( ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str()))); if (hal) { ALOGV("Successfully connected to Vibrator HAL AIDL service."); @@ -63,30 +56,9 @@ std::shared_ptr<HalWrapper> connectHal(std::shared_ptr<CallbackScheduler> schedu } } - sp<V1_0::IVibrator> halV1_0 = V1_0::IVibrator::getService(); - if (halV1_0 == nullptr) { - ALOGV("Vibrator HAL service not available."); - gHalExists = false; - return nullptr; - } - - sp<V1_3::IVibrator> halV1_3 = V1_3::IVibrator::castFrom(halV1_0); - if (halV1_3) { - ALOGV("Successfully connected to Vibrator HAL v1.3 service."); - return std::make_shared<HidlHalWrapperV1_3>(std::move(scheduler), halV1_3); - } - sp<V1_2::IVibrator> halV1_2 = V1_2::IVibrator::castFrom(halV1_0); - if (halV1_2) { - ALOGV("Successfully connected to Vibrator HAL v1.2 service."); - return std::make_shared<HidlHalWrapperV1_2>(std::move(scheduler), halV1_2); - } - sp<V1_1::IVibrator> halV1_1 = V1_1::IVibrator::castFrom(halV1_0); - if (halV1_1) { - ALOGV("Successfully connected to Vibrator HAL v1.1 service."); - return std::make_shared<HidlHalWrapperV1_1>(std::move(scheduler), halV1_1); - } - ALOGV("Successfully connected to Vibrator HAL v1.0 service."); - return std::make_shared<HidlHalWrapperV1_0>(std::move(scheduler), halV1_0); + ALOGV("Vibrator HAL service not available."); + gHalExists = false; + return nullptr; } // ------------------------------------------------------------------------------------------------- diff --git a/services/vibratorservice/VibratorHalWrapper.cpp b/services/vibratorservice/VibratorHalWrapper.cpp index 536a6b352b..5d4c17dc76 100644 --- a/services/vibratorservice/VibratorHalWrapper.cpp +++ b/services/vibratorservice/VibratorHalWrapper.cpp @@ -17,7 +17,6 @@ #define LOG_TAG "VibratorHalWrapper" #include <aidl/android/hardware/vibrator/IVibrator.h> -#include <android/hardware/vibrator/1.3/IVibrator.h> #include <hardware/vibrator.h> #include <cmath> @@ -33,32 +32,18 @@ using aidl::android::hardware::vibrator::CompositePwleV2; using aidl::android::hardware::vibrator::Effect; using aidl::android::hardware::vibrator::EffectStrength; using aidl::android::hardware::vibrator::FrequencyAccelerationMapEntry; +using aidl::android::hardware::vibrator::IVibrator; using aidl::android::hardware::vibrator::PrimitivePwle; using aidl::android::hardware::vibrator::VendorEffect; using std::chrono::milliseconds; -namespace V1_0 = android::hardware::vibrator::V1_0; -namespace V1_1 = android::hardware::vibrator::V1_1; -namespace V1_2 = android::hardware::vibrator::V1_2; -namespace V1_3 = android::hardware::vibrator::V1_3; -namespace Aidl = aidl::android::hardware::vibrator; - namespace android { namespace vibrator { // ------------------------------------------------------------------------------------------------- -template <class T> -bool isStaticCastValid(Effect effect) { - T castEffect = static_cast<T>(effect); - auto iter = hardware::hidl_enum_range<T>(); - return castEffect >= *iter.begin() && castEffect <= *std::prev(iter.end()); -} - -// ------------------------------------------------------------------------------------------------- - Info HalWrapper::getInfo() { getCapabilities(); getPrimitiveDurations(); @@ -261,7 +246,7 @@ void AidlHalWrapper::tryReconnect() { if (!result.isOk()) { return; } - std::shared_ptr<Aidl::IVibrator> newHandle = result.value(); + std::shared_ptr<IVibrator> newHandle = result.value(); if (newHandle) { std::lock_guard<std::mutex> lock(mHandleMutex); mHandle = std::move(newHandle); @@ -514,219 +499,13 @@ AidlHalWrapper::getFrequencyToOutputAccelerationMapInternal() { frequencyToOutputAccelerationMap); } -std::shared_ptr<Aidl::IVibrator> AidlHalWrapper::getHal() { - std::lock_guard<std::mutex> lock(mHandleMutex); - return mHandle; -} - -// ------------------------------------------------------------------------------------------------- - -template <typename I> -HalResult<void> HidlHalWrapper<I>::ping() { - return HalResultFactory::fromReturn(getHal()->ping()); -} - -template <typename I> -void HidlHalWrapper<I>::tryReconnect() { - sp<I> newHandle = I::tryGetService(); - if (newHandle) { - std::lock_guard<std::mutex> lock(mHandleMutex); - mHandle = std::move(newHandle); - } -} - -template <typename I> -HalResult<void> HidlHalWrapper<I>::on(milliseconds timeout, - const std::function<void()>& completionCallback) { - auto status = getHal()->on(timeout.count()); - auto ret = HalResultFactory::fromStatus(status.withDefault(V1_0::Status::UNKNOWN_ERROR)); - if (ret.isOk()) { - mCallbackScheduler->schedule(completionCallback, timeout); - } - return ret; -} - -template <typename I> -HalResult<void> HidlHalWrapper<I>::off() { - auto status = getHal()->off(); - return HalResultFactory::fromStatus(status.withDefault(V1_0::Status::UNKNOWN_ERROR)); -} - -template <typename I> -HalResult<void> HidlHalWrapper<I>::setAmplitude(float amplitude) { - uint8_t amp = static_cast<uint8_t>(amplitude * std::numeric_limits<uint8_t>::max()); - auto status = getHal()->setAmplitude(amp); - return HalResultFactory::fromStatus(status.withDefault(V1_0::Status::UNKNOWN_ERROR)); -} - -template <typename I> -HalResult<void> HidlHalWrapper<I>::setExternalControl(bool) { - ALOGV("Skipped setExternalControl because Vibrator HAL does not support it"); - return HalResult<void>::unsupported(); -} - -template <typename I> -HalResult<void> HidlHalWrapper<I>::alwaysOnEnable(int32_t, Effect, EffectStrength) { - ALOGV("Skipped alwaysOnEnable because Vibrator HAL AIDL is not available"); - return HalResult<void>::unsupported(); -} - -template <typename I> -HalResult<void> HidlHalWrapper<I>::alwaysOnDisable(int32_t) { - ALOGV("Skipped alwaysOnDisable because Vibrator HAL AIDL is not available"); - return HalResult<void>::unsupported(); -} - -template <typename I> -HalResult<Capabilities> HidlHalWrapper<I>::getCapabilitiesInternal() { - hardware::Return<bool> result = getHal()->supportsAmplitudeControl(); - Capabilities capabilities = - result.withDefault(false) ? Capabilities::AMPLITUDE_CONTROL : Capabilities::NONE; - return HalResultFactory::fromReturn<Capabilities>(std::move(result), capabilities); -} - -template <typename I> -template <typename T> -HalResult<milliseconds> HidlHalWrapper<I>::performInternal( - perform_fn<T> performFn, sp<I> handle, T effect, EffectStrength strength, - const std::function<void()>& completionCallback) { - V1_0::Status status; - int32_t lengthMs; - auto effectCallback = [&status, &lengthMs](V1_0::Status retStatus, uint32_t retLengthMs) { - status = retStatus; - lengthMs = retLengthMs; - }; - - V1_0::EffectStrength effectStrength = static_cast<V1_0::EffectStrength>(strength); - auto result = std::invoke(performFn, handle, effect, effectStrength, effectCallback); - milliseconds length = milliseconds(lengthMs); - - auto ret = HalResultFactory::fromReturn<milliseconds>(std::move(result), status, length); - if (ret.isOk()) { - mCallbackScheduler->schedule(completionCallback, length); - } - - return ret; -} - -template <typename I> -sp<I> HidlHalWrapper<I>::getHal() { +std::shared_ptr<IVibrator> AidlHalWrapper::getHal() { std::lock_guard<std::mutex> lock(mHandleMutex); return mHandle; } // ------------------------------------------------------------------------------------------------- -HalResult<milliseconds> HidlHalWrapperV1_0::performEffect( - Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { - if (isStaticCastValid<V1_0::Effect>(effect)) { - return performInternal(&V1_0::IVibrator::perform, getHal(), - static_cast<V1_0::Effect>(effect), strength, completionCallback); - } - - ALOGV("Skipped performEffect because Vibrator HAL does not support effect %s", - Aidl::toString(effect).c_str()); - return HalResult<milliseconds>::unsupported(); -} - -// ------------------------------------------------------------------------------------------------- - -HalResult<milliseconds> HidlHalWrapperV1_1::performEffect( - Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { - if (isStaticCastValid<V1_0::Effect>(effect)) { - return performInternal(&V1_1::IVibrator::perform, getHal(), - static_cast<V1_0::Effect>(effect), strength, completionCallback); - } - if (isStaticCastValid<V1_1::Effect_1_1>(effect)) { - return performInternal(&V1_1::IVibrator::perform_1_1, getHal(), - static_cast<V1_1::Effect_1_1>(effect), strength, completionCallback); - } - - ALOGV("Skipped performEffect because Vibrator HAL does not support effect %s", - Aidl::toString(effect).c_str()); - return HalResult<milliseconds>::unsupported(); -} - -// ------------------------------------------------------------------------------------------------- - -HalResult<milliseconds> HidlHalWrapperV1_2::performEffect( - Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { - if (isStaticCastValid<V1_0::Effect>(effect)) { - return performInternal(&V1_2::IVibrator::perform, getHal(), - static_cast<V1_0::Effect>(effect), strength, completionCallback); - } - if (isStaticCastValid<V1_1::Effect_1_1>(effect)) { - return performInternal(&V1_2::IVibrator::perform_1_1, getHal(), - static_cast<V1_1::Effect_1_1>(effect), strength, completionCallback); - } - if (isStaticCastValid<V1_2::Effect>(effect)) { - return performInternal(&V1_2::IVibrator::perform_1_2, getHal(), - static_cast<V1_2::Effect>(effect), strength, completionCallback); - } - - ALOGV("Skipped performEffect because Vibrator HAL does not support effect %s", - Aidl::toString(effect).c_str()); - return HalResult<milliseconds>::unsupported(); -} - -// ------------------------------------------------------------------------------------------------- - -HalResult<void> HidlHalWrapperV1_3::setExternalControl(bool enabled) { - auto result = getHal()->setExternalControl(static_cast<uint32_t>(enabled)); - return HalResultFactory::fromStatus(result.withDefault(V1_0::Status::UNKNOWN_ERROR)); -} - -HalResult<milliseconds> HidlHalWrapperV1_3::performEffect( - Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { - if (isStaticCastValid<V1_0::Effect>(effect)) { - return performInternal(&V1_3::IVibrator::perform, getHal(), - static_cast<V1_0::Effect>(effect), strength, completionCallback); - } - if (isStaticCastValid<V1_1::Effect_1_1>(effect)) { - return performInternal(&V1_3::IVibrator::perform_1_1, getHal(), - static_cast<V1_1::Effect_1_1>(effect), strength, completionCallback); - } - if (isStaticCastValid<V1_2::Effect>(effect)) { - return performInternal(&V1_3::IVibrator::perform_1_2, getHal(), - static_cast<V1_2::Effect>(effect), strength, completionCallback); - } - if (isStaticCastValid<V1_3::Effect>(effect)) { - return performInternal(&V1_3::IVibrator::perform_1_3, getHal(), - static_cast<V1_3::Effect>(effect), strength, completionCallback); - } - - ALOGV("Skipped performEffect because Vibrator HAL does not support effect %s", - Aidl::toString(effect).c_str()); - return HalResult<milliseconds>::unsupported(); -} - -HalResult<Capabilities> HidlHalWrapperV1_3::getCapabilitiesInternal() { - Capabilities capabilities = Capabilities::NONE; - - sp<V1_3::IVibrator> hal = getHal(); - auto amplitudeResult = hal->supportsAmplitudeControl(); - if (!amplitudeResult.isOk()) { - return HalResultFactory::fromReturn<Capabilities>(std::move(amplitudeResult), capabilities); - } - - auto externalControlResult = hal->supportsExternalControl(); - if (amplitudeResult.withDefault(false)) { - capabilities |= Capabilities::AMPLITUDE_CONTROL; - } - if (externalControlResult.withDefault(false)) { - capabilities |= Capabilities::EXTERNAL_CONTROL; - - if (amplitudeResult.withDefault(false)) { - capabilities |= Capabilities::EXTERNAL_AMPLITUDE_CONTROL; - } - } - - return HalResultFactory::fromReturn<Capabilities>(std::move(externalControlResult), - capabilities); -} - -// ------------------------------------------------------------------------------------------------- - }; // namespace vibrator }; // namespace android diff --git a/services/vibratorservice/VibratorManagerHalController.cpp b/services/vibratorservice/VibratorManagerHalController.cpp index 494f88f10e..31b6ed030f 100644 --- a/services/vibratorservice/VibratorManagerHalController.cpp +++ b/services/vibratorservice/VibratorManagerHalController.cpp @@ -20,7 +20,10 @@ #include <vibratorservice/VibratorManagerHalController.h> -namespace Aidl = aidl::android::hardware::vibrator; +using aidl::android::hardware::vibrator::IVibrationSession; +using aidl::android::hardware::vibrator::IVibrator; +using aidl::android::hardware::vibrator::IVibratorManager; +using aidl::android::hardware::vibrator::VibrationSessionConfig; namespace android { @@ -29,9 +32,9 @@ namespace vibrator { std::shared_ptr<ManagerHalWrapper> connectManagerHal(std::shared_ptr<CallbackScheduler> scheduler) { static bool gHalExists = true; if (gHalExists) { - auto serviceName = std::string(Aidl::IVibratorManager::descriptor) + "/default"; + auto serviceName = std::string(IVibratorManager::descriptor) + "/default"; if (AServiceManager_isDeclared(serviceName.c_str())) { - std::shared_ptr<Aidl::IVibratorManager> hal = Aidl::IVibratorManager::fromBinder( + std::shared_ptr<IVibratorManager> hal = IVibratorManager::fromBinder( ndk::SpAIBinder(AServiceManager_checkService(serviceName.c_str()))); if (hal) { ALOGV("Successfully connected to VibratorManager HAL AIDL service."); @@ -41,6 +44,7 @@ std::shared_ptr<ManagerHalWrapper> connectManagerHal(std::shared_ptr<CallbackSch } } + ALOGV("VibratorManager HAL service not available."); gHalExists = false; return std::make_shared<LegacyManagerHalWrapper>(); } @@ -150,10 +154,10 @@ HalResult<void> ManagerHalController::cancelSynced() { return apply(cancelSyncedFn, "cancelSynced"); } -HalResult<std::shared_ptr<Aidl::IVibrationSession>> ManagerHalController::startSession( - const std::vector<int32_t>& ids, const Aidl::VibrationSessionConfig& config, +HalResult<std::shared_ptr<IVibrationSession>> ManagerHalController::startSession( + const std::vector<int32_t>& ids, const VibrationSessionConfig& config, const std::function<void()>& completionCallback) { - hal_fn<std::shared_ptr<Aidl::IVibrationSession>> startSessionFn = + hal_fn<std::shared_ptr<IVibrationSession>> startSessionFn = [&](std::shared_ptr<ManagerHalWrapper> hal) { return hal->startSession(ids, config, completionCallback); }; diff --git a/services/vibratorservice/VibratorManagerHalWrapper.cpp b/services/vibratorservice/VibratorManagerHalWrapper.cpp index 3db8ff8699..bab3f58754 100644 --- a/services/vibratorservice/VibratorManagerHalWrapper.cpp +++ b/services/vibratorservice/VibratorManagerHalWrapper.cpp @@ -20,7 +20,10 @@ #include <vibratorservice/VibratorManagerHalWrapper.h> -namespace Aidl = aidl::android::hardware::vibrator; +using aidl::android::hardware::vibrator::IVibrationSession; +using aidl::android::hardware::vibrator::IVibrator; +using aidl::android::hardware::vibrator::IVibratorManager; +using aidl::android::hardware::vibrator::VibrationSessionConfig; namespace android { @@ -41,10 +44,9 @@ HalResult<void> ManagerHalWrapper::cancelSynced() { return HalResult<void>::unsupported(); } -HalResult<std::shared_ptr<Aidl::IVibrationSession>> ManagerHalWrapper::startSession( - const std::vector<int32_t>&, const Aidl::VibrationSessionConfig&, - const std::function<void()>&) { - return HalResult<std::shared_ptr<Aidl::IVibrationSession>>::unsupported(); +HalResult<std::shared_ptr<IVibrationSession>> ManagerHalWrapper::startSession( + const std::vector<int32_t>&, const VibrationSessionConfig&, const std::function<void()>&) { + return HalResult<std::shared_ptr<IVibrationSession>>::unsupported(); } HalResult<void> ManagerHalWrapper::clearSessions() { @@ -87,11 +89,11 @@ HalResult<std::shared_ptr<HalController>> LegacyManagerHalWrapper::getVibrator(i std::shared_ptr<HalWrapper> AidlManagerHalWrapper::connectToVibrator( int32_t vibratorId, std::shared_ptr<CallbackScheduler> callbackScheduler) { - std::function<HalResult<std::shared_ptr<Aidl::IVibrator>>()> reconnectFn = [=, this]() { - std::shared_ptr<Aidl::IVibrator> vibrator; + std::function<HalResult<std::shared_ptr<IVibrator>>()> reconnectFn = [=, this]() { + std::shared_ptr<IVibrator> vibrator; auto status = this->getHal()->getVibrator(vibratorId, &vibrator); - return HalResultFactory::fromStatus<std::shared_ptr<Aidl::IVibrator>>(std::move(status), - vibrator); + return HalResultFactory::fromStatus<std::shared_ptr<IVibrator>>(std::move(status), + vibrator); }; auto result = reconnectFn(); if (!result.isOk()) { @@ -110,8 +112,8 @@ HalResult<void> AidlManagerHalWrapper::ping() { } void AidlManagerHalWrapper::tryReconnect() { - auto aidlServiceName = std::string(Aidl::IVibratorManager::descriptor) + "/default"; - std::shared_ptr<Aidl::IVibratorManager> newHandle = Aidl::IVibratorManager::fromBinder( + auto aidlServiceName = std::string(IVibratorManager::descriptor) + "/default"; + std::shared_ptr<IVibratorManager> newHandle = IVibratorManager::fromBinder( ndk::SpAIBinder(AServiceManager_checkService(aidlServiceName.c_str()))); if (newHandle) { std::lock_guard<std::mutex> lock(mHandleMutex); @@ -198,15 +200,14 @@ HalResult<void> AidlManagerHalWrapper::triggerSynced( return HalResultFactory::fromStatus(getHal()->triggerSynced(cb)); } -HalResult<std::shared_ptr<Aidl::IVibrationSession>> AidlManagerHalWrapper::startSession( - const std::vector<int32_t>& ids, const Aidl::VibrationSessionConfig& config, +HalResult<std::shared_ptr<IVibrationSession>> AidlManagerHalWrapper::startSession( + const std::vector<int32_t>& ids, const VibrationSessionConfig& config, const std::function<void()>& completionCallback) { auto cb = ndk::SharedRefBase::make<HalCallbackWrapper>(completionCallback); - std::shared_ptr<Aidl::IVibrationSession> session; + std::shared_ptr<IVibrationSession> session; auto status = getHal()->startSession(ids, config, cb, &session); - return HalResultFactory::fromStatus<std::shared_ptr<Aidl::IVibrationSession>>(std::move(status), - std::move( - session)); + return HalResultFactory::fromStatus<std::shared_ptr<IVibrationSession>>(std::move(status), + std::move(session)); } HalResult<void> AidlManagerHalWrapper::cancelSynced() { @@ -227,7 +228,7 @@ HalResult<void> AidlManagerHalWrapper::clearSessions() { return HalResultFactory::fromStatus(getHal()->clearSessions()); } -std::shared_ptr<Aidl::IVibratorManager> AidlManagerHalWrapper::getHal() { +std::shared_ptr<IVibratorManager> AidlManagerHalWrapper::getHal() { std::lock_guard<std::mutex> lock(mHandleMutex); return mHandle; } diff --git a/services/vibratorservice/benchmarks/Android.bp b/services/vibratorservice/benchmarks/Android.bp index 915d6c7bc3..6fc5cf3517 100644 --- a/services/vibratorservice/benchmarks/Android.bp +++ b/services/vibratorservice/benchmarks/Android.bp @@ -29,15 +29,10 @@ cc_benchmark { ], shared_libs: [ "libbinder_ndk", - "libhidlbase", "liblog", "libutils", "libvibratorservice", "android.hardware.vibrator-V3-ndk", - "android.hardware.vibrator@1.0", - "android.hardware.vibrator@1.1", - "android.hardware.vibrator@1.2", - "android.hardware.vibrator@1.3", ], cflags: [ "-Wall", diff --git a/services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h b/services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h index 9a39ad4f7b..065227861d 100644 --- a/services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h +++ b/services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h @@ -22,7 +22,6 @@ #include <android-base/thread_annotations.h> #include <android/binder_manager.h> -#include <android/hardware/vibrator/1.3/IVibrator.h> #include <binder/IServiceManager.h> #include <vibratorservice/VibratorCallbackScheduler.h> @@ -105,26 +104,6 @@ public: : fromFailedStatus<T>(std::move(status)); } - template <typename T> - static HalResult<T> fromStatus(hardware::vibrator::V1_0::Status&& status, T data) { - return (status == hardware::vibrator::V1_0::Status::OK) - ? HalResult<T>::ok(std::move(data)) - : fromFailedStatus<T>(std::move(status)); - } - - template <typename T, typename R> - static HalResult<T> fromReturn(hardware::Return<R>&& ret, T data) { - return ret.isOk() ? HalResult<T>::ok(std::move(data)) - : fromFailedReturn<T, R>(std::move(ret)); - } - - template <typename T, typename R> - static HalResult<T> fromReturn(hardware::Return<R>&& ret, - hardware::vibrator::V1_0::Status status, T data) { - return ret.isOk() ? fromStatus<T>(std::move(status), std::move(data)) - : fromFailedReturn<T, R>(std::move(ret)); - } - static HalResult<void> fromStatus(status_t status) { return (status == android::OK) ? HalResult<void>::ok() : fromFailedStatus<void>(std::move(status)); @@ -134,17 +113,6 @@ public: return status.isOk() ? HalResult<void>::ok() : fromFailedStatus<void>(std::move(status)); } - static HalResult<void> fromStatus(hardware::vibrator::V1_0::Status&& status) { - return (status == hardware::vibrator::V1_0::Status::OK) - ? HalResult<void>::ok() - : fromFailedStatus<void>(std::move(status)); - } - - template <typename R> - static HalResult<void> fromReturn(hardware::Return<R>&& ret) { - return ret.isOk() ? HalResult<void>::ok() : fromFailedReturn<void, R>(std::move(ret)); - } - private: template <typename T> static HalResult<T> fromFailedStatus(status_t status) { @@ -166,23 +134,6 @@ private: } return HalResult<T>::failed(status.getMessage()); } - - template <typename T> - static HalResult<T> fromFailedStatus(hardware::vibrator::V1_0::Status&& status) { - switch (status) { - case hardware::vibrator::V1_0::Status::UNSUPPORTED_OPERATION: - return HalResult<T>::unsupported(); - default: - auto msg = "android::hardware::vibrator::V1_0::Status = " + toString(status); - return HalResult<T>::failed(msg.c_str()); - } - } - - template <typename T, typename R> - static HalResult<T> fromFailedReturn(hardware::Return<R>&& ret) { - return ret.isDeadObject() ? HalResult<T>::transactionFailed(ret.description().c_str()) - : HalResult<T>::failed(ret.description().c_str()); - } }; // ------------------------------------------------------------------------------------------------- @@ -548,108 +499,6 @@ private: std::shared_ptr<IVibrator> getHal(); }; -// Wrapper for the HDIL Vibrator HALs. -template <typename I> -class HidlHalWrapper : public HalWrapper { -public: - HidlHalWrapper(std::shared_ptr<CallbackScheduler> scheduler, sp<I> handle) - : HalWrapper(std::move(scheduler)), mHandle(std::move(handle)) {} - virtual ~HidlHalWrapper() = default; - - HalResult<void> ping() override final; - void tryReconnect() override final; - - HalResult<void> on(std::chrono::milliseconds timeout, - const std::function<void()>& completionCallback) override final; - HalResult<void> off() override final; - - HalResult<void> setAmplitude(float amplitude) override final; - virtual HalResult<void> setExternalControl(bool enabled) override; - - HalResult<void> alwaysOnEnable(int32_t id, HalWrapper::Effect effect, - HalWrapper::EffectStrength strength) override final; - HalResult<void> alwaysOnDisable(int32_t id) override final; - -protected: - std::mutex mHandleMutex; - sp<I> mHandle GUARDED_BY(mHandleMutex); - - virtual HalResult<Capabilities> getCapabilitiesInternal() override; - - template <class T> - using perform_fn = - hardware::Return<void> (I::*)(T, hardware::vibrator::V1_0::EffectStrength, - hardware::vibrator::V1_0::IVibrator::perform_cb); - - template <class T> - HalResult<std::chrono::milliseconds> performInternal( - perform_fn<T> performFn, sp<I> handle, T effect, HalWrapper::EffectStrength strength, - const std::function<void()>& completionCallback); - - sp<I> getHal(); -}; - -// Wrapper for the HDIL Vibrator HAL v1.0. -class HidlHalWrapperV1_0 : public HidlHalWrapper<hardware::vibrator::V1_0::IVibrator> { -public: - HidlHalWrapperV1_0(std::shared_ptr<CallbackScheduler> scheduler, - sp<hardware::vibrator::V1_0::IVibrator> handle) - : HidlHalWrapper<hardware::vibrator::V1_0::IVibrator>(std::move(scheduler), - std::move(handle)) {} - virtual ~HidlHalWrapperV1_0() = default; - - HalResult<std::chrono::milliseconds> performEffect( - HalWrapper::Effect effect, HalWrapper::EffectStrength strength, - const std::function<void()>& completionCallback) override final; -}; - -// Wrapper for the HDIL Vibrator HAL v1.1. -class HidlHalWrapperV1_1 : public HidlHalWrapper<hardware::vibrator::V1_1::IVibrator> { -public: - HidlHalWrapperV1_1(std::shared_ptr<CallbackScheduler> scheduler, - sp<hardware::vibrator::V1_1::IVibrator> handle) - : HidlHalWrapper<hardware::vibrator::V1_1::IVibrator>(std::move(scheduler), - std::move(handle)) {} - virtual ~HidlHalWrapperV1_1() = default; - - HalResult<std::chrono::milliseconds> performEffect( - HalWrapper::Effect effect, HalWrapper::EffectStrength strength, - const std::function<void()>& completionCallback) override final; -}; - -// Wrapper for the HDIL Vibrator HAL v1.2. -class HidlHalWrapperV1_2 : public HidlHalWrapper<hardware::vibrator::V1_2::IVibrator> { -public: - HidlHalWrapperV1_2(std::shared_ptr<CallbackScheduler> scheduler, - sp<hardware::vibrator::V1_2::IVibrator> handle) - : HidlHalWrapper<hardware::vibrator::V1_2::IVibrator>(std::move(scheduler), - std::move(handle)) {} - virtual ~HidlHalWrapperV1_2() = default; - - HalResult<std::chrono::milliseconds> performEffect( - HalWrapper::Effect effect, HalWrapper::EffectStrength strength, - const std::function<void()>& completionCallback) override final; -}; - -// Wrapper for the HDIL Vibrator HAL v1.3. -class HidlHalWrapperV1_3 : public HidlHalWrapper<hardware::vibrator::V1_3::IVibrator> { -public: - HidlHalWrapperV1_3(std::shared_ptr<CallbackScheduler> scheduler, - sp<hardware::vibrator::V1_3::IVibrator> handle) - : HidlHalWrapper<hardware::vibrator::V1_3::IVibrator>(std::move(scheduler), - std::move(handle)) {} - virtual ~HidlHalWrapperV1_3() = default; - - HalResult<void> setExternalControl(bool enabled) override final; - - HalResult<std::chrono::milliseconds> performEffect( - HalWrapper::Effect effect, HalWrapper::EffectStrength strength, - const std::function<void()>& completionCallback) override final; - -protected: - HalResult<Capabilities> getCapabilitiesInternal() override final; -}; - // ------------------------------------------------------------------------------------------------- }; // namespace vibrator diff --git a/services/vibratorservice/test/Android.bp b/services/vibratorservice/test/Android.bp index 92527eb5cf..038248e636 100644 --- a/services/vibratorservice/test/Android.bp +++ b/services/vibratorservice/test/Android.bp @@ -29,10 +29,6 @@ cc_test { "VibratorCallbackSchedulerTest.cpp", "VibratorHalControllerTest.cpp", "VibratorHalWrapperAidlTest.cpp", - "VibratorHalWrapperHidlV1_0Test.cpp", - "VibratorHalWrapperHidlV1_1Test.cpp", - "VibratorHalWrapperHidlV1_2Test.cpp", - "VibratorHalWrapperHidlV1_3Test.cpp", "VibratorManagerHalControllerTest.cpp", "VibratorManagerHalWrapperAidlTest.cpp", "VibratorManagerHalWrapperLegacyTest.cpp", @@ -45,15 +41,10 @@ cc_test { shared_libs: [ "libbase", "libbinder_ndk", - "libhidlbase", "liblog", "libvibratorservice", "libutils", "android.hardware.vibrator-V3-ndk", - "android.hardware.vibrator@1.0", - "android.hardware.vibrator@1.1", - "android.hardware.vibrator@1.2", - "android.hardware.vibrator@1.3", ], static_libs: [ "libgmock", diff --git a/services/vibratorservice/test/VibratorHalWrapperHidlV1_0Test.cpp b/services/vibratorservice/test/VibratorHalWrapperHidlV1_0Test.cpp deleted file mode 100644 index 04dbe4eb26..0000000000 --- a/services/vibratorservice/test/VibratorHalWrapperHidlV1_0Test.cpp +++ /dev/null @@ -1,398 +0,0 @@ -/* - * Copyright (C) 2020 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 "VibratorHalWrapperHidlV1_0Test" - -#include <aidl/android/hardware/vibrator/IVibrator.h> -#include <android/persistable_bundle_aidl.h> - -#include <gmock/gmock.h> -#include <gtest/gtest.h> - -#include <utils/Log.h> -#include <thread> - -#include <vibratorservice/VibratorCallbackScheduler.h> -#include <vibratorservice/VibratorHalWrapper.h> - -#include "test_mocks.h" -#include "test_utils.h" - -namespace V1_0 = android::hardware::vibrator::V1_0; - -using aidl::android::hardware::vibrator::Braking; -using aidl::android::hardware::vibrator::CompositeEffect; -using aidl::android::hardware::vibrator::CompositePrimitive; -using aidl::android::hardware::vibrator::CompositePwleV2; -using aidl::android::hardware::vibrator::Effect; -using aidl::android::hardware::vibrator::EffectStrength; -using aidl::android::hardware::vibrator::IVibrator; -using aidl::android::hardware::vibrator::PrimitivePwle; -using aidl::android::hardware::vibrator::PwleV2Primitive; -using aidl::android::hardware::vibrator::VendorEffect; -using aidl::android::os::PersistableBundle; - -using namespace android; -using namespace std::chrono_literals; -using namespace testing; - -// ------------------------------------------------------------------------------------------------- - -class MockIVibratorV1_0 : public V1_0::IVibrator { -public: - MOCK_METHOD(hardware::Return<void>, ping, (), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, on, (uint32_t timeoutMs), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, off, (), (override)); - MOCK_METHOD(hardware::Return<bool>, supportsAmplitudeControl, (), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, setAmplitude, (uint8_t amplitude), (override)); - MOCK_METHOD(hardware::Return<void>, perform, - (V1_0::Effect effect, V1_0::EffectStrength strength, perform_cb cb), (override)); -}; - -// ------------------------------------------------------------------------------------------------- - -class VibratorHalWrapperHidlV1_0Test : public Test { -public: - void SetUp() override { - mMockHal = new StrictMock<MockIVibratorV1_0>(); - mMockScheduler = std::make_shared<StrictMock<vibrator::MockCallbackScheduler>>(); - mWrapper = std::make_unique<vibrator::HidlHalWrapperV1_0>(mMockScheduler, mMockHal); - ASSERT_NE(mWrapper, nullptr); - } - -protected: - std::shared_ptr<StrictMock<vibrator::MockCallbackScheduler>> mMockScheduler = nullptr; - std::unique_ptr<vibrator::HalWrapper> mWrapper = nullptr; - sp<StrictMock<MockIVibratorV1_0>> mMockHal = nullptr; -}; - -// ------------------------------------------------------------------------------------------------- - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestPing) { - EXPECT_CALL(*mMockHal.get(), ping()) - .Times(Exactly(2)) - .WillOnce([]() { return hardware::Return<void>(); }) - .WillRepeatedly([]() { - return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); - }); - - ASSERT_TRUE(mWrapper->ping().isOk()); - ASSERT_TRUE(mWrapper->ping().isFailed()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestOn) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), on(Eq(static_cast<uint32_t>(1)))) - .Times(Exactly(1)) - .WillRepeatedly( - [](uint32_t) { return hardware::Return<V1_0::Status>(V1_0::Status::OK); }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(1ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - EXPECT_CALL(*mMockHal.get(), on(Eq(static_cast<uint32_t>(10)))) - .Times(Exactly(1)) - .WillRepeatedly([](uint32_t) { - return hardware::Return<V1_0::Status>(V1_0::Status::UNSUPPORTED_OPERATION); - }); - EXPECT_CALL(*mMockHal.get(), on(Eq(static_cast<uint32_t>(11)))) - .Times(Exactly(1)) - .WillRepeatedly([](uint32_t) { - return hardware::Return<V1_0::Status>(V1_0::Status::BAD_VALUE); - }); - EXPECT_CALL(*mMockHal.get(), on(Eq(static_cast<uint32_t>(12)))) - .Times(Exactly(1)) - .WillRepeatedly([](uint32_t) { - return hardware::Return<V1_0::Status>(hardware::Status::fromExceptionCode(-1)); - }); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - - ASSERT_TRUE(mWrapper->on(1ms, callback).isOk()); - ASSERT_EQ(1, *callbackCounter.get()); - - ASSERT_TRUE(mWrapper->on(10ms, callback).isUnsupported()); - ASSERT_TRUE(mWrapper->on(11ms, callback).isFailed()); - ASSERT_TRUE(mWrapper->on(12ms, callback).isFailed()); - - // Callback not triggered for unsupported and on failure - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestOff) { - EXPECT_CALL(*mMockHal.get(), off()) - .Times(Exactly(4)) - .WillOnce([]() { return hardware::Return<V1_0::Status>(V1_0::Status::OK); }) - .WillOnce([]() { - return hardware::Return<V1_0::Status>(V1_0::Status::UNSUPPORTED_OPERATION); - }) - .WillOnce([]() { return hardware::Return<V1_0::Status>(V1_0::Status::BAD_VALUE); }) - .WillRepeatedly([]() { - return hardware::Return<V1_0::Status>(hardware::Status::fromExceptionCode(-1)); - }); - - ASSERT_TRUE(mWrapper->off().isOk()); - ASSERT_TRUE(mWrapper->off().isUnsupported()); - ASSERT_TRUE(mWrapper->off().isFailed()); - ASSERT_TRUE(mWrapper->off().isFailed()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestSetAmplitude) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), setAmplitude(Eq(static_cast<uint8_t>(1)))) - .Times(Exactly(1)) - .WillRepeatedly( - [](uint8_t) { return hardware::Return<V1_0::Status>(V1_0::Status::OK); }); - EXPECT_CALL(*mMockHal.get(), setAmplitude(Eq(static_cast<uint8_t>(2)))) - .Times(Exactly(1)) - .WillRepeatedly([](uint8_t) { - return hardware::Return<V1_0::Status>(V1_0::Status::UNSUPPORTED_OPERATION); - }); - EXPECT_CALL(*mMockHal.get(), setAmplitude(Eq(static_cast<uint8_t>(3)))) - .Times(Exactly(1)) - .WillRepeatedly([](uint8_t) { - return hardware::Return<V1_0::Status>(V1_0::Status::BAD_VALUE); - }); - EXPECT_CALL(*mMockHal.get(), setAmplitude(Eq(static_cast<uint8_t>(4)))) - .Times(Exactly(1)) - .WillRepeatedly([](uint8_t) { - return hardware::Return<V1_0::Status>(hardware::Status::fromExceptionCode(-1)); - }); - } - - auto maxAmplitude = std::numeric_limits<uint8_t>::max(); - ASSERT_TRUE(mWrapper->setAmplitude(1.0f / maxAmplitude).isOk()); - ASSERT_TRUE(mWrapper->setAmplitude(2.0f / maxAmplitude).isUnsupported()); - ASSERT_TRUE(mWrapper->setAmplitude(3.0f / maxAmplitude).isFailed()); - ASSERT_TRUE(mWrapper->setAmplitude(4.0f / maxAmplitude).isFailed()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestSetExternalControlUnsupported) { - ASSERT_TRUE(mWrapper->setExternalControl(true).isUnsupported()); - ASSERT_TRUE(mWrapper->setExternalControl(false).isUnsupported()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestAlwaysOnEnableUnsupported) { - ASSERT_TRUE(mWrapper->alwaysOnEnable(1, Effect::CLICK, EffectStrength::LIGHT).isUnsupported()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestAlwaysOnDisableUnsupported) { - ASSERT_TRUE(mWrapper->alwaysOnDisable(1).isUnsupported()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestGetInfoDoesNotCacheFailedResult) { - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()) - .Times(Exactly(2)) - .WillOnce([]() { - return hardware::Return<bool>(hardware::Status::fromExceptionCode(-1)); - }) - .WillRepeatedly([]() { return hardware::Return<bool>(true); }); - - ASSERT_TRUE(mWrapper->getInfo().capabilities.isFailed()); - - vibrator::Info info = mWrapper->getInfo(); - ASSERT_EQ(vibrator::Capabilities::AMPLITUDE_CONTROL, info.capabilities.value()); - ASSERT_TRUE(info.supportedEffects.isUnsupported()); - ASSERT_TRUE(info.supportedBraking.isUnsupported()); - ASSERT_TRUE(info.supportedPrimitives.isUnsupported()); - ASSERT_TRUE(info.primitiveDurations.isUnsupported()); - ASSERT_TRUE(info.primitiveDelayMax.isUnsupported()); - ASSERT_TRUE(info.pwlePrimitiveDurationMax.isUnsupported()); - ASSERT_TRUE(info.compositionSizeMax.isUnsupported()); - ASSERT_TRUE(info.pwleSizeMax.isUnsupported()); - ASSERT_TRUE(info.minFrequency.isUnsupported()); - ASSERT_TRUE(info.resonantFrequency.isUnsupported()); - ASSERT_TRUE(info.frequencyResolution.isUnsupported()); - ASSERT_TRUE(info.qFactor.isUnsupported()); - ASSERT_TRUE(info.maxAmplitudes.isUnsupported()); - ASSERT_TRUE(info.maxEnvelopeEffectSize.isUnsupported()); - ASSERT_TRUE(info.minEnvelopeEffectControlPointDuration.isUnsupported()); - ASSERT_TRUE(info.maxEnvelopeEffectControlPointDuration.isUnsupported()); - ASSERT_TRUE(info.frequencyToOutputAccelerationMap.isUnsupported()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestGetInfoWithoutAmplitudeControl) { - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()).Times(Exactly(1)).WillRepeatedly([]() { - return hardware::Return<bool>(false); - }); - - ASSERT_EQ(vibrator::Capabilities::NONE, mWrapper->getInfo().capabilities.value()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestGetInfoCachesResult) { - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()).Times(Exactly(1)).WillRepeatedly([]() { - return hardware::Return<bool>(true); - }); - - std::vector<std::thread> threads; - for (int i = 0; i < 10; i++) { - threads.push_back( - std::thread([&]() { ASSERT_TRUE(mWrapper->getInfo().capabilities.isOk()); })); - } - std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); }); - - vibrator::Info info = mWrapper->getInfo(); - ASSERT_EQ(vibrator::Capabilities::AMPLITUDE_CONTROL, info.capabilities.value()); - ASSERT_TRUE(info.supportedEffects.isUnsupported()); - ASSERT_TRUE(info.supportedBraking.isUnsupported()); - ASSERT_TRUE(info.supportedPrimitives.isUnsupported()); - ASSERT_TRUE(info.primitiveDurations.isUnsupported()); - ASSERT_TRUE(info.minFrequency.isUnsupported()); - ASSERT_TRUE(info.resonantFrequency.isUnsupported()); - ASSERT_TRUE(info.frequencyResolution.isUnsupported()); - ASSERT_TRUE(info.qFactor.isUnsupported()); - ASSERT_TRUE(info.maxAmplitudes.isUnsupported()); - ASSERT_TRUE(info.maxEnvelopeEffectSize.isUnsupported()); - ASSERT_TRUE(info.minEnvelopeEffectControlPointDuration.isUnsupported()); - ASSERT_TRUE(info.maxEnvelopeEffectControlPointDuration.isUnsupported()); - ASSERT_TRUE(info.frequencyToOutputAccelerationMap.isUnsupported()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestPerformEffect) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform(Eq(V1_0::Effect::CLICK), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_0::Effect, V1_0::EffectStrength, MockIVibratorV1_0::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - EXPECT_CALL(*mMockHal.get(), - perform(Eq(V1_0::Effect::CLICK), Eq(V1_0::EffectStrength::MEDIUM), _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_0::Effect, V1_0::EffectStrength, MockIVibratorV1_0::perform_cb cb) { - cb(V1_0::Status::UNSUPPORTED_OPERATION, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockHal.get(), - perform(Eq(V1_0::Effect::CLICK), Eq(V1_0::EffectStrength::STRONG), _)) - .Times(Exactly(2)) - .WillOnce([](V1_0::Effect, V1_0::EffectStrength, MockIVibratorV1_0::perform_cb cb) { - cb(V1_0::Status::BAD_VALUE, 10); - return hardware::Return<void>(); - }) - .WillRepeatedly( - [](V1_0::Effect, V1_0::EffectStrength, MockIVibratorV1_0::perform_cb) { - return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); - }); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - - auto result = mWrapper->performEffect(Effect::CLICK, EffectStrength::LIGHT, callback); - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); - - result = mWrapper->performEffect(Effect::CLICK, EffectStrength::MEDIUM, callback); - ASSERT_TRUE(result.isUnsupported()); - - result = mWrapper->performEffect(Effect::CLICK, EffectStrength::STRONG, callback); - ASSERT_TRUE(result.isFailed()); - - result = mWrapper->performEffect(Effect::CLICK, EffectStrength::STRONG, callback); - ASSERT_TRUE(result.isFailed()); - - // Callback not triggered for unsupported and on failure - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestPerformEffectUnsupported) { - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - // Using TICK that is only available in v1.1 - auto result = mWrapper->performEffect(Effect::TICK, EffectStrength::LIGHT, callback); - ASSERT_TRUE(result.isUnsupported()); - // No callback is triggered. - ASSERT_EQ(0, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestPerformVendorEffectUnsupported) { - PersistableBundle vendorData; // empty - VendorEffect vendorEffect; - vendorEffect.vendorData = vendorData; - vendorEffect.strength = EffectStrength::LIGHT; - vendorEffect.scale = 1.0f; - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - - ASSERT_TRUE(mWrapper->performVendorEffect(vendorEffect, callback).isUnsupported()); - - // No callback is triggered. - ASSERT_EQ(0, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestPerformComposedEffectUnsupported) { - std::vector<CompositeEffect> emptyEffects, singleEffect, multipleEffects; - singleEffect.push_back( - vibrator::TestFactory::createCompositeEffect(CompositePrimitive::CLICK, 10ms, 0.0f)); - multipleEffects.push_back( - vibrator::TestFactory::createCompositeEffect(CompositePrimitive::SPIN, 100ms, 0.5f)); - multipleEffects.push_back( - vibrator::TestFactory::createCompositeEffect(CompositePrimitive::THUD, 1000ms, 1.0f)); - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - - ASSERT_TRUE(mWrapper->performComposedEffect(singleEffect, callback).isUnsupported()); - ASSERT_TRUE(mWrapper->performComposedEffect(multipleEffects, callback).isUnsupported()); - - // No callback is triggered. - ASSERT_EQ(0, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestPerformPwleEffectUnsupported) { - std::vector<PrimitivePwle> emptyPrimitives, multiplePrimitives; - multiplePrimitives.push_back(vibrator::TestFactory::createActivePwle(0, 1, 0, 1, 10ms)); - multiplePrimitives.push_back(vibrator::TestFactory::createBrakingPwle(Braking::NONE, 100ms)); - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - - ASSERT_TRUE(mWrapper->performPwleEffect(emptyPrimitives, callback).isUnsupported()); - ASSERT_TRUE(mWrapper->performPwleEffect(multiplePrimitives, callback).isUnsupported()); - - // No callback is triggered. - ASSERT_EQ(0, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_0Test, TestComposePwleV2Unsupported) { - CompositePwleV2 composite; - composite.pwlePrimitives = { - PwleV2Primitive(/*amplitude=*/0.2, /*frequency=*/50, /*time=*/100), - PwleV2Primitive(/*amplitude=*/0.5, /*frequency=*/150, /*time=*/100), - PwleV2Primitive(/*amplitude=*/0.8, /*frequency=*/250, /*time=*/100), - }; - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - - ASSERT_TRUE(mWrapper->composePwleV2(composite, callback).isUnsupported()); - - // No callback is triggered. - ASSERT_EQ(0, *callbackCounter.get()); -} diff --git a/services/vibratorservice/test/VibratorHalWrapperHidlV1_1Test.cpp b/services/vibratorservice/test/VibratorHalWrapperHidlV1_1Test.cpp deleted file mode 100644 index b0a653769e..0000000000 --- a/services/vibratorservice/test/VibratorHalWrapperHidlV1_1Test.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2020 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 "VibratorHalWrapperHidlV1_1Test" - -#include <aidl/android/hardware/vibrator/IVibrator.h> - -#include <gmock/gmock.h> -#include <gtest/gtest.h> - -#include <utils/Log.h> - -#include <vibratorservice/VibratorCallbackScheduler.h> -#include <vibratorservice/VibratorHalWrapper.h> - -#include "test_mocks.h" -#include "test_utils.h" - -namespace V1_0 = android::hardware::vibrator::V1_0; -namespace V1_1 = android::hardware::vibrator::V1_1; - -using aidl::android::hardware::vibrator::Effect; -using aidl::android::hardware::vibrator::EffectStrength; - -using namespace android; -using namespace std::chrono_literals; -using namespace testing; - -// ------------------------------------------------------------------------------------------------- - -class MockIVibratorV1_1 : public V1_1::IVibrator { -public: - MOCK_METHOD(hardware::Return<V1_0::Status>, on, (uint32_t timeoutMs), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, off, (), (override)); - MOCK_METHOD(hardware::Return<bool>, supportsAmplitudeControl, (), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, setAmplitude, (uint8_t amplitude), (override)); - MOCK_METHOD(hardware::Return<void>, perform, - (V1_0::Effect effect, V1_0::EffectStrength strength, perform_cb cb), (override)); - MOCK_METHOD(hardware::Return<void>, perform_1_1, - (V1_1::Effect_1_1 effect, V1_0::EffectStrength strength, perform_cb cb), - (override)); -}; - -// ------------------------------------------------------------------------------------------------- - -class VibratorHalWrapperHidlV1_1Test : public Test { -public: - void SetUp() override { - mMockHal = new StrictMock<MockIVibratorV1_1>(); - mMockScheduler = std::make_shared<StrictMock<vibrator::MockCallbackScheduler>>(); - mWrapper = std::make_unique<vibrator::HidlHalWrapperV1_1>(mMockScheduler, mMockHal); - ASSERT_NE(mWrapper, nullptr); - } - -protected: - std::shared_ptr<StrictMock<vibrator::MockCallbackScheduler>> mMockScheduler = nullptr; - std::unique_ptr<vibrator::HalWrapper> mWrapper = nullptr; - sp<StrictMock<MockIVibratorV1_1>> mMockHal = nullptr; -}; - -// ------------------------------------------------------------------------------------------------- - -TEST_F(VibratorHalWrapperHidlV1_1Test, TestPerformEffectV1_0) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform(Eq(V1_0::Effect::CLICK), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_0::Effect, V1_0::EffectStrength, MockIVibratorV1_1::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - auto result = mWrapper->performEffect(Effect::CLICK, EffectStrength::LIGHT, callback); - - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_1Test, TestPerformEffectV1_1) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform_1_1(Eq(V1_1::Effect_1_1::TICK), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly([](V1_1::Effect_1_1, V1_0::EffectStrength, - MockIVibratorV1_1::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - EXPECT_CALL(*mMockHal.get(), - perform_1_1(Eq(V1_1::Effect_1_1::TICK), Eq(V1_0::EffectStrength::MEDIUM), _)) - .Times(Exactly(1)) - .WillRepeatedly([](V1_1::Effect_1_1, V1_0::EffectStrength, - MockIVibratorV1_1::perform_cb cb) { - cb(V1_0::Status::UNSUPPORTED_OPERATION, 0); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockHal.get(), - perform_1_1(Eq(V1_1::Effect_1_1::TICK), Eq(V1_0::EffectStrength::STRONG), _)) - .Times(Exactly(2)) - .WillOnce([](V1_1::Effect_1_1, V1_0::EffectStrength, - MockIVibratorV1_1::perform_cb cb) { - cb(V1_0::Status::BAD_VALUE, 0); - return hardware::Return<void>(); - }) - .WillRepeatedly( - [](V1_1::Effect_1_1, V1_0::EffectStrength, MockIVibratorV1_1::perform_cb) { - return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); - }); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - - auto result = mWrapper->performEffect(Effect::TICK, EffectStrength::LIGHT, callback); - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); - - result = mWrapper->performEffect(Effect::TICK, EffectStrength::MEDIUM, callback); - ASSERT_TRUE(result.isUnsupported()); - - result = mWrapper->performEffect(Effect::TICK, EffectStrength::STRONG, callback); - ASSERT_TRUE(result.isFailed()); - - result = mWrapper->performEffect(Effect::TICK, EffectStrength::STRONG, callback); - ASSERT_TRUE(result.isFailed()); - - // Callback not triggered for unsupported and on failure - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_1Test, TestPerformEffectUnsupported) { - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - // Using THUD that is only available in v1.2 - auto result = mWrapper->performEffect(Effect::THUD, EffectStrength::LIGHT, callback); - ASSERT_TRUE(result.isUnsupported()); - // No callback is triggered. - ASSERT_EQ(0, *callbackCounter.get()); -} diff --git a/services/vibratorservice/test/VibratorHalWrapperHidlV1_2Test.cpp b/services/vibratorservice/test/VibratorHalWrapperHidlV1_2Test.cpp deleted file mode 100644 index dfe3fa0e68..0000000000 --- a/services/vibratorservice/test/VibratorHalWrapperHidlV1_2Test.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (C) 2020 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 "VibratorHalWrapperHidlV1_2Test" - -#include <aidl/android/hardware/vibrator/IVibrator.h> - -#include <gmock/gmock.h> -#include <gtest/gtest.h> - -#include <utils/Log.h> - -#include <vibratorservice/VibratorCallbackScheduler.h> -#include <vibratorservice/VibratorHalWrapper.h> - -#include "test_mocks.h" -#include "test_utils.h" - -namespace V1_0 = android::hardware::vibrator::V1_0; -namespace V1_1 = android::hardware::vibrator::V1_1; -namespace V1_2 = android::hardware::vibrator::V1_2; - -using aidl::android::hardware::vibrator::Effect; -using aidl::android::hardware::vibrator::EffectStrength; - -using namespace android; -using namespace std::chrono_literals; -using namespace testing; - -// ------------------------------------------------------------------------------------------------- - -class MockIVibratorV1_2 : public V1_2::IVibrator { -public: - MOCK_METHOD(hardware::Return<V1_0::Status>, on, (uint32_t timeoutMs), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, off, (), (override)); - MOCK_METHOD(hardware::Return<bool>, supportsAmplitudeControl, (), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, setAmplitude, (uint8_t amplitude), (override)); - MOCK_METHOD(hardware::Return<void>, perform, - (V1_0::Effect effect, V1_0::EffectStrength strength, perform_cb cb), (override)); - MOCK_METHOD(hardware::Return<void>, perform_1_1, - (V1_1::Effect_1_1 effect, V1_0::EffectStrength strength, perform_cb cb), - (override)); - MOCK_METHOD(hardware::Return<void>, perform_1_2, - (V1_2::Effect effect, V1_0::EffectStrength strength, perform_cb cb), (override)); -}; - -// ------------------------------------------------------------------------------------------------- - -class VibratorHalWrapperHidlV1_2Test : public Test { -public: - void SetUp() override { - mMockHal = new StrictMock<MockIVibratorV1_2>(); - mMockScheduler = std::make_shared<StrictMock<vibrator::MockCallbackScheduler>>(); - mWrapper = std::make_unique<vibrator::HidlHalWrapperV1_2>(mMockScheduler, mMockHal); - ASSERT_NE(mWrapper, nullptr); - } - -protected: - std::shared_ptr<StrictMock<vibrator::MockCallbackScheduler>> mMockScheduler = nullptr; - std::unique_ptr<vibrator::HalWrapper> mWrapper = nullptr; - sp<StrictMock<MockIVibratorV1_2>> mMockHal = nullptr; -}; - -// ------------------------------------------------------------------------------------------------- - -TEST_F(VibratorHalWrapperHidlV1_2Test, TestPerformEffectV1_0) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform(Eq(V1_0::Effect::CLICK), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_0::Effect, V1_0::EffectStrength, MockIVibratorV1_2::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - auto result = mWrapper->performEffect(Effect::CLICK, EffectStrength::LIGHT, callback); - - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_2Test, TestPerformEffectV1_1) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform_1_1(Eq(V1_1::Effect_1_1::TICK), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly([](V1_1::Effect_1_1, V1_0::EffectStrength, - MockIVibratorV1_2::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - auto result = mWrapper->performEffect(Effect::TICK, EffectStrength::LIGHT, callback); - - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_2Test, TestPerformEffectV1_2) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform_1_2(Eq(V1_2::Effect::THUD), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_2::Effect, V1_0::EffectStrength, MockIVibratorV1_2::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - EXPECT_CALL(*mMockHal.get(), - perform_1_2(Eq(V1_2::Effect::THUD), Eq(V1_0::EffectStrength::MEDIUM), _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_2::Effect, V1_0::EffectStrength, MockIVibratorV1_2::perform_cb cb) { - cb(V1_0::Status::UNSUPPORTED_OPERATION, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockHal.get(), - perform_1_2(Eq(V1_2::Effect::THUD), Eq(V1_0::EffectStrength::STRONG), _)) - .Times(Exactly(2)) - .WillOnce([](V1_2::Effect, V1_0::EffectStrength, MockIVibratorV1_2::perform_cb cb) { - cb(V1_0::Status::BAD_VALUE, 10); - return hardware::Return<void>(); - }) - .WillRepeatedly( - [](V1_2::Effect, V1_0::EffectStrength, MockIVibratorV1_2::perform_cb) { - return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); - }); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - - auto result = mWrapper->performEffect(Effect::THUD, EffectStrength::LIGHT, callback); - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); - - result = mWrapper->performEffect(Effect::THUD, EffectStrength::MEDIUM, callback); - ASSERT_TRUE(result.isUnsupported()); - - result = mWrapper->performEffect(Effect::THUD, EffectStrength::STRONG, callback); - ASSERT_TRUE(result.isFailed()); - - result = mWrapper->performEffect(Effect::THUD, EffectStrength::STRONG, callback); - ASSERT_TRUE(result.isFailed()); - - // Callback not triggered for unsupported and on failure - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_2Test, TestPerformEffectUnsupported) { - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - // Using TEXTURE_TICK that is only available in v1.3 - auto result = mWrapper->performEffect(Effect::TEXTURE_TICK, EffectStrength::LIGHT, callback); - ASSERT_TRUE(result.isUnsupported()); - // No callback is triggered. - ASSERT_EQ(0, *callbackCounter.get()); -} diff --git a/services/vibratorservice/test/VibratorHalWrapperHidlV1_3Test.cpp b/services/vibratorservice/test/VibratorHalWrapperHidlV1_3Test.cpp deleted file mode 100644 index 86243326ac..0000000000 --- a/services/vibratorservice/test/VibratorHalWrapperHidlV1_3Test.cpp +++ /dev/null @@ -1,381 +0,0 @@ -/* - * Copyright (C) 2020 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 "VibratorHalWrapperHidlV1_3Test" - -#include <aidl/android/hardware/vibrator/IVibrator.h> - -#include <gmock/gmock.h> -#include <gtest/gtest.h> - -#include <utils/Log.h> -#include <thread> - -#include <vibratorservice/VibratorCallbackScheduler.h> -#include <vibratorservice/VibratorHalWrapper.h> - -#include "test_mocks.h" -#include "test_utils.h" - -namespace V1_0 = android::hardware::vibrator::V1_0; -namespace V1_1 = android::hardware::vibrator::V1_1; -namespace V1_2 = android::hardware::vibrator::V1_2; -namespace V1_3 = android::hardware::vibrator::V1_3; - -using aidl::android::hardware::vibrator::Effect; -using aidl::android::hardware::vibrator::EffectStrength; -using aidl::android::hardware::vibrator::IVibrator; - -using namespace android; -using namespace std::chrono_literals; -using namespace testing; - -// ------------------------------------------------------------------------------------------------- - -class MockIVibratorV1_3 : public V1_3::IVibrator { -public: - MOCK_METHOD(hardware::Return<V1_0::Status>, on, (uint32_t timeoutMs), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, off, (), (override)); - MOCK_METHOD(hardware::Return<bool>, supportsAmplitudeControl, (), (override)); - MOCK_METHOD(hardware::Return<bool>, supportsExternalControl, (), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, setAmplitude, (uint8_t amplitude), (override)); - MOCK_METHOD(hardware::Return<V1_0::Status>, setExternalControl, (bool enabled), (override)); - MOCK_METHOD(hardware::Return<void>, perform, - (V1_0::Effect effect, V1_0::EffectStrength strength, perform_cb cb), (override)); - MOCK_METHOD(hardware::Return<void>, perform_1_1, - (V1_1::Effect_1_1 effect, V1_0::EffectStrength strength, perform_cb cb), - (override)); - MOCK_METHOD(hardware::Return<void>, perform_1_2, - (V1_2::Effect effect, V1_0::EffectStrength strength, perform_cb cb), (override)); - MOCK_METHOD(hardware::Return<void>, perform_1_3, - (V1_3::Effect effect, V1_0::EffectStrength strength, perform_cb cb), (override)); -}; - -// ------------------------------------------------------------------------------------------------- - -class VibratorHalWrapperHidlV1_3Test : public Test { -public: - void SetUp() override { - mMockHal = new StrictMock<MockIVibratorV1_3>(); - mMockScheduler = std::make_shared<StrictMock<vibrator::MockCallbackScheduler>>(); - mWrapper = std::make_unique<vibrator::HidlHalWrapperV1_3>(mMockScheduler, mMockHal); - ASSERT_NE(mWrapper, nullptr); - } - -protected: - std::shared_ptr<StrictMock<vibrator::MockCallbackScheduler>> mMockScheduler = nullptr; - std::unique_ptr<vibrator::HalWrapper> mWrapper = nullptr; - sp<StrictMock<MockIVibratorV1_3>> mMockHal = nullptr; -}; - -// ------------------------------------------------------------------------------------------------- - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestSetExternalControl) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), setExternalControl(Eq(true))) - .Times(Exactly(2)) - .WillOnce([]() { return hardware::Return<V1_0::Status>(V1_0::Status::OK); }) - .WillRepeatedly([]() { - return hardware::Return<V1_0::Status>(V1_0::Status::UNSUPPORTED_OPERATION); - }); - EXPECT_CALL(*mMockHal.get(), setExternalControl(Eq(false))) - .Times(Exactly(2)) - .WillOnce([]() { return hardware::Return<V1_0::Status>(V1_0::Status::BAD_VALUE); }) - .WillRepeatedly([]() { - return hardware::Return<V1_0::Status>(hardware::Status::fromExceptionCode(-1)); - }); - } - - ASSERT_TRUE(mWrapper->setExternalControl(true).isOk()); - ASSERT_TRUE(mWrapper->setExternalControl(true).isUnsupported()); - ASSERT_TRUE(mWrapper->setExternalControl(false).isFailed()); - ASSERT_TRUE(mWrapper->setExternalControl(false).isFailed()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestGetInfoSuccessful) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { return hardware::Return<bool>(true); }); - EXPECT_CALL(*mMockHal.get(), supportsExternalControl()).Times(Exactly(1)).WillOnce([]() { - return hardware::Return<bool>(true); - }); - } - - ASSERT_EQ(vibrator::Capabilities::AMPLITUDE_CONTROL | vibrator::Capabilities::EXTERNAL_CONTROL | - vibrator::Capabilities::EXTERNAL_AMPLITUDE_CONTROL, - mWrapper->getInfo().capabilities.value()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestGetInfoOnlyAmplitudeControl) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()).Times(Exactly(1)).WillOnce([]() { - return hardware::Return<bool>(true); - }); - EXPECT_CALL(*mMockHal.get(), supportsExternalControl()).Times(Exactly(1)).WillOnce([]() { - return hardware::Return<bool>(false); - }); - } - - ASSERT_EQ(vibrator::Capabilities::AMPLITUDE_CONTROL, mWrapper->getInfo().capabilities.value()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestGetInfoOnlyExternalControl) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()).Times(Exactly(1)).WillOnce([]() { - return hardware::Return<bool>(false); - }); - EXPECT_CALL(*mMockHal.get(), supportsExternalControl()).Times(Exactly(1)).WillOnce([]() { - return hardware::Return<bool>(true); - }); - } - - ASSERT_EQ(vibrator::Capabilities::EXTERNAL_CONTROL, mWrapper->getInfo().capabilities.value()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestGetInfoNoCapabilities) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { return hardware::Return<bool>(false); }); - EXPECT_CALL(*mMockHal.get(), supportsExternalControl()).Times(Exactly(1)).WillOnce([]() { - return hardware::Return<bool>(false); - }); - } - - ASSERT_EQ(vibrator::Capabilities::NONE, mWrapper->getInfo().capabilities.value()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestGetInfoFailed) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { - return hardware::Return<bool>(hardware::Status::fromExceptionCode(-1)); - }); - - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { return hardware::Return<bool>(true); }); - EXPECT_CALL(*mMockHal.get(), supportsExternalControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { - return hardware::Return<bool>(hardware::Status::fromExceptionCode(-1)); - }); - } - - ASSERT_TRUE(mWrapper->getInfo().capabilities.isFailed()); - ASSERT_TRUE(mWrapper->getInfo().capabilities.isFailed()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestGetInfoCachesResult) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { return hardware::Return<bool>(true); }); - EXPECT_CALL(*mMockHal.get(), supportsExternalControl()).Times(Exactly(1)).WillOnce([]() { - return hardware::Return<bool>(false); - }); - } - - std::vector<std::thread> threads; - for (int i = 0; i < 10; i++) { - threads.push_back( - std::thread([&]() { ASSERT_TRUE(mWrapper->getInfo().capabilities.isOk()); })); - } - std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); }); - - ASSERT_EQ(vibrator::Capabilities::AMPLITUDE_CONTROL, mWrapper->getInfo().capabilities.value()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestGetInfoDoesNotCacheFailedResult) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { - return hardware::Return<bool>(hardware::Status::fromExceptionCode(-1)); - }); - - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { return hardware::Return<bool>(true); }); - EXPECT_CALL(*mMockHal.get(), supportsExternalControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { - return hardware::Return<bool>(hardware::Status::fromExceptionCode(-1)); - }); - - EXPECT_CALL(*mMockHal.get(), supportsAmplitudeControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { return hardware::Return<bool>(true); }); - EXPECT_CALL(*mMockHal.get(), supportsExternalControl()) - .Times(Exactly(1)) - .WillRepeatedly([]() { return hardware::Return<bool>(false); }); - } - - // Call to supportsAmplitudeControl failed. - ASSERT_TRUE(mWrapper->getInfo().capabilities.isFailed()); - - // Call to supportsExternalControl failed. - ASSERT_TRUE(mWrapper->getInfo().capabilities.isFailed()); - - // Returns successful result from third call. - ASSERT_EQ(vibrator::Capabilities::AMPLITUDE_CONTROL, mWrapper->getInfo().capabilities.value()); - - // Returns cached successful result. - ASSERT_EQ(vibrator::Capabilities::AMPLITUDE_CONTROL, mWrapper->getInfo().capabilities.value()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestPerformEffectV1_0) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform(Eq(V1_0::Effect::CLICK), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_0::Effect, V1_0::EffectStrength, MockIVibratorV1_3::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - auto result = mWrapper->performEffect(Effect::CLICK, EffectStrength::LIGHT, callback); - - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestPerformEffectV1_1) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform_1_1(Eq(V1_1::Effect_1_1::TICK), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly([](V1_1::Effect_1_1, V1_0::EffectStrength, - MockIVibratorV1_3::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - auto result = mWrapper->performEffect(Effect::TICK, EffectStrength::LIGHT, callback); - - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestPerformEffectV1_2) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform_1_2(Eq(V1_2::Effect::THUD), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_2::Effect, V1_0::EffectStrength, MockIVibratorV1_3::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - auto result = mWrapper->performEffect(Effect::THUD, EffectStrength::LIGHT, callback); - - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); -} - -TEST_F(VibratorHalWrapperHidlV1_3Test, TestPerformEffectV1_3) { - { - InSequence seq; - EXPECT_CALL(*mMockHal.get(), - perform_1_3(Eq(V1_3::Effect::TEXTURE_TICK), Eq(V1_0::EffectStrength::LIGHT), _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_3::Effect, V1_0::EffectStrength, MockIVibratorV1_3::perform_cb cb) { - cb(V1_0::Status::OK, 10); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) - .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); - EXPECT_CALL(*mMockHal.get(), - perform_1_3(Eq(V1_3::Effect::TEXTURE_TICK), Eq(V1_0::EffectStrength::MEDIUM), - _)) - .Times(Exactly(1)) - .WillRepeatedly( - [](V1_3::Effect, V1_0::EffectStrength, MockIVibratorV1_3::perform_cb cb) { - cb(V1_0::Status::UNSUPPORTED_OPERATION, 0); - return hardware::Return<void>(); - }); - EXPECT_CALL(*mMockHal.get(), - perform_1_3(Eq(V1_3::Effect::TEXTURE_TICK), Eq(V1_0::EffectStrength::STRONG), - _)) - .Times(Exactly(2)) - .WillOnce([](V1_3::Effect, V1_0::EffectStrength, MockIVibratorV1_3::perform_cb cb) { - cb(V1_0::Status::BAD_VALUE, 0); - return hardware::Return<void>(); - }) - .WillRepeatedly( - [](V1_3::Effect, V1_0::EffectStrength, MockIVibratorV1_3::perform_cb) { - return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); - }); - } - - std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); - auto callback = vibrator::TestFactory::createCountingCallback(callbackCounter.get()); - - auto result = mWrapper->performEffect(Effect::TEXTURE_TICK, EffectStrength::LIGHT, callback); - ASSERT_TRUE(result.isOk()); - ASSERT_EQ(10ms, result.value()); - ASSERT_EQ(1, *callbackCounter.get()); - - result = mWrapper->performEffect(Effect::TEXTURE_TICK, EffectStrength::MEDIUM, callback); - ASSERT_TRUE(result.isUnsupported()); - - result = mWrapper->performEffect(Effect::TEXTURE_TICK, EffectStrength::STRONG, callback); - ASSERT_TRUE(result.isFailed()); - - result = mWrapper->performEffect(Effect::TEXTURE_TICK, EffectStrength::STRONG, callback); - ASSERT_TRUE(result.isFailed()); - - // Callback not triggered for unsupported and on failure - ASSERT_EQ(1, *callbackCounter.get()); -} |