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