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