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