1 /*
2  * Copyright (c) 2021-2022 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 
16 #include "processing_mouse_device.h"
17 
18 #undef MMI_LOG_TAG
19 #define MMI_LOG_TAG "ProcessingMouseDevice"
20 
21 namespace OHOS {
22 namespace MMI {
TransformJsonDataToInputData(const DeviceItem & fingerEventArrays,InputEventArray & inputEventArray)23 int32_t ProcessingMouseDevice::TransformJsonDataToInputData(const DeviceItem& fingerEventArrays,
24     InputEventArray& inputEventArray)
25 {
26     CALL_DEBUG_ENTER;
27     std::vector<DeviceEvent> inputData = fingerEventArrays.events;
28     if (inputData.empty()) {
29         MMI_HILOGE("Manage KeyBoard array failed, inputData is empty.");
30         return RET_ERR;
31     }
32     std::vector<MouseEvent> mouseEventArray;
33     if (AnalysisMouseEvent(inputData, mouseEventArray) == RET_ERR) {
34         return RET_ERR;
35     }
36     TransformMouseEventToInputEvent(mouseEventArray, inputEventArray);
37     return RET_OK;
38 }
39 
TransformMouseEventToInputEvent(const std::vector<MouseEvent> & mouseEventArray,InputEventArray & inputEventArray)40 void ProcessingMouseDevice::TransformMouseEventToInputEvent(const std::vector<MouseEvent>& mouseEventArray,
41     InputEventArray& inputEventArray)
42 {
43     for (const auto &item : mouseEventArray) {
44         if (item.eventType == "KEY_EVENT_PRESS") {
45             TransformKeyPressEvent(item, inputEventArray);
46         } else if (item.eventType == "KEY_EVENT_RELEASE") {
47             TransformKeyReleaseEvent(item, inputEventArray);
48         } else if (item.eventType == "KEY_EVENT_CLICK") {
49             TransformKeyClickEvent(item, inputEventArray);
50         } else if (item.eventType == "MOUSE_EVENT_MOVE") {
51             TransformMouseMoveEvent(item, inputEventArray);
52         } else if (item.eventType == "MOUSE_EVENT_WHEEL") {
53             TransformMouseWheelEvent(item, inputEventArray);
54         } else if (item.eventType == "MOUSE_EVENT_HWHEEL") {
55             TransformMouseHwheelEvent(item, inputEventArray);
56         } else {
57             MMI_HILOGW("Json file format error");
58         }
59     }
60 }
61 
AnalysisMouseEvent(const std::vector<DeviceEvent> & inputData,std::vector<MouseEvent> & mouseEventArray)62 int32_t ProcessingMouseDevice::AnalysisMouseEvent(const std::vector<DeviceEvent>& inputData,
63     std::vector<MouseEvent>& mouseEventArray)
64 {
65     MouseEvent mouseEvent = {};
66     for (const auto &item : inputData) {
67         mouseEvent = {};
68         mouseEvent.eventType = item.eventType;
69         mouseEvent.keyValue = item.keyValue;
70         mouseEvent.blockTime = item.blockTime;
71         mouseEvent.xPos = item.xPos;
72         mouseEvent.yPos = item.yPos;
73         mouseEvent.distance = item.distance;
74         mouseEvent.direction = item.direction;
75         mouseEventArray.push_back(mouseEvent);
76     }
77     return RET_OK;
78 }
79 
TransformKeyPressEvent(const MouseEvent & mouseEvent,InputEventArray & inputEventArray)80 void ProcessingMouseDevice::TransformKeyPressEvent(const MouseEvent& mouseEvent,
81     InputEventArray& inputEventArray)
82 {
83     uint16_t keyValue = static_cast<uint16_t>(mouseEvent.keyValue);
84     SetKeyPressEvent(inputEventArray, mouseEvent.blockTime, keyValue);
85     SetSynReport(inputEventArray);
86 }
87 
TransformKeyReleaseEvent(const MouseEvent & mouseEvent,InputEventArray & inputEventArray)88 void ProcessingMouseDevice::TransformKeyReleaseEvent(const MouseEvent& mouseEvent,
89     InputEventArray& inputEventArray)
90 {
91     uint16_t keyValue = static_cast<uint16_t>(mouseEvent.keyValue);
92     SetKeyReleaseEvent(inputEventArray, mouseEvent.blockTime, keyValue);
93     SetSynReport(inputEventArray);
94 }
95 
TransformKeyClickEvent(const MouseEvent & mouseEvent,InputEventArray & inputEventArray)96 void ProcessingMouseDevice::TransformKeyClickEvent(const MouseEvent& mouseEvent,
97                                                    InputEventArray& inputEventArray)
98 {
99     uint16_t keyValue = static_cast<uint16_t>(mouseEvent.keyValue);
100     SetKeyPressEvent(inputEventArray, mouseEvent.blockTime, keyValue);
101     SetSynReport(inputEventArray);
102     SetKeyReleaseEvent(inputEventArray, mouseEvent.blockTime, keyValue);
103     SetSynReport(inputEventArray);
104 }
105 
TransformMouseMoveEvent(const MouseEvent & mouseEvent,InputEventArray & inputEventArray)106 void ProcessingMouseDevice::TransformMouseMoveEvent(const MouseEvent& mouseEvent,
107     InputEventArray& inputEventArray)
108 {
109     SetRelX(inputEventArray, mouseEvent.blockTime, mouseEvent.xPos);
110     SetSynReport(inputEventArray);
111     SetRelY(inputEventArray, mouseEvent.blockTime, mouseEvent.yPos);
112     SetSynReport(inputEventArray);
113 }
114 
TransformMouseWheelEvent(const MouseEvent & mouseEvent,InputEventArray & inputEventArray)115 void ProcessingMouseDevice::TransformMouseWheelEvent(const MouseEvent& mouseEvent,
116     InputEventArray& inputEventArray)
117 {
118     uint32_t distance = static_cast<uint32_t>(mouseEvent.distance);
119     if (mouseEvent.direction == "up") {
120         distance = ~distance + 1;
121     }
122     SetRelWheel(inputEventArray, mouseEvent.blockTime, static_cast<int32_t>(distance));
123     SetSynReport(inputEventArray);
124 }
125 
TransformMouseHwheelEvent(const MouseEvent & mouseEvent,InputEventArray & inputEventArray)126 void ProcessingMouseDevice::TransformMouseHwheelEvent(const MouseEvent& mouseEvent,
127     InputEventArray& inputEventArray)
128 {
129     uint32_t distance = static_cast<uint32_t>(mouseEvent.distance);
130     if (mouseEvent.direction == "left") {
131         distance = ~distance + 1;
132     }
133     SetRelWheel(inputEventArray, mouseEvent.blockTime, static_cast<int32_t>(distance));
134     SetSynReport(inputEventArray);
135 }
136 } // namespace MMI
137 } // namespace OHOS