Loading cmds/idlcli/Android.bp +0 −5 Original line number Original line Diff line number Diff line Loading @@ -25,13 +25,8 @@ cc_defaults { name: "idlcli-defaults", name: "idlcli-defaults", shared_libs: [ shared_libs: [ "android.hardware.vibrator-V3-ndk", "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", "libbase", "libbinder_ndk", "libbinder_ndk", "libhidlbase", "liblog", "liblog", "libutils", "libutils", ], ], Loading cmds/idlcli/utils.h +0 −1 Original line number Original line Diff line number Diff line Loading @@ -18,7 +18,6 @@ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_UTILS_H_ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_UTILS_H_ #include <android/binder_enums.h> #include <android/binder_enums.h> #include <hidl/HidlSupport.h> #include <iomanip> #include <iomanip> #include <iostream> #include <iostream> Loading cmds/idlcli/vibrator.h +6 −78 Original line number Original line Diff line number Diff line Loading @@ -22,102 +22,30 @@ #include <aidl/android/hardware/vibrator/IVibratorManager.h> #include <aidl/android/hardware/vibrator/IVibratorManager.h> #include <android/binder_manager.h> #include <android/binder_manager.h> #include <android/binder_process.h> #include <android/binder_process.h> #include <android/hardware/vibrator/1.3/IVibrator.h> #include "IdlCli.h" #include "IdlCli.h" #include "utils.h" #include "utils.h" namespace android { namespace android { using hardware::Return; using ::aidl::android::hardware::vibrator::IVibrator; using idlcli::IdlCli; 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) { 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())); auto vibBinder = ndk::SpAIBinder(AServiceManager_checkService(instance.c_str())); return I::fromBinder(vibBinder); return IVibrator::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); } 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 getHal() { static auto sHalWrapper = HalWrapper<I>::Create(); // Assume that if getService returns a nullptr, HAL is not available on the device. return sHalWrapper.get(); const auto name = IdlCli::Get().getName(); } return getService(name.empty() ? "default" : name); 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>(); } } namespace idlcli { namespace idlcli { namespace vibrator { 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; namespace aidl = ::aidl::android::hardware::vibrator; class VibratorCallback : public aidl::BnVibratorCallback { class VibratorCallback : public aidl::BnVibratorCallback { Loading cmds/idlcli/vibrator/CommandAlwaysOnDisable.cpp +6 −10 Original line number Original line Diff line number Diff line Loading @@ -51,21 +51,17 @@ class CommandAlwaysOnDisable : public Command { } } Status doMain(Args && /*args*/) override { Status doMain(Args && /*args*/) override { std::string statusStr; auto hal = getHal(); Status ret; if (auto hal = getHal<aidl::IVibrator>()) { if (!hal) { auto status = hal->call(&aidl::IVibrator::alwaysOnDisable, mId); statusStr = status.getDescription(); ret = status.isOk() ? OK : ERROR; } else { return UNAVAILABLE; 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; int32_t mId; Loading cmds/idlcli/vibrator/CommandAlwaysOnEnable.cpp +6 −10 Original line number Original line Diff line number Diff line Loading @@ -72,21 +72,17 @@ class CommandAlwaysOnEnable : public Command { } } Status doMain(Args && /*args*/) override { Status doMain(Args && /*args*/) override { std::string statusStr; auto hal = getHal(); Status ret; if (auto hal = getHal<aidl::IVibrator>()) { if (!hal) { auto status = hal->call(&aidl::IVibrator::alwaysOnEnable, mId, mEffect, mStrength); statusStr = status.getDescription(); ret = status.isOk() ? OK : ERROR; } else { return UNAVAILABLE; 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; int32_t mId; Loading Loading
cmds/idlcli/Android.bp +0 −5 Original line number Original line Diff line number Diff line Loading @@ -25,13 +25,8 @@ cc_defaults { name: "idlcli-defaults", name: "idlcli-defaults", shared_libs: [ shared_libs: [ "android.hardware.vibrator-V3-ndk", "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", "libbase", "libbinder_ndk", "libbinder_ndk", "libhidlbase", "liblog", "liblog", "libutils", "libutils", ], ], Loading
cmds/idlcli/utils.h +0 −1 Original line number Original line Diff line number Diff line Loading @@ -18,7 +18,6 @@ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_UTILS_H_ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_UTILS_H_ #include <android/binder_enums.h> #include <android/binder_enums.h> #include <hidl/HidlSupport.h> #include <iomanip> #include <iomanip> #include <iostream> #include <iostream> Loading
cmds/idlcli/vibrator.h +6 −78 Original line number Original line Diff line number Diff line Loading @@ -22,102 +22,30 @@ #include <aidl/android/hardware/vibrator/IVibratorManager.h> #include <aidl/android/hardware/vibrator/IVibratorManager.h> #include <android/binder_manager.h> #include <android/binder_manager.h> #include <android/binder_process.h> #include <android/binder_process.h> #include <android/hardware/vibrator/1.3/IVibrator.h> #include "IdlCli.h" #include "IdlCli.h" #include "utils.h" #include "utils.h" namespace android { namespace android { using hardware::Return; using ::aidl::android::hardware::vibrator::IVibrator; using idlcli::IdlCli; 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) { 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())); auto vibBinder = ndk::SpAIBinder(AServiceManager_checkService(instance.c_str())); return I::fromBinder(vibBinder); return IVibrator::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); } 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 getHal() { static auto sHalWrapper = HalWrapper<I>::Create(); // Assume that if getService returns a nullptr, HAL is not available on the device. return sHalWrapper.get(); const auto name = IdlCli::Get().getName(); } return getService(name.empty() ? "default" : name); 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>(); } } namespace idlcli { namespace idlcli { namespace vibrator { 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; namespace aidl = ::aidl::android::hardware::vibrator; class VibratorCallback : public aidl::BnVibratorCallback { class VibratorCallback : public aidl::BnVibratorCallback { Loading
cmds/idlcli/vibrator/CommandAlwaysOnDisable.cpp +6 −10 Original line number Original line Diff line number Diff line Loading @@ -51,21 +51,17 @@ class CommandAlwaysOnDisable : public Command { } } Status doMain(Args && /*args*/) override { Status doMain(Args && /*args*/) override { std::string statusStr; auto hal = getHal(); Status ret; if (auto hal = getHal<aidl::IVibrator>()) { if (!hal) { auto status = hal->call(&aidl::IVibrator::alwaysOnDisable, mId); statusStr = status.getDescription(); ret = status.isOk() ? OK : ERROR; } else { return UNAVAILABLE; 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; int32_t mId; Loading
cmds/idlcli/vibrator/CommandAlwaysOnEnable.cpp +6 −10 Original line number Original line Diff line number Diff line Loading @@ -72,21 +72,17 @@ class CommandAlwaysOnEnable : public Command { } } Status doMain(Args && /*args*/) override { Status doMain(Args && /*args*/) override { std::string statusStr; auto hal = getHal(); Status ret; if (auto hal = getHal<aidl::IVibrator>()) { if (!hal) { auto status = hal->call(&aidl::IVibrator::alwaysOnEnable, mId, mEffect, mStrength); statusStr = status.getDescription(); ret = status.isOk() ? OK : ERROR; } else { return UNAVAILABLE; 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; int32_t mId; Loading