1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "pointers_input_device.h"
16 #include <unistd.h>
17 #include "log/log.h"
18 #include "common/input_device_manager.h"
19 #include "ui_rotation.h"
20
21 namespace Updater {
AddInputDevice()22 void AddInputDevice()
23 {
24 OHOS::InputDeviceManager::GetInstance()->Add(&PointersInputDevice::GetInstance());
25 }
26
HandlePointersEvent(const input_event & ev,uint32_t type)27 void HandlePointersEvent(const input_event &ev, uint32_t type)
28 {
29 PointersInputDevice::GetInstance().HandlePointEvent(ev, type);
30 }
31
GetInstance()32 PointersInputDevice &PointersInputDevice::GetInstance()
33 {
34 static PointersInputDevice instance;
35 return instance;
36 }
37
Read(OHOS::DeviceData & data)38 bool PointersInputDevice::Read(OHOS::DeviceData& data)
39 {
40 ReadTouch(data);
41 return false;
42 }
43
ReadPoint(OHOS::DeviceData & data,OHOS::Point pos,bool fingerPressDown)44 bool PointersInputDevice::ReadPoint(OHOS::DeviceData& data, OHOS::Point pos, bool fingerPressDown)
45 {
46 auto [x, y] = UiRotation::GetInstance().RotateXY(pos.x, pos.y);
47 data.point.x = x;
48 data.point.y = y;
49 data.state = fingerPressDown ? OHOS::InputDevice::STATE_PRESS : OHOS::InputDevice::STATE_RELEASE;
50 return false;
51 }
52
ReadTouch(OHOS::DeviceData & data)53 bool PointersInputDevice::ReadTouch(OHOS::DeviceData &data)
54 {
55 ReadPoint(data, reportAbsMt_, touchFingerDown_);
56 return false;
57 }
58
SetFingerDown(bool isPressed)59 void PointersInputDevice::SetFingerDown(bool isPressed)
60 {
61 touchFingerDown_ = isPressed;
62 }
63
HandleEvAbsMt(const input_event & ev)64 void PointersInputDevice::HandleEvAbsMt(const input_event &ev)
65 {
66 const static std::unordered_map<int, std::function<void(int)>> evMap {
67 {ABS_MT_POSITION_X, [this] (int value) {
68 reportAbsMt_.x = value;
69 SetFingerDown(true);
70 }},
71 {ABS_MT_POSITION_Y, [this] (int value) {
72 reportAbsMt_.y = value;
73 SetFingerDown(true);
74 }},
75 {ABS_MT_TRACKING_ID, [this] (int value) {
76 // Protocol B: -1 marks lifting the contact.
77 if (value < 0) {
78 SetFingerDown(false);
79 }
80 }}
81 };
82 if (auto it = evMap.find(ev.code); it != evMap.end()) {
83 it->second(ev.value);
84 }
85 }
86
HandlePointEvent(const input_event & ev,uint32_t type)87 int PointersInputDevice::HandlePointEvent(const input_event &ev, uint32_t type)
88 {
89 if (ev.type == EV_ABS) {
90 HandleEvAbsMt(ev);
91 return 0;
92 }
93 if (ev.type == EV_KEY && ev.code == BTN_TOUCH) {
94 SetFingerDown(ev.value == 1);
95 }
96 return 0;
97 }
98 } // namespace Updater
99