• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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