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