1 /*
2 * Copyright (c) 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 #include "multimode_manager.h"
16
17 namespace OHOS {
18 namespace WuKong {
19 namespace {
20 const int SHORTEST_LEN = 2;
21 const int LONGEST_LEN = 20;
22 const int DEFAULT_PRESSURE = 5;
23 const int SLEEP_TIME = 16000;
24 } // namespace
MultimodeManager()25 MultimodeManager::MultimodeManager()
26 {
27 for (int i = OHOS::MMI::KeyEvent::KEYCODE_CALL; i <= OHOS::MMI::KeyEvent::KEYCODE_ENDCALL; i++) {
28 keycodelist_.push_back(i);
29 }
30
31 for (int j = OHOS::MMI::KeyEvent::KEYCODE_0; j <= OHOS::MMI::KeyEvent::KEYCODE_NUMPAD_RIGHT_PAREN; j++) {
32 keycodelist_.push_back(j);
33 }
34 }
35
~MultimodeManager()36 MultimodeManager::~MultimodeManager()
37 {
38 }
39
SingleKeyCodeInput(int keycode, int downtime)40 ErrCode MultimodeManager::SingleKeyCodeInput(int keycode, int downtime)
41 {
42 ErrCode result = ERR_OK;
43 std::string keycodeType = OHOS::MMI::KeyEvent::KeyCodeToString(keycode);
44 INFO_LOG_STR("keycodeType: %s", keycodeType.c_str());
45 auto keyKeyboardEvent = OHOS::MMI::KeyEvent::Create();
46 if (!keyKeyboardEvent) {
47 WARN_LOG("keyKeyboardEvent is nullptr");
48 return OHOS::ERR_NO_INIT;
49 }
50 MMI::KeyEvent::KeyItem item;
51 item.SetKeyCode(keycode);
52 item.SetPressed(true);
53 item.SetDownTime(downtime);
54 keyKeyboardEvent->SetKeyCode(keycode);
55 keyKeyboardEvent->SetKeyAction(MMI::KeyEvent::KEY_ACTION_DOWN);
56 keyKeyboardEvent->AddPressedKeyItems(item);
57 // check if KeyEvent is valid
58 if (keyKeyboardEvent->IsValid()) {
59 MMI::InputManager::GetInstance()->SimulateInputEvent(keyKeyboardEvent);
60 } else {
61 WARN_LOG("keyevent down is invalid");
62 return OHOS::ERR_NO_INIT;
63 }
64 keyKeyboardEvent->RemoveReleasedKeyItems(item);
65 item.SetKeyCode(keycode);
66 item.SetPressed(false);
67 item.SetDownTime(downtime);
68 keyKeyboardEvent->SetKeyCode(keycode);
69 keyKeyboardEvent->SetKeyAction(MMI::KeyEvent::KEY_ACTION_UP);
70 keyKeyboardEvent->AddPressedKeyItems(item);
71 // check if KeyEvent is valid
72 if (keyKeyboardEvent->IsValid()) {
73 MMI::InputManager::GetInstance()->SimulateInputEvent(keyKeyboardEvent);
74 } else {
75 WARN_LOG("keyevent up is invalid");
76 return OHOS::ERR_NO_INIT;
77 }
78 keyKeyboardEvent->RemoveReleasedKeyItems(item);
79
80 return result;
81 }
82
MultiKeyCodeInput(int downtime)83 ErrCode MultimodeManager::MultiKeyCodeInput(int downtime)
84 {
85 ErrCode result = OHOS::ERR_OK;
86 // generate the length of string randomly
87 int stringLen = SHORTEST_LEN + random() % (LONGEST_LEN - 1);
88 if (keycodelist_.size() > 0) {
89 for (int i = 0; i < stringLen; i++) {
90 int keycode = keycodelist_[(uint32_t)(rand()) % keycodelist_.size()];
91 result = MultimodeManager::GetInstance()->SingleKeyCodeInput(keycode, downtime);
92 }
93 } else {
94 return OHOS::ERR_NO_INIT;
95 }
96 return result;
97 }
98
GetKeycodeList(std::vector<int> &keycodelist)99 void MultimodeManager::GetKeycodeList(std::vector<int> &keycodelist)
100 {
101 keycodelist = keycodelist_;
102 }
103
PointerInput(int x, int y, int pointertype, int actiontype)104 ErrCode MultimodeManager::PointerInput(int x, int y, int pointertype, int actiontype)
105 {
106 ErrCode result = OHOS::ERR_OK;
107 auto pointerEvent = MMI::PointerEvent::Create();
108 if (!pointerEvent) {
109 WARN_LOG("pointerEvent is nullptr");
110 return OHOS::ERR_NO_INIT;
111 }
112 MMI::PointerEvent::PointerItem item;
113
114 item.SetPointerId(0);
115 item.SetDisplayX(x);
116 item.SetDisplayY(y);
117 item.SetPressure(DEFAULT_PRESSURE);
118 pointerEvent->AddPointerItem(item);
119
120 pointerEvent->SetPointerAction(actiontype);
121 pointerEvent->SetSourceType(pointertype);
122 pointerEvent->SetPointerId(0);
123
124 MMI::InputManager::GetInstance()->SimulateInputEvent(pointerEvent);
125
126 return result;
127 }
128
IntervalSwap(int xSrcPosition, int ySrcPosition, int xDstPosition, int yDstPosition)129 ErrCode MultimodeManager::IntervalSwap(int xSrcPosition, int ySrcPosition, int xDstPosition, int yDstPosition)
130 {
131 auto multiinput = MultimodeManager::GetInstance();
132 ErrCode result = multiinput->PointerInput(xSrcPosition, ySrcPosition, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN,
133 MMI::PointerEvent::POINTER_ACTION_DOWN);
134 if (result != OHOS::ERR_OK) {
135 return result;
136 }
137 usleep(SLEEP_TIME);
138 int segment = 50;
139 float secX = (xDstPosition - xSrcPosition) / (float)segment;
140 float secY = (yDstPosition - ySrcPosition) / (float)segment;
141
142 for (int i = 1; i < segment; ++i) {
143 int mPosX = int(xSrcPosition + secX * i);
144 int mPosY = int(ySrcPosition + secY * i);
145 result = multiinput->PointerInput(mPosX, mPosY, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN,
146 MMI::PointerEvent::POINTER_ACTION_MOVE);
147 if (result != OHOS::ERR_OK) {
148 return result;
149 }
150 usleep(SLEEP_TIME);
151 }
152 result = multiinput->PointerInput(xDstPosition, yDstPosition, MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN,
153 MMI::PointerEvent::POINTER_ACTION_UP);
154 return result;
155 }
156 } // namespace WuKong
157 } // namespace OHOS
158