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