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