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 "accessibility_element_operator_impl.h"
17 #include "accessibility_element_operator.h"
18 #include "accessibility_system_ability_client.h"
19 #include "hilog_wrapper.h"
20 #include <cinttypes>
21 namespace OHOS {
22 namespace Accessibility {
23 std::unordered_map<int32_t,
24 sptr<IAccessibilityElementOperatorCallback>> AccessibilityElementOperatorImpl::requests_ = {};
25 ffrt::mutex AccessibilityElementOperatorImpl::requestsMutex_;
26
AccessibilityElementOperatorImpl(int32_t windowId,const std::shared_ptr<AccessibilityElementOperator> & operation,AccessibilityElementOperatorCallback & callback)27 AccessibilityElementOperatorImpl::AccessibilityElementOperatorImpl(int32_t windowId,
28 const std::shared_ptr<AccessibilityElementOperator> &operation,
29 AccessibilityElementOperatorCallback &callback)
30 : windowId_(windowId), operatorCallback_(callback), operator_(operation)
31 {
32 HILOG_DEBUG();
33 }
34
~AccessibilityElementOperatorImpl()35 AccessibilityElementOperatorImpl::~AccessibilityElementOperatorImpl()
36 {
37 HILOG_DEBUG();
38 }
39
SearchElementInfoByAccessibilityId(const int64_t elementId,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback,const int32_t mode,bool isFilter)40 RetError AccessibilityElementOperatorImpl::SearchElementInfoByAccessibilityId(const int64_t elementId,
41 const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback, const int32_t mode,
42 bool isFilter)
43 {
44 RetError ret = RET_OK;
45 int32_t mRequestId = AddRequest(requestId, callback);
46 HILOG_DEBUG("search element add requestId[%{public}d], elementId[%{public}" PRId64 "], requestId[%{public}d]",
47 mRequestId, elementId, requestId);
48 callback->SetIsFilter(isFilter);
49 if (operator_) {
50 ret = operator_->SearchElementInfoByAccessibilityId(elementId, mRequestId, operatorCallback_, mode);
51 } else {
52 HILOG_ERROR("Operator is nullptr");
53 return RET_ERR_NULLPTR;
54 }
55 return ret;
56 }
57
SearchDefaultFocusedByWindowId(const int32_t windowId,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback,const int32_t mode,bool isFilter)58 void AccessibilityElementOperatorImpl::SearchDefaultFocusedByWindowId(const int32_t windowId,
59 const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback, const int32_t mode,
60 bool isFilter)
61 {
62 int32_t pageId = -1;
63 int32_t mRequestId = AddRequest(requestId, callback);
64 HILOG_DEBUG("search element add requestId[%{public}d], requestId[%{public}d], windowId is [%{public}d]",
65 mRequestId, requestId, windowId);
66 callback->SetIsFilter(isFilter);
67 if (operator_) {
68 operator_->SearchDefaultFocusByWindowId(windowId, mRequestId, operatorCallback_, pageId);
69 } else {
70 HILOG_ERROR("Operator is nullptr");
71 }
72 }
73
SearchElementInfosByText(const int64_t elementId,const std::string & text,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)74 void AccessibilityElementOperatorImpl::SearchElementInfosByText(const int64_t elementId,
75 const std::string &text, const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
76 {
77 HILOG_DEBUG();
78 int32_t mRequestId = AddRequest(requestId, callback);
79 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
80 if (operator_) {
81 operator_->SearchElementInfosByText(elementId, text, mRequestId, operatorCallback_);
82 } else {
83 HILOG_DEBUG("Can not find interaction object");
84 }
85 }
86
FindFocusedElementInfo(const int64_t elementId,const int32_t focusType,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)87 void AccessibilityElementOperatorImpl::FindFocusedElementInfo(const int64_t elementId,
88 const int32_t focusType, const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
89 {
90 HILOG_DEBUG();
91 int32_t mRequestId = AddRequest(requestId, callback);
92 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
93 if (operator_) {
94 operator_->FindFocusedElementInfo(elementId, focusType, mRequestId, operatorCallback_);
95 } else {
96 HILOG_DEBUG("Can not find interaction object");
97 }
98 }
99
FocusMoveSearch(const int64_t elementId,const int32_t direction,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)100 void AccessibilityElementOperatorImpl::FocusMoveSearch(const int64_t elementId,
101 const int32_t direction, const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
102 {
103 HILOG_DEBUG();
104 int32_t mRequestId = AddRequest(requestId, callback);
105 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
106 if (operator_) {
107 operator_->FocusMoveSearch(elementId, direction, mRequestId, operatorCallback_);
108 } else {
109 HILOG_DEBUG("Can not find interaction object");
110 }
111 }
112
ExecuteAction(const int64_t elementId,const int32_t action,const std::map<std::string,std::string> & actionArguments,int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)113 void AccessibilityElementOperatorImpl::ExecuteAction(const int64_t elementId,
114 const int32_t action, const std::map<std::string, std::string> &actionArguments,
115 int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
116 {
117 HILOG_DEBUG();
118 int32_t mRequestId = AddRequest(requestId, callback);
119 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
120 if (operator_) {
121 operator_->ExecuteAction(elementId, action, actionArguments, mRequestId, operatorCallback_);
122 } else {
123 HILOG_DEBUG("Can not find interaction object");
124 }
125 }
126
GetCursorPosition(const int64_t elementId,int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)127 void AccessibilityElementOperatorImpl::GetCursorPosition(const int64_t elementId,
128 int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
129 {
130 HILOG_DEBUG();
131 int32_t mRequestId = AddRequest(requestId, callback);
132 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
133 if (operator_) {
134 operator_->GetCursorPosition(elementId, mRequestId, operatorCallback_);
135 } else {
136 HILOG_DEBUG("Can not find interaction object");
137 }
138 }
139
ClearFocus()140 void AccessibilityElementOperatorImpl::ClearFocus()
141 {
142 HILOG_DEBUG();
143 if (operator_) {
144 operator_->ClearFocus();
145 } else {
146 HILOG_DEBUG("Can not find interaction object");
147 }
148 }
149
OutsideTouch()150 void AccessibilityElementOperatorImpl::OutsideTouch()
151 {
152 HILOG_DEBUG();
153 if (operator_ != nullptr) {
154 operator_->OutsideTouch();
155 } else {
156 HILOG_DEBUG("Can not find interaction object");
157 }
158 }
159
GetWindowId()160 int32_t AccessibilityElementOperatorImpl::GetWindowId()
161 {
162 return windowId_;
163 }
164
SetChildTreeIdAndWinId(const int64_t elementId,const int32_t childTreeId,const int32_t childWindowId)165 void AccessibilityElementOperatorImpl::SetChildTreeIdAndWinId(const int64_t elementId,
166 const int32_t childTreeId, const int32_t childWindowId)
167 {
168 HILOG_DEBUG("elementId:%{public}" PRId64 ", childTreeId:%{public}d, childWind:%{public}d",
169 elementId, childTreeId, childWindowId);
170 operator_->SetChildTreeIdAndWinId(elementId, childTreeId, childWindowId);
171 }
172
SetBelongTreeId(const int32_t treeId)173 void AccessibilityElementOperatorImpl::SetBelongTreeId(const int32_t treeId)
174 {
175 HILOG_DEBUG("treeId:[%{public}d]", treeId);
176 operator_->SetBelongTreeId(treeId);
177 }
178
SetParentWindowId(const int32_t parentWindowId)179 void AccessibilityElementOperatorImpl::SetParentWindowId(const int32_t parentWindowId)
180 {
181 HILOG_DEBUG("parentWindowId:[%{public}d]", parentWindowId);
182 operator_->SetParentWindowId(parentWindowId);
183 }
184
AddRequest(int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)185 int32_t AccessibilityElementOperatorImpl::AddRequest(int32_t requestId,
186 const sptr<IAccessibilityElementOperatorCallback> &callback)
187 {
188 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
189
190 auto iter = requests_.find(requestId);
191 if (iter == requests_.end()) {
192 requests_[requestId] = callback;
193 }
194 return requestId;
195 }
196
SetSearchElementInfoByAccessibilityIdResult(const std::list<AccessibilityElementInfo> & infos,const int32_t requestId)197 void AccessibilityElementOperatorImpl::SetSearchElementInfoByAccessibilityIdResult(
198 const std::list<AccessibilityElementInfo> &infos, const int32_t requestId)
199 {
200 HILOG_DEBUG("requestId is %{public}d", requestId);
201 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
202 std::vector<AccessibilityElementInfo> filterInfos(infos.begin(), infos.end());
203 auto iter = requests_.find(requestId);
204 if (iter != requests_.end()) {
205 if (iter->second != nullptr) {
206 HILOG_DEBUG("isFilter %{public}d", iter->second->GetFilter());
207 if (iter->second->GetFilter()) {
208 SetFiltering(filterInfos);
209 }
210 iter->second->SetSearchElementInfoByAccessibilityIdResult(filterInfos, requestId);
211 }
212 requests_.erase(iter);
213 } else {
214 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
215 }
216 }
217
SetSearchDefaultFocusByWindowIdResult(const std::list<AccessibilityElementInfo> & infos,const int32_t requestId)218 void AccessibilityElementOperatorImpl::SetSearchDefaultFocusByWindowIdResult(
219 const std::list<AccessibilityElementInfo> &infos, const int32_t requestId)
220 {
221 HILOG_DEBUG("requestId is %{public}d, infos size is %{public}zu", requestId, infos.size());
222 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
223 std::vector<AccessibilityElementInfo> filterInfos(infos.begin(), infos.end());
224 auto iter = requests_.find(requestId);
225 if (iter != requests_.end()) {
226 if (iter->second != nullptr) {
227 HILOG_DEBUG("isFilter %{public}d", iter->second->GetFilter());
228 if (iter->second->GetFilter()) {
229 SetFiltering(filterInfos);
230 }
231 iter->second->SetSearchDefaultFocusByWindowIdResult(filterInfos, requestId);
232 }
233 requests_.erase(iter);
234 } else {
235 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
236 }
237 }
238
SetFiltering(std::vector<AccessibilityElementInfo> & filterInfos)239 void AccessibilityElementOperatorImpl::SetFiltering(std::vector<AccessibilityElementInfo> &filterInfos)
240 {
241 for (auto &info : filterInfos) {
242 info.SetAccessibilityText("");
243 info.SetComponentResourceId("");
244 info.SetPagePath("");
245 info.SetError("");
246 info.SetLatestContent("");
247 info.SetContentList({});
248 }
249 }
250
SetSearchElementInfoByTextResult(const std::list<AccessibilityElementInfo> & infos,const int32_t requestId)251 void AccessibilityElementOperatorImpl::SetSearchElementInfoByTextResult(
252 const std::list<AccessibilityElementInfo> &infos, const int32_t requestId)
253 {
254 HILOG_DEBUG();
255 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
256 std::vector<AccessibilityElementInfo> myInfos(infos.begin(), infos.end());
257 auto iter = requests_.find(requestId);
258 if (iter != requests_.end()) {
259 if (iter->second != nullptr) {
260 iter->second->SetSearchElementInfoByTextResult(myInfos, requestId);
261 }
262 requests_.erase(iter);
263 } else {
264 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
265 }
266 }
267
SetFindFocusedElementInfoResult(const AccessibilityElementInfo & info,const int32_t requestId)268 void AccessibilityElementOperatorImpl::SetFindFocusedElementInfoResult(
269 const AccessibilityElementInfo &info, const int32_t requestId)
270 {
271 HILOG_DEBUG();
272 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
273 auto iter = requests_.find(requestId);
274 if (iter != requests_.end()) {
275 if (iter->second != nullptr) {
276 iter->second->SetFindFocusedElementInfoResult(info, requestId);
277 }
278 requests_.erase(iter);
279 } else {
280 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
281 }
282 }
283
SetFocusMoveSearchResult(const AccessibilityElementInfo & info,const int32_t requestId)284 void AccessibilityElementOperatorImpl::SetFocusMoveSearchResult(
285 const AccessibilityElementInfo &info, const int32_t requestId)
286 {
287 HILOG_DEBUG();
288 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
289 auto iter = requests_.find(requestId);
290 if (iter != requests_.end()) {
291 if (iter->second != nullptr) {
292 iter->second->SetFocusMoveSearchResult(info, requestId);
293 }
294 requests_.erase(iter);
295 } else {
296 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
297 }
298 }
299
SetExecuteActionResult(const bool succeeded,const int32_t requestId)300 void AccessibilityElementOperatorImpl::SetExecuteActionResult(
301 const bool succeeded, const int32_t requestId)
302 {
303 HILOG_DEBUG();
304 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
305 auto iter = requests_.find(requestId);
306 if (iter != requests_.end()) {
307 if (iter->second != nullptr) {
308 iter->second->SetExecuteActionResult(succeeded, requestId);
309 }
310 requests_.erase(iter);
311 } else {
312 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
313 }
314 }
315
316
SetCursorPositionResult(const int32_t cursorPosition,const int32_t requestId)317 void AccessibilityElementOperatorImpl::SetCursorPositionResult(const int32_t cursorPosition, const int32_t requestId)
318 {
319 HILOG_DEBUG();
320 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
321 auto iter = requests_.find(requestId);
322 if (iter != requests_.end()) {
323 if (iter->second != nullptr) {
324 iter->second->SetCursorPositionResult(cursorPosition, requestId);
325 }
326 requests_.erase(iter);
327 } else {
328 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
329 }
330 }
331
GetCallbackByRequestId(const int32_t requestId)332 sptr<IAccessibilityElementOperatorCallback> AccessibilityElementOperatorImpl::GetCallbackByRequestId(
333 const int32_t requestId)
334 {
335 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
336 auto iter = requests_.find(requestId);
337 if (iter == requests_.end()) {
338 return nullptr;
339 }
340 return iter->second;
341 }
342
EraseCallback(const int32_t requestId)343 void AccessibilityElementOperatorImpl::EraseCallback(const int32_t requestId)
344 {
345 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
346 auto iter = requests_.find(requestId);
347 if (iter != requests_.end()) {
348 requests_.erase(iter);
349 } else {
350 HILOG_DEBUG("Can't find the callback [requestId:%{public}d]", requestId);
351 }
352 }
353
SearchElementInfoBySpecificProperty(const int64_t elementId,const SpecificPropertyParam & param,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)354 void AccessibilityElementOperatorImpl::SearchElementInfoBySpecificProperty(const int64_t elementId,
355 const SpecificPropertyParam& param, const int32_t requestId,
356 const sptr<IAccessibilityElementOperatorCallback> &callback)
357 {
358 int32_t mRequestId = AddRequest(requestId, callback);
359 HILOG_DEBUG("search element add requestId[%{public}d], elementId[%{public}" PRId64 "], "
360 "requestId[%{public}d], propertyTarget[%{public}s], propertyType[%{public}u]",
361 mRequestId, elementId, requestId, param.propertyTarget.c_str(), static_cast<uint32_t>(param.propertyType));
362 if (operator_) {
363 operator_->SearchElementInfoBySpecificProperty(elementId, param, mRequestId, operatorCallback_);
364 } else {
365 HILOG_ERROR("Operator is nullptr");
366 return;
367 }
368 }
369
SetSearchElementInfoBySpecificPropertyResult(const std::list<AccessibilityElementInfo> & infos,const std::list<AccessibilityElementInfo> & treeInfos,const int32_t requestId)370 void AccessibilityElementOperatorImpl::SetSearchElementInfoBySpecificPropertyResult(
371 const std::list<AccessibilityElementInfo> &infos, const std::list<AccessibilityElementInfo> &treeInfos,
372 const int32_t requestId)
373 {
374 HILOG_DEBUG("requestId is %{public}d", requestId);
375 std::lock_guard<ffrt::mutex> lock(requestsMutex_);
376 std::vector<AccessibilityElementInfo> filterInfos(infos.begin(), infos.end());
377 auto iter = requests_.find(requestId);
378 if (iter != requests_.end()) {
379 if (iter->second != nullptr) {
380 HILOG_DEBUG("isFilter %{public}d", iter->second->GetFilter());
381 if (iter->second->GetFilter()) {
382 SetFiltering(filterInfos);
383 }
384 iter->second->SetSearchElementInfoBySpecificPropertyResult(infos, treeInfos, requestId);
385 }
386 requests_.erase(iter);
387 } else {
388 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
389 }
390 }
391 } // namespace Accessibility
392 } // namespace OHOS