1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 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#include "input_adapter.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include "input_manager.h"
19c29fa5a6Sopenharmony_ci#include "i_input_event_consumer.h"
20c29fa5a6Sopenharmony_ci#include "i_input_event_filter.h"
21c29fa5a6Sopenharmony_ci
22c29fa5a6Sopenharmony_ci#include "devicestatus_define.h"
23c29fa5a6Sopenharmony_ci
24c29fa5a6Sopenharmony_ci#undef LOG_TAG
25c29fa5a6Sopenharmony_ci#define LOG_TAG "InputAdapter"
26c29fa5a6Sopenharmony_ci
27c29fa5a6Sopenharmony_cinamespace OHOS {
28c29fa5a6Sopenharmony_cinamespace Msdp {
29c29fa5a6Sopenharmony_cinamespace DeviceStatus {
30c29fa5a6Sopenharmony_ci
31c29fa5a6Sopenharmony_ciclass PointerFilter : public MMI::IInputEventFilter {
32c29fa5a6Sopenharmony_cipublic:
33c29fa5a6Sopenharmony_ci    explicit PointerFilter(std::function<bool(std::shared_ptr<MMI::PointerEvent>)> filter)
34c29fa5a6Sopenharmony_ci        : filter_(filter) {}
35c29fa5a6Sopenharmony_ci
36c29fa5a6Sopenharmony_ci    bool OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const override
37c29fa5a6Sopenharmony_ci    {
38c29fa5a6Sopenharmony_ci        return (filter_ != nullptr ? filter_(pointerEvent) : false);
39c29fa5a6Sopenharmony_ci    }
40c29fa5a6Sopenharmony_ci
41c29fa5a6Sopenharmony_ci    bool OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const override
42c29fa5a6Sopenharmony_ci    {
43c29fa5a6Sopenharmony_ci        return false;
44c29fa5a6Sopenharmony_ci    }
45c29fa5a6Sopenharmony_ci
46c29fa5a6Sopenharmony_ciprivate:
47c29fa5a6Sopenharmony_ci    std::function<bool(std::shared_ptr<MMI::PointerEvent>)> filter_;
48c29fa5a6Sopenharmony_ci};
49c29fa5a6Sopenharmony_ci
50c29fa5a6Sopenharmony_ciclass InterceptorConsumer : public MMI::IInputEventConsumer {
51c29fa5a6Sopenharmony_cipublic:
52c29fa5a6Sopenharmony_ci    InterceptorConsumer(std::function<void(std::shared_ptr<MMI::PointerEvent>)> pointerCb,
53c29fa5a6Sopenharmony_ci                        std::function<void(std::shared_ptr<MMI::KeyEvent>)> keyCb)
54c29fa5a6Sopenharmony_ci        : pointerCb_(pointerCb), keyCb_(keyCb) {}
55c29fa5a6Sopenharmony_ci
56c29fa5a6Sopenharmony_ci    void OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const override
57c29fa5a6Sopenharmony_ci    {
58c29fa5a6Sopenharmony_ci        if (keyCb_ != nullptr) {
59c29fa5a6Sopenharmony_ci            keyCb_(keyEvent);
60c29fa5a6Sopenharmony_ci        }
61c29fa5a6Sopenharmony_ci    }
62c29fa5a6Sopenharmony_ci
63c29fa5a6Sopenharmony_ci    void OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const override
64c29fa5a6Sopenharmony_ci    {
65c29fa5a6Sopenharmony_ci        if (pointerCb_ != nullptr) {
66c29fa5a6Sopenharmony_ci            pointerCb_(pointerEvent);
67c29fa5a6Sopenharmony_ci        }
68c29fa5a6Sopenharmony_ci    }
69c29fa5a6Sopenharmony_ci
70c29fa5a6Sopenharmony_ci    void OnInputEvent(std::shared_ptr<MMI::AxisEvent> axisEvent) const override {}
71c29fa5a6Sopenharmony_ci
72c29fa5a6Sopenharmony_ciprivate:
73c29fa5a6Sopenharmony_ci    std::function<void(std::shared_ptr<MMI::PointerEvent>)> pointerCb_;
74c29fa5a6Sopenharmony_ci    std::function<void(std::shared_ptr<MMI::KeyEvent>)> keyCb_;
75c29fa5a6Sopenharmony_ci};
76c29fa5a6Sopenharmony_ci
77c29fa5a6Sopenharmony_ciint32_t InputAdapter::AddMonitor(std::function<void(std::shared_ptr<MMI::PointerEvent>)> callback)
78c29fa5a6Sopenharmony_ci{
79c29fa5a6Sopenharmony_ci    int32_t monitorId = MMI::InputManager::GetInstance()->AddMonitor(callback);
80c29fa5a6Sopenharmony_ci    if (monitorId < 0) {
81c29fa5a6Sopenharmony_ci        FI_HILOGE("AddMonitor fail");
82c29fa5a6Sopenharmony_ci    }
83c29fa5a6Sopenharmony_ci    return monitorId;
84c29fa5a6Sopenharmony_ci}
85c29fa5a6Sopenharmony_ci
86c29fa5a6Sopenharmony_ciint32_t InputAdapter::AddMonitor(std::function<void(std::shared_ptr<MMI::KeyEvent>)> callback)
87c29fa5a6Sopenharmony_ci{
88c29fa5a6Sopenharmony_ci    int32_t monitorId = MMI::InputManager::GetInstance()->AddMonitor(callback);
89c29fa5a6Sopenharmony_ci    if (monitorId < 0) {
90c29fa5a6Sopenharmony_ci        FI_HILOGE("AddMonitor fail");
91c29fa5a6Sopenharmony_ci    }
92c29fa5a6Sopenharmony_ci    return monitorId;
93c29fa5a6Sopenharmony_ci}
94c29fa5a6Sopenharmony_ci
95c29fa5a6Sopenharmony_civoid InputAdapter::RemoveMonitor(int32_t monitorId)
96c29fa5a6Sopenharmony_ci{
97c29fa5a6Sopenharmony_ci    MMI::InputManager::GetInstance()->RemoveMonitor(monitorId);
98c29fa5a6Sopenharmony_ci}
99c29fa5a6Sopenharmony_ci
100c29fa5a6Sopenharmony_ciint32_t InputAdapter::AddInterceptor(std::function<void(std::shared_ptr<MMI::PointerEvent>)> pointerCb)
101c29fa5a6Sopenharmony_ci{
102c29fa5a6Sopenharmony_ci    return AddInterceptor(pointerCb, nullptr);
103c29fa5a6Sopenharmony_ci}
104c29fa5a6Sopenharmony_ci
105c29fa5a6Sopenharmony_ciint32_t InputAdapter::AddInterceptor(std::function<void(std::shared_ptr<MMI::KeyEvent>)> keyCb)
106c29fa5a6Sopenharmony_ci{
107c29fa5a6Sopenharmony_ci    return AddInterceptor(nullptr, keyCb);
108c29fa5a6Sopenharmony_ci}
109c29fa5a6Sopenharmony_ci
110c29fa5a6Sopenharmony_ciint32_t InputAdapter::AddInterceptor(std::function<void(std::shared_ptr<MMI::PointerEvent>)> pointerCb,
111c29fa5a6Sopenharmony_ci                                     std::function<void(std::shared_ptr<MMI::KeyEvent>)> keyCb)
112c29fa5a6Sopenharmony_ci{
113c29fa5a6Sopenharmony_ci    uint32_t tags { 0u };
114c29fa5a6Sopenharmony_ci    if (pointerCb != nullptr) {
115c29fa5a6Sopenharmony_ci        tags |= MMI::CapabilityToTags(MMI::INPUT_DEV_CAP_POINTER);
116c29fa5a6Sopenharmony_ci    }
117c29fa5a6Sopenharmony_ci    if (keyCb != nullptr) {
118c29fa5a6Sopenharmony_ci        tags |= MMI::CapabilityToTags(MMI::INPUT_DEV_CAP_KEYBOARD);
119c29fa5a6Sopenharmony_ci    }
120c29fa5a6Sopenharmony_ci    if (tags == 0u) {
121c29fa5a6Sopenharmony_ci        FI_HILOGE("Both interceptors are null");
122c29fa5a6Sopenharmony_ci        return -1;
123c29fa5a6Sopenharmony_ci    }
124c29fa5a6Sopenharmony_ci    auto interceptor = std::make_shared<InterceptorConsumer>(pointerCb, keyCb);
125c29fa5a6Sopenharmony_ci    constexpr int32_t DEFAULT_PRIORITY { 499 };
126c29fa5a6Sopenharmony_ci    int32_t interceptorId = MMI::InputManager::GetInstance()->AddInterceptor(interceptor, DEFAULT_PRIORITY, tags);
127c29fa5a6Sopenharmony_ci    if (interceptorId < 0) {
128c29fa5a6Sopenharmony_ci        FI_HILOGE("AddInterceptor fail");
129c29fa5a6Sopenharmony_ci    }
130c29fa5a6Sopenharmony_ci    return interceptorId;
131c29fa5a6Sopenharmony_ci}
132c29fa5a6Sopenharmony_ci
133c29fa5a6Sopenharmony_civoid InputAdapter::RemoveInterceptor(int32_t interceptorId)
134c29fa5a6Sopenharmony_ci{
135c29fa5a6Sopenharmony_ci    MMI::InputManager::GetInstance()->RemoveInterceptor(interceptorId);
136c29fa5a6Sopenharmony_ci}
137c29fa5a6Sopenharmony_ci
138c29fa5a6Sopenharmony_ciint32_t InputAdapter::AddFilter(std::function<bool(std::shared_ptr<MMI::PointerEvent>)> callback)
139c29fa5a6Sopenharmony_ci{
140c29fa5a6Sopenharmony_ci    constexpr int32_t DEFAULT_PRIORITY { 220 };
141c29fa5a6Sopenharmony_ci    auto filter = std::make_shared<PointerFilter>(callback);
142c29fa5a6Sopenharmony_ci    uint32_t tags = CapabilityToTags(MMI::INPUT_DEV_CAP_POINTER);
143c29fa5a6Sopenharmony_ci    int32_t filterId = MMI::InputManager::GetInstance()->AddInputEventFilter(filter, DEFAULT_PRIORITY, tags);
144c29fa5a6Sopenharmony_ci    if (filterId < 0) {
145c29fa5a6Sopenharmony_ci        FI_HILOGE("AddInputEventFilter fail");
146c29fa5a6Sopenharmony_ci    }
147c29fa5a6Sopenharmony_ci    return filterId;
148c29fa5a6Sopenharmony_ci}
149c29fa5a6Sopenharmony_ci
150c29fa5a6Sopenharmony_civoid InputAdapter::RemoveFilter(int32_t filterId)
151c29fa5a6Sopenharmony_ci{
152c29fa5a6Sopenharmony_ci    MMI::InputManager::GetInstance()->RemoveInputEventFilter(filterId);
153c29fa5a6Sopenharmony_ci}
154c29fa5a6Sopenharmony_ci
155c29fa5a6Sopenharmony_ciint32_t InputAdapter::SetPointerVisibility(bool visible, int32_t priority)
156c29fa5a6Sopenharmony_ci{
157c29fa5a6Sopenharmony_ci    FI_HILOGI("Set pointer visibility, visible:%{public}s", visible ? "true" : "false");
158c29fa5a6Sopenharmony_ci    return MMI::InputManager::GetInstance()->SetPointerVisible(visible, priority);
159c29fa5a6Sopenharmony_ci}
160c29fa5a6Sopenharmony_ci
161c29fa5a6Sopenharmony_ciint32_t InputAdapter::SetPointerLocation(int32_t x, int32_t y)
162c29fa5a6Sopenharmony_ci{
163c29fa5a6Sopenharmony_ci    return MMI::InputManager::GetInstance()->SetPointerLocation(x, y);
164c29fa5a6Sopenharmony_ci}
165c29fa5a6Sopenharmony_ci
166c29fa5a6Sopenharmony_ciint32_t InputAdapter::EnableInputDevice(bool enable)
167c29fa5a6Sopenharmony_ci{
168c29fa5a6Sopenharmony_ci    return MMI::InputManager::GetInstance()->EnableInputDevice(enable);
169c29fa5a6Sopenharmony_ci}
170c29fa5a6Sopenharmony_ci
171c29fa5a6Sopenharmony_civoid InputAdapter::SimulateInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent)
172c29fa5a6Sopenharmony_ci{
173c29fa5a6Sopenharmony_ci    MMI::InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
174c29fa5a6Sopenharmony_ci}
175c29fa5a6Sopenharmony_ci
176c29fa5a6Sopenharmony_civoid InputAdapter::SimulateInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent)
177c29fa5a6Sopenharmony_ci{
178c29fa5a6Sopenharmony_ci    MMI::InputManager::GetInstance()->SimulateInputEvent(keyEvent);
179c29fa5a6Sopenharmony_ci}
180c29fa5a6Sopenharmony_ci
181c29fa5a6Sopenharmony_ciint32_t InputAdapter::AddVirtualInputDevice(std::shared_ptr<MMI::InputDevice> device, int32_t &deviceId)
182c29fa5a6Sopenharmony_ci{
183c29fa5a6Sopenharmony_ci    return MMI::InputManager::GetInstance()->AddVirtualInputDevice(device, deviceId);
184c29fa5a6Sopenharmony_ci}
185c29fa5a6Sopenharmony_ci
186c29fa5a6Sopenharmony_ciint32_t InputAdapter::RemoveVirtualInputDevice(int32_t deviceId)
187c29fa5a6Sopenharmony_ci{
188c29fa5a6Sopenharmony_ci    return MMI::InputManager::GetInstance()->RemoveVirtualInputDevice(deviceId);
189c29fa5a6Sopenharmony_ci}
190c29fa5a6Sopenharmony_ci} // namespace DeviceStatus
191c29fa5a6Sopenharmony_ci} // namespace Msdp
192c29fa5a6Sopenharmony_ci} // namespace OHOS