Loading include/ftl/algorithm.h +25 −0 Original line number Diff line number Diff line Loading @@ -68,4 +68,29 @@ constexpr auto to_mapped_ref(const Pair& pair) -> std::reference_wrapper<const M return std::cref(pair.second); } // Combinator for ftl::Optional<T>::or_else when T is std::reference_wrapper<const V>. Given a // lambda argument that returns a `constexpr` value, ftl::static_ref<T> binds a reference to a // static T initialized to that constant. // // const ftl::SmallMap map = ftl::init::map(13, "tiramisu"sv)(14, "upside-down cake"sv); // assert("???"sv == // map.get(20).or_else(ftl::static_ref<std::string_view>([] { return "???"sv; }))->get()); // // using Map = decltype(map); // // assert("snow cone"sv == // ftl::find_if(map, [](const auto& pair) { return pair.second.front() == 's'; }) // .transform(ftl::to_mapped_ref<Map>) // .or_else(ftl::static_ref<std::string_view>([] { return "snow cone"sv; })) // ->get()); // template <typename T, typename F> constexpr auto static_ref(F&& f) { return [f = std::forward<F>(f)] { constexpr auto kInitializer = f(); static const T kValue = kInitializer; return Optional(std::cref(kValue)); }; } } // namespace android::ftl include/input/VirtualInputDevice.h +17 −10 Original line number Diff line number Diff line Loading @@ -34,10 +34,12 @@ public: protected: const android::base::unique_fd mFd; bool writeInputEvent(uint16_t type, uint16_t code, int32_t value); bool writeInputEvent(uint16_t type, uint16_t code, int32_t value, std::chrono::nanoseconds eventTime); bool writeEvKeyEvent(int32_t androidCode, int32_t androidAction, const std::map<int, int>& evKeyCodeMapping, const std::map<int, UinputAction>& actionMapping); const std::map<int, UinputAction>& actionMapping, std::chrono::nanoseconds eventTime); }; class VirtualKeyboard : public VirtualInputDevice { Loading @@ -47,7 +49,8 @@ public: static const std::map<int, UinputAction> KEY_ACTION_MAPPING; VirtualKeyboard(android::base::unique_fd fd); virtual ~VirtualKeyboard() override; bool writeKeyEvent(int32_t androidKeyCode, int32_t androidAction); bool writeKeyEvent(int32_t androidKeyCode, int32_t androidAction, std::chrono::nanoseconds eventTime); }; class VirtualDpad : public VirtualInputDevice { Loading @@ -55,17 +58,20 @@ public: static const std::map<int, int> DPAD_KEY_CODE_MAPPING; VirtualDpad(android::base::unique_fd fd); virtual ~VirtualDpad() override; bool writeDpadKeyEvent(int32_t androidKeyCode, int32_t androidAction); bool writeDpadKeyEvent(int32_t androidKeyCode, int32_t androidAction, std::chrono::nanoseconds eventTime); }; class VirtualMouse : public VirtualInputDevice { public: VirtualMouse(android::base::unique_fd fd); virtual ~VirtualMouse() override; bool writeButtonEvent(int32_t androidButtonCode, int32_t androidAction); bool writeButtonEvent(int32_t androidButtonCode, int32_t androidAction, std::chrono::nanoseconds eventTime); // TODO(b/259554911): changing float parameters to int32_t. bool writeRelativeEvent(float relativeX, float relativeY); bool writeScrollEvent(float xAxisMovement, float yAxisMovement); bool writeRelativeEvent(float relativeX, float relativeY, std::chrono::nanoseconds eventTime); bool writeScrollEvent(float xAxisMovement, float yAxisMovement, std::chrono::nanoseconds eventTime); private: static const std::map<int, UinputAction> BUTTON_ACTION_MAPPING; Loading @@ -78,7 +84,8 @@ public: virtual ~VirtualTouchscreen() override; // TODO(b/259554911): changing float parameters to int32_t. bool writeTouchEvent(int32_t pointerId, int32_t toolType, int32_t action, float locationX, float locationY, float pressure, float majorAxisSize); float locationY, float pressure, float majorAxisSize, std::chrono::nanoseconds eventTime); private: static const std::map<int, UinputAction> TOUCH_ACTION_MAPPING; Loading @@ -91,7 +98,7 @@ private: */ std::bitset<MAX_POINTERS> mActivePointers{}; bool isValidPointerId(int32_t pointerId, UinputAction uinputAction); bool handleTouchDown(int32_t pointerId); bool handleTouchUp(int32_t pointerId); bool handleTouchDown(int32_t pointerId, std::chrono::nanoseconds eventTime); bool handleTouchUp(int32_t pointerId, std::chrono::nanoseconds eventTime); }; } // namespace android libs/ftl/algorithm_test.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -47,4 +47,20 @@ TEST(Algorithm, FindIf) { EXPECT_EQ(opt->get(), ftl::StaticVector("tiramisu"sv)); } TEST(Algorithm, StaticRef) { using namespace std::string_view_literals; const ftl::SmallMap map = ftl::init::map(13, "tiramisu"sv)(14, "upside-down cake"sv); ASSERT_EQ("???"sv, map.get(20).or_else(ftl::static_ref<std::string_view>([] { return "???"sv; }))->get()); using Map = decltype(map); ASSERT_EQ("snow cone"sv, ftl::find_if(map, [](const auto& pair) { return pair.second.front() == 's'; }) .transform(ftl::to_mapped_ref<Map>) .or_else(ftl::static_ref<std::string_view>([] { return "snow cone"sv; })) ->get()); } } // namespace android::test libs/graphicsenv/GraphicsEnv.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -689,4 +689,13 @@ android_namespace_t* GraphicsEnv::getAngleNamespace() { return mAngleNamespace; } void GraphicsEnv::nativeToggleAngleAsSystemDriver(bool enabled) { const sp<IGpuService> gpuService = getGpuService(); if (!gpuService) { ALOGE("No GPU service"); return; } gpuService->toggleAngleAsSystemDriver(enabled); } } // namespace android libs/graphicsenv/IGpuService.cpp +18 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,15 @@ public: IBinder::FLAG_ONEWAY); } void toggleAngleAsSystemDriver(bool enabled) override { Parcel data, reply; data.writeInterfaceToken(IGpuService::getInterfaceDescriptor()); data.writeBool(enabled); remote()->transact(BnGpuService::TOGGLE_ANGLE_AS_SYSTEM_DRIVER, data, &reply, IBinder::FLAG_ONEWAY); } std::string getUpdatableDriverPath() override { Parcel data, reply; data.writeInterfaceToken(IGpuService::getInterfaceDescriptor()); Loading Loading @@ -189,6 +198,15 @@ status_t BnGpuService::onTransact(uint32_t code, const Parcel& data, Parcel* rep return OK; } case TOGGLE_ANGLE_AS_SYSTEM_DRIVER: { CHECK_INTERFACE(IGpuService, data, reply); bool enableAngleAsSystemDriver; if ((status = data.readBool(&enableAngleAsSystemDriver)) != OK) return status; toggleAngleAsSystemDriver(enableAngleAsSystemDriver); return OK; } default: return BBinder::onTransact(code, data, reply, flags); } Loading Loading
include/ftl/algorithm.h +25 −0 Original line number Diff line number Diff line Loading @@ -68,4 +68,29 @@ constexpr auto to_mapped_ref(const Pair& pair) -> std::reference_wrapper<const M return std::cref(pair.second); } // Combinator for ftl::Optional<T>::or_else when T is std::reference_wrapper<const V>. Given a // lambda argument that returns a `constexpr` value, ftl::static_ref<T> binds a reference to a // static T initialized to that constant. // // const ftl::SmallMap map = ftl::init::map(13, "tiramisu"sv)(14, "upside-down cake"sv); // assert("???"sv == // map.get(20).or_else(ftl::static_ref<std::string_view>([] { return "???"sv; }))->get()); // // using Map = decltype(map); // // assert("snow cone"sv == // ftl::find_if(map, [](const auto& pair) { return pair.second.front() == 's'; }) // .transform(ftl::to_mapped_ref<Map>) // .or_else(ftl::static_ref<std::string_view>([] { return "snow cone"sv; })) // ->get()); // template <typename T, typename F> constexpr auto static_ref(F&& f) { return [f = std::forward<F>(f)] { constexpr auto kInitializer = f(); static const T kValue = kInitializer; return Optional(std::cref(kValue)); }; } } // namespace android::ftl
include/input/VirtualInputDevice.h +17 −10 Original line number Diff line number Diff line Loading @@ -34,10 +34,12 @@ public: protected: const android::base::unique_fd mFd; bool writeInputEvent(uint16_t type, uint16_t code, int32_t value); bool writeInputEvent(uint16_t type, uint16_t code, int32_t value, std::chrono::nanoseconds eventTime); bool writeEvKeyEvent(int32_t androidCode, int32_t androidAction, const std::map<int, int>& evKeyCodeMapping, const std::map<int, UinputAction>& actionMapping); const std::map<int, UinputAction>& actionMapping, std::chrono::nanoseconds eventTime); }; class VirtualKeyboard : public VirtualInputDevice { Loading @@ -47,7 +49,8 @@ public: static const std::map<int, UinputAction> KEY_ACTION_MAPPING; VirtualKeyboard(android::base::unique_fd fd); virtual ~VirtualKeyboard() override; bool writeKeyEvent(int32_t androidKeyCode, int32_t androidAction); bool writeKeyEvent(int32_t androidKeyCode, int32_t androidAction, std::chrono::nanoseconds eventTime); }; class VirtualDpad : public VirtualInputDevice { Loading @@ -55,17 +58,20 @@ public: static const std::map<int, int> DPAD_KEY_CODE_MAPPING; VirtualDpad(android::base::unique_fd fd); virtual ~VirtualDpad() override; bool writeDpadKeyEvent(int32_t androidKeyCode, int32_t androidAction); bool writeDpadKeyEvent(int32_t androidKeyCode, int32_t androidAction, std::chrono::nanoseconds eventTime); }; class VirtualMouse : public VirtualInputDevice { public: VirtualMouse(android::base::unique_fd fd); virtual ~VirtualMouse() override; bool writeButtonEvent(int32_t androidButtonCode, int32_t androidAction); bool writeButtonEvent(int32_t androidButtonCode, int32_t androidAction, std::chrono::nanoseconds eventTime); // TODO(b/259554911): changing float parameters to int32_t. bool writeRelativeEvent(float relativeX, float relativeY); bool writeScrollEvent(float xAxisMovement, float yAxisMovement); bool writeRelativeEvent(float relativeX, float relativeY, std::chrono::nanoseconds eventTime); bool writeScrollEvent(float xAxisMovement, float yAxisMovement, std::chrono::nanoseconds eventTime); private: static const std::map<int, UinputAction> BUTTON_ACTION_MAPPING; Loading @@ -78,7 +84,8 @@ public: virtual ~VirtualTouchscreen() override; // TODO(b/259554911): changing float parameters to int32_t. bool writeTouchEvent(int32_t pointerId, int32_t toolType, int32_t action, float locationX, float locationY, float pressure, float majorAxisSize); float locationY, float pressure, float majorAxisSize, std::chrono::nanoseconds eventTime); private: static const std::map<int, UinputAction> TOUCH_ACTION_MAPPING; Loading @@ -91,7 +98,7 @@ private: */ std::bitset<MAX_POINTERS> mActivePointers{}; bool isValidPointerId(int32_t pointerId, UinputAction uinputAction); bool handleTouchDown(int32_t pointerId); bool handleTouchUp(int32_t pointerId); bool handleTouchDown(int32_t pointerId, std::chrono::nanoseconds eventTime); bool handleTouchUp(int32_t pointerId, std::chrono::nanoseconds eventTime); }; } // namespace android
libs/ftl/algorithm_test.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -47,4 +47,20 @@ TEST(Algorithm, FindIf) { EXPECT_EQ(opt->get(), ftl::StaticVector("tiramisu"sv)); } TEST(Algorithm, StaticRef) { using namespace std::string_view_literals; const ftl::SmallMap map = ftl::init::map(13, "tiramisu"sv)(14, "upside-down cake"sv); ASSERT_EQ("???"sv, map.get(20).or_else(ftl::static_ref<std::string_view>([] { return "???"sv; }))->get()); using Map = decltype(map); ASSERT_EQ("snow cone"sv, ftl::find_if(map, [](const auto& pair) { return pair.second.front() == 's'; }) .transform(ftl::to_mapped_ref<Map>) .or_else(ftl::static_ref<std::string_view>([] { return "snow cone"sv; })) ->get()); } } // namespace android::test
libs/graphicsenv/GraphicsEnv.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -689,4 +689,13 @@ android_namespace_t* GraphicsEnv::getAngleNamespace() { return mAngleNamespace; } void GraphicsEnv::nativeToggleAngleAsSystemDriver(bool enabled) { const sp<IGpuService> gpuService = getGpuService(); if (!gpuService) { ALOGE("No GPU service"); return; } gpuService->toggleAngleAsSystemDriver(enabled); } } // namespace android
libs/graphicsenv/IGpuService.cpp +18 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,15 @@ public: IBinder::FLAG_ONEWAY); } void toggleAngleAsSystemDriver(bool enabled) override { Parcel data, reply; data.writeInterfaceToken(IGpuService::getInterfaceDescriptor()); data.writeBool(enabled); remote()->transact(BnGpuService::TOGGLE_ANGLE_AS_SYSTEM_DRIVER, data, &reply, IBinder::FLAG_ONEWAY); } std::string getUpdatableDriverPath() override { Parcel data, reply; data.writeInterfaceToken(IGpuService::getInterfaceDescriptor()); Loading Loading @@ -189,6 +198,15 @@ status_t BnGpuService::onTransact(uint32_t code, const Parcel& data, Parcel* rep return OK; } case TOGGLE_ANGLE_AS_SYSTEM_DRIVER: { CHECK_INTERFACE(IGpuService, data, reply); bool enableAngleAsSystemDriver; if ((status = data.readBool(&enableAngleAsSystemDriver)) != OK) return status; toggleAngleAsSystemDriver(enableAngleAsSystemDriver); return OK; } default: return BBinder::onTransact(code, data, reply, flags); } Loading