1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#ifndef INPUT_DEVICE_MANAGER_H
17c29fa5a6Sopenharmony_ci#define INPUT_DEVICE_MANAGER_H
18c29fa5a6Sopenharmony_ci
19c29fa5a6Sopenharmony_ci#include <list>
20c29fa5a6Sopenharmony_ci#include <string>
21c29fa5a6Sopenharmony_ci
22c29fa5a6Sopenharmony_ci#include "device_config_file_parser.h"
23c29fa5a6Sopenharmony_ci#include "device_observer.h"
24c29fa5a6Sopenharmony_ci#include "input_device.h"
25c29fa5a6Sopenharmony_ci#include "msg_handler.h"
26c29fa5a6Sopenharmony_ci#include "nocopyable.h"
27c29fa5a6Sopenharmony_ci#include "singleton.h"
28c29fa5a6Sopenharmony_ci#include "uds_session.h"
29c29fa5a6Sopenharmony_ci#include "util.h"
30c29fa5a6Sopenharmony_ci
31c29fa5a6Sopenharmony_cinamespace OHOS {
32c29fa5a6Sopenharmony_cinamespace MMI {
33c29fa5a6Sopenharmony_ciclass InputDeviceManager final : public IDeviceObject {
34c29fa5a6Sopenharmony_ciprivate:
35c29fa5a6Sopenharmony_ci    struct InputDeviceInfo {
36c29fa5a6Sopenharmony_ci        struct libinput_device *inputDeviceOrigin { nullptr };
37c29fa5a6Sopenharmony_ci        std::string networkIdOrigin;
38c29fa5a6Sopenharmony_ci        bool isRemote { false };
39c29fa5a6Sopenharmony_ci        bool isPointerDevice { false };
40c29fa5a6Sopenharmony_ci        bool isTouchableDevice { false };
41c29fa5a6Sopenharmony_ci        bool enable { false };
42c29fa5a6Sopenharmony_ci        std::string dhid;
43c29fa5a6Sopenharmony_ci        std::string sysUid;
44c29fa5a6Sopenharmony_ci        VendorConfig vendorConfig;
45c29fa5a6Sopenharmony_ci    };
46c29fa5a6Sopenharmony_ci
47c29fa5a6Sopenharmony_cipublic:
48c29fa5a6Sopenharmony_ci    InputDeviceManager() = default;
49c29fa5a6Sopenharmony_ci    ~InputDeviceManager() = default;
50c29fa5a6Sopenharmony_ci    DISALLOW_COPY_AND_MOVE(InputDeviceManager);
51c29fa5a6Sopenharmony_ci
52c29fa5a6Sopenharmony_ci    void OnInputDeviceAdded(struct libinput_device *inputDevice);
53c29fa5a6Sopenharmony_ci    void OnInputDeviceRemoved(struct libinput_device *inputDevice);
54c29fa5a6Sopenharmony_ci    int32_t AddVirtualInputDevice(std::shared_ptr<InputDevice> device, int32_t &deviceId);
55c29fa5a6Sopenharmony_ci    int32_t RemoveVirtualInputDevice(int32_t deviceId);
56c29fa5a6Sopenharmony_ci    std::vector<int32_t> GetInputDeviceIds() const;
57c29fa5a6Sopenharmony_ci    std::shared_ptr<InputDevice> GetInputDevice(int32_t deviceId, bool checked = true) const;
58c29fa5a6Sopenharmony_ci    int32_t SupportKeys(int32_t deviceId, std::vector<int32_t> &keyCodes, std::vector<bool> &keystroke);
59c29fa5a6Sopenharmony_ci    int32_t FindInputDeviceId(struct libinput_device* inputDevice);
60c29fa5a6Sopenharmony_ci    int32_t GetKeyboardBusMode(int32_t deviceId);
61c29fa5a6Sopenharmony_ci    bool GetDeviceConfig(int32_t deviceId, int32_t &KeyboardType);
62c29fa5a6Sopenharmony_ci    int32_t GetDeviceSupportKey(int32_t deviceId, int32_t &keyboardType);
63c29fa5a6Sopenharmony_ci    int32_t GetKeyboardType(int32_t deviceId, int32_t &keyboardType);
64c29fa5a6Sopenharmony_ci    void Attach(std::shared_ptr<IDeviceObserver> observer);
65c29fa5a6Sopenharmony_ci    void Detach(std::shared_ptr<IDeviceObserver> observer);
66c29fa5a6Sopenharmony_ci    void NotifyPointerDevice(bool hasPointerDevice, bool isVisible, bool isHotPlug);
67c29fa5a6Sopenharmony_ci    void AddDevListener(SessionPtr sess);
68c29fa5a6Sopenharmony_ci    void RemoveDevListener(SessionPtr sess);
69c29fa5a6Sopenharmony_ci    void Dump(int32_t fd, const std::vector<std::string> &args);
70c29fa5a6Sopenharmony_ci    void DumpDeviceList(int32_t fd, const std::vector<std::string> &args);
71c29fa5a6Sopenharmony_ci    bool IsRemote(struct libinput_device *inputDevice) const;
72c29fa5a6Sopenharmony_ci    bool IsRemote(int32_t id) const;
73c29fa5a6Sopenharmony_ci    bool IsKeyboardDevice(struct libinput_device* device) const;
74c29fa5a6Sopenharmony_ci    bool IsPointerDevice(struct libinput_device* device) const;
75c29fa5a6Sopenharmony_ci    bool IsTouchDevice(struct libinput_device* device) const;
76c29fa5a6Sopenharmony_ci    struct libinput_device* GetKeyboardDevice() const;
77c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER_DRAWING
78c29fa5a6Sopenharmony_ci    bool HasPointerDevice();
79c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER_DRAWING
80c29fa5a6Sopenharmony_ci    bool HasTouchDevice();
81c29fa5a6Sopenharmony_ci    const std::string& GetScreenId(int32_t deviceId) const;
82c29fa5a6Sopenharmony_ci    using inputDeviceCallback = std::function<void(int32_t deviceId, std::string devName, std::string devStatus)>;
83c29fa5a6Sopenharmony_ci    void SetInputStatusChangeCallback(inputDeviceCallback callback);
84c29fa5a6Sopenharmony_ci    VendorConfig GetVendorConfig(int32_t deviceId) const;
85c29fa5a6Sopenharmony_ci    int32_t OnEnableInputDevice(bool enable);
86c29fa5a6Sopenharmony_ci    std::vector<int32_t> GetTouchPadIds();
87c29fa5a6Sopenharmony_ci
88c29fa5a6Sopenharmony_ci    static std::shared_ptr<InputDeviceManager> GetInstance();
89c29fa5a6Sopenharmony_ci
90c29fa5a6Sopenharmony_ciprivate:
91c29fa5a6Sopenharmony_ci    int32_t ParseDeviceId(struct libinput_device *inputDevice);
92c29fa5a6Sopenharmony_ci    void MakeDeviceInfo(struct libinput_device *inputDevice, struct InputDeviceInfo& info);
93c29fa5a6Sopenharmony_ci    bool IsMatchKeys(struct libinput_device* device, const std::vector<int32_t> &keyCodes) const;
94c29fa5a6Sopenharmony_ci    void ScanPointerDevice();
95c29fa5a6Sopenharmony_ci    void FillInputDevice(std::shared_ptr<InputDevice> inputDevice, libinput_device *deviceOrigin) const;
96c29fa5a6Sopenharmony_ci    std::string GetInputIdentification(struct libinput_device* inputDevice);
97c29fa5a6Sopenharmony_ci    void NotifyDevCallback(int32_t deviceId, struct InputDeviceInfo inDevice);
98c29fa5a6Sopenharmony_ci    void NotifyDevRemoveCallback(int32_t deviceId, const InputDeviceInfo &deviceInfo);
99c29fa5a6Sopenharmony_ci    int32_t NotifyMessage(SessionPtr sess, int32_t id, const std::string &type);
100c29fa5a6Sopenharmony_ci    void InitSessionLostCallback();
101c29fa5a6Sopenharmony_ci    void OnSessionLost(SessionPtr session);
102c29fa5a6Sopenharmony_ci    int32_t MakeVirtualDeviceInfo(std::shared_ptr<InputDevice> device, InputDeviceInfo &deviceInfo);
103c29fa5a6Sopenharmony_ci    int32_t GenerateVirtualDeviceId(int32_t &deviceId);
104c29fa5a6Sopenharmony_ci    bool IsPointerDevice(std::shared_ptr<InputDevice> inputDevice) const;
105c29fa5a6Sopenharmony_ci    bool IsTouchableDevice(std::shared_ptr<InputDevice> inputDevice) const;
106c29fa5a6Sopenharmony_ci    bool IsKeyboardDevice(std::shared_ptr<InputDevice> inputDevice) const;
107c29fa5a6Sopenharmony_ci
108c29fa5a6Sopenharmony_ciprivate:
109c29fa5a6Sopenharmony_ci    std::map<int32_t, struct InputDeviceInfo> inputDevice_;
110c29fa5a6Sopenharmony_ci    std::map<int32_t, std::shared_ptr<InputDevice>> virtualInputDevices_;
111c29fa5a6Sopenharmony_ci    std::map<std::string, std::string> inputDeviceScreens_;
112c29fa5a6Sopenharmony_ci    std::list<std::shared_ptr<IDeviceObserver>> observers_;
113c29fa5a6Sopenharmony_ci    std::list<SessionPtr> devListeners_;
114c29fa5a6Sopenharmony_ci    inputDeviceCallback devCallbacks_ { nullptr };
115c29fa5a6Sopenharmony_ci    std::map<int32_t, std::string> displayInputBindInfos_;
116c29fa5a6Sopenharmony_ci    DeviceConfigManagement configManagement_;
117c29fa5a6Sopenharmony_ci    bool sessionLostCallbackInitialized_ { false };
118c29fa5a6Sopenharmony_ci
119c29fa5a6Sopenharmony_ci    static std::shared_ptr<InputDeviceManager> instance_;
120c29fa5a6Sopenharmony_ci    static std::mutex mutex_;
121c29fa5a6Sopenharmony_ci};
122c29fa5a6Sopenharmony_ci
123c29fa5a6Sopenharmony_ci#define INPUT_DEV_MGR ::OHOS::MMI::InputDeviceManager::GetInstance()
124c29fa5a6Sopenharmony_ci} // namespace MMI
125c29fa5a6Sopenharmony_ci} // namespace OHOS
126c29fa5a6Sopenharmony_ci#endif // INPUT_DEVICE_MANAGER_H
127