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