• 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 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