1885b47fbSopenharmony_ci/*
2885b47fbSopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3885b47fbSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4885b47fbSopenharmony_ci * you may not use this file except in compliance with the License.
5885b47fbSopenharmony_ci * You may obtain a copy of the License at
6885b47fbSopenharmony_ci *
7885b47fbSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8885b47fbSopenharmony_ci *
9885b47fbSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10885b47fbSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11885b47fbSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12885b47fbSopenharmony_ci * See the License for the specific language governing permissions and
13885b47fbSopenharmony_ci * limitations under the License.
14885b47fbSopenharmony_ci */
15885b47fbSopenharmony_ci
16885b47fbSopenharmony_ci#include "accessibility_mouse_key.h"
17885b47fbSopenharmony_ci#include "hilog_wrapper.h"
18885b47fbSopenharmony_ci#include "utils.h"
19885b47fbSopenharmony_ci
20885b47fbSopenharmony_cinamespace OHOS {
21885b47fbSopenharmony_cinamespace Accessibility {
22885b47fbSopenharmony_cistruct MouseMoveOffset {
23885b47fbSopenharmony_ci    int32_t offsetX = 0;
24885b47fbSopenharmony_ci    int32_t offsetY = 0;
25885b47fbSopenharmony_ci};
26885b47fbSopenharmony_cinamespace {
27885b47fbSopenharmony_ci    // item count
28885b47fbSopenharmony_ci    constexpr size_t ITEM_COUNT_1 = 1;
29885b47fbSopenharmony_ci    constexpr size_t ITEM_COUNT_2 = 2;
30885b47fbSopenharmony_ci    constexpr size_t ITEM_COUNT_3 = 3;
31885b47fbSopenharmony_ci    // move offset
32885b47fbSopenharmony_ci    constexpr int32_t MOVE_LEFT_STEP = -5;
33885b47fbSopenharmony_ci    constexpr int32_t MOVE_RIGHT_STEP = 5;
34885b47fbSopenharmony_ci    constexpr int32_t MOVE_UP_STEP = -5;
35885b47fbSopenharmony_ci    constexpr int32_t MOVE_DOWN_STEP = 5;
36885b47fbSopenharmony_ci    // speed multiple
37885b47fbSopenharmony_ci    constexpr float SPEED_UP_MULTIPLE = 5.0f;
38885b47fbSopenharmony_ci    constexpr float SLOW_DOWN_MULTIPLE = 0.5f;
39885b47fbSopenharmony_ci    // result of parsing meta key
40885b47fbSopenharmony_ci    constexpr int32_t INVALID_KEY = -1;
41885b47fbSopenharmony_ci    constexpr int32_t NONE_KEY = 0;
42885b47fbSopenharmony_ci    constexpr int32_t CTRL_KEY = 1;
43885b47fbSopenharmony_ci    constexpr int32_t SHIFT_KEY = 2;
44885b47fbSopenharmony_ci    constexpr int32_t CTRL_SHIFT_KEY = 3;
45885b47fbSopenharmony_ci    // array(PRESSED_METAKEYS_TBL)'s length
46885b47fbSopenharmony_ci    constexpr int32_t ROW_COUNT = 21;
47885b47fbSopenharmony_ci    constexpr int32_t COLUMN_COUNT = 3;
48885b47fbSopenharmony_ci    const std::vector<int32_t> MOUSE_KEYCODE_V = {
49885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_NUMPAD_1, MMI::KeyEvent::KEYCODE_NUMPAD_2, MMI::KeyEvent::KEYCODE_NUMPAD_3,
50885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_NUMPAD_4, MMI::KeyEvent::KEYCODE_NUMPAD_5, MMI::KeyEvent::KEYCODE_NUMPAD_6,
51885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_NUMPAD_7, MMI::KeyEvent::KEYCODE_NUMPAD_8, MMI::KeyEvent::KEYCODE_NUMPAD_9,
52885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_NUMPAD_DIVIDE, MMI::KeyEvent::KEYCODE_NUMPAD_MULTIPLY,
53885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_NUMPAD_SUBTRACT, MMI::KeyEvent::KEYCODE_NUMPAD_ADD};
54885b47fbSopenharmony_ci    const std::vector<int32_t> MOUSE_MOVE_KEYCODE_V = {
55885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_NUMPAD_1, MMI::KeyEvent::KEYCODE_NUMPAD_2, MMI::KeyEvent::KEYCODE_NUMPAD_3,
56885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_NUMPAD_4, MMI::KeyEvent::KEYCODE_NUMPAD_6, MMI::KeyEvent::KEYCODE_NUMPAD_7,
57885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_NUMPAD_8, MMI::KeyEvent::KEYCODE_NUMPAD_9};
58885b47fbSopenharmony_ci    const std::vector<int32_t> CTRL_SHIFT_KEYCODE_V = {
59885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_CTRL_LEFT, MMI::KeyEvent::KEYCODE_CTRL_RIGHT,
60885b47fbSopenharmony_ci        MMI::KeyEvent::KEYCODE_SHIFT_LEFT, MMI::KeyEvent::KEYCODE_SHIFT_RIGHT};
61885b47fbSopenharmony_ci    const std::map<int32_t, MouseMoveOffset> MOUSE_MOVE_OFFSET_M = {
62885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_NUMPAD_1, {MOVE_LEFT_STEP, MOVE_DOWN_STEP}},
63885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_NUMPAD_2, {0, MOVE_DOWN_STEP}},
64885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_NUMPAD_3, {MOVE_RIGHT_STEP, MOVE_DOWN_STEP}},
65885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_NUMPAD_4, {MOVE_LEFT_STEP, 0}},
66885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_NUMPAD_6, {MOVE_RIGHT_STEP, 0}},
67885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_NUMPAD_7, {MOVE_LEFT_STEP, MOVE_UP_STEP}},
68885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_NUMPAD_8, {0, MOVE_UP_STEP}},
69885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_NUMPAD_9, {MOVE_RIGHT_STEP, MOVE_UP_STEP}}};
70885b47fbSopenharmony_ci    const int32_t PRESSED_METAKEYS_TBL[ROW_COUNT][COLUMN_COUNT] = {
71885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_UNKNOWN, MMI::KeyEvent::KEYCODE_UNKNOWN, NONE_KEY},
72885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_UNKNOWN, MMI::KeyEvent::KEYCODE_CTRL_LEFT, CTRL_KEY},
73885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_UNKNOWN, MMI::KeyEvent::KEYCODE_CTRL_RIGHT, CTRL_KEY},
74885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_UNKNOWN, MMI::KeyEvent::KEYCODE_SHIFT_LEFT, SHIFT_KEY},
75885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_UNKNOWN, MMI::KeyEvent::KEYCODE_SHIFT_RIGHT, SHIFT_KEY},
76885b47fbSopenharmony_ci
77885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_CTRL_LEFT, MMI::KeyEvent::KEYCODE_UNKNOWN, CTRL_KEY},
78885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_CTRL_LEFT, MMI::KeyEvent::KEYCODE_CTRL_RIGHT, CTRL_KEY},
79885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_CTRL_LEFT, MMI::KeyEvent::KEYCODE_SHIFT_LEFT, CTRL_SHIFT_KEY},
80885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_CTRL_LEFT, MMI::KeyEvent::KEYCODE_SHIFT_RIGHT, CTRL_SHIFT_KEY},
81885b47fbSopenharmony_ci
82885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_CTRL_RIGHT, MMI::KeyEvent::KEYCODE_UNKNOWN, CTRL_KEY},
83885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_CTRL_RIGHT, MMI::KeyEvent::KEYCODE_CTRL_LEFT, CTRL_KEY},
84885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_CTRL_RIGHT, MMI::KeyEvent::KEYCODE_SHIFT_LEFT, CTRL_SHIFT_KEY},
85885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_CTRL_RIGHT, MMI::KeyEvent::KEYCODE_SHIFT_RIGHT, CTRL_SHIFT_KEY},
86885b47fbSopenharmony_ci
87885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_SHIFT_LEFT, MMI::KeyEvent::KEYCODE_UNKNOWN, SHIFT_KEY},
88885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_SHIFT_LEFT, MMI::KeyEvent::KEYCODE_CTRL_LEFT, CTRL_SHIFT_KEY},
89885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_SHIFT_LEFT, MMI::KeyEvent::KEYCODE_CTRL_RIGHT, CTRL_SHIFT_KEY},
90885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_SHIFT_LEFT, MMI::KeyEvent::KEYCODE_SHIFT_RIGHT, SHIFT_KEY},
91885b47fbSopenharmony_ci
92885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_SHIFT_RIGHT, MMI::KeyEvent::KEYCODE_UNKNOWN, SHIFT_KEY},
93885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_SHIFT_RIGHT, MMI::KeyEvent::KEYCODE_CTRL_LEFT, CTRL_SHIFT_KEY},
94885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_SHIFT_RIGHT, MMI::KeyEvent::KEYCODE_CTRL_RIGHT, CTRL_SHIFT_KEY},
95885b47fbSopenharmony_ci        {MMI::KeyEvent::KEYCODE_SHIFT_RIGHT, MMI::KeyEvent::KEYCODE_SHIFT_LEFT, SHIFT_KEY},
96885b47fbSopenharmony_ci    };
97885b47fbSopenharmony_ci} // namespace
98885b47fbSopenharmony_ci
99885b47fbSopenharmony_cibool AccessibilityMouseKey::OnPointerEvent(MMI::PointerEvent &event)
100885b47fbSopenharmony_ci{
101885b47fbSopenharmony_ci    HILOG_DEBUG();
102885b47fbSopenharmony_ci
103885b47fbSopenharmony_ci    int32_t sourceType = event.GetSourceType();
104885b47fbSopenharmony_ci    int32_t action = event.GetPointerAction();
105885b47fbSopenharmony_ci    std::vector<int32_t> pointers = event.GetPointerIds();
106885b47fbSopenharmony_ci    size_t pointerCount = pointers.size();
107885b47fbSopenharmony_ci    if ((sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE) &&
108885b47fbSopenharmony_ci        (action == MMI::PointerEvent::POINTER_ACTION_MOVE) &&
109885b47fbSopenharmony_ci        (pointerCount == ITEM_COUNT_1)) {
110885b47fbSopenharmony_ci        UpdateLastMouseEvent(event);
111885b47fbSopenharmony_ci    }
112885b47fbSopenharmony_ci    return false;
113885b47fbSopenharmony_ci}
114885b47fbSopenharmony_ci
115885b47fbSopenharmony_cibool AccessibilityMouseKey::OnKeyEvent(MMI::KeyEvent &event)
116885b47fbSopenharmony_ci{
117885b47fbSopenharmony_ci    HILOG_DEBUG();
118885b47fbSopenharmony_ci
119885b47fbSopenharmony_ci    int32_t actionKey = MMI::KeyEvent::KEYCODE_UNKNOWN;
120885b47fbSopenharmony_ci    int32_t metaKey1 = MMI::KeyEvent::KEYCODE_UNKNOWN;
121885b47fbSopenharmony_ci    int32_t metaKey2 = MMI::KeyEvent::KEYCODE_UNKNOWN;
122885b47fbSopenharmony_ci    std::vector<int32_t> pressedKeys = event.GetPressedKeys();
123885b47fbSopenharmony_ci    if (IsMouseKey(pressedKeys, actionKey, metaKey1, metaKey2)) {
124885b47fbSopenharmony_ci        return ExecuteMouseKey(actionKey, metaKey1, metaKey2);
125885b47fbSopenharmony_ci    }
126885b47fbSopenharmony_ci    return false;
127885b47fbSopenharmony_ci}
128885b47fbSopenharmony_ci
129885b47fbSopenharmony_civoid AccessibilityMouseKey::UpdateLastMouseEvent(const MMI::PointerEvent &event)
130885b47fbSopenharmony_ci{
131885b47fbSopenharmony_ci    HILOG_DEBUG();
132885b47fbSopenharmony_ci
133885b47fbSopenharmony_ci    lastMouseMoveEvent_ = std::make_shared<MMI::PointerEvent>(event);
134885b47fbSopenharmony_ci}
135885b47fbSopenharmony_ci
136885b47fbSopenharmony_cibool AccessibilityMouseKey::IsMouseKey(const std::vector<int32_t> &pressedKeys, int32_t &actionKey,
137885b47fbSopenharmony_ci    int32_t &metaKey1, int32_t &metaKey2) const
138885b47fbSopenharmony_ci{
139885b47fbSopenharmony_ci    HILOG_DEBUG();
140885b47fbSopenharmony_ci
141885b47fbSopenharmony_ci    size_t pressedKeyCount = pressedKeys.size();
142885b47fbSopenharmony_ci    if (pressedKeyCount == ITEM_COUNT_1) {
143885b47fbSopenharmony_ci        if (std::find(MOUSE_KEYCODE_V.begin(), MOUSE_KEYCODE_V.end(), pressedKeys[0]) != MOUSE_KEYCODE_V.end()) {
144885b47fbSopenharmony_ci            actionKey = pressedKeys[0];
145885b47fbSopenharmony_ci            return true;
146885b47fbSopenharmony_ci        }
147885b47fbSopenharmony_ci    } else if (pressedKeyCount == ITEM_COUNT_2) {
148885b47fbSopenharmony_ci        for (size_t i = 0; i < ITEM_COUNT_2; i++) {
149885b47fbSopenharmony_ci            if (std::find(MOUSE_MOVE_KEYCODE_V.begin(), MOUSE_MOVE_KEYCODE_V.end(), pressedKeys[i]) ==
150885b47fbSopenharmony_ci                MOUSE_MOVE_KEYCODE_V.end()) {
151885b47fbSopenharmony_ci                continue;
152885b47fbSopenharmony_ci            }
153885b47fbSopenharmony_ci            actionKey = pressedKeys[i];
154885b47fbSopenharmony_ci            size_t Index = (i + 1) % ITEM_COUNT_2;
155885b47fbSopenharmony_ci            if (std::find(CTRL_SHIFT_KEYCODE_V.begin(), CTRL_SHIFT_KEYCODE_V.end(), pressedKeys[Index]) !=
156885b47fbSopenharmony_ci                CTRL_SHIFT_KEYCODE_V.end()) {
157885b47fbSopenharmony_ci                metaKey1 = pressedKeys[Index];
158885b47fbSopenharmony_ci                return true;
159885b47fbSopenharmony_ci            }
160885b47fbSopenharmony_ci        }
161885b47fbSopenharmony_ci    } else if (pressedKeyCount == ITEM_COUNT_3) {
162885b47fbSopenharmony_ci        for (size_t i = 0; i < ITEM_COUNT_3; i++) {
163885b47fbSopenharmony_ci            if (std::find(MOUSE_MOVE_KEYCODE_V.begin(), MOUSE_MOVE_KEYCODE_V.end(), pressedKeys[i]) ==
164885b47fbSopenharmony_ci                MOUSE_MOVE_KEYCODE_V.end()) {
165885b47fbSopenharmony_ci                continue;
166885b47fbSopenharmony_ci            }
167885b47fbSopenharmony_ci            actionKey = pressedKeys[i];
168885b47fbSopenharmony_ci            size_t Index1 = (i + 1) % ITEM_COUNT_3;
169885b47fbSopenharmony_ci            size_t Index2 = (i + 2) % ITEM_COUNT_3;
170885b47fbSopenharmony_ci            if ((std::find(CTRL_SHIFT_KEYCODE_V.begin(), CTRL_SHIFT_KEYCODE_V.end(), pressedKeys[Index1]) !=
171885b47fbSopenharmony_ci                CTRL_SHIFT_KEYCODE_V.end()) &&
172885b47fbSopenharmony_ci                (std::find(CTRL_SHIFT_KEYCODE_V.begin(), CTRL_SHIFT_KEYCODE_V.end(), pressedKeys[Index2]) !=
173885b47fbSopenharmony_ci                CTRL_SHIFT_KEYCODE_V.end())) {
174885b47fbSopenharmony_ci                metaKey1 = pressedKeys[Index1];
175885b47fbSopenharmony_ci                metaKey2 = pressedKeys[Index2];
176885b47fbSopenharmony_ci                return true;
177885b47fbSopenharmony_ci            }
178885b47fbSopenharmony_ci        }
179885b47fbSopenharmony_ci    }
180885b47fbSopenharmony_ci    return false;
181885b47fbSopenharmony_ci}
182885b47fbSopenharmony_ci
183885b47fbSopenharmony_ciint32_t AccessibilityMouseKey::ParseMetaKey(int32_t metaKey1, int32_t metaKey2) const
184885b47fbSopenharmony_ci{
185885b47fbSopenharmony_ci    HILOG_DEBUG();
186885b47fbSopenharmony_ci    for (int32_t i = 0; i < ROW_COUNT; i++) {
187885b47fbSopenharmony_ci        if ((metaKey1 == PRESSED_METAKEYS_TBL[i][0]) && (metaKey2 == PRESSED_METAKEYS_TBL[i][1])) {
188885b47fbSopenharmony_ci            return PRESSED_METAKEYS_TBL[i][COLUMN_COUNT - 1];
189885b47fbSopenharmony_ci        }
190885b47fbSopenharmony_ci    }
191885b47fbSopenharmony_ci    return INVALID_KEY;
192885b47fbSopenharmony_ci}
193885b47fbSopenharmony_ci
194885b47fbSopenharmony_cibool AccessibilityMouseKey::ExecuteMouseKey(int32_t actionKey, int32_t metaKey1, int32_t metaKey2)
195885b47fbSopenharmony_ci{
196885b47fbSopenharmony_ci    HILOG_DEBUG("actionKey:%{public}d, metaKey1:%{public}d, metaKey2:%{public}d", actionKey, metaKey1, metaKey2);
197885b47fbSopenharmony_ci
198885b47fbSopenharmony_ci    if ((actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_1) ||
199885b47fbSopenharmony_ci        (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_2) ||
200885b47fbSopenharmony_ci        (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_3) ||
201885b47fbSopenharmony_ci        (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_4) ||
202885b47fbSopenharmony_ci        (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_6) ||
203885b47fbSopenharmony_ci        (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_7) ||
204885b47fbSopenharmony_ci        (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_8) ||
205885b47fbSopenharmony_ci        (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_9)) {
206885b47fbSopenharmony_ci        auto iter = MOUSE_MOVE_OFFSET_M.find(actionKey);
207885b47fbSopenharmony_ci        if (iter != MOUSE_MOVE_OFFSET_M.end()) {
208885b47fbSopenharmony_ci            int32_t offsetX = iter->second.offsetX;
209885b47fbSopenharmony_ci            int32_t offsetY = iter->second.offsetY;
210885b47fbSopenharmony_ci            int32_t result = ParseMetaKey(metaKey1, metaKey2);
211885b47fbSopenharmony_ci            if ((result == INVALID_KEY) || (result == CTRL_SHIFT_KEY)) {
212885b47fbSopenharmony_ci                return false;
213885b47fbSopenharmony_ci            }
214885b47fbSopenharmony_ci            if (result == CTRL_KEY) {
215885b47fbSopenharmony_ci                offsetX = static_cast<int32_t>(iter->second.offsetX * SPEED_UP_MULTIPLE);
216885b47fbSopenharmony_ci                offsetY = static_cast<int32_t>(iter->second.offsetY * SPEED_UP_MULTIPLE);
217885b47fbSopenharmony_ci            } else if (result == SHIFT_KEY) {
218885b47fbSopenharmony_ci                offsetX = static_cast<int32_t>(iter->second.offsetX * SLOW_DOWN_MULTIPLE);
219885b47fbSopenharmony_ci                offsetY = static_cast<int32_t>(iter->second.offsetY * SLOW_DOWN_MULTIPLE);
220885b47fbSopenharmony_ci            }
221885b47fbSopenharmony_ci            MoveMousePointer(offsetX, offsetY);
222885b47fbSopenharmony_ci        }
223885b47fbSopenharmony_ci    } else if (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_5) {
224885b47fbSopenharmony_ci        SendMouseClickEvent(SINGLE_CLICK);
225885b47fbSopenharmony_ci    } else if (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_DIVIDE) {
226885b47fbSopenharmony_ci        selectedKeyType_ = LEFT_KEY;
227885b47fbSopenharmony_ci    } else if (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_MULTIPLY) {
228885b47fbSopenharmony_ci        selectedKeyType_ = BOOTH_KEY;
229885b47fbSopenharmony_ci    } else if (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_SUBTRACT) {
230885b47fbSopenharmony_ci        selectedKeyType_ = RIGHT_KEY;
231885b47fbSopenharmony_ci    } else if (actionKey == MMI::KeyEvent::KEYCODE_NUMPAD_ADD) {
232885b47fbSopenharmony_ci        SendMouseClickEvent(DOUBLE_CLICK);
233885b47fbSopenharmony_ci    }
234885b47fbSopenharmony_ci    return true;
235885b47fbSopenharmony_ci}
236885b47fbSopenharmony_ci
237885b47fbSopenharmony_civoid AccessibilityMouseKey::MoveMousePointer(int32_t offsetX, int32_t offsetY)
238885b47fbSopenharmony_ci{
239885b47fbSopenharmony_ci    HILOG_DEBUG("offsetX:%{public}d, offsetY:%{public}d", offsetX, offsetY);
240885b47fbSopenharmony_ci
241885b47fbSopenharmony_ci    EventTransmission::OnMoveMouse(offsetX, offsetY);
242885b47fbSopenharmony_ci}
243885b47fbSopenharmony_ci
244885b47fbSopenharmony_civoid AccessibilityMouseKey::SendMouseClickEvent(CLICK_TYPE clickType)
245885b47fbSopenharmony_ci{
246885b47fbSopenharmony_ci    HILOG_DEBUG();
247885b47fbSopenharmony_ci
248885b47fbSopenharmony_ci    if (!lastMouseMoveEvent_) {
249885b47fbSopenharmony_ci        HILOG_DEBUG("No mouse event to be sent.");
250885b47fbSopenharmony_ci        return;
251885b47fbSopenharmony_ci    }
252885b47fbSopenharmony_ci
253885b47fbSopenharmony_ci    int64_t nowTime = GetSystemTime();
254885b47fbSopenharmony_ci    // Update event information.
255885b47fbSopenharmony_ci    lastMouseMoveEvent_->SetActionTime(nowTime);
256885b47fbSopenharmony_ci    lastMouseMoveEvent_->SetActionStartTime(nowTime);
257885b47fbSopenharmony_ci
258885b47fbSopenharmony_ci    // Update pointer item information.
259885b47fbSopenharmony_ci    int32_t pointerId = lastMouseMoveEvent_->GetPointerId();
260885b47fbSopenharmony_ci    MMI::PointerEvent::PointerItem item;
261885b47fbSopenharmony_ci    lastMouseMoveEvent_->GetPointerItem(pointerId, item);
262885b47fbSopenharmony_ci    item.SetDownTime(nowTime);
263885b47fbSopenharmony_ci    item.SetPressed(true);
264885b47fbSopenharmony_ci    lastMouseMoveEvent_->UpdatePointerItem(pointerId, item);
265885b47fbSopenharmony_ci
266885b47fbSopenharmony_ci    for (uint32_t clickCount = 0; clickCount < clickType; clickCount ++) {
267885b47fbSopenharmony_ci        HILOG_DEBUG("selectedKeyType:%{public}u", selectedKeyType_);
268885b47fbSopenharmony_ci        if (selectedKeyType_ == LEFT_KEY) {
269885b47fbSopenharmony_ci            PerformMouseAction(MMI::PointerEvent::MOUSE_BUTTON_LEFT, MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN);
270885b47fbSopenharmony_ci            PerformMouseAction(MMI::PointerEvent::MOUSE_BUTTON_LEFT, MMI::PointerEvent::POINTER_ACTION_BUTTON_UP);
271885b47fbSopenharmony_ci        } else if (selectedKeyType_ == RIGHT_KEY) {
272885b47fbSopenharmony_ci            PerformMouseAction(MMI::PointerEvent::MOUSE_BUTTON_RIGHT, MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN);
273885b47fbSopenharmony_ci            PerformMouseAction(MMI::PointerEvent::MOUSE_BUTTON_RIGHT, MMI::PointerEvent::POINTER_ACTION_BUTTON_UP);
274885b47fbSopenharmony_ci        } else if (selectedKeyType_ == BOOTH_KEY) {
275885b47fbSopenharmony_ci            PerformMouseAction(MMI::PointerEvent::MOUSE_BUTTON_LEFT, MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN);
276885b47fbSopenharmony_ci            PerformMouseAction(MMI::PointerEvent::MOUSE_BUTTON_RIGHT, MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN);
277885b47fbSopenharmony_ci
278885b47fbSopenharmony_ci            PerformMouseAction(MMI::PointerEvent::MOUSE_BUTTON_LEFT, MMI::PointerEvent::POINTER_ACTION_BUTTON_UP);
279885b47fbSopenharmony_ci            PerformMouseAction(MMI::PointerEvent::MOUSE_BUTTON_RIGHT, MMI::PointerEvent::POINTER_ACTION_BUTTON_UP);
280885b47fbSopenharmony_ci        }
281885b47fbSopenharmony_ci    }
282885b47fbSopenharmony_ci}
283885b47fbSopenharmony_ci
284885b47fbSopenharmony_civoid AccessibilityMouseKey::PerformMouseAction(int32_t buttonId, int32_t actionType)
285885b47fbSopenharmony_ci{
286885b47fbSopenharmony_ci    HILOG_DEBUG();
287885b47fbSopenharmony_ci
288885b47fbSopenharmony_ci    if (!lastMouseMoveEvent_) {
289885b47fbSopenharmony_ci        HILOG_DEBUG("No mouse event to be sent.");
290885b47fbSopenharmony_ci        return;
291885b47fbSopenharmony_ci    }
292885b47fbSopenharmony_ci    lastMouseMoveEvent_->SetButtonId(buttonId);
293885b47fbSopenharmony_ci    lastMouseMoveEvent_->SetButtonPressed(buttonId);
294885b47fbSopenharmony_ci    lastMouseMoveEvent_->SetPointerAction(actionType);
295885b47fbSopenharmony_ci    EventTransmission::OnPointerEvent(*lastMouseMoveEvent_);
296885b47fbSopenharmony_ci}
297885b47fbSopenharmony_ci
298885b47fbSopenharmony_ciint64_t AccessibilityMouseKey::GetSystemTime() const
299885b47fbSopenharmony_ci{
300885b47fbSopenharmony_ci    HILOG_DEBUG();
301885b47fbSopenharmony_ci
302885b47fbSopenharmony_ci    int64_t microsecond = Utils::GetSystemTime() * 1000;
303885b47fbSopenharmony_ci    return microsecond;
304885b47fbSopenharmony_ci}
305885b47fbSopenharmony_ci} // namespace Accessibility
306885b47fbSopenharmony_ci} // namespace OHOS