Loading cmds/idlcli/CommandVibrator.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -22,7 +22,7 @@ namespace idlcli { class IdlCli; class IdlCli; class CommandVibrator : public CommandWithSubcommands<CommandVibrator> { class CommandVibrator : public CommandWithSubcommands<CommandVibrator> { std::string getDescription() const override { return "Invoke Vibrator HIDL APIs."; } std::string getDescription() const override { return "Invoke Vibrator IDL APIs."; } std::string getUsageSummary() const override { return "<api> [arguments]"; } std::string getUsageSummary() const override { return "<api> [arguments]"; } Loading cmds/idlcli/IdlCli.h +34 −1 Original line number Original line Diff line number Diff line Loading @@ -25,14 +25,47 @@ namespace idlcli { class IdlCli : public CommandWithSubcommands<IdlCli> { class IdlCli : public CommandWithSubcommands<IdlCli> { std::string getDescription() const override { return "Invoke IDL APIs."; } std::string getDescription() const override { return "Invoke IDL APIs."; } std::string getUsageSummary() const override { return "<idl> [arguments]"; } std::string getUsageSummary() const override { return "<idl> [options] [arguments]"; } UsageDetails getUsageDetails() const override { UsageDetails getUsageDetails() const override { UsageDetails details{ UsageDetails details{ {"-n <name>", {"Get named service, rather than default."}}, {"<idl>", CommandRegistry<IdlCli>::List()}, {"<idl>", CommandRegistry<IdlCli>::List()}, }; }; return details; return details; } } Status doArgs(Args &args) override { while (args.get<std::string>().value_or("").find("-") == 0) { auto opt = *args.pop<std::string>(); if (opt == "--") { break; } else if (opt == "-n") { if (auto name = args.pop<decltype(mName)>()) { mName = *name; } else { std::cerr << "Missing Value for Name!" << std::endl; return USAGE; } } else { std::cerr << "Invalid Option '" << opt << "'!" << std::endl; return USAGE; } } return CommandWithSubcommands::doArgs(args); } IdlCli() {} std::string mName; public: static IdlCli &Get() { static IdlCli instance; return instance; } auto getName() { return mName; } }; }; } // namespace idlcli } // namespace idlcli Loading cmds/idlcli/main.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -19,5 +19,5 @@ int main(const int argc, const char* const argv[]) { int main(const int argc, const char* const argv[]) { using namespace ::android::idlcli; using namespace ::android::idlcli; return IdlCli{}.main(Args{argc, argv}); return IdlCli::Get().main(Args{argc, argv}); } } cmds/idlcli/utils.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -249,7 +249,7 @@ private: template <typename T> template <typename T> class CommandWithSubcommands : public Command { class CommandWithSubcommands : public Command { private: protected: Status doArgs(Args &args) override { Status doArgs(Args &args) override { mCommand = CommandRegistry<T>::Create(*args.get()); mCommand = CommandRegistry<T>::Create(*args.get()); if (!mCommand) { if (!mCommand) { Loading cmds/idlcli/vibrator.h +28 −15 Original line number Original line Diff line number Diff line Loading @@ -13,24 +13,24 @@ * See the License for the specific language governing permissions and * See the License for the specific language governing permissions and * limitations under the License. * limitations under the License. */ */ #ifndef FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ #pragma once #define FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ #include <future> #include <future> #include <aidl/android/hardware/vibrator/BnVibratorCallback.h> #include <aidl/android/hardware/vibrator/BnVibratorCallback.h> #include <aidl/android/hardware/vibrator/IVibrator.h> #include <aidl/android/hardware/vibrator/IVibrator.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 <android/hardware/vibrator/1.3/IVibrator.h> #include "IdlCli.h" #include "utils.h" #include "utils.h" #include "log/log.h" namespace android { namespace android { using hardware::Return; using hardware::Return; using idlcli::IdlCli; static constexpr int NUM_TRIES = 2; static constexpr int NUM_TRIES = 2; Loading @@ -47,20 +47,34 @@ inline ndk::ScopedAStatus NullptrStatus() { } } template <typename I> template <typename I> inline auto getService() { inline auto getService(std::string name) { return I::getService(); const auto instance = std::string() + I::descriptor + "/" + name; auto vibBinder = ndk::SpAIBinder(AServiceManager_getService(instance.c_str())); return I::fromBinder(vibBinder); } } template <> template <> inline auto getService<aidl::android::hardware::vibrator::IVibrator>() { inline auto getService<android::hardware::vibrator::V1_0::IVibrator>(std::string name) { const auto instance = return android::hardware::vibrator::V1_0::IVibrator::getService(name); std::string() + aidl::android::hardware::vibrator::IVibrator::descriptor + "/default"; } auto vibBinder = ndk::SpAIBinder(AServiceManager_getService(instance.c_str())); return aidl::android::hardware::vibrator::IVibrator::fromBinder(vibBinder); 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> template <typename I> using shared_ptr = std::result_of_t<decltype(getService<I>)&()>; using shared_ptr = std::result_of_t<decltype(getService<I>)&(std::string)>; template <typename I> template <typename I> class HalWrapper { class HalWrapper { Loading @@ -68,7 +82,8 @@ public: static std::unique_ptr<HalWrapper> Create() { static std::unique_ptr<HalWrapper> Create() { // Assume that if getService returns a nullptr, HAL is not available on the // Assume that if getService returns a nullptr, HAL is not available on the // device. // device. auto hal = getService<I>(); 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; return hal ? std::unique_ptr<HalWrapper>(new HalWrapper(std::move(hal))) : nullptr; } } Loading Loading @@ -121,5 +136,3 @@ private: } // namespace idlcli } // namespace idlcli } // namespace android } // namespace android #endif // FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ Loading
cmds/idlcli/CommandVibrator.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -22,7 +22,7 @@ namespace idlcli { class IdlCli; class IdlCli; class CommandVibrator : public CommandWithSubcommands<CommandVibrator> { class CommandVibrator : public CommandWithSubcommands<CommandVibrator> { std::string getDescription() const override { return "Invoke Vibrator HIDL APIs."; } std::string getDescription() const override { return "Invoke Vibrator IDL APIs."; } std::string getUsageSummary() const override { return "<api> [arguments]"; } std::string getUsageSummary() const override { return "<api> [arguments]"; } Loading
cmds/idlcli/IdlCli.h +34 −1 Original line number Original line Diff line number Diff line Loading @@ -25,14 +25,47 @@ namespace idlcli { class IdlCli : public CommandWithSubcommands<IdlCli> { class IdlCli : public CommandWithSubcommands<IdlCli> { std::string getDescription() const override { return "Invoke IDL APIs."; } std::string getDescription() const override { return "Invoke IDL APIs."; } std::string getUsageSummary() const override { return "<idl> [arguments]"; } std::string getUsageSummary() const override { return "<idl> [options] [arguments]"; } UsageDetails getUsageDetails() const override { UsageDetails getUsageDetails() const override { UsageDetails details{ UsageDetails details{ {"-n <name>", {"Get named service, rather than default."}}, {"<idl>", CommandRegistry<IdlCli>::List()}, {"<idl>", CommandRegistry<IdlCli>::List()}, }; }; return details; return details; } } Status doArgs(Args &args) override { while (args.get<std::string>().value_or("").find("-") == 0) { auto opt = *args.pop<std::string>(); if (opt == "--") { break; } else if (opt == "-n") { if (auto name = args.pop<decltype(mName)>()) { mName = *name; } else { std::cerr << "Missing Value for Name!" << std::endl; return USAGE; } } else { std::cerr << "Invalid Option '" << opt << "'!" << std::endl; return USAGE; } } return CommandWithSubcommands::doArgs(args); } IdlCli() {} std::string mName; public: static IdlCli &Get() { static IdlCli instance; return instance; } auto getName() { return mName; } }; }; } // namespace idlcli } // namespace idlcli Loading
cmds/idlcli/main.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -19,5 +19,5 @@ int main(const int argc, const char* const argv[]) { int main(const int argc, const char* const argv[]) { using namespace ::android::idlcli; using namespace ::android::idlcli; return IdlCli{}.main(Args{argc, argv}); return IdlCli::Get().main(Args{argc, argv}); } }
cmds/idlcli/utils.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -249,7 +249,7 @@ private: template <typename T> template <typename T> class CommandWithSubcommands : public Command { class CommandWithSubcommands : public Command { private: protected: Status doArgs(Args &args) override { Status doArgs(Args &args) override { mCommand = CommandRegistry<T>::Create(*args.get()); mCommand = CommandRegistry<T>::Create(*args.get()); if (!mCommand) { if (!mCommand) { Loading
cmds/idlcli/vibrator.h +28 −15 Original line number Original line Diff line number Diff line Loading @@ -13,24 +13,24 @@ * See the License for the specific language governing permissions and * See the License for the specific language governing permissions and * limitations under the License. * limitations under the License. */ */ #ifndef FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ #pragma once #define FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ #include <future> #include <future> #include <aidl/android/hardware/vibrator/BnVibratorCallback.h> #include <aidl/android/hardware/vibrator/BnVibratorCallback.h> #include <aidl/android/hardware/vibrator/IVibrator.h> #include <aidl/android/hardware/vibrator/IVibrator.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 <android/hardware/vibrator/1.3/IVibrator.h> #include "IdlCli.h" #include "utils.h" #include "utils.h" #include "log/log.h" namespace android { namespace android { using hardware::Return; using hardware::Return; using idlcli::IdlCli; static constexpr int NUM_TRIES = 2; static constexpr int NUM_TRIES = 2; Loading @@ -47,20 +47,34 @@ inline ndk::ScopedAStatus NullptrStatus() { } } template <typename I> template <typename I> inline auto getService() { inline auto getService(std::string name) { return I::getService(); const auto instance = std::string() + I::descriptor + "/" + name; auto vibBinder = ndk::SpAIBinder(AServiceManager_getService(instance.c_str())); return I::fromBinder(vibBinder); } } template <> template <> inline auto getService<aidl::android::hardware::vibrator::IVibrator>() { inline auto getService<android::hardware::vibrator::V1_0::IVibrator>(std::string name) { const auto instance = return android::hardware::vibrator::V1_0::IVibrator::getService(name); std::string() + aidl::android::hardware::vibrator::IVibrator::descriptor + "/default"; } auto vibBinder = ndk::SpAIBinder(AServiceManager_getService(instance.c_str())); return aidl::android::hardware::vibrator::IVibrator::fromBinder(vibBinder); 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> template <typename I> using shared_ptr = std::result_of_t<decltype(getService<I>)&()>; using shared_ptr = std::result_of_t<decltype(getService<I>)&(std::string)>; template <typename I> template <typename I> class HalWrapper { class HalWrapper { Loading @@ -68,7 +82,8 @@ public: static std::unique_ptr<HalWrapper> Create() { static std::unique_ptr<HalWrapper> Create() { // Assume that if getService returns a nullptr, HAL is not available on the // Assume that if getService returns a nullptr, HAL is not available on the // device. // device. auto hal = getService<I>(); 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; return hal ? std::unique_ptr<HalWrapper>(new HalWrapper(std::move(hal))) : nullptr; } } Loading Loading @@ -121,5 +136,3 @@ private: } // namespace idlcli } // namespace idlcli } // namespace android } // namespace android #endif // FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_