init: turn keychords into a standalone class
Test: init_tests
Bug: 64114943
Change-Id: Ie760e4a3a661260ed2aabb8a92fe65fc93521cb5
diff --git a/init/keychords.h b/init/keychords.h
index f273c8c..74a9195 100644
--- a/init/keychords.h
+++ b/init/keychords.h
@@ -18,6 +18,8 @@
#define _INIT_KEYCHORDS_H_
#include <functional>
+#include <map>
+#include <string>
#include <vector>
#include "epoll.h"
@@ -25,8 +27,74 @@
namespace android {
namespace init {
-void KeychordInit(Epoll* init_epoll, std::function<void(int)> handler);
-int GetKeychordId(const std::vector<int>& keycodes);
+class Keychords {
+ public:
+ Keychords();
+ Keychords(const Keychords&) = delete;
+ Keychords(Keychords&&) = delete;
+ Keychords& operator=(const Keychords&) = delete;
+ Keychords& operator=(Keychords&&) = delete;
+ ~Keychords() noexcept;
+
+ int GetId(const std::vector<int>& keycodes);
+ void Start(Epoll* epoll, std::function<void(int)> handler);
+
+ private:
+ // Bit management
+ class Mask {
+ public:
+ explicit Mask(size_t bit = 0);
+
+ void SetBit(size_t bit, bool value = true);
+ bool GetBit(size_t bit) const;
+
+ size_t bytesize() const;
+ void* data();
+ size_t size() const;
+ void resize(size_t bit);
+
+ operator bool() const;
+ Mask operator&(const Mask& rval) const;
+ void operator|=(const Mask& rval);
+
+ private:
+ typedef unsigned int mask_t;
+ static constexpr size_t kBitsPerByte = 8;
+
+ std::vector<mask_t> bits_;
+ };
+
+ struct Entry {
+ Entry(const std::vector<int>& keycodes, int id);
+
+ const std::vector<int> keycodes;
+ const int id;
+ bool notified;
+ };
+
+ static constexpr char kDevicePath[] = "/dev/input";
+
+ void LambdaCheck();
+ void LambdaHandler(int fd);
+ void InotifyHandler();
+
+ bool GeteventEnable(int fd);
+ void GeteventOpenDevice(const std::string& device);
+ void GeteventOpenDevice();
+ void GeteventCloseDevice(const std::string& device);
+
+ Epoll* epoll_;
+ std::function<void(int)> handler_;
+
+ std::map<std::string, int> registration_;
+
+ int count_;
+ std::vector<Entry> entries_;
+
+ Mask current_;
+
+ int inotify_fd_;
+};
} // namespace init
} // namespace android