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
16 #include "mock_accessibility_element_operator_impl.h"
17 #include "accessibility_element_operator_callback_proxy.h"
18 #include "accessibility_element_operator_callback_stub.h"
19 #include "accessibility_element_operator_stub.h"
20 #include "accessibility_system_ability_client.h"
21 #include "hilog_wrapper.h"
22 #include "iremote_object.h"
23 #include "ipc_skeleton.h"
24 #include "ipc_types.h"
25 #include "parcel_util.h"
26
27 namespace OHOS {
28 namespace Accessibility {
29 namespace {
30 constexpr int32_t REQUEST_WINDOW_ID_MAX = 0x00007FFF;
31 constexpr uint32_t REQUEST_ID_MASK = 0x0000FFFF;
32 constexpr int32_t REQUEST_ID_MASK_BIT = 16;
33 } // namespaces
34
35 using AccessibilityElementOperatorCallbacks =
36 std::map<const int32_t, const sptr<IAccessibilityElementOperatorCallback>>;
MockAccessibilityElementOperatorImpl(int32_t windowId,const std::shared_ptr<AccessibilityElementOperator> & operation,AccessibilityElementOperatorCallback & callback)37 MockAccessibilityElementOperatorImpl::MockAccessibilityElementOperatorImpl(int32_t windowId,
38 const std::shared_ptr<AccessibilityElementOperator> &operation,
39 AccessibilityElementOperatorCallback &callback)
40 : windowId_(windowId), operatorCallback_(callback), operator_(operation)
41 {}
42
~MockAccessibilityElementOperatorImpl()43 MockAccessibilityElementOperatorImpl::~MockAccessibilityElementOperatorImpl()
44 {}
45
SearchElementInfoByAccessibilityId(const int64_t elementId,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback,const int32_t mode,bool isFilter)46 void MockAccessibilityElementOperatorImpl::SearchElementInfoByAccessibilityId(const int64_t elementId,
47 const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback>& callback, const int32_t mode,
48 bool isFilter)
49 {
50 int32_t mRequestId = AddRequest(requestId, callback);
51 if (operator_) {
52 operator_->SearchElementInfoByAccessibilityId(elementId, mRequestId, operatorCallback_, mode);
53 } else {
54 HILOG_ERROR("Operator is nullptr");
55 }
56 return;
57 }
58
SearchDefaultFocusedByWindowId(const int32_t windowId,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback,const int32_t mode,bool isFilter)59 void MockAccessibilityElementOperatorImpl::SearchDefaultFocusedByWindowId(const int32_t windowId,
60 const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback>& callback, const int32_t mode,
61 bool isFilter)
62 {
63 int32_t mRequestId = AddRequest(requestId, callback);
64 int32_t pageId = -1;
65 if (operator_) {
66 operator_->SearchDefaultFocusByWindowId(windowId, mRequestId, operatorCallback_, pageId);
67 } else {
68 HILOG_ERROR("Operator is nullptr");
69 }
70 return;
71 }
72
SearchElementInfosByText(const int64_t elementId,const std::string & text,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)73 void MockAccessibilityElementOperatorImpl::SearchElementInfosByText(const int64_t elementId, const std::string& text,
74 const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback>& callback)
75 {
76 int32_t mRequestId = AddRequest(requestId, callback);
77 if (operator_) {
78 operator_->SearchElementInfosByText(elementId, text, mRequestId, operatorCallback_);
79 } else {
80 HILOG_DEBUG("Can not find interaction object");
81 }
82 return;
83 }
84
FindFocusedElementInfo(const int64_t elementId,const int32_t focusType,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)85 void MockAccessibilityElementOperatorImpl::FindFocusedElementInfo(const int64_t elementId, const int32_t focusType,
86 const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback>& callback)
87 {
88 int32_t mRequestId = AddRequest(requestId, callback);
89 if (operator_) {
90 operator_->FindFocusedElementInfo(elementId, focusType, mRequestId, operatorCallback_);
91 } else {
92 HILOG_DEBUG("Can not find interaction object");
93 }
94 return;
95 }
96
FocusMoveSearch(const int64_t elementId,const int32_t direction,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)97 void MockAccessibilityElementOperatorImpl::FocusMoveSearch(const int64_t elementId, const int32_t direction,
98 const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback>& callback)
99 {
100 int32_t mRequestId = AddRequest(requestId, callback);
101 if (operator_) {
102 operator_->FocusMoveSearch(elementId, direction, mRequestId, operatorCallback_);
103 } else {
104 HILOG_DEBUG("Can not find interaction object");
105 }
106 return;
107 }
108
ExecuteAction(const int64_t elementId,const int32_t action,const std::map<std::string,std::string> & actionArguments,int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)109 void MockAccessibilityElementOperatorImpl::ExecuteAction(const int64_t elementId, const int32_t action,
110 const std::map<std::string, std::string> &actionArguments, int32_t requestId,
111 const sptr<IAccessibilityElementOperatorCallback>& callback)
112 {
113 int32_t mRequestId = AddRequest(requestId, callback);
114 if (operator_) {
115 operator_->ExecuteAction(elementId, action, actionArguments, mRequestId, operatorCallback_);
116 } else {
117 HILOG_DEBUG("Can not find interaction object");
118 }
119 return;
120 }
121
GetCursorPosition(const int64_t elementId,int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)122 void MockAccessibilityElementOperatorImpl::GetCursorPosition(const int64_t elementId, int32_t requestId,
123 const sptr<IAccessibilityElementOperatorCallback>& callback)
124 {
125 int32_t mRequestId = AddRequest(requestId, callback);
126 if (operator_) {
127 operator_->GetCursorPosition(elementId, mRequestId, operatorCallback_);
128 } else {
129 HILOG_DEBUG("Can not find interaction object");
130 }
131 return;
132 }
133
ClearFocus()134 void MockAccessibilityElementOperatorImpl::ClearFocus()
135 {
136 if (operator_) {
137 operator_->ClearFocus();
138 } else {
139 HILOG_DEBUG("Can not find interaction object");
140 }
141 return;
142 }
143
OutsideTouch()144 void MockAccessibilityElementOperatorImpl::OutsideTouch()
145 {
146 if (operator_ != nullptr) {
147 operator_->OutsideTouch();
148 } else {
149 HILOG_DEBUG("Can not find interaction object");
150 }
151 return;
152 }
GetWindowId()153 int32_t MockAccessibilityElementOperatorImpl::GetWindowId()
154 {
155 return windowId_;
156 }
157
AddRequest(int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)158 int32_t MockAccessibilityElementOperatorImpl::AddRequest(int32_t requestId,
159 const sptr<IAccessibilityElementOperatorCallback> &callback)
160 {
161 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
162 uint32_t compositionRequestId = static_cast<uint32_t>(requestId) & REQUEST_ID_MASK;
163
164 if (windowId_ < REQUEST_WINDOW_ID_MAX && windowId_ > 0) {
165 compositionRequestId &= static_cast<uint32_t>(windowId_) << REQUEST_ID_MASK_BIT;
166 } else {
167 HILOG_ERROR("window id[%{public}d] is wrong", windowId_);
168 return -1;
169 }
170
171 requestId = static_cast<int32_t>(compositionRequestId);
172 if (requests_.find(requestId) == requests_.end()) {
173 requests_[requestId] = callback;
174 }
175 return requestId;
176 }
177
SetSearchElementInfoByAccessibilityIdResult(const std::list<AccessibilityElementInfo> & infos,const int32_t requestId)178 void MockAccessibilityElementOperatorImpl::SetSearchElementInfoByAccessibilityIdResult(
179 const std::list<AccessibilityElementInfo>& infos, const int32_t requestId)
180 {
181 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
182 std::vector<AccessibilityElementInfo> myInfos(infos.begin(), infos.end());
183 auto iterator = requests_.find(requestId);
184 if (iterator != requests_.end()) {
185 if (iterator->second != nullptr) {
186 iterator->second->SetSearchElementInfoByAccessibilityIdResult(myInfos, requestId);
187 }
188 requests_.erase(iterator);
189 } else {
190 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
191 }
192 return;
193 }
194
SetSearchDefaultFocusByWindowIdResult(const std::list<AccessibilityElementInfo> & infos,const int32_t requestId)195 void MockAccessibilityElementOperatorImpl::SetSearchDefaultFocusByWindowIdResult(
196 const std::list<AccessibilityElementInfo>& infos, const int32_t requestId)
197 {
198 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
199 std::vector<AccessibilityElementInfo> myInfos(infos.begin(), infos.end());
200 auto iterator = requests_.find(requestId);
201 if (iterator != requests_.end()) {
202 if (iterator->second != nullptr) {
203 iterator->second->SetSearchDefaultFocusByWindowIdResult(myInfos, requestId);
204 }
205 requests_.erase(iterator);
206 } else {
207 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
208 }
209 return;
210 }
211
SetSearchElementInfoByTextResult(const std::list<AccessibilityElementInfo> & infos,const int32_t requestId)212 void MockAccessibilityElementOperatorImpl::SetSearchElementInfoByTextResult(
213 const std::list<AccessibilityElementInfo>& infos, const int32_t requestId)
214 {
215 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
216 std::vector<AccessibilityElementInfo> myInfos(infos.begin(), infos.end());
217 auto iterator = requests_.find(requestId);
218 if (iterator != requests_.end()) {
219 if (iterator->second != nullptr) {
220 iterator->second->SetSearchElementInfoByTextResult(myInfos, requestId);
221 }
222 requests_.erase(iterator);
223 } else {
224 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
225 }
226 return;
227 }
228
SetFindFocusedElementInfoResult(const AccessibilityElementInfo & info,const int32_t requestId)229 void MockAccessibilityElementOperatorImpl::SetFindFocusedElementInfoResult(
230 const AccessibilityElementInfo& info, const int32_t requestId)
231 {
232 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
233 auto iterator = requests_.find(requestId);
234 if (iterator != requests_.end()) {
235 if (iterator->second != nullptr) {
236 iterator->second->SetFindFocusedElementInfoResult(info, requestId);
237 }
238 requests_.erase(iterator);
239 } else {
240 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
241 }
242 return;
243 }
244
SetFocusMoveSearchResult(const AccessibilityElementInfo & info,const int32_t requestId)245 void MockAccessibilityElementOperatorImpl::SetFocusMoveSearchResult(
246 const AccessibilityElementInfo& info, const int32_t requestId)
247 {
248 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
249 auto iterator = requests_.find(requestId);
250 if (iterator != requests_.end()) {
251 if (iterator->second != nullptr) {
252 iterator->second->SetFocusMoveSearchResult(info, requestId);
253 }
254 requests_.erase(iterator);
255 } else {
256 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
257 }
258 return;
259 }
260
SetExecuteActionResult(const bool succeeded,const int32_t requestId)261 void MockAccessibilityElementOperatorImpl::SetExecuteActionResult(
262 const bool succeeded, const int32_t requestId)
263 {
264 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
265 auto iterator = requests_.find(requestId);
266 if (iterator != requests_.end()) {
267 if (iterator->second != nullptr) {
268 iterator->second->SetExecuteActionResult(succeeded, requestId);
269 }
270 requests_.erase(iterator);
271 } else {
272 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
273 }
274 return;
275 }
276
SetCursorPositionResult(const int32_t cursorPosition,const int32_t requestId)277 void MockAccessibilityElementOperatorImpl::SetCursorPositionResult(
278 const int32_t cursorPosition, const int32_t requestId)
279 {
280 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
281 auto iterator = requests_.find(requestId);
282 if (iterator != requests_.end()) {
283 if (iterator->second != nullptr) {
284 iterator->second->SetCursorPositionResult(cursorPosition, requestId);
285 }
286 requests_.erase(iterator);
287 } else {
288 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
289 }
290 return;
291 }
292
SetChildTreeIdAndWinId(const int64_t elementId,const int32_t treeId,const int32_t childWindowId)293 void MockAccessibilityElementOperatorImpl::SetChildTreeIdAndWinId(const int64_t elementId,
294 const int32_t treeId, const int32_t childWindowId)
295 {
296 if (operator_ != nullptr) {
297 operator_->SetChildTreeIdAndWinId(elementId, treeId, childWindowId);
298 } else {
299 HILOG_DEBUG("Can not find interaction object");
300 }
301 return;
302 }
303
SetBelongTreeId(const int32_t treeId)304 void MockAccessibilityElementOperatorImpl::SetBelongTreeId(const int32_t treeId)
305 {
306 if (operator_ != nullptr) {
307 operator_->SetBelongTreeId(treeId);
308 } else {
309 HILOG_DEBUG("Can not find interaction object");
310 }
311 return;
312 }
313
SetParentWindowId(const int32_t parentWindowId)314 void MockAccessibilityElementOperatorImpl::SetParentWindowId(const int32_t parentWindowId)
315 {
316 if (operator_ != nullptr) {
317 operator_->SetParentWindowId(parentWindowId);
318 } else {
319 HILOG_DEBUG("Can not find interaction object");
320 }
321 return;
322 }
323 } // namespace Accessibility
324 } // namespace OHOS