1 /*
2 * Copyright (C) 2022-2025 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_extension_context.h"
17 #include "accessible_ability_client.h"
18 #include "hilog_wrapper.h"
19 #include "ability_manager_client.h"
20 #include "accessibility_permission.h"
21 #include "api_reporter_helper.h"
22
23 using namespace std;
24
25 namespace OHOS {
26 namespace Accessibility {
27 int AccessibilityExtensionContext::illegalRequestCode_(-1);
28 const std::string WANT_VERIFY = "";
GetFocus(const int32_t focusType,AccessibilityElementInfo & elementInfo,bool systemApi)29 RetError AccessibilityExtensionContext::GetFocus(
30 const int32_t focusType, AccessibilityElementInfo& elementInfo, bool systemApi)
31 {
32 HILOG_DEBUG();
33 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
34 if (aaClient == nullptr) {
35 HILOG_ERROR("aaClient is nullptr");
36 return RET_ERR_NULLPTR;
37 }
38 return aaClient->GetFocus(focusType, elementInfo, systemApi);
39 }
40
GetFocusByElementInfo(const AccessibilityElementInfo & sourceInfo,const int32_t focusType,AccessibilityElementInfo & elementInfo)41 RetError AccessibilityExtensionContext::GetFocusByElementInfo(const AccessibilityElementInfo &sourceInfo,
42 const int32_t focusType, AccessibilityElementInfo &elementInfo)
43 {
44 HILOG_DEBUG();
45 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
46 if (aaClient == nullptr) {
47 HILOG_ERROR("aaClient is nullptr");
48 return RET_ERR_NULLPTR;
49 }
50 return aaClient->GetFocusByElementInfo(sourceInfo, focusType, elementInfo);
51 }
52
InjectGesture(const std::shared_ptr<AccessibilityGestureInjectPath> & gesturePath)53 RetError AccessibilityExtensionContext::InjectGesture(
54 const std::shared_ptr<AccessibilityGestureInjectPath> &gesturePath)
55 {
56 HILOG_DEBUG();
57 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
58 if (aaClient == nullptr) {
59 HILOG_ERROR("aaClient is nullptr");
60 return RET_ERR_NULLPTR;
61 }
62 return aaClient->InjectGesture(gesturePath);
63 }
64
GetRoot(AccessibilityElementInfo & elementInfo,bool systemApi)65 RetError AccessibilityExtensionContext::GetRoot(AccessibilityElementInfo &elementInfo, bool systemApi)
66 {
67 HILOG_DEBUG();
68 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
69 if (aaClient == nullptr) {
70 HILOG_ERROR("aaClient is nullptr");
71 return RET_ERR_NULLPTR;
72 }
73 return aaClient->GetRoot(elementInfo, systemApi);
74 }
75
GetRootByWindow(const AccessibilityWindowInfo & windowInfo,AccessibilityElementInfo & elementInfo,bool systemApi)76 RetError AccessibilityExtensionContext::GetRootByWindow(const AccessibilityWindowInfo &windowInfo,
77 AccessibilityElementInfo &elementInfo, bool systemApi)
78 {
79 HILOG_DEBUG();
80 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
81 if (aaClient == nullptr) {
82 HILOG_ERROR("aaClient is nullptr");
83 return RET_ERR_NULLPTR;
84 }
85 return aaClient->GetRootByWindow(windowInfo, elementInfo, systemApi);
86 }
87
GetWindows(std::vector<AccessibilityWindowInfo> & windows,bool systemApi)88 RetError AccessibilityExtensionContext::GetWindows(std::vector<AccessibilityWindowInfo> &windows, bool systemApi)
89 {
90 HILOG_DEBUG();
91 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
92 if (aaClient == nullptr) {
93 HILOG_ERROR("aaClient is nullptr");
94 return RET_ERR_NULLPTR;
95 }
96 return aaClient->GetWindows(windows, systemApi);
97 }
98
GetWindows(const uint64_t displayId,std::vector<AccessibilityWindowInfo> & windows,bool systemApi)99 RetError AccessibilityExtensionContext::GetWindows(const uint64_t displayId,
100 std::vector<AccessibilityWindowInfo> &windows, bool systemApi)
101 {
102 HILOG_DEBUG();
103 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
104 if (aaClient == nullptr) {
105 HILOG_ERROR("aaClient is nullptr");
106 return RET_ERR_NULLPTR;
107 }
108 return aaClient->GetWindows(displayId, windows, systemApi);
109 }
110
GetNext(const AccessibilityElementInfo & elementInfo,const FocusMoveDirection direction,AccessibilityElementInfo & nextElementInfo)111 RetError AccessibilityExtensionContext::GetNext(const AccessibilityElementInfo &elementInfo,
112 const FocusMoveDirection direction, AccessibilityElementInfo &nextElementInfo)
113 {
114 HILOG_DEBUG();
115 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
116 if (aaClient == nullptr) {
117 HILOG_ERROR("aaClient is nullptr");
118 return RET_ERR_NULLPTR;
119 }
120 return aaClient->GetNext(elementInfo, direction, nextElementInfo);
121 }
122
GetChildElementInfo(const int32_t index,const AccessibilityElementInfo & parent,AccessibilityElementInfo & child)123 RetError AccessibilityExtensionContext::GetChildElementInfo(const int32_t index,
124 const AccessibilityElementInfo &parent, AccessibilityElementInfo &child)
125 {
126 HILOG_DEBUG();
127 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
128 if (aaClient == nullptr) {
129 HILOG_ERROR("aaClient is nullptr");
130 return RET_ERR_NULLPTR;
131 }
132 return aaClient->GetChildElementInfo(index, parent, child);
133 }
134
GetByContent(const AccessibilityElementInfo & elementInfo,const std::string & text,std::vector<AccessibilityElementInfo> & elementInfos)135 RetError AccessibilityExtensionContext::GetByContent(const AccessibilityElementInfo &elementInfo,
136 const std::string &text, std::vector<AccessibilityElementInfo> &elementInfos)
137 {
138 HILOG_DEBUG();
139 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
140 if (aaClient == nullptr) {
141 HILOG_ERROR("aaClient is nullptr");
142 return RET_ERR_NULLPTR;
143 }
144 return aaClient->GetByContent(elementInfo, text, elementInfos);
145 }
146
GetParentElementInfo(const AccessibilityElementInfo & child,AccessibilityElementInfo & parent)147 RetError AccessibilityExtensionContext::GetParentElementInfo(const AccessibilityElementInfo &child,
148 AccessibilityElementInfo &parent)
149 {
150 HILOG_DEBUG();
151 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
152 if (aaClient == nullptr) {
153 HILOG_ERROR("aaClient is nullptr");
154 return RET_ERR_NULLPTR;
155 }
156 return aaClient->GetParentElementInfo(child, parent);
157 }
158
ExecuteAction(const AccessibilityElementInfo & elementInfo,const ActionType action,const std::map<std::string,std::string> & actionArguments)159 RetError AccessibilityExtensionContext::ExecuteAction(const AccessibilityElementInfo &elementInfo,
160 const ActionType action, const std::map<std::string, std::string> &actionArguments)
161 {
162 HILOG_DEBUG();
163 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
164 if (aaClient == nullptr) {
165 HILOG_ERROR("aaClient is nullptr");
166 return RET_ERR_NULLPTR;
167 }
168 return aaClient->ExecuteAction(elementInfo, action, actionArguments);
169 }
170
SetTargetBundleName(const std::vector<std::string> & targetBundleNames)171 RetError AccessibilityExtensionContext::SetTargetBundleName(const std::vector<std::string> &targetBundleNames)
172 {
173 HILOG_DEBUG();
174 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
175 if (aaClient == nullptr) {
176 HILOG_ERROR("aaClient is nullptr");
177 return RET_ERR_NULLPTR;
178 }
179 return aaClient->SetTargetBundleName(targetBundleNames);
180 }
181
StartAbility(const AAFwk::Want & want)182 RetError AccessibilityExtensionContext::StartAbility(const AAFwk::Want &want)
183 {
184 HILOG_DEBUG();
185 #ifdef ACCESSIBILITY_EMULATOR_DEFINED
186 ApiReportHelper reporter("AccessibilityExtensionContext.StartAbility");
187 #endif // ACCESSIBILITY_EMULATOR_DEFINED
188 if (!Permission::IsSystemApp()) {
189 HILOG_ERROR("Not system app");
190 return RET_ERR_NOT_SYSTEM_APP;
191 }
192
193 if (want.GetBundle() == WANT_VERIFY || want.GetElement().GetAbilityName() == WANT_VERIFY) {
194 HILOG_ERROR("Start ability failed, Want Parameter error.");
195 return RET_ERR_INVALID_PARAM;
196 }
197 HILOG_DEBUG("bundleName: %{public}s, abilityName: %{public}s",
198 want.GetBundle().c_str(), want.GetElement().GetAbilityName().c_str());
199
200 auto ret = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, illegalRequestCode_);
201 if (ret != ERR_OK) {
202 HILOG_ERROR("StartAbility is failed %{public}d", ret);
203 return RET_ERR_FAILED;
204 }
205 return RET_OK;
206 }
207
EnableScreenCurtain(const bool isEnable)208 RetError AccessibilityExtensionContext::EnableScreenCurtain(const bool isEnable)
209 {
210 HILOG_DEBUG();
211 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
212 if (aaClient == nullptr) {
213 HILOG_ERROR("aaClient is nullptr");
214 return RET_ERR_NULLPTR;
215 }
216 return aaClient->EnableScreenCurtain(isEnable);
217 }
218
GetElements(const int32_t windowId,const int64_t elementId,std::vector<AccessibilityElementInfo> & elementInfos)219 RetError AccessibilityExtensionContext::GetElements(const int32_t windowId, const int64_t elementId,
220 std::vector<AccessibilityElementInfo> &elementInfos)
221 {
222 HILOG_DEBUG();
223 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
224 if (aaClient == nullptr) {
225 HILOG_ERROR("aaClient is nullptr");
226 return RET_ERR_NULLPTR;
227 }
228 return aaClient->GetElements(windowId, elementId, elementInfos);
229 }
230
GetDefaultFocusedElementIds(const int32_t windowId,std::vector<AccessibilityElementInfo> & elementInfos)231 RetError AccessibilityExtensionContext::GetDefaultFocusedElementIds(const int32_t windowId,
232 std::vector<AccessibilityElementInfo> &elementInfos)
233 {
234 HILOG_DEBUG();
235 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
236 if (aaClient == nullptr) {
237 HILOG_ERROR("aaClient is nullptr");
238 return RET_ERR_NULLPTR;
239 }
240 return aaClient->GetDefaultFocusedElementIds(windowId, elementInfos);
241 }
242
HoldRunningLock()243 RetError AccessibilityExtensionContext::HoldRunningLock()
244 {
245 HILOG_DEBUG();
246 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
247 if (aaClient == nullptr) {
248 HILOG_ERROR("aaClient is nullptr");
249 return RET_ERR_NULLPTR;
250 }
251 return aaClient->HoldRunningLock();
252 }
253
UnholdRunningLock()254 RetError AccessibilityExtensionContext::UnholdRunningLock()
255 {
256 HILOG_DEBUG();
257 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
258 if (aaClient == nullptr) {
259 HILOG_ERROR("aaClient is nullptr");
260 return RET_ERR_NULLPTR;
261 }
262 return aaClient->UnholdRunningLock();
263 }
264
RegisterDisconnectCallback(std::shared_ptr<DisconnectCallback> & callback)265 RetError AccessibilityExtensionContext::RegisterDisconnectCallback(std::shared_ptr<DisconnectCallback> &callback)
266 {
267 HILOG_DEBUG();
268 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
269 if (aaClient == nullptr) {
270 HILOG_ERROR("aaClient is nullptr");
271 return RET_ERR_NULLPTR;
272 }
273 return aaClient->RegisterDisconnectCallback(callback);
274 }
275
UnRegisterDisconnectCallback(std::shared_ptr<DisconnectCallback> & callback)276 RetError AccessibilityExtensionContext::UnRegisterDisconnectCallback(std::shared_ptr<DisconnectCallback> &callback)
277 {
278 HILOG_DEBUG();
279 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
280 if (aaClient == nullptr) {
281 HILOG_ERROR("aaClient is nullptr");
282 return RET_ERR_NULLPTR;
283 }
284 return aaClient->UnRegisterDisconnectCallback(callback);
285 }
286
NotifyDisconnect()287 RetError AccessibilityExtensionContext::NotifyDisconnect()
288 {
289 HILOG_DEBUG();
290 sptr<AccessibleAbilityClient> aaClient = AccessibleAbilityClient::GetInstance();
291 if (aaClient == nullptr) {
292 HILOG_ERROR("aaClient is nullptr");
293 return RET_ERR_NULLPTR;
294 }
295 return aaClient->NotifyDisconnect();
296 }
297 } // namespace Accessibility
298 } // namespace OHOS