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
21 namespace OHOS {
22 namespace Accessibility {
23 namespace {
24 constexpr int32_t REQUEST_WINDOW_ID_MAX = 0x00007FFF;
25 constexpr uint32_t REQUEST_ID_MASK = 0x0000FFFF;
26 constexpr int32_t REQUEST_ID_MASK_BIT = 16;
27 } // namespaces
28
AccessibilityElementOperatorImpl(int32_t windowId,const std::shared_ptr<AccessibilityElementOperator> & operation,AccessibilityElementOperatorCallback & callback)29 AccessibilityElementOperatorImpl::AccessibilityElementOperatorImpl(int32_t windowId,
30 const std::shared_ptr<AccessibilityElementOperator> &operation,
31 AccessibilityElementOperatorCallback &callback)
32 : windowId_(windowId), operatorCallback_(callback), operator_(operation)
33 {
34 HILOG_DEBUG();
35 }
36
~AccessibilityElementOperatorImpl()37 AccessibilityElementOperatorImpl::~AccessibilityElementOperatorImpl()
38 {
39 HILOG_DEBUG();
40 }
41
SearchElementInfoByAccessibilityId(const int32_t elementId,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback,const int32_t mode)42 void AccessibilityElementOperatorImpl::SearchElementInfoByAccessibilityId(const int32_t elementId,
43 const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback, const int32_t mode)
44 {
45 HILOG_DEBUG();
46 int32_t mRequestId = AddRequest(requestId, callback);
47 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
48 if (operator_) {
49 operator_->SearchElementInfoByAccessibilityId(elementId, mRequestId, operatorCallback_, mode);
50 } else {
51 HILOG_ERROR("Operator is nullptr");
52 }
53 }
54
SearchElementInfosByText(const int32_t elementId,const std::string & text,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)55 void AccessibilityElementOperatorImpl::SearchElementInfosByText(const int32_t elementId,
56 const std::string &text, const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
57 {
58 HILOG_DEBUG();
59 int32_t mRequestId = AddRequest(requestId, callback);
60 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
61 if (operator_) {
62 operator_->SearchElementInfosByText(elementId, text, mRequestId, operatorCallback_);
63 } else {
64 HILOG_DEBUG("Can not find interaction object");
65 }
66 }
67
FindFocusedElementInfo(const int32_t elementId,const int32_t focusType,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)68 void AccessibilityElementOperatorImpl::FindFocusedElementInfo(const int32_t elementId,
69 const int32_t focusType, const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
70 {
71 HILOG_DEBUG();
72 int32_t mRequestId = AddRequest(requestId, callback);
73 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
74 if (operator_) {
75 operator_->FindFocusedElementInfo(elementId, focusType, mRequestId, operatorCallback_);
76 } else {
77 HILOG_DEBUG("Can not find interaction object");
78 }
79 }
80
FocusMoveSearch(const int32_t elementId,const int32_t direction,const int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)81 void AccessibilityElementOperatorImpl::FocusMoveSearch(const int32_t elementId,
82 const int32_t direction, const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
83 {
84 HILOG_DEBUG();
85 int32_t mRequestId = AddRequest(requestId, callback);
86 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
87 if (operator_) {
88 operator_->FocusMoveSearch(elementId, direction, mRequestId, operatorCallback_);
89 } else {
90 HILOG_DEBUG("Can not find interaction object");
91 }
92 }
93
ExecuteAction(const int32_t elementId,const int32_t action,const std::map<std::string,std::string> & actionArguments,int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)94 void AccessibilityElementOperatorImpl::ExecuteAction(const int32_t elementId,
95 const int32_t action, const std::map<std::string, std::string> &actionArguments,
96 int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
97 {
98 HILOG_DEBUG();
99 int32_t mRequestId = AddRequest(requestId, callback);
100 HILOG_DEBUG("add requestId[%{public}d]", mRequestId);
101 if (operator_) {
102 operator_->ExecuteAction(elementId, action, actionArguments, mRequestId, operatorCallback_);
103 } else {
104 HILOG_DEBUG("Can not find interaction object");
105 }
106 }
107
ClearFocus()108 void AccessibilityElementOperatorImpl::ClearFocus()
109 {
110 HILOG_DEBUG();
111 if (operator_) {
112 operator_->ClearFocus();
113 } else {
114 HILOG_DEBUG("Can not find interaction object");
115 }
116 }
117
OutsideTouch()118 void AccessibilityElementOperatorImpl::OutsideTouch()
119 {
120 HILOG_DEBUG();
121 if (operator_ != nullptr) {
122 operator_->OutsideTouch();
123 } else {
124 HILOG_DEBUG("Can not find interaction object");
125 }
126 }
127
GetWindowId()128 int32_t AccessibilityElementOperatorImpl::GetWindowId()
129 {
130 return windowId_;
131 }
132
AddRequest(int32_t requestId,const sptr<IAccessibilityElementOperatorCallback> & callback)133 int32_t AccessibilityElementOperatorImpl::AddRequest(int32_t requestId,
134 const sptr<IAccessibilityElementOperatorCallback> &callback)
135 {
136 std::lock_guard<std::mutex> lock(mutex_);
137 uint32_t compositionRequestId = static_cast<uint32_t>(requestId) & REQUEST_ID_MASK;
138
139 if (windowId_ < REQUEST_WINDOW_ID_MAX && windowId_ > 0) {
140 compositionRequestId |= static_cast<uint32_t>(windowId_) << REQUEST_ID_MASK_BIT;
141 } else {
142 HILOG_ERROR("window id[%{public}d] is wrong", windowId_);
143 return -1;
144 }
145
146 requestId = static_cast<int32_t>(compositionRequestId);
147 auto iter = requests_.find(requestId);
148 if (iter == requests_.end()) {
149 requests_[requestId] = callback;
150 }
151 return requestId;
152 }
153
SetSearchElementInfoByAccessibilityIdResult(const std::list<AccessibilityElementInfo> & infos,const int32_t requestId)154 void AccessibilityElementOperatorImpl::SetSearchElementInfoByAccessibilityIdResult(
155 const std::list<AccessibilityElementInfo> &infos, const int32_t requestId)
156 {
157 HILOG_DEBUG();
158 std::lock_guard<std::mutex> lock(mutex_);
159 std::vector<AccessibilityElementInfo> myInfos = TranslateListToVector(infos);
160 auto iter = requests_.find(requestId);
161 if (iter != requests_.end()) {
162 if (iter->second != nullptr) {
163 iter->second->SetSearchElementInfoByAccessibilityIdResult(myInfos, requestId);
164 }
165 requests_.erase(iter);
166 } else {
167 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
168 }
169 }
170
SetSearchElementInfoByTextResult(const std::list<AccessibilityElementInfo> & infos,const int32_t requestId)171 void AccessibilityElementOperatorImpl::SetSearchElementInfoByTextResult(
172 const std::list<AccessibilityElementInfo> &infos, const int32_t requestId)
173 {
174 HILOG_DEBUG();
175 std::lock_guard<std::mutex> lock(mutex_);
176 std::vector<AccessibilityElementInfo> myInfos = TranslateListToVector(infos);
177 auto iter = requests_.find(requestId);
178 if (iter != requests_.end()) {
179 if (iter->second != nullptr) {
180 iter->second->SetSearchElementInfoByTextResult(myInfos, requestId);
181 }
182 requests_.erase(iter);
183 } else {
184 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
185 }
186 }
187
SetFindFocusedElementInfoResult(const AccessibilityElementInfo & info,const int32_t requestId)188 void AccessibilityElementOperatorImpl::SetFindFocusedElementInfoResult(
189 const AccessibilityElementInfo &info, const int32_t requestId)
190 {
191 HILOG_DEBUG();
192 std::lock_guard<std::mutex> lock(mutex_);
193 auto iter = requests_.find(requestId);
194 if (iter != requests_.end()) {
195 if (iter->second != nullptr) {
196 iter->second->SetFindFocusedElementInfoResult(info, requestId);
197 }
198 requests_.erase(iter);
199 } else {
200 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
201 }
202 }
203
SetFocusMoveSearchResult(const AccessibilityElementInfo & info,const int32_t requestId)204 void AccessibilityElementOperatorImpl::SetFocusMoveSearchResult(
205 const AccessibilityElementInfo &info, const int32_t requestId)
206 {
207 HILOG_DEBUG();
208 std::lock_guard<std::mutex> lock(mutex_);
209 auto iter = requests_.find(requestId);
210 if (iter != requests_.end()) {
211 if (iter->second != nullptr) {
212 iter->second->SetFocusMoveSearchResult(info, requestId);
213 }
214 requests_.erase(iter);
215 } else {
216 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
217 }
218 }
219
SetExecuteActionResult(const bool succeeded,const int32_t requestId)220 void AccessibilityElementOperatorImpl::SetExecuteActionResult(
221 const bool succeeded, const int32_t requestId)
222 {
223 HILOG_DEBUG();
224 std::lock_guard<std::mutex> lock(mutex_);
225 auto iter = requests_.find(requestId);
226 if (iter != requests_.end()) {
227 if (iter->second != nullptr) {
228 iter->second->SetExecuteActionResult(succeeded, requestId);
229 }
230 requests_.erase(iter);
231 } else {
232 HILOG_DEBUG("Can't find the callback [requestId:%d]", requestId);
233 }
234 }
235 } // namespace Accessibility
236 } // namespace OHOS