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 "accessible_ability_manager_service.h"
17
18 #include <algorithm>
19 #include <cinttypes>
20 #include <new>
21 #include <string>
22 #include <unistd.h>
23 #include <functional>
24 #include <hitrace_meter.h>
25
26 #include "ability_info.h"
27 #include "accessibility_event_info.h"
28 #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER
29 #include "accessibility_power_manager.h"
30 #endif
31 #include "accessibility_short_key_dialog.h"
32 #include "accessibility_window_manager.h"
33 #include "hilog_wrapper.h"
34 #include "input_manager.h"
35 #include "iservice_registry.h"
36 #include "os_account_manager.h"
37 #include "parameter.h"
38 #include "system_ability_definition.h"
39 #include "utils.h"
40 #include "xcollie_helper.h"
41 #include <ipc_skeleton.h>
42 #include "transaction/rs_interfaces.h"
43 #include "resource_manager.h"
44 #include "res_config.h"
45 #include "bundle_info.h"
46 #include "locale_config.h"
47 #include "locale_info.h"
48
49 using namespace std;
50
51 namespace OHOS {
52 namespace Accessibility {
53 namespace {
54 const std::string AAMS_SERVICE_NAME = "AccessibleAbilityManagerService";
55 const std::string AAMS_ACTION_RUNNER_NAME = "AamsActionRunner";
56 const std::string AAMS_SEND_EVENT_RUNNER_NAME = "AamsSendEventRunner";
57 const std::string AAMS_INPUT_MANAGER_RUNNER_NAME = "AamsInputManagerRunner";
58 const std::string AAMS_GESTURE_RUNNER_NAME = "AamsGestureRunner";
59 const std::string AAMS_CHANNEL_RUNNER_NAME = "AamsChannelRunner";
60 const std::string AAMS_HOVER_ENTER_RUNNER_NAME = "AamsHoverEnterRunner";
61 const std::string AAMS_REGISTER_RUNNER_NAME = "AamsRegisterRunner";
62 const std::string UI_TEST_BUNDLE_NAME = "ohos.uitest";
63 const std::string UI_TEST_ABILITY_NAME = "uitestability";
64 const std::string SYSTEM_PARAMETER_AAMS_NAME = "accessibility.config.ready";
65 const std::string GRAPHIC_ANIMATION_SCALE_NAME = "persist.sys.graphic.animationscale";
66 const std::string ARKUI_ANIMATION_SCALE_NAME = "persist.sys.arkui.animationscale";
67 const std::string SCREEN_READER_BUNDLE_ABILITY_NAME = "com.huawei.hmos.screenreader/AccessibilityExtAbility";
68 const std::string DEVICE_PROVISIONED = "device_provisioned";
69 const std::string SCREEN_MAGNIFICATION_KEY = "accessibility_display_magnification_enabled";
70 const std::string SCREEN_MAGNIFICATION_TYPE = "accessibility_magnification_capability";
71 const std::string DELAY_UNLOAD_TASK = "TASK_UNLOAD_ACCESSIBILITY_SA";
72 const std::string USER_SETUP_COMPLETED = "user_setup_complete";
73 const std::string ACCESSIBILITY_CLONE_FLAG = "accessibility_config_clone";
74 const std::string SHORTCUT_ENABLED = "accessibility_shortcut_enabled";
75 constexpr int32_t INVALID_SHORTCUT_STATE = 2;
76 constexpr int32_t QUERY_USER_ID_RETRY_COUNT = 600;
77 constexpr int32_t QUERY_USER_ID_SLEEP_TIME = 50;
78 constexpr int32_t REQUEST_ID_MAX = 0xFFFFFFFF;
79 constexpr int32_t REQUEST_ID_MIN = 0x0000FFFF;
80 constexpr int32_t DEFAULT_ACCOUNT_ID = 100;
81 constexpr int32_t ROOT_UID = 0;
82 constexpr int32_t UNLOAD_TASK_INTERNAL = 3 * 60 * 1000; // ms
83 constexpr int32_t TREE_ID_INVALID = 0;
84 constexpr uint32_t ELEMENT_MOVE_BIT = 40;
85 constexpr int32_t SINGLE_TREE_ID = 0;
86 constexpr int32_t WINDOW_ID_INVALID = -1;
87 constexpr int64_t ELEMENT_ID_INVALID = -1;
88 enum SCREENREADER_STATE : int32_t {
89 UNINIT = -1,
90 OFF = 0,
91 ON = 1,
92 };
93 constexpr int32_t SHORT_KEY_TIMEOUT_BEFORE_USE = 3000; // ms
94 constexpr int32_t SHORT_KEY_TIMEOUT_AFTER_USE = 1000; // ms
95 const std::string TIMER_REGISTER_STATE_OBSERVER = "accessibility:registerStateObServer";
96 const std::string TIMER_REGISTER_CAPTION_OBSERVER = "accessibility:registerCaptionObServer";
97 const std::string TIMER_REGISTER_ENABLEABILITY_OBSERVER = "accessibility:registerEnableAbilityObServer";
98 const std::string TIMER_GET_ALL_CONFIG = "accessibility:getAllConfig";
99 const std::string TIMER_REGISTER_CONFIG_OBSERVER = "accessibility:registerConfigObserver";
100 constexpr int32_t XCOLLIE_TIMEOUT = 6; // s
101 } // namespace
102
103 const bool REGISTER_RESULT =
104 SystemAbility::MakeAndRegisterAbility(&Singleton<AccessibleAbilityManagerService>::GetInstance());
105
AccessibleAbilityManagerService()106 AccessibleAbilityManagerService::AccessibleAbilityManagerService()
107 : SystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, true)
108 {
109 HILOG_INFO("AccessibleAbilityManagerService is constructed");
110 dependentServicesStatus_[ABILITY_MGR_SERVICE_ID] = false;
111 dependentServicesStatus_[BUNDLE_MGR_SERVICE_SYS_ABILITY_ID] = false;
112 dependentServicesStatus_[COMMON_EVENT_SERVICE_ID] = false;
113 dependentServicesStatus_[DISPLAY_MANAGER_SERVICE_SA_ID] = false;
114 dependentServicesStatus_[SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN] = false;
115 dependentServicesStatus_[WINDOW_MANAGER_SERVICE_ID] = false;
116 dependentServicesStatus_[DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID] = false;
117
118 accessibilitySettings_ = std::make_shared<AccessibilitySettings>();
119 accessibilityShortKey_ = std::make_shared<AccessibilityShortKey>();
120 }
121
~AccessibleAbilityManagerService()122 AccessibleAbilityManagerService::~AccessibleAbilityManagerService()
123 {
124 HILOG_INFO("AccessibleAbilityManagerService::~AccessibleAbilityManagerService");
125
126 inputInterceptor_ = nullptr;
127 touchEventInjector_ = nullptr;
128 keyEventFilter_ = nullptr;
129 a11yAccountsData_.Clear();
130 }
131
InitHandler()132 void AccessibleAbilityManagerService::InitHandler()
133 {
134 if (!runner_) {
135 #ifdef ACCESSIBILITY_WATCH_FEATURE
136 runner_ = AppExecFwk::EventRunner::Create(AAMS_SERVICE_NAME);
137 #else
138 runner_ = AppExecFwk::EventRunner::Create(AAMS_SERVICE_NAME, AppExecFwk::ThreadMode::FFRT);
139 #endif // ACCESSIBILITY_WATCH_FEATURE
140 if (!runner_) {
141 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS runner failed");
142 return;
143 }
144 }
145
146 if (!handler_) {
147 handler_ = std::make_shared<AAMSEventHandler>(runner_);
148 if (!handler_) {
149 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS event handler failed");
150 return;
151 }
152 }
153 }
154
InitActionHandler()155 void AccessibleAbilityManagerService::InitActionHandler()
156 {
157 if (!actionRunner_) {
158 actionRunner_ = AppExecFwk::EventRunner::Create(AAMS_ACTION_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
159 if (!actionRunner_) {
160 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS action runner failed");
161 return;
162 }
163 }
164
165 if (!actionHandler_) {
166 actionHandler_ = std::make_shared<AAMSEventHandler>(actionRunner_);
167 if (!actionHandler_) {
168 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS action handler failed");
169 return;
170 }
171 }
172 }
173
InitSendEventHandler()174 void AccessibleAbilityManagerService::InitSendEventHandler()
175 {
176 if (!sendEventRunner_) {
177 sendEventRunner_ = AppExecFwk::EventRunner::Create(AAMS_SEND_EVENT_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
178 if (!sendEventRunner_) {
179 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS sendEvent runner failed");
180 return;
181 }
182 }
183
184 if (!sendEventHandler_) {
185 sendEventHandler_ = std::make_shared<AAMSEventHandler>(sendEventRunner_);
186 if (!sendEventHandler_) {
187 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS sendEvent handler failed");
188 return;
189 }
190 }
191 }
192
InitChannelHandler()193 void AccessibleAbilityManagerService::InitChannelHandler()
194 {
195 if (!channelRunner_) {
196 channelRunner_ = AppExecFwk::EventRunner::Create(AAMS_CHANNEL_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
197 if (!channelRunner_) {
198 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS channel runner failed");
199 return;
200 }
201 }
202
203 if (!channelHandler_) {
204 channelHandler_ = std::make_shared<AAMSEventHandler>(channelRunner_);
205 if (!channelHandler_) {
206 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS channel handler failed");
207 return;
208 }
209 }
210 }
211
InitInputManagerHandler()212 void AccessibleAbilityManagerService::InitInputManagerHandler()
213 {
214 if (!inputManagerRunner_) {
215 inputManagerRunner_ = AppExecFwk::EventRunner::Create(AAMS_INPUT_MANAGER_RUNNER_NAME,
216 AppExecFwk::ThreadMode::FFRT);
217 if (!inputManagerRunner_) {
218 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS input manager runner failed");
219 return;
220 }
221 }
222 }
223
InitGestureHandler()224 void AccessibleAbilityManagerService::InitGestureHandler()
225 {
226 if (!gestureRunner_) {
227 gestureRunner_ = AppExecFwk::EventRunner::Create(AAMS_GESTURE_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
228 if (!gestureRunner_) {
229 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS gesture runner failed");
230 return;
231 }
232 }
233 }
234
InitHoverEnterHandler()235 void AccessibleAbilityManagerService::InitHoverEnterHandler()
236 {
237 if (!hoverEnterRunner_) {
238 hoverEnterRunner_ = AppExecFwk::EventRunner::Create(AAMS_HOVER_ENTER_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
239 if (!hoverEnterRunner_) {
240 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS hoverEnter runner failed");
241 return;
242 }
243 }
244
245 if (!hoverEnterHandler_) {
246 hoverEnterHandler_ = std::make_shared<AAMSEventHandler>(hoverEnterRunner_);
247 if (!hoverEnterHandler_) {
248 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS hoverEnter handler failed");
249 return;
250 }
251 }
252 }
253
InitRegisterHandler()254 void AccessibleAbilityManagerService::InitRegisterHandler()
255 {
256 if (!registerRunner_) {
257 registerRunner_ = AppExecFwk::EventRunner::Create(AAMS_REGISTER_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
258 if (!registerRunner_) {
259 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS register runner failed");
260 return;
261 }
262 }
263
264 if (!registerHandler_) {
265 registerHandler_ = std::make_shared<AAMSEventHandler>(registerRunner_);
266 if (!registerHandler_) {
267 HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS register handler failed");
268 return;
269 }
270 }
271 }
272
OnStart()273 void AccessibleAbilityManagerService::OnStart()
274 {
275 HILOG_INFO("AccessibleAbilityManagerService::OnStart start");
276
277 InitHandler();
278 InitActionHandler();
279 InitSendEventHandler();
280 InitChannelHandler();
281 InitInputManagerHandler();
282 InitGestureHandler();
283 InitHoverEnterHandler();
284 InitRegisterHandler();
285
286 SetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false");
287
288 HILOG_DEBUG("AddAbilityListener!");
289 AddSystemAbilityListener(ABILITY_MGR_SERVICE_ID);
290 AddSystemAbilityListener(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
291 AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
292 AddSystemAbilityListener(DISPLAY_MANAGER_SERVICE_SA_ID);
293 AddSystemAbilityListener(SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN);
294 AddSystemAbilityListener(WINDOW_MANAGER_SERVICE_ID);
295 AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
296
297 accessibilitySettings_->RegisterSettingsHandler(handler_);
298 }
299
OnStop()300 void AccessibleAbilityManagerService::OnStop()
301 {
302 HILOG_INFO("stop AccessibleAbilityManagerService");
303 if (!handler_) {
304 HILOG_ERROR("AccessibleAbilityManagerService::OnStop failed!");
305 return;
306 }
307
308 ffrt::promise<void> syncPromise;
309 ffrt::future syncFuture = syncPromise.get_future();
310 handler_->PostTask([this, &syncPromise]() {
311 HILOG_DEBUG();
312
313 Singleton<AccessibilityCommonEvent>::GetInstance().UnSubscriberEvent();
314 Singleton<AccessibilityDisplayManager>::GetInstance().UnregisterDisplayListener();
315 Singleton<AccessibilityWindowManager>::GetInstance().DeregisterWindowListener();
316
317 currentAccountId_ = -1;
318 a11yAccountsData_.Clear();
319 stateObservers_.Clear();
320 bundleManager_ = nullptr;
321 inputInterceptor_ = nullptr;
322 touchEventInjector_ = nullptr;
323 keyEventFilter_ = nullptr;
324 stateObserversDeathRecipient_ = nullptr;
325 bundleManagerDeathRecipient_ = nullptr;
326
327 syncPromise.set_value();
328 }, "TASK_ONSTOP");
329 syncFuture.wait();
330
331 for (auto &iter : dependentServicesStatus_) {
332 iter.second = false;
333 }
334
335 isReady_ = false;
336 isPublished_ = false;
337 SetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false");
338 HILOG_INFO("AccessibleAbilityManagerService::OnStop OK.");
339 }
340
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)341 void AccessibleAbilityManagerService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
342 {
343 HILOG_DEBUG("systemAbilityId:%{public}d added!", systemAbilityId);
344 if (!handler_) {
345 HILOG_DEBUG("Event handler is nullptr.");
346 return;
347 }
348
349 handler_->PostTask([=]() {
350 auto iter = dependentServicesStatus_.find(systemAbilityId);
351 if (iter == dependentServicesStatus_.end()) {
352 HILOG_ERROR("SystemAbilityId is not found!");
353 return;
354 }
355
356 dependentServicesStatus_[systemAbilityId] = true;
357 if (std::any_of(dependentServicesStatus_.begin(), dependentServicesStatus_.end(),
358 [](const std::map<int32_t, bool>::value_type &status) { return !status.second; })) {
359 HILOG_DEBUG("Not all the dependence is ready!");
360 return;
361 }
362
363 if (Init() == false) {
364 HILOG_ERROR("AccessibleAbilityManagerService::Init failed!");
365 return;
366 }
367
368 if (!isPublished_) {
369 if (Publish(this) == false) {
370 HILOG_ERROR("AccessibleAbilityManagerService::Publish failed!");
371 return;
372 }
373 isPublished_ = true;
374 }
375
376 InitInnerResource();
377
378 isReady_ = true;
379 SetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "true");
380 HILOG_DEBUG("AAMS is ready!");
381 RegisterShortKeyEvent();
382 PostDelayUnloadTask();
383 RegisterScreenMagnificationState();
384 RegisterScreenMagnificationType();
385 }, "OnAddSystemAbility");
386 }
387
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)388 void AccessibleAbilityManagerService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
389 {
390 HILOG_INFO("systemAbilityId:%{public}d removed!", systemAbilityId);
391 Utils::RecordOnRemoveSystemAbility(systemAbilityId);
392 if (!handler_) {
393 HILOG_DEBUG("Event handler is nullptr.");
394 return;
395 }
396
397 handler_->PostTask([=]() {
398 HILOG_INFO("Remove system ability start");
399 auto iter = dependentServicesStatus_.find(systemAbilityId);
400 if (iter == dependentServicesStatus_.end()) {
401 HILOG_ERROR("SystemAbilityId is not found!");
402 return;
403 }
404
405 dependentServicesStatus_[systemAbilityId] = false;
406 if (isReady_) {
407 SwitchedUser(-1);
408 Singleton<AccessibilityCommonEvent>::GetInstance().UnSubscriberEvent();
409 Singleton<AccessibilityDisplayManager>::GetInstance().UnregisterDisplayListener();
410 Singleton<AccessibilityWindowManager>::GetInstance().DeregisterWindowListener();
411 Singleton<AccessibilityWindowManager>::GetInstance().DeInit();
412
413 isReady_ = false;
414 SetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false");
415 }
416 }, "OnRemoveSystemAbility");
417 }
418
Dump(int fd,const std::vector<std::u16string> & args)419 int AccessibleAbilityManagerService::Dump(int fd, const std::vector<std::u16string>& args)
420 {
421 HILOG_DEBUG("dump AccessibilityManagerServiceInfo");
422 if (!handler_) {
423 HILOG_ERROR("Parameters check failed!");
424 return RET_ERR_NULLPTR;
425 }
426 ffrt::promise<int> syncPromise;
427 ffrt::future syncFuture = syncPromise.get_future();
428 handler_->PostTask([this, &syncPromise, fd, args]() {
429 if (!accessibilityDumper_) {
430 accessibilityDumper_ = new(std::nothrow) AccessibilityDumper();
431 if (!accessibilityDumper_) {
432 HILOG_ERROR("accessibilityDumper_ is nullptr");
433 syncPromise.set_value(-1);
434 return;
435 }
436 }
437 syncPromise.set_value(accessibilityDumper_->Dump(fd, args));
438 }, "TASK_DUMP_INFO");
439 return syncFuture.get();
440 }
441
VerifyingToKenId(const int32_t windowId,const int64_t elementId)442 RetError AccessibleAbilityManagerService::VerifyingToKenId(const int32_t windowId, const int64_t elementId)
443 {
444 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
445 int32_t treeId = (static_cast<uint64_t>(elementId) >> ELEMENT_MOVE_BIT);
446 HILOG_DEBUG("VerifyingToKenId: treeId[%{public}d], windowId[%{public}d], elementId[%{public}" PRId64 "]",
447 treeId, windowId, elementId);
448 if (elementId == ELEMENT_ID_INVALID || windowId == WINDOW_ID_INVALID) {
449 HILOG_DEBUG("windowId[%{public}d], elementId[%{public}" PRId64 "]", windowId, elementId);
450 return RET_OK;
451 }
452
453 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
454 if (accountData == nullptr) {
455 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
456 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
457 HILOG_ERROR("Get current account data failed!!");
458 return RET_ERR_CONNECTION_EXIST;
459 }
460 HILOG_DEBUG("treeId %{public}d, windowId %{public}d", treeId, windowId);
461 int32_t realId =
462 Singleton<AccessibilityWindowManager>::GetInstance().ConvertToRealWindowId(windowId, FOCUS_TYPE_INVALID);
463 sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(realId);
464 if (connection == nullptr) {
465 HILOG_ERROR("connection is empty.");
466 return RET_ERR_REGISTER_EXIST;
467 }
468 uint32_t expectTokenId = connection->GetTokenIdMap(treeId);
469 if (tokenId != expectTokenId) {
470 HILOG_ERROR("tokenId error!");
471 return RET_ERR_TOKEN_ID;
472 }
473
474 return RET_OK;
475 }
476
SendEvent(const AccessibilityEventInfo & uiEvent,const int32_t flag)477 RetError AccessibleAbilityManagerService::SendEvent(const AccessibilityEventInfo &uiEvent, const int32_t flag)
478 {
479 EventType eventType = uiEvent.GetEventType();
480
481 HILOG_DEBUG("eventType[%{public}d] gestureId[%{public}d] windowId[%{public}d] compnentId: %{public}" PRId64 " "
482 "elementId: %{public}" PRId64 " winId: %{public}d innerWinId: %{public}d treeId: %{public}d",
483 uiEvent.GetEventType(), uiEvent.GetGestureType(), uiEvent.GetWindowId(), uiEvent.GetAccessibilityId(),
484 uiEvent.GetElementInfo().GetAccessibilityId(), uiEvent.GetElementInfo().GetWindowId(),
485 uiEvent.GetElementInfo().GetInnerWindowId(), uiEvent.GetElementInfo().GetBelongTreeId());
486 if (!sendEventHandler_ || !hoverEnterHandler_) {
487 HILOG_ERROR("Parameters check failed!");
488 return RET_ERR_NULLPTR;
489 }
490 if (flag) {
491 if (VerifyingToKenId(uiEvent.GetElementInfo().GetWindowId(),
492 uiEvent.GetElementInfo().GetAccessibilityId()) == RET_OK) {
493 } else {
494 HILOG_ERROR("VerifyingToKenId failed");
495 return RET_ERR_CONNECTION_EXIST;
496 }
497 }
498
499 RetError res = GetResourceBundleInfo(const_cast<AccessibilityEventInfo&>(uiEvent));
500 if (res != RET_OK) {
501 HILOG_ERROR("Get Resource BundleInfo failed! RetError is %{public}d", res);
502 }
503
504 auto sendEventTask = [this, uiEvent]() {
505 HILOG_DEBUG();
506 UpdateAccessibilityWindowStateByEvent(uiEvent);
507 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
508 if (!accountData) {
509 HILOG_ERROR("accountData is nullptr.");
510 return;
511 }
512
513 const_cast<AccessibilityEventInfo&>(uiEvent).SetTimeStamp(Utils::GetSystemTime());
514 map<string, sptr<AccessibleAbilityConnection>> abilities = accountData->GetConnectedA11yAbilities();
515 for (auto &ability : abilities) {
516 if (ability.second) {
517 ability.second->OnAccessibilityEvent(const_cast<AccessibilityEventInfo&>(uiEvent));
518 }
519 }
520 };
521
522 if (eventType == TYPE_VIEW_HOVER_ENTER_EVENT) {
523 hoverEnterHandler_->PostTask(sendEventTask, "TASK_SEND_EVENT");
524 } else {
525 sendEventHandler_->PostTask(sendEventTask, "TASK_SEND_EVENT");
526 }
527
528 return RET_OK;
529 }
530
RegisterStateObserver(const sptr<IAccessibleAbilityManagerStateObserver> & stateObserver)531 uint32_t AccessibleAbilityManagerService::RegisterStateObserver(
532 const sptr<IAccessibleAbilityManagerStateObserver>& stateObserver)
533 {
534 HILOG_DEBUG();
535 if (!stateObserver || !handler_) {
536 HILOG_ERROR("parameters check failed!");
537 return 0;
538 }
539 XCollieHelper timer(TIMER_REGISTER_STATE_OBSERVER, XCOLLIE_TIMEOUT);
540 std::lock_guard<ffrt::mutex> lock(mutex_);
541 if (!stateObserversDeathRecipient_) {
542 stateObserversDeathRecipient_ = new(std::nothrow) StateCallbackDeathRecipient();
543 if (!stateObserversDeathRecipient_) {
544 HILOG_ERROR("stateObserversDeathRecipient_ is null");
545 return 0;
546 }
547 }
548
549 if (!stateObserver->AsObject()) {
550 HILOG_ERROR("object is null");
551 return 0;
552 }
553
554 stateObserver->AsObject()->AddDeathRecipient(stateObserversDeathRecipient_);
555 stateObservers_.AddStateObserver(stateObserver);
556 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
557 if (accountData == nullptr) {
558 return 0;
559 }
560
561 return accountData->GetAccessibilityState();
562 }
563
GetRealWindowAndElementId(int32_t & windowId,int64_t & elementId)564 void AccessibleAbilityManagerService::GetRealWindowAndElementId(int32_t& windowId, int64_t& elementId)
565 {
566 HILOG_DEBUG("real windowId %{public}d", windowId);
567 if (!handler_) {
568 return;
569 }
570
571 ffrt::promise<void> syncPromise;
572 ffrt::future syncFuture = syncPromise.get_future();
573 handler_->PostTask([&, this]() {
574 Singleton<AccessibilityWindowManager>::GetInstance().GetRealWindowAndElementId(windowId, elementId);
575 syncPromise.set_value();
576 }, "GET_REAL_WINDOW_AND_ELEMENT_ID");
577 return syncFuture.get();
578 }
579
GetSceneBoardInnerWinId(int32_t windowId,int64_t elementId,int32_t & innerWid)580 void AccessibleAbilityManagerService::GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId,
581 int32_t& innerWid)
582 {
583 HILOG_DEBUG("real windowId %{public}d", windowId);
584 if (!handler_) {
585 return;
586 }
587
588 ffrt::promise<void> syncPromise;
589 ffrt::future syncFuture = syncPromise.get_future();
590 handler_->PostTask([&, this]() {
591 Singleton<AccessibilityWindowManager>::GetInstance().GetSceneBoardInnerWinId(windowId, elementId, innerWid);
592 syncPromise.set_value();
593 }, "GET_SCENE_BOARD_INNER_WINDOW_ID");
594 return syncFuture.get();
595 }
596
GetRealIdConnection()597 sptr<AccessibilityWindowConnection> AccessibleAbilityManagerService::GetRealIdConnection()
598 {
599 HILOG_DEBUG();
600 int32_t windowId = ANY_WINDOW_ID;
601 int32_t focusType = FOCUS_TYPE_ACCESSIBILITY;
602 int32_t realId = Singleton<AccessibilityWindowManager>::GetInstance().ConvertToRealWindowId(windowId, focusType);
603
604 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
605 if (!accountData) {
606 HILOG_ERROR("GetCurrentAccountData failed");
607 return sptr<AccessibilityWindowConnection>();
608 }
609 return accountData->GetAccessibilityWindowConnection(realId);
610 }
611
FindFocusedElementByConnection(sptr<AccessibilityWindowConnection> connection,AccessibilityElementInfo & elementInfo)612 bool AccessibleAbilityManagerService::FindFocusedElementByConnection(sptr<AccessibilityWindowConnection> connection,
613 AccessibilityElementInfo &elementInfo)
614 {
615 HILOG_DEBUG();
616 int64_t elementId = -1;
617 int32_t focusType = FOCUS_TYPE_ACCESSIBILITY;
618 if (!connection || !connection->GetProxy()) {
619 HILOG_ERROR("GetAccessibilityWindowConnection failed");
620 return false;
621 }
622
623 uint32_t timeOut = 5000;
624 sptr<ElementOperatorCallbackImpl> focusCallback = new(std::nothrow) ElementOperatorCallbackImpl();
625 if (!focusCallback) {
626 HILOG_ERROR("Failed to create focusCallback.");
627 return false;
628 }
629 ffrt::future<void> focusFuture = focusCallback->promise_.get_future();
630 connection->GetProxy()->FindFocusedElementInfo(elementId, focusType, GenerateRequestId(), focusCallback);
631 ffrt::future_status waitFocus = focusFuture.wait_for(std::chrono::milliseconds(timeOut));
632 if (waitFocus != ffrt::future_status::ready) {
633 HILOG_ERROR("FindFocusedElementInfo Failed to wait result");
634 return false;
635 }
636 elementInfo = focusCallback->accessibilityInfoResult_;
637 return true;
638 }
639
FindFocusedElement(AccessibilityElementInfo & elementInfo,uint32_t timeout)640 bool AccessibleAbilityManagerService::FindFocusedElement(AccessibilityElementInfo &elementInfo, uint32_t timeout)
641 {
642 HILOG_DEBUG();
643 if (timeout > TIME_OUT_OPERATOR) {
644 HILOG_ERROR("invalid timeout value!");
645 return false;
646 }
647 sptr<AccessibilityWindowConnection> connection = GetRealIdConnection();
648 FindFocusedElementByConnection(connection, elementInfo);
649 if (elementInfo.GetAccessibilityId() >= 0) {
650 HILOG_DEBUG("find focused element success.");
651 return true;
652 }
653 int32_t windowId = GetFocusWindowId();
654 int64_t elementId = GetFocusElementId();
655 sptr<IAccessibilityElementOperator> elementOperator = nullptr;
656 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
657 RETURN_FALSE_IF_NULL(accountData);
658 int32_t realId =
659 Singleton<AccessibilityWindowManager>::GetInstance().ConvertToRealWindowId(windowId, FOCUS_TYPE_INVALID);
660 connection = accountData->GetAccessibilityWindowConnection(realId);
661 HILOG_DEBUG("windowId[%{public}d], elementId[%{public}" PRId64 "]", windowId, elementId);
662 RETURN_FALSE_IF_NULL(connection);
663 sptr<ElementOperatorCallbackImpl> callBack = new(std::nothrow) ElementOperatorCallbackImpl();
664 RETURN_FALSE_IF_NULL(callBack);
665 ffrt::future<void> promiseFuture = callBack->promise_.get_future();
666 GetElementOperatorConnection(connection, elementId, elementOperator);
667 RETURN_FALSE_IF_NULL(elementOperator);
668 elementOperator->SearchElementInfoByAccessibilityId(elementId, GenerateRequestId(), callBack, 0);
669 ffrt::future_status waitFocus = promiseFuture.wait_for(std::chrono::milliseconds(timeout));
670 if (waitFocus != ffrt::future_status::ready) {
671 ipcTimeoutNum_++;
672 HILOG_ERROR("Failed to wait result, number %{public}" PRId64 "", ipcTimeoutNum_);
673 return false;
674 }
675
676 if (callBack->elementInfosResult_.size() <= 0) {
677 HILOG_ERROR("SearchElementInfoByAccessibilityId return null");
678 return false;
679 }
680 elementInfo = callBack->elementInfosResult_[0];
681 return true;
682 }
683
GetElementOperatorConnection(sptr<AccessibilityWindowConnection> & connection,const int64_t elementId,sptr<IAccessibilityElementOperator> & elementOperator)684 void AccessibleAbilityManagerService::GetElementOperatorConnection(sptr<AccessibilityWindowConnection> &connection,
685 const int64_t elementId, sptr<IAccessibilityElementOperator> &elementOperator)
686 {
687 int32_t treeId = 0;
688 if (elementId > 0) {
689 treeId = GetTreeIdBySplitElementId(elementId);
690 elementOperator = connection->GetCardProxy(treeId);
691 } else {
692 elementOperator = connection->GetProxy();
693 }
694 HILOG_DEBUG("elementId:%{public}" PRId64 " treeId:%{public}d", elementId, treeId);
695 }
696
ExecuteActionOnAccessibilityFocused(const ActionType & action)697 bool AccessibleAbilityManagerService::ExecuteActionOnAccessibilityFocused(const ActionType &action)
698 {
699 int32_t windowId = GetFocusWindowId();
700 int64_t elementId = GetFocusElementId();
701 uint32_t timeOut = 5000;
702 int32_t treeId = GetTreeIdBySplitElementId(elementId);
703 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
704 if (accountData == nullptr) {
705 HILOG_ERROR("GetCurrentAccountData failed");
706 return false;
707 }
708 int32_t realId =
709 Singleton<AccessibilityWindowManager>::GetInstance().ConvertToRealWindowId(windowId, FOCUS_TYPE_INVALID);
710 sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(realId);
711 if (connection == nullptr) {
712 HILOG_ERROR("connection is nullptr");
713 return false;
714 }
715 std::map<std::string, std::string> actionArguments {};
716 sptr<ElementOperatorCallbackImpl> actionCallback = new(std::nothrow) ElementOperatorCallbackImpl();
717 if (actionCallback == nullptr) {
718 HILOG_ERROR("Failed to create actionCallback.");
719 return false;
720 }
721 ffrt::future<void> actionFuture = actionCallback->promise_.get_future();
722 if (treeId > TREE_ID_INVALID) {
723 if (connection->GetCardProxy(treeId) != nullptr) {
724 connection->GetCardProxy(treeId)->ExecuteAction(elementId, action,
725 actionArguments, GenerateRequestId(), actionCallback);
726 } else {
727 HILOG_ERROR("get card operation is nullptr");
728 return false;
729 }
730 } else {
731 if (connection->GetProxy() != nullptr) {
732 connection->GetProxy()->ExecuteAction(elementId, action, actionArguments, GenerateRequestId(),
733 actionCallback);
734 } else {
735 HILOG_ERROR("get operation is nullptr");
736 return false;
737 }
738 }
739 ffrt::future_status waitAction = actionFuture.wait_for(std::chrono::milliseconds(timeOut));
740 if (waitAction != ffrt::future_status::ready) {
741 HILOG_ERROR("ExecuteAction Failed to wait result");
742 return false;
743 }
744 HILOG_INFO("windowId[%{public}d], elementId[%{public}" PRId64 "], action[%{public}d, result: %{public}d",
745 windowId, elementId, action, actionCallback->executeActionResult_);
746 return actionCallback->executeActionResult_;
747 }
748
SetFocusWindowId(const int32_t focusWindowId)749 void AccessibleAbilityManagerService::SetFocusWindowId(const int32_t focusWindowId)
750 {
751 focusWindowId_ = focusWindowId;
752 }
753
GetFocusWindowId()754 int32_t AccessibleAbilityManagerService::GetFocusWindowId()
755 {
756 return focusWindowId_;
757 }
758
SetFocusElementId(const int64_t focusElementId)759 void AccessibleAbilityManagerService::SetFocusElementId(const int64_t focusElementId)
760 {
761 focusElementId_ = focusElementId;
762 }
763
GetFocusElementId()764 int64_t AccessibleAbilityManagerService::GetFocusElementId()
765 {
766 return focusElementId_;
767 }
768
RegisterCaptionObserver(const sptr<IAccessibleAbilityManagerCaptionObserver> & callback)769 uint32_t AccessibleAbilityManagerService::RegisterCaptionObserver(
770 const sptr<IAccessibleAbilityManagerCaptionObserver> &callback)
771 {
772 HILOG_DEBUG();
773 if (!callback || !actionHandler_) {
774 HILOG_ERROR("Parameters check failed!");
775 return ERR_INVALID_VALUE;
776 }
777
778 XCollieHelper timer(TIMER_REGISTER_CAPTION_OBSERVER, XCOLLIE_TIMEOUT);
779 std::shared_ptr<ffrt::promise<uint32_t>> syncPromise = std::make_shared<ffrt::promise<uint32_t>>();
780 ffrt::future syncFuture = syncPromise->get_future();
781 actionHandler_->PostTask([this, syncPromise, callback]() {
782 HILOG_DEBUG();
783 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
784 if (!accountData) {
785 HILOG_ERROR("Account data is null");
786 syncPromise->set_value(ERR_INVALID_VALUE);
787 return;
788 }
789 if (!captionPropertyCallbackDeathRecipient_) {
790 captionPropertyCallbackDeathRecipient_ = new(std::nothrow) CaptionPropertyCallbackDeathRecipient();
791 if (!captionPropertyCallbackDeathRecipient_) {
792 HILOG_ERROR("captionPropertyCallbackDeathRecipient_ is null");
793 syncPromise->set_value(ERR_INVALID_VALUE);
794 return;
795 }
796 }
797 if (!callback->AsObject()) {
798 HILOG_ERROR("object is null");
799 syncPromise->set_value(0);
800 return;
801 }
802 callback->AsObject()->AddDeathRecipient(captionPropertyCallbackDeathRecipient_);
803 accountData->AddCaptionPropertyCallback(callback);
804 HILOG_DEBUG("the size of caption property callbacks is %{public}zu",
805 accountData->GetCaptionPropertyCallbacks().size());
806 syncPromise->set_value(NO_ERROR);
807 }, "TASK_REGISTER_CAPTION_OBSERVER");
808
809 ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
810 if (wait != ffrt::future_status::ready) {
811 HILOG_ERROR("Failed to wait RegisterCaptionObserver result");
812 return RET_ERR_TIME_OUT;
813 }
814 return syncFuture.get();
815 }
816
RegisterEnableAbilityListsObserver(const sptr<IAccessibilityEnableAbilityListsObserver> & observer)817 void AccessibleAbilityManagerService::RegisterEnableAbilityListsObserver(
818 const sptr<IAccessibilityEnableAbilityListsObserver> &observer)
819 {
820 HILOG_DEBUG();
821 if (!observer || !actionHandler_) {
822 HILOG_ERROR("Parameters check failed!");
823 return;
824 }
825 XCollieHelper timer(TIMER_REGISTER_ENABLEABILITY_OBSERVER, XCOLLIE_TIMEOUT);
826 std::shared_ptr<ffrt::promise<void>> syncPromisePtr = std::make_shared<ffrt::promise<void>>();
827 ffrt::future syncFuture = syncPromisePtr->get_future();
828 actionHandler_->PostTask([this, syncPromisePtr, observer]() {
829 HILOG_DEBUG();
830 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
831 if (!accountData) {
832 HILOG_ERROR("Account data is null");
833 syncPromisePtr->set_value();
834 return;
835 }
836 if (!enableAbilityListsObserverDeathRecipient_) {
837 enableAbilityListsObserverDeathRecipient_ = new(std::nothrow) EnableAbilityListsObserverDeathRecipient();
838 if (!enableAbilityListsObserverDeathRecipient_) {
839 HILOG_ERROR("enableAbilityListsObserverDeathRecipient_ is null");
840 syncPromisePtr->set_value();
841 return;
842 }
843 }
844 if (!observer->AsObject()) {
845 HILOG_ERROR("object is null");
846 syncPromisePtr->set_value();
847 return;
848 }
849 observer->AsObject()->AddDeathRecipient(enableAbilityListsObserverDeathRecipient_);
850 accountData->AddEnableAbilityListsObserver(observer);
851 syncPromisePtr->set_value();
852 }, "TASK_REGISTER_ENABLE_ABILITY_LISTS_OBSERVER");
853
854 ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
855 if (wait != ffrt::future_status::ready) {
856 HILOG_ERROR("Failed to wait RegisterEnableAbilityListsObserver result");
857 return;
858 }
859 return syncFuture.get();
860 }
861
GetAbilityList(const uint32_t abilityTypes,const int32_t stateType,std::vector<AccessibilityAbilityInfo> & infos)862 RetError AccessibleAbilityManagerService::GetAbilityList(const uint32_t abilityTypes, const int32_t stateType,
863 std::vector<AccessibilityAbilityInfo> &infos)
864 {
865 HILOG_DEBUG("abilityTypes(%{public}d) stateType(%{public}d)", abilityTypes, stateType);
866 if (!handler_ || (stateType > ABILITY_STATE_INSTALLED) || (stateType < ABILITY_STATE_ENABLE)) {
867 HILOG_ERROR("Parameters check failed! stateType:%{public}d", stateType);
868 return RET_ERR_INVALID_PARAM;
869 }
870
871 ffrt::promise<RetError> syncPromise;
872 ffrt::future syncFuture = syncPromise.get_future();
873 handler_->PostTask([this, &syncPromise, &infos, abilityTypes, stateType]() {
874 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
875 if (!accountData) {
876 HILOG_ERROR("Get current account data failed!!");
877 syncPromise.set_value(RET_ERR_FAILED);
878 return;
879 }
880
881 vector<AccessibilityAbilityInfo> abilities;
882 accountData->GetAbilitiesByState(static_cast<AbilityStateType>(stateType), abilities);
883 HILOG_DEBUG("abilityes count is %{public}zu", abilities.size());
884 for (auto &ability : abilities) {
885 if (abilityTypes == AccessibilityAbilityTypes::ACCESSIBILITY_ABILITY_TYPE_ALL ||
886 (ability.GetAccessibilityAbilityType() & abilityTypes)) {
887 infos.push_back(ability);
888 }
889 }
890 HILOG_DEBUG("infos count is %{public}zu", infos.size());
891 syncPromise.set_value(RET_OK);
892 }, "TASK_GET_ABILITY_LIST");
893 return syncFuture.get();
894 }
895
RegisterElementOperator(const int32_t windowId,const sptr<IAccessibilityElementOperator> & operation,bool isApp)896 RetError AccessibleAbilityManagerService::RegisterElementOperator(
897 const int32_t windowId, const sptr<IAccessibilityElementOperator> &operation, bool isApp)
898 {
899 if (!registerHandler_) {
900 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
901 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
902 HILOG_ERROR("handler_ is nullptr.");
903 return RET_ERR_NULLPTR;
904 }
905 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
906 if (CheckCallingUid() != RET_OK) {
907 return RET_ERR_SAMGR;
908 }
909
910 registerHandler_->PostTask([=]() {
911 HILOG_INFO("Register windowId[%{public}d]", windowId);
912 HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "RegisterElementOperator");
913 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
914 if (!accountData) {
915 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
916 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
917 HILOG_ERROR("Get current account data failed!!");
918 return;
919 }
920 sptr<AccessibilityWindowConnection> oldConnection = accountData->GetAccessibilityWindowConnection(windowId);
921 if (isApp && oldConnection) {
922 HILOG_WARN("no need to register again.");
923 return;
924 }
925 DeleteConnectionAndDeathRecipient(windowId, oldConnection);
926 sptr<AccessibilityWindowConnection> connection =
927 new(std::nothrow) AccessibilityWindowConnection(windowId, operation, currentAccountId_);
928 if (!connection) {
929 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
930 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
931 HILOG_ERROR("New AccessibilityWindowConnection failed!!");
932 return;
933 }
934 connection->SetTokenIdMap(SINGLE_TREE_ID, tokenId);
935 accountData->AddAccessibilityWindowConnection(windowId, connection);
936
937 IsCheckWindowIdEventExist(windowId);
938 if (operation && operation->AsObject()) {
939 sptr<IRemoteObject::DeathRecipient> deathRecipient =
940 new(std::nothrow) InteractionOperationDeathRecipient(windowId, currentAccountId_);
941 if (!deathRecipient) {
942 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
943 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
944 HILOG_ERROR("Create interactionOperationDeathRecipient failed");
945 return;
946 }
947
948 bool result = operation->AsObject()->AddDeathRecipient(deathRecipient);
949 interactionOperationDeathRecipients_[windowId] = deathRecipient;
950 HILOG_DEBUG("The result of adding operation's death recipient is %{public}d", result);
951 }
952 }, "TASK_REGISTER_ELEMENT_OPERATOR");
953 return RET_OK;
954 }
955
IsCheckWindowIdEventExist(const int32_t windowId)956 void AccessibleAbilityManagerService::IsCheckWindowIdEventExist(const int32_t windowId)
957 {
958 if (CheckWindowIdEventExist(windowId)) {
959 SendEvent(windowFocusEventMap_.ReadVal(windowId));
960 windowFocusEventMap_.Erase(windowId);
961 }
962 }
963
RegisterElementOperatorChildWork(const Registration & parameter,const int32_t treeId,const int64_t nodeId,const sptr<IAccessibilityElementOperator> & operation,const uint32_t tokenId,bool isApp)964 RetError AccessibleAbilityManagerService::RegisterElementOperatorChildWork(const Registration ¶meter,
965 const int32_t treeId, const int64_t nodeId, const sptr<IAccessibilityElementOperator> &operation,
966 const uint32_t tokenId, bool isApp)
967 {
968 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
969 if (accountData == nullptr) {
970 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
971 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
972 HILOG_ERROR("Get current account data failed!!");
973 return RET_ERR_REGISTER_EXIST;
974 }
975
976 sptr<AccessibilityWindowConnection> parentConnection =
977 accountData->GetAccessibilityWindowConnection(parameter.parentWindowId);
978 if (isApp && parentConnection) {
979 sptr<IAccessibilityElementOperator> parentAamsOper =
980 parentConnection->GetCardProxy(parameter.parentTreeId);
981 if (parentAamsOper != nullptr) {
982 parentAamsOper->SetChildTreeIdAndWinId(nodeId, treeId, parameter.windowId);
983 } else {
984 HILOG_DEBUG("parentAamsOper is nullptr");
985 }
986 } else {
987 return RET_ERR_NO_CONNECTION;
988 }
989
990 operation->SetBelongTreeId(treeId);
991 operation->SetParentWindowId(parameter.parentWindowId);
992 sptr<AccessibilityWindowConnection> oldConnection =
993 accountData->GetAccessibilityWindowConnection(parameter.windowId);
994 if (isApp && oldConnection) {
995 if (oldConnection->GetCardProxy(treeId) != nullptr) {
996 HILOG_WARN("no need to register again.");
997 return RET_ERR_REGISTER_EXIST;
998 } else {
999 oldConnection->SetCardProxy(treeId, operation);
1000 SetTokenIdMapAndRootParentId(oldConnection, treeId, nodeId, tokenId);
1001 }
1002 }
1003 return RET_OK;
1004 }
1005
SetTokenIdMapAndRootParentId(const sptr<AccessibilityWindowConnection> connection,const int32_t treeId,const int64_t nodeId,const uint32_t tokenId)1006 void AccessibleAbilityManagerService::SetTokenIdMapAndRootParentId(
1007 const sptr<AccessibilityWindowConnection> connection,
1008 const int32_t treeId, const int64_t nodeId, const uint32_t tokenId)
1009 {
1010 connection->SetTokenIdMap(treeId, tokenId);
1011 connection->SetRootParentId(treeId, nodeId);
1012 }
1013
ApplyTreeId()1014 int32_t AccessibleAbilityManagerService::ApplyTreeId()
1015 {
1016 std::lock_guard<ffrt::mutex> lock(treeIdPoolMutex_);
1017 int32_t curTreeId = preTreeId_ + 1;
1018 for (int32_t index = 0; index < TREE_ID_MAX; index++) {
1019 if (curTreeId == TREE_ID_MAX) {
1020 curTreeId = 0;
1021 }
1022 if (!treeIdPool_.test(curTreeId)) {
1023 treeIdPool_.set(curTreeId, true);
1024 preTreeId_ = curTreeId;
1025 return curTreeId + 1;
1026 }
1027 curTreeId++;
1028 }
1029 preTreeId_ = TREE_ID_MAX - 1;
1030 return 0;
1031 }
1032
RecycleTreeId(int32_t treeId)1033 void AccessibleAbilityManagerService::RecycleTreeId(int32_t treeId)
1034 {
1035 std::lock_guard<ffrt::mutex> lock(treeIdPoolMutex_);
1036 if ((treeId > 0) && (treeId <= TREE_ID_MAX)) {
1037 treeIdPool_.set(treeId - 1, false);
1038 }
1039 }
1040
RegisterElementOperator(Registration parameter,const sptr<IAccessibilityElementOperator> & operation,bool isApp)1041 RetError AccessibleAbilityManagerService::RegisterElementOperator(Registration parameter,
1042 const sptr<IAccessibilityElementOperator> &operation, bool isApp)
1043 {
1044 if (CheckCallingUid() != RET_OK) {
1045 return RET_ERR_SAMGR;
1046 }
1047 int32_t treeIdSingle = ApplyTreeId();
1048 if (treeIdSingle == 0) {
1049 HILOG_ERROR("TreeId is used up.");
1050 return RET_ERR_TREE_TOO_BIG;
1051 }
1052 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
1053 int64_t nodeId = parameter.elementId;
1054 HILOG_INFO("get treeId element and treeid - treeId: %{public}d parameter.elementId[%{public}" PRId64 "]"
1055 "element[%{public}" PRId64 "]",
1056 treeIdSingle, parameter.elementId, nodeId);
1057
1058 if (!registerHandler_) {
1059 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
1060 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
1061 HILOG_ERROR("handler_ is nullptr.");
1062 return RET_ERR_NULLPTR;
1063 }
1064 registerHandler_->PostTask([=]() {
1065 HILOG_INFO("Register windowId[%{public}d]", parameter.windowId);
1066 HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "RegisterElementOperator");
1067 if (RET_OK != RegisterElementOperatorChildWork(parameter, treeIdSingle, nodeId, operation, tokenId, isApp)) {
1068 return;
1069 }
1070 if (CheckWindowIdEventExist(parameter.windowId)) {
1071 SendEvent(windowFocusEventMap_.ReadVal(parameter.windowId));
1072 windowFocusEventMap_.Erase(parameter.windowId);
1073 }
1074 if (operation && operation->AsObject()) {
1075 sptr<IRemoteObject::DeathRecipient> deathRecipient =
1076 new(std::nothrow) InteractionOperationDeathRecipient(parameter.windowId, treeIdSingle,
1077 currentAccountId_);
1078 if (deathRecipient == nullptr) {
1079 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
1080 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
1081 HILOG_ERROR("Create interactionOperationDeathRecipient failed");
1082 return;
1083 }
1084 bool result = operation->AsObject()->AddDeathRecipient(deathRecipient);
1085 interactionOperationDeathMap_[parameter.windowId][treeIdSingle] = deathRecipient;
1086 HILOG_DEBUG("The result of adding operation's death recipient is %{public}d", result);
1087 }
1088 }, "TASK_REGISTER_ELEMENT_OPERATOR");
1089 return RET_OK;
1090 }
1091
DeleteConnectionAndDeathRecipient(const int32_t windowId,const sptr<AccessibilityWindowConnection> & connection)1092 void AccessibleAbilityManagerService::DeleteConnectionAndDeathRecipient(
1093 const int32_t windowId, const sptr<AccessibilityWindowConnection> &connection)
1094 {
1095 HILOG_DEBUG();
1096 if (!connection) {
1097 HILOG_ERROR("connection is nullptr");
1098 return;
1099 }
1100
1101 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1102 if (!accountData) {
1103 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
1104 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
1105 HILOG_ERROR("Get current account data failed!!");
1106 return;
1107 }
1108
1109 accountData->RemoveAccessibilityWindowConnection(windowId);
1110 if (!connection->GetProxy()) {
1111 HILOG_WARN("proxy is null");
1112 return;
1113 }
1114 auto object = connection->GetProxy()->AsObject();
1115 if (object) {
1116 auto iter = interactionOperationDeathRecipients_.find(windowId);
1117 if (iter != interactionOperationDeathRecipients_.end()) {
1118 sptr<IRemoteObject::DeathRecipient> deathRecipient = iter->second;
1119 bool result = object->RemoveDeathRecipient(deathRecipient);
1120 HILOG_DEBUG("The result of deleting connection's death recipient is %{public}d", result);
1121 interactionOperationDeathRecipients_.erase(iter);
1122 }
1123 }
1124 }
1125
DeregisterElementOperator(int32_t windowId)1126 RetError AccessibleAbilityManagerService::DeregisterElementOperator(int32_t windowId)
1127 {
1128 if (!registerHandler_) {
1129 HILOG_ERROR("registerHandler_ is nullptr.");
1130 return RET_ERR_NULLPTR;
1131 }
1132
1133 registerHandler_->PostTask([=]() {
1134 HILOG_INFO("Deregister windowId[%{public}d]", windowId);
1135 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1136 if (!accountData) {
1137 HILOG_ERROR("accountData is nullptr.");
1138 return;
1139 }
1140 sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(windowId);
1141 if (!connection) {
1142 HILOG_WARN("The operation of windowId[%{public}d] has not been registered.", windowId);
1143 return;
1144 }
1145 StopCallbackWait(windowId);
1146
1147 if (!connection->GetProxy()) {
1148 HILOG_ERROR("proxy is null");
1149 return;
1150 }
1151
1152 auto object = connection->GetProxy()->AsObject();
1153 if (object) {
1154 auto iter = interactionOperationDeathRecipients_.find(windowId);
1155 if (iter != interactionOperationDeathRecipients_.end()) {
1156 sptr<IRemoteObject::DeathRecipient> deathRecipient = iter->second;
1157 bool result = object->RemoveDeathRecipient(deathRecipient);
1158 HILOG_DEBUG("The result of deleting operation's death recipient is %{public}d", result);
1159 interactionOperationDeathRecipients_.erase(iter);
1160 } else {
1161 HILOG_INFO("cannot find remote object. windowId[%{public}d]", windowId);
1162 }
1163 }
1164
1165 connection->SetProxy(nullptr);
1166 RemoveTreeDeathRecipient(windowId, 0, connection);
1167
1168 std::vector<int32_t> treeIds {};
1169 connection->GetAllTreeId(treeIds);
1170 for (int32_t treeId : treeIds) {
1171 RemoveTreeDeathRecipient(windowId, treeId, connection);
1172 }
1173 accountData->RemoveAccessibilityWindowConnection(windowId);
1174 }, "TASK_DEREGISTER_ELEMENT_OPERATOR");
1175 return RET_OK;
1176 }
1177
DeregisterElementOperator(int32_t windowId,const int32_t treeId)1178 RetError AccessibleAbilityManagerService::DeregisterElementOperator(int32_t windowId, const int32_t treeId)
1179 {
1180 if (!registerHandler_) {
1181 HILOG_ERROR("registerHandler_ is nullptr.");
1182 return RET_ERR_NULLPTR;
1183 }
1184
1185 registerHandler_->PostTask([=]() {
1186 HILOG_INFO("Deregister windowId[%{public}d], treeId[%{public}d] start", windowId, treeId);
1187 RecycleTreeId(treeId);
1188 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1189 if (!accountData) {
1190 HILOG_ERROR("accountData is nullptr.");
1191 return;
1192 }
1193 sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(windowId);
1194 if (connection == nullptr) {
1195 HILOG_WARN("The operation of windowId[%{public}d] has not been registered.", windowId);
1196 return;
1197 }
1198 StopCallbackWait(windowId, treeId);
1199
1200 RemoveTreeDeathRecipient(windowId, treeId, connection);
1201 // remove connection when all proxy and children tree proxy deregistered
1202 if (connection->GetProxy() == nullptr && connection->GetCardProxySize() == 0) {
1203 accountData->RemoveAccessibilityWindowConnection(windowId);
1204 }
1205 Singleton<AccessibilityWindowManager>::GetInstance().RemoveTreeIdWindowIdPair(treeId);
1206 }, "TASK_DEREGISTER_ELEMENT_OPERATOR");
1207 return RET_OK;
1208 }
1209
RemoveTreeDeathRecipient(const int32_t windowId,const int32_t treeId,const sptr<AccessibilityWindowConnection> connection)1210 void AccessibleAbilityManagerService::RemoveTreeDeathRecipient(const int32_t windowId, const int32_t treeId,
1211 const sptr<AccessibilityWindowConnection> connection)
1212 {
1213 if (connection == nullptr) {
1214 HILOG_ERROR("connection is null");
1215 return;
1216 }
1217 auto object = connection->GetCardProxy(treeId);
1218 if (object == nullptr) {
1219 HILOG_ERROR("GetCardProxy is null");
1220 return;
1221 }
1222 auto remoteObject = object->AsObject();
1223 if (remoteObject == nullptr) {
1224 HILOG_ERROR("object->AsObject() is null");
1225 return;
1226 }
1227 connection->EraseProxy(treeId);
1228 auto iter = interactionOperationDeathMap_.find(windowId);
1229 if (iter != interactionOperationDeathMap_.end()) {
1230 auto iterTree = iter->second.find(treeId);
1231 if (iterTree != iter->second.end()) {
1232 sptr<IRemoteObject::DeathRecipient> deathRecipient = iterTree->second;
1233 bool result = remoteObject->RemoveDeathRecipient(deathRecipient);
1234 HILOG_DEBUG("The result of deleting operation's death recipient is %{public}d", result);
1235 iter->second.erase(iterTree);
1236 } else {
1237 HILOG_ERROR("cannot find remote object. treeId[%{public}d]", treeId);
1238 }
1239 } else {
1240 HILOG_ERROR("cannot find remote object. windowId[%{public}d]", windowId);
1241 }
1242 }
1243
GetCaptionProperty(AccessibilityConfig::CaptionProperty & caption)1244 RetError AccessibleAbilityManagerService::GetCaptionProperty(AccessibilityConfig::CaptionProperty &caption)
1245 {
1246 return accessibilitySettings_->GetCaptionProperty(caption);
1247 }
1248
SetCaptionProperty(const AccessibilityConfig::CaptionProperty & caption)1249 RetError AccessibleAbilityManagerService::SetCaptionProperty(const AccessibilityConfig::CaptionProperty &caption)
1250 {
1251 return accessibilitySettings_->SetCaptionProperty(caption);
1252 }
1253
SetCaptionState(const bool state)1254 RetError AccessibleAbilityManagerService::SetCaptionState(const bool state)
1255 {
1256 return accessibilitySettings_->SetCaptionState(state);
1257 }
1258
GetEnabledState()1259 bool AccessibleAbilityManagerService::GetEnabledState()
1260 {
1261 HILOG_DEBUG();
1262 if (!handler_) {
1263 HILOG_ERROR("handler_ is nullptr.");
1264 return false;
1265 }
1266
1267 ffrt::promise<bool> syncPromise;
1268 ffrt::future syncFuture = syncPromise.get_future();
1269 handler_->PostTask([this, &syncPromise]() {
1270 HILOG_DEBUG();
1271 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1272 if (!accountData) {
1273 HILOG_ERROR("accountData is nullptr");
1274 syncPromise.set_value(false);
1275 return;
1276 }
1277 bool result = accountData->GetConfig()->GetEnabledState();
1278 syncPromise.set_value(result);
1279 }, "TASK_GET_ENABLE_STATE");
1280 return syncFuture.get();
1281 }
1282
GetCaptionState(bool & state)1283 RetError AccessibleAbilityManagerService::GetCaptionState(bool &state)
1284 {
1285 return accessibilitySettings_->GetCaptionState(state);
1286 }
1287
GetTouchGuideState()1288 bool AccessibleAbilityManagerService::GetTouchGuideState()
1289 {
1290 HILOG_DEBUG();
1291 if (!handler_) {
1292 HILOG_ERROR("handler_ is nullptr.");
1293 return false;
1294 }
1295
1296 ffrt::promise<bool> syncPromise;
1297 ffrt::future syncFuture = syncPromise.get_future();
1298 handler_->PostTask([this, &syncPromise]() {
1299 HILOG_DEBUG();
1300 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1301 if (!accountData) {
1302 HILOG_ERROR("accountData is nullptr");
1303 syncPromise.set_value(false);
1304 return;
1305 }
1306 bool result = accountData->GetConfig()->GetTouchGuideState();
1307 syncPromise.set_value(result);
1308 }, "TASK_GET_TOUCH_GUIDE_STATE");
1309 return syncFuture.get();
1310 }
1311
GetGestureState()1312 bool AccessibleAbilityManagerService::GetGestureState()
1313 {
1314 HILOG_DEBUG();
1315 if (!handler_) {
1316 HILOG_ERROR("handler_ is nullptr.");
1317 return false;
1318 }
1319
1320 ffrt::promise<bool> syncPromise;
1321 ffrt::future syncFuture = syncPromise.get_future();
1322 handler_->PostTask([this, &syncPromise]() {
1323 HILOG_DEBUG();
1324 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1325 if (!accountData) {
1326 HILOG_ERROR("accountData is nullptr");
1327 syncPromise.set_value(false);
1328 return;
1329 }
1330 bool result = accountData->GetConfig()->GetGestureState();
1331 syncPromise.set_value(result);
1332 }, "TASK_GET_GESTURE_STATE");
1333 return syncFuture.get();
1334 }
1335
GetKeyEventObserverState()1336 bool AccessibleAbilityManagerService::GetKeyEventObserverState()
1337 {
1338 HILOG_DEBUG();
1339 if (!handler_) {
1340 HILOG_ERROR("handler_ is nullptr.");
1341 return false;
1342 }
1343
1344 ffrt::promise<bool> syncPromise;
1345 ffrt::future syncFuture = syncPromise.get_future();
1346 handler_->PostTask([this, &syncPromise]() {
1347 HILOG_DEBUG();
1348 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1349 if (!accountData) {
1350 HILOG_ERROR("accountData is nullptr");
1351 syncPromise.set_value(false);
1352 return;
1353 }
1354 bool result = accountData->GetConfig()->GetKeyEventObserverState();
1355 syncPromise.set_value(result);
1356 }, "TASK_GET_KEY_EVENT_OBSERVER_STATE");
1357 return syncFuture.get();
1358 }
1359
EnableAbility(const std::string & name,const uint32_t capabilities)1360 RetError AccessibleAbilityManagerService::EnableAbility(const std::string &name, const uint32_t capabilities)
1361 {
1362 HILOG_DEBUG();
1363 if (!handler_) {
1364 HILOG_ERROR("handler_ is nullptr.");
1365 return RET_ERR_NULLPTR;
1366 }
1367
1368 ffrt::promise<RetError> syncPromise;
1369 ffrt::future syncFuture = syncPromise.get_future();
1370 handler_->PostTask([this, &syncPromise, &name, &capabilities]() {
1371 HILOG_DEBUG();
1372 RetError result = InnerEnableAbility(name, capabilities);
1373 syncPromise.set_value(result);
1374 }, "TASK_ENABLE_ABILITIES");
1375 return syncFuture.get();
1376 }
1377
SetTargetAbility(const int32_t targetAbilityValue)1378 bool AccessibleAbilityManagerService::SetTargetAbility(const int32_t targetAbilityValue)
1379 {
1380 HILOG_DEBUG();
1381
1382 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1383 if (!accountData) {
1384 HILOG_ERROR("accountData is nullptr");
1385 return false;
1386 }
1387
1388 bool state;
1389 switch (targetAbilityValue) {
1390 case HIGH_CONTRAST_TEXT:
1391 state = accountData->GetConfig()->GetHighContrastTextState();
1392 Utils::RecordEnableShortkeyAbilityEvent("HIGH_CONTRAST_TEXT", !state);
1393 return SetHighContrastTextState(!state) == RET_OK;
1394 case INVERT_COLOR:
1395 state = accountData->GetConfig()->GetInvertColorState();
1396 Utils::RecordEnableShortkeyAbilityEvent("INVERT_COLOR", !state);
1397 return SetInvertColorState(!state) == RET_OK;
1398 case ANIMATION_OFF:
1399 state = accountData->GetConfig()->GetAnimationOffState();
1400 Utils::RecordEnableShortkeyAbilityEvent("ANIMATION_OFF", !state);
1401 return SetAnimationOffState(!state) == RET_OK;
1402 case SCREEN_MAGNIFICATION:
1403 state = accountData->GetConfig()->GetScreenMagnificationState();
1404 Utils::RecordEnableShortkeyAbilityEvent("SCREEN_MAGNIFICATION", !state);
1405 return SetScreenMagnificationState(!state) == RET_OK;
1406 case AUDIO_MONO:
1407 state = accountData->GetConfig()->GetAudioMonoState();
1408 Utils::RecordEnableShortkeyAbilityEvent("AUDIO_MONO", !state);
1409 return SetAudioMonoState(!state) == RET_OK;
1410 case MOUSE_KEY:
1411 state = accountData->GetConfig()->GetMouseKeyState();
1412 Utils::RecordEnableShortkeyAbilityEvent("MOUSE_KEY", !state);
1413 return SetMouseKeyState(!state) == RET_OK;
1414 case CAPTION_STATE:
1415 state = accountData->GetConfig()->GetCaptionState();
1416 Utils::RecordEnableShortkeyAbilityEvent("CAPTION_STATE", !state);
1417 return SetCaptionState(!state) == RET_OK;
1418 default:
1419 return false;
1420 }
1421 }
1422
GetScreenReaderState()1423 bool AccessibleAbilityManagerService::GetScreenReaderState()
1424 {
1425 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1426 if (!accountData) {
1427 HILOG_ERROR("accountData is nullptr");
1428 return false;
1429 }
1430 return accountData->GetScreenReaderState();
1431 }
1432
InnerEnableAbility(const std::string & name,const uint32_t capabilities)1433 RetError AccessibleAbilityManagerService::InnerEnableAbility(const std::string &name, const uint32_t capabilities)
1434 {
1435 HILOG_DEBUG();
1436 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1437 if (!accountData) {
1438 HILOG_ERROR("accountData is nullptr");
1439 return RET_ERR_NULLPTR;
1440 }
1441 auto iter = removedAutoStartAbilities_.begin();
1442 for (; iter != removedAutoStartAbilities_.end(); ++iter) {
1443 if (*iter == name) {
1444 removedAutoStartAbilities_.erase(iter);
1445 break;
1446 }
1447 }
1448 return accountData->EnableAbility(name, capabilities);
1449 }
1450
GetEnabledAbilities(std::vector<std::string> & enabledAbilities)1451 RetError AccessibleAbilityManagerService::GetEnabledAbilities(std::vector<std::string> &enabledAbilities)
1452 {
1453 HILOG_DEBUG();
1454 if (!handler_) {
1455 HILOG_ERROR("handler_ is nullptr.");
1456 return RET_ERR_NULLPTR;
1457 }
1458
1459 ffrt::promise<RetError> syncPromise;
1460 ffrt::future syncFuture = syncPromise.get_future();
1461 handler_->PostTask([this, &syncPromise, &enabledAbilities]() {
1462 HILOG_DEBUG();
1463 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1464 if (!accountData) {
1465 HILOG_ERROR("accountData is nullptr");
1466 syncPromise.set_value(RET_ERR_NULLPTR);
1467 return;
1468 }
1469 enabledAbilities = accountData->GetEnabledAbilities();
1470 syncPromise.set_value(RET_OK);
1471 }, "TASK_GET_ENABLE_ABILITIES");
1472 return syncFuture.get();
1473 }
1474
SetCurtainScreenUsingStatus(bool isEnable)1475 RetError AccessibleAbilityManagerService::SetCurtainScreenUsingStatus(bool isEnable)
1476 {
1477 HILOG_DEBUG();
1478 auto rsInterfaces = &(Rosen::RSInterfaces::GetInstance());
1479 if (rsInterfaces == nullptr) {
1480 HILOG_ERROR("rsInterfaces is nullptr.");
1481 return RET_ERR_NULLPTR;
1482 }
1483 HILOG_INFO("SetCurtainScreenUsingStatus: status = %{public}d", isEnable);
1484 rsInterfaces->SetCurtainScreenUsingStatus(isEnable);
1485 return RET_OK;
1486 }
1487
DisableAbility(const std::string & name)1488 RetError AccessibleAbilityManagerService::DisableAbility(const std::string &name)
1489 {
1490 HILOG_INFO();
1491 if (!handler_) {
1492 HILOG_ERROR("handler_ is nullptr.");
1493 return RET_ERR_NULLPTR;
1494 }
1495
1496 ffrt::promise<RetError> syncPromise;
1497 ffrt::future syncFuture = syncPromise.get_future();
1498 handler_->PostTask([this, &syncPromise, &name]() {
1499 HILOG_DEBUG();
1500 RetError result = InnerDisableAbility(name);
1501 syncPromise.set_value(result);
1502 }, "TASK_DISABLE_ABILITIES");
1503 return syncFuture.get();
1504 }
1505
InnerDisableAbility(const std::string & name)1506 RetError AccessibleAbilityManagerService::InnerDisableAbility(const std::string &name)
1507 {
1508 HILOG_INFO();
1509 HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "InnerDisableAbility:" + name);
1510
1511 if (!actionHandler_) {
1512 HILOG_ERROR("actionHandler_ is nullptr.");
1513 return RET_ERR_NULLPTR;
1514 }
1515
1516 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1517 if (!accountData) {
1518 HILOG_ERROR("accountData is nullptr");
1519 return RET_ERR_NULLPTR;
1520 }
1521 if (accountData->GetConnectingA11yAbility(name) != nullptr) {
1522 HILOG_WARN("refuse to disconnect ability %{public}s when connecting", name.c_str());
1523 return RET_OK;
1524 }
1525 if (name == SCREEN_READER_BUNDLE_ABILITY_NAME) {
1526 actionHandler_->PostTask([this]() {
1527 ExecuteActionOnAccessibilityFocused(ACCESSIBILITY_ACTION_CLEAR_ACCESSIBILITY_FOCUS);
1528 }, "TASK_CLEAR_FOCUS");
1529 SetCurtainScreenUsingStatus(false);
1530 }
1531 RetError ret = accountData->RemoveEnabledAbility(name);
1532 if (ret != RET_OK) {
1533 HILOG_ERROR("RemoveEnabledAbility failed");
1534 return ret;
1535 }
1536 accountData->SetAbilityAutoStartState(name, false);
1537 accountData->RemoveConnectingA11yAbility(name);
1538 accountData->UpdateAbilities();
1539 return RET_OK;
1540 }
1541
EnableUITestAbility(const sptr<IRemoteObject> & obj)1542 RetError AccessibleAbilityManagerService::EnableUITestAbility(const sptr<IRemoteObject> &obj)
1543 {
1544 HILOG_DEBUG();
1545 if (!handler_) {
1546 HILOG_ERROR("handler_ is nullptr.");
1547 return RET_ERR_NULLPTR;
1548 }
1549
1550 if (!obj) {
1551 HILOG_ERROR("obj is nullptr.");
1552 return RET_ERR_NULLPTR;
1553 }
1554
1555 ffrt::promise<RetError> syncPromise;
1556 ffrt::future syncFuture = syncPromise.get_future();
1557 handler_->PostTask([this, &syncPromise, obj]() {
1558 HILOG_DEBUG();
1559 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1560 if (!accountData) {
1561 HILOG_ERROR("accountData is nullptr");
1562 syncPromise.set_value(RET_ERR_NULLPTR);
1563 return;
1564 }
1565 std::string uiTestUri = Utils::GetUri(UI_TEST_BUNDLE_NAME, UI_TEST_ABILITY_NAME);
1566 sptr<AccessibleAbilityConnection> connection = accountData->GetAccessibleAbilityConnection(uiTestUri);
1567 if (connection) {
1568 HILOG_ERROR("connection is existed!!");
1569 syncPromise.set_value(RET_ERR_CONNECTION_EXIST);
1570 return;
1571 }
1572
1573 std::function<void()> addUITestClientFunc = std::bind(&AccessibilityAccountData::AddUITestClient, accountData,
1574 obj, UI_TEST_BUNDLE_NAME, UI_TEST_ABILITY_NAME);
1575 handler_->PostTask(addUITestClientFunc, "AddUITestClient");
1576 accountData->AddEnabledAbility(uiTestUri);
1577 syncPromise.set_value(RET_OK);
1578 }, "TASK_ENABLE_UI_TEST_ABILITIES");
1579 return syncFuture.get();
1580 }
1581
DisableUITestAbility()1582 RetError AccessibleAbilityManagerService::DisableUITestAbility()
1583 {
1584 HILOG_DEBUG();
1585 if (!handler_) {
1586 HILOG_ERROR("handler_ is nullptr.");
1587 return RET_ERR_NULLPTR;
1588 }
1589
1590 std::shared_ptr<ffrt::promise<RetError>> syncPromise = std::make_shared<ffrt::promise<RetError>>();
1591 ffrt::future syncFuture = syncPromise->get_future();
1592 handler_->PostTask([this, syncPromise]() {
1593 HILOG_DEBUG();
1594 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1595 if (!accountData) {
1596 HILOG_ERROR("accountData is nullptr");
1597 syncPromise->set_value(RET_ERR_NULLPTR);
1598 return;
1599 }
1600 std::string uiTestUri = Utils::GetUri(UI_TEST_BUNDLE_NAME, UI_TEST_ABILITY_NAME);
1601 sptr<AccessibleAbilityConnection> connection = accountData->GetAccessibleAbilityConnection(uiTestUri);
1602 if (!connection) {
1603 HILOG_ERROR("connection is not existed!!");
1604 syncPromise->set_value(RET_ERR_NO_CONNECTION);
1605 return;
1606 }
1607 std::function<void()> removeUITestClientFunc =
1608 std::bind(&AccessibilityAccountData::RemoveUITestClient, accountData, connection, UI_TEST_BUNDLE_NAME);
1609 handler_->PostTask(removeUITestClientFunc, "RemoveUITestClient");
1610 accountData->RemoveEnabledAbility(uiTestUri);
1611 syncPromise->set_value(RET_OK);
1612 }, "TASK_DISABLE_UI_TEST_ABILITIES");
1613
1614 ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
1615 if (wait != ffrt::future_status::ready) {
1616 HILOG_ERROR("Failed to wait DisableUITestAbility result");
1617 return RET_ERR_TIME_OUT;
1618 }
1619 return syncFuture.get();
1620 }
1621
GetActiveWindow()1622 int32_t AccessibleAbilityManagerService::GetActiveWindow()
1623 {
1624 HILOG_DEBUG();
1625 return Singleton<AccessibilityWindowManager>::GetInstance().GetActiveWindowId();
1626 }
1627
Init()1628 bool AccessibleAbilityManagerService::Init()
1629 {
1630 HILOG_DEBUG();
1631 Singleton<AccessibilityCommonEvent>::GetInstance().SubscriberEvent(handler_);
1632 Singleton<AccessibilityDisplayManager>::GetInstance().RegisterDisplayListener(handler_);
1633 Singleton<AccessibilityWindowManager>::GetInstance().RegisterWindowListener(handler_);
1634 bool result = Singleton<AccessibilityWindowManager>::GetInstance().Init();
1635 HILOG_DEBUG("wms init result is %{public}d", result);
1636
1637 int32_t retry = QUERY_USER_ID_RETRY_COUNT;
1638 int32_t sleepTime = QUERY_USER_ID_SLEEP_TIME;
1639 std::vector<int32_t> accountIds;
1640 ErrCode ret = AccountSA::OsAccountManager::QueryActiveOsAccountIds(accountIds);
1641 while (ret != ERR_OK || accountIds.size() == 0) {
1642 HILOG_DEBUG("Query account information failed, left retry count:%{public}d", retry);
1643 if (retry == 0) {
1644 HILOG_ERROR("Query account information failed!!!");
1645 break;
1646 }
1647 std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime));
1648 ret = AccountSA::OsAccountManager::QueryActiveOsAccountIds(accountIds);
1649 retry--;
1650 }
1651
1652 if (accountIds.size() > 0) {
1653 HILOG_DEBUG("Query account information success, account id:%{public}d", accountIds[0]);
1654 SwitchedUser(accountIds[0]);
1655 }
1656
1657 return true;
1658 }
1659
InitInnerResource()1660 void AccessibleAbilityManagerService::InitInnerResource()
1661 {
1662 UpdateSettingsInAtoHosTask();
1663 }
1664
OnRemoteDied(const wptr<IRemoteObject> & remote)1665 void AccessibleAbilityManagerService::InteractionOperationDeathRecipient::OnRemoteDied(
1666 const wptr<IRemoteObject> &remote)
1667 {
1668 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
1669 A11yError::ERROR_TARGET_APPLICATION_DISCONNECT_ABNORMALLY);
1670 HILOG_INFO();
1671 sptr<AccessibilityAccountData> accountData =
1672 Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1673 if (accountData == nullptr) {
1674 HILOG_ERROR("get accountData failed");
1675 return;
1676 }
1677 int32_t currentAccountId = accountData->GetAccountId();
1678 if (currentAccountId != accountId_) {
1679 HILOG_ERROR("check accountId failed");
1680 return;
1681 }
1682
1683 if (treeId_ > 0) {
1684 Singleton<AccessibleAbilityManagerService>::GetInstance().DeregisterElementOperator(windowId_, treeId_);
1685 } else {
1686 Singleton<AccessibleAbilityManagerService>::GetInstance().DeregisterElementOperator(windowId_);
1687 }
1688 }
1689
GetCurrentAccountData()1690 sptr<AccessibilityAccountData> AccessibleAbilityManagerService::GetCurrentAccountData()
1691 {
1692 HILOG_DEBUG();
1693 if (currentAccountId_ == -1) {
1694 HILOG_ERROR("current account id is wrong");
1695 return nullptr;
1696 }
1697
1698 return a11yAccountsData_.GetCurrentAccountData(currentAccountId_);
1699 }
1700
GetAccountData(int32_t accountId)1701 sptr<AccessibilityAccountData> AccessibleAbilityManagerService::GetAccountData(int32_t accountId)
1702 {
1703 HILOG_DEBUG();
1704 return a11yAccountsData_.GetAccountData(accountId);
1705 }
1706
GetAllAccountIds()1707 std::vector<int32_t> AccessibleAbilityManagerService::GetAllAccountIds()
1708 {
1709 HILOG_DEBUG();
1710 return a11yAccountsData_.GetAllAccountIds();
1711 }
1712
GetBundleMgrProxy()1713 sptr<AppExecFwk::IBundleMgr> AccessibleAbilityManagerService::GetBundleMgrProxy()
1714 {
1715 HILOG_DEBUG();
1716 if (bundleManager_) {
1717 return bundleManager_;
1718 }
1719
1720 sptr<ISystemAbilityManager> systemAbilityManager =
1721 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1722 if (!systemAbilityManager) {
1723 HILOG_ERROR("failed:fail to get system ability mgr.");
1724 return nullptr;
1725 }
1726
1727 sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
1728 if (!remoteObject) {
1729 HILOG_ERROR("failed:fail to get bundle manager proxy.");
1730 return nullptr;
1731 }
1732
1733 bundleManager_ = iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
1734 if (!bundleManager_) {
1735 HILOG_ERROR("fail to new bundle manager.");
1736 return nullptr;
1737 }
1738
1739 if (!bundleManagerDeathRecipient_) {
1740 bundleManagerDeathRecipient_ = new(std::nothrow) BundleManagerDeathRecipient();
1741 if (bundleManagerDeathRecipient_ == nullptr) {
1742 HILOG_ERROR("bundleManagerDeathRecipient_ is null");
1743 return nullptr;
1744 }
1745 }
1746
1747 bundleManager_->AsObject()->AddDeathRecipient(bundleManagerDeathRecipient_);
1748 return bundleManager_;
1749 }
1750
GetAccessibilityWindowConnection(int32_t windowId)1751 sptr<AccessibilityWindowConnection> AccessibleAbilityManagerService::GetAccessibilityWindowConnection(
1752 int32_t windowId)
1753 {
1754 HILOG_DEBUG("windowId(%{public}d)", windowId);
1755 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1756 if (!accountData) {
1757 HILOG_ERROR("Get account data failed");
1758 return nullptr;
1759 }
1760 return accountData->GetAccessibilityWindowConnection(windowId);
1761 }
1762
ClearFocus(int32_t windowId)1763 void AccessibleAbilityManagerService::ClearFocus(int32_t windowId)
1764 {
1765 HILOG_DEBUG();
1766 sptr<AccessibilityWindowConnection> connection = GetAccessibilityWindowConnection(windowId);
1767 if (connection && connection->GetProxy()) {
1768 connection->GetProxy()->ClearFocus();
1769 }
1770 }
1771
OutsideTouch(int32_t windowId)1772 void AccessibleAbilityManagerService::OutsideTouch(int32_t windowId)
1773 {
1774 HILOG_DEBUG();
1775 sptr<AccessibilityWindowConnection> connection = GetAccessibilityWindowConnection(windowId);
1776 if (connection && connection->GetProxy()) {
1777 connection->GetProxy()->OutsideTouch();
1778 }
1779 }
1780
SetTouchEventInjector(const sptr<TouchEventInjector> & touchEventInjector)1781 void AccessibleAbilityManagerService::SetTouchEventInjector(const sptr<TouchEventInjector> &touchEventInjector)
1782 {
1783 HILOG_DEBUG();
1784 touchEventInjector_ = touchEventInjector;
1785 }
1786
SetKeyEventFilter(const sptr<KeyEventFilter> & keyEventFilter)1787 void AccessibleAbilityManagerService::SetKeyEventFilter(const sptr<KeyEventFilter> &keyEventFilter)
1788 {
1789 HILOG_DEBUG();
1790 keyEventFilter_ = keyEventFilter;
1791 }
1792
OnRemoteDied(const wptr<IRemoteObject> & remote)1793 void AccessibleAbilityManagerService::StateCallbackDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
1794 {
1795 Singleton<AccessibleAbilityManagerService>::GetInstance().RemoveCallback(STATE_CALLBACK, this, remote);
1796 }
1797
OnRemoteDied(const wptr<IRemoteObject> & remote)1798 void AccessibleAbilityManagerService::CaptionPropertyCallbackDeathRecipient::OnRemoteDied(
1799 const wptr<IRemoteObject> &remote)
1800 {
1801 Singleton<AccessibleAbilityManagerService>::GetInstance().RemoveCallback(CAPTION_PROPERTY_CALLBACK, this, remote);
1802 }
1803
OnRemoteDied(const wptr<IRemoteObject> & remote)1804 void AccessibleAbilityManagerService::EnableAbilityListsObserverDeathRecipient::OnRemoteDied(
1805 const wptr<IRemoteObject> &remote)
1806 {
1807 Singleton<AccessibleAbilityManagerService>::GetInstance().RemoveCallback(
1808 ENABLE_ABILITY_LISTS_CALLBACK, this, remote);
1809 }
1810
AddedUser(int32_t accountId)1811 void AccessibleAbilityManagerService::AddedUser(int32_t accountId)
1812 {
1813 HILOG_DEBUG();
1814 a11yAccountsData_.AddAccountData(accountId);
1815 }
1816
RemovedUser(int32_t accountId)1817 void AccessibleAbilityManagerService::RemovedUser(int32_t accountId)
1818 {
1819 HILOG_DEBUG();
1820 if (accountId == currentAccountId_) {
1821 HILOG_ERROR("Remove user failed, this account is current account.");
1822 return;
1823 }
1824
1825 auto accountData = a11yAccountsData_.RemoveAccountData(accountId);
1826 if (accountData) {
1827 accountData->GetConfig()->ClearData();
1828 return;
1829 }
1830
1831 HILOG_ERROR("accountId is not exist");
1832 }
1833
SwitchedUser(int32_t accountId)1834 void AccessibleAbilityManagerService::SwitchedUser(int32_t accountId)
1835 {
1836 HILOG_DEBUG();
1837
1838 if (accountId == currentAccountId_) {
1839 HILOG_WARN("The account is current account id.");
1840 return;
1841 }
1842 OffZoomGesture();
1843
1844 std::map<std::string, uint32_t> importantEnabledAbilities;
1845 SCREENREADER_STATE screenReaderState = SCREENREADER_STATE::UNINIT;
1846 if (currentAccountId_ != -1) {
1847 HILOG_DEBUG();
1848 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1849 if (!accountData) {
1850 HILOG_ERROR("Current account data is null");
1851 return;
1852 }
1853 defaultConfigCallbacks_ = accountData->GetConfigCallbacks();
1854 screenReaderState = accountData->GetDefaultUserScreenReaderState() ?
1855 SCREENREADER_STATE::ON : SCREENREADER_STATE::OFF;
1856 accountData->GetImportantEnabledAbilities(importantEnabledAbilities);
1857 accountData->OnAccountSwitched();
1858 UpdateAccessibilityManagerService();
1859 }
1860 currentAccountId_ = accountId;
1861 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1862 if (!accountData) {
1863 HILOG_ERROR("accountData is nullptr.");
1864 return;
1865 }
1866 accountData->Init();
1867 accountData->SetConfigCallbacks(defaultConfigCallbacks_);
1868 #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER
1869 float discount = accountData->GetConfig()->GetBrightnessDiscount();
1870 if (!Singleton<AccessibilityPowerManager>::GetInstance().DiscountBrightness(discount)) {
1871 HILOG_ERROR("Failed to set brightness discount");
1872 }
1873 #endif
1874 AccountSA::OsAccountType accountType = accountData->GetAccountType();
1875 if (screenReaderState != SCREENREADER_STATE::UNINIT &&
1876 (accountType == AccountSA::OsAccountType::PRIVATE || accountType == AccountSA::OsAccountType::ADMIN)) {
1877 bool state = (screenReaderState == SCREENREADER_STATE::ON) ? true : false;
1878 accountData->SetAbilityAutoStartState(SCREEN_READER_BUNDLE_ABILITY_NAME, state);
1879 HILOG_INFO("set screenreader auto-start state = %{public}d", true);
1880 }
1881
1882 if (accountData->GetInstalledAbilitiesFromBMS()) {
1883 accountData->UpdateImportantEnabledAbilities(importantEnabledAbilities);
1884 accountData->UpdateAbilities();
1885 UpdateAccessibilityManagerService();
1886 }
1887 UpdateAllSetting();
1888 UpdateAutoStartAbilities();
1889 RegisterShortKeyEvent();
1890 RegisterScreenMagnificationState();
1891 RegisterScreenMagnificationType();
1892 }
1893
PackageRemoved(const std::string & bundleName)1894 void AccessibleAbilityManagerService::PackageRemoved(const std::string &bundleName)
1895 {
1896 sptr<AccessibilityAccountData> packageAccount = GetCurrentAccountData();
1897 if (!packageAccount) {
1898 HILOG_ERROR("packageAccount is nullptr.");
1899 return;
1900 }
1901
1902 packageAccount->DelAutoStartPrefKeyInRemovePkg(bundleName);
1903 std::vector<std::string> multiTarget = packageAccount->GetConfig()->GetShortkeyMultiTarget();
1904 std::string name = packageAccount->GetConfig()->GetShortkeyTarget();
1905 auto installedAbilities_ = packageAccount->GetInstalledAbilities();
1906 for (auto &installAbility : installedAbilities_) {
1907 std::string abilityId = installAbility.GetId();
1908 HILOG_DEBUG("abilityId%{public}s", abilityId.c_str());
1909 if (bundleName != installAbility.GetPackageName()) {
1910 continue;
1911 }
1912 if (std::find(removedAutoStartAbilities_.begin(), removedAutoStartAbilities_.end(), abilityId)
1913 == removedAutoStartAbilities_.end()) {
1914 removedAutoStartAbilities_.push_back(abilityId);
1915 }
1916 // no use later version
1917 if (abilityId == name) {
1918 std::string targetName = "";
1919 packageAccount->GetConfig()->SetShortkeyTarget(targetName);
1920 UpdateShortkeyTarget();
1921 }
1922 // multi
1923 for (const auto &target : multiTarget) {
1924 if (target == abilityId) {
1925 packageAccount->GetConfig()->SetShortkeyMultiTargetInPkgRemove(abilityId);
1926 UpdateShortkeyMultiTarget();
1927 }
1928 }
1929 }
1930
1931 if (packageAccount->RemoveAbility(bundleName)) {
1932 HILOG_DEBUG("ability%{public}s removed!", bundleName.c_str());
1933 UpdateAccessibilityManagerService();
1934 }
1935 }
1936
PackageAdd(const std::string & bundleName)1937 void AccessibleAbilityManagerService::PackageAdd(const std::string &bundleName)
1938 {
1939 sptr<AccessibilityAccountData> packageAccount = GetCurrentAccountData();
1940 if (!packageAccount) {
1941 HILOG_ERROR("packageAccount is nullptr");
1942 return;
1943 }
1944 for (auto &abilityId : removedAutoStartAbilities_) {
1945 if (packageAccount->GetAbilityAutoStartState(abilityId)) {
1946 packageAccount->SetAbilityAutoStartState(abilityId, false);
1947 }
1948 }
1949 packageAccount->AddAbility(bundleName);
1950 }
1951
PackageChanged(const std::string & bundleName)1952 void AccessibleAbilityManagerService::PackageChanged(const std::string &bundleName)
1953 {
1954 sptr<AccessibilityAccountData> packageAccount = GetCurrentAccountData();
1955 if (!packageAccount) {
1956 HILOG_ERROR("packageAccount is nullptr");
1957 return;
1958 }
1959
1960 bool isNeedUpdateShortKeyTarget = false;
1961 std::string target = packageAccount->GetConfig()->GetShortkeyTarget();
1962 if (target.substr(0, target.find("/")) == bundleName) {
1963 isNeedUpdateShortKeyTarget = true;
1964 }
1965 std::vector<std::string> multiTarget = packageAccount->GetConfig()->GetShortkeyMultiTarget();
1966
1967 packageAccount->ChangeAbility(bundleName);
1968 UpdateAccessibilityManagerService();
1969
1970 std::vector<std::string> sameBundleTarget;
1971 auto installedAbilities_ = packageAccount->GetInstalledAbilities();
1972 for (auto &installAbility : installedAbilities_) {
1973 std::string abilityId = installAbility.GetId();
1974 if (bundleName != installAbility.GetPackageName()) {
1975 continue;
1976 }
1977 if (abilityId == target) {
1978 isNeedUpdateShortKeyTarget = false;
1979 }
1980 sameBundleTarget.push_back(abilityId);
1981 }
1982
1983 if (isNeedUpdateShortKeyTarget) {
1984 packageAccount->GetConfig()->SetShortkeyTarget("");
1985 UpdateShortkeyTarget();
1986 }
1987 std::vector<std::string> tmpAbilities = multiTarget;
1988 bool isNeedUpdateShortKeyMultiTarget = false;
1989 Utils::SelectUsefulFromVecWithSameBundle(tmpAbilities, sameBundleTarget,
1990 isNeedUpdateShortKeyMultiTarget, bundleName);
1991 if (isNeedUpdateShortKeyMultiTarget) {
1992 packageAccount->GetConfig()->SetShortkeyMultiTarget(tmpAbilities);
1993 UpdateShortkeyMultiTarget();
1994 }
1995 }
1996
SetFindFocusedElementInfoResult(const AccessibilityElementInfo & info,const int32_t requestId)1997 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetFindFocusedElementInfoResult(
1998 const AccessibilityElementInfo &info, const int32_t requestId)
1999 {
2000 HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2001 if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2002 info.GetAccessibilityId()) == RET_OK) {
2003 HILOG_DEBUG("VerifyingToKenId ok");
2004 accessibilityInfoResult_ = info;
2005 promise_.set_value();
2006 } else {
2007 HILOG_ERROR("VerifyingToKenId failed");
2008 promise_.set_value();
2009 }
2010 }
2011
SetSearchElementInfoByTextResult(const std::vector<AccessibilityElementInfo> & infos,const int32_t requestId)2012 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetSearchElementInfoByTextResult(
2013 const std::vector<AccessibilityElementInfo> &infos, const int32_t requestId)
2014 {
2015 HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2016 for (auto info : infos) {
2017 if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2018 info.GetAccessibilityId()) == RET_OK) {
2019 HILOG_DEBUG("VerifyingToKenId ok");
2020 } else {
2021 HILOG_ERROR("VerifyingToKenId failed");
2022 elementInfosResult_.clear();
2023 promise_.set_value();
2024 return;
2025 }
2026 elementInfosResult_ = infos;
2027 }
2028 promise_.set_value();
2029 }
2030
SetSearchElementInfoByAccessibilityIdResult(const std::vector<AccessibilityElementInfo> & infos,const int32_t requestId)2031 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetSearchElementInfoByAccessibilityIdResult(
2032 const std::vector<AccessibilityElementInfo> &infos, const int32_t requestId)
2033 {
2034 HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2035 for (auto info : infos) {
2036 if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2037 info.GetAccessibilityId()) == RET_OK) {
2038 HILOG_DEBUG("VerifyingToKenId ok");
2039 } else {
2040 HILOG_ERROR("VerifyingToKenId failed");
2041 elementInfosResult_.clear();
2042 promise_.set_value();
2043 return;
2044 }
2045 elementInfosResult_ = infos;
2046 }
2047 promise_.set_value();
2048 }
2049
SetFocusMoveSearchResult(const AccessibilityElementInfo & info,const int32_t requestId)2050 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetFocusMoveSearchResult(
2051 const AccessibilityElementInfo &info, const int32_t requestId)
2052 {
2053 HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2054 if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2055 info.GetAccessibilityId()) == RET_OK) {
2056 HILOG_DEBUG("VerifyingToKenId ok");
2057 accessibilityInfoResult_ = info;
2058 promise_.set_value();
2059 } else {
2060 HILOG_ERROR("VerifyingToKenId failed");
2061 promise_.set_value();
2062 }
2063 }
2064
SetExecuteActionResult(const bool succeeded,const int32_t requestId)2065 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetExecuteActionResult(const bool succeeded,
2066 const int32_t requestId)
2067 {
2068 HILOG_DEBUG("Response [result:%{public}d, requestId:%{public}d]", succeeded, requestId);
2069 executeActionResult_ = succeeded;
2070 promise_.set_value();
2071 }
2072
SetCursorPositionResult(const int32_t cursorPosition,const int32_t requestId)2073 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetCursorPositionResult(const int32_t cursorPosition,
2074 const int32_t requestId)
2075 {
2076 HILOG_INFO("ElementOperatorCallbackImpl::SetCursorPositionResult [result:%{public}d]",
2077 cursorPosition);
2078 HILOG_DEBUG("cursorPosition [result:%{public}d, requestId:%{public}d]", cursorPosition, requestId);
2079 callCursorPosition_ = cursorPosition;
2080 promise_.set_value();
2081 }
2082
SetSearchDefaultFocusByWindowIdResult(const std::vector<AccessibilityElementInfo> & infos,const int32_t requestId)2083 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetSearchDefaultFocusByWindowIdResult(
2084 const std::vector<AccessibilityElementInfo> &infos, const int32_t requestId)
2085 {
2086 HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2087 for (auto info : infos) {
2088 if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2089 info.GetAccessibilityId()) == RET_OK) {
2090 HILOG_DEBUG("VerifyingToKenId ok");
2091 } else {
2092 HILOG_ERROR("VerifyingToKenId failed");
2093 elementInfosResult_.clear();
2094 promise_.set_value();
2095 return;
2096 }
2097 elementInfosResult_ = infos;
2098 }
2099 promise_.set_value();
2100 }
2101
GetParentElementRecursively(int32_t windowId,int64_t elementId,std::vector<AccessibilityElementInfo> & infos)2102 bool AccessibleAbilityManagerService::GetParentElementRecursively(int32_t windowId, int64_t elementId,
2103 std::vector<AccessibilityElementInfo>& infos)
2104 {
2105 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2106 if (!accountData) {
2107 HILOG_ERROR("GetCurrentAccountData failed");
2108 return false;
2109 }
2110
2111 int32_t treeId = 0;
2112 sptr<IAccessibilityElementOperator> elementOperator = nullptr;
2113 sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(windowId);
2114 if (!connection) {
2115 HILOG_ERROR("GetAccessibilityWindowConnection failed");
2116 return false;
2117 }
2118
2119 if (elementId > 0) {
2120 treeId = GetTreeIdBySplitElementId(elementId);
2121 elementOperator = connection->GetCardProxy(treeId);
2122 } else {
2123 elementOperator = connection->GetProxy();
2124 }
2125 if (elementOperator == nullptr) {
2126 HILOG_DEBUG("elementOperator failed elementId: %{public}" PRId64 " winId: %{public}d treeId: %{public}d",
2127 elementId, windowId, treeId);
2128 return false;
2129 }
2130 sptr<ElementOperatorCallbackImpl> callBack = new(std::nothrow) ElementOperatorCallbackImpl();
2131 if (callBack == nullptr) {
2132 HILOG_ERROR("Failed to create callBack.");
2133 return false;
2134 }
2135
2136 ffrt::future<void> promiseFuture = callBack->promise_.get_future();
2137 int32_t requestId = GenerateRequestId();
2138 AddRequestId(windowId, treeId, requestId, callBack);
2139 elementOperator->SearchElementInfoByAccessibilityId(elementId, requestId, callBack, 0);
2140 ffrt::future_status waitFocus = promiseFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
2141 if (waitFocus != ffrt::future_status::ready) {
2142 ipcTimeoutNum_++;
2143 HILOG_ERROR("Failed to wait result, number %{public}" PRId64 "", ipcTimeoutNum_);
2144 return false;
2145 }
2146
2147 for (auto& info : callBack->elementInfosResult_) {
2148 if (info.GetAccessibilityId() == AccessibilityElementInfo::UNDEFINED_ACCESSIBILITY_ID) {
2149 HILOG_ERROR("SearchElementInfoByAccessibilityId elementInfo from ace is wrong");
2150 return false;
2151 }
2152 }
2153
2154 infos = callBack->elementInfosResult_;
2155 HILOG_DEBUG("Get parent element success, size %{public}zu", infos.size());
2156 return true;
2157 }
2158
FindInnerWindowId(const AccessibilityEventInfo & event,int32_t & windowId)2159 void AccessibleAbilityManagerService::FindInnerWindowId(const AccessibilityEventInfo &event, int32_t& windowId)
2160 {
2161 HILOG_DEBUG();
2162 auto mapTable = Singleton<AccessibilityWindowManager>::GetInstance().sceneBoardElementIdMap_.GetAllPairs();
2163 int64_t elementId = event.GetAccessibilityId();
2164 int tmpWindowId = Singleton<AccessibilityWindowManager>::GetInstance().
2165 FindTreeIdWindowIdPair(GetTreeIdBySplitElementId(elementId));
2166 if (tmpWindowId != 0) {
2167 windowId = tmpWindowId;
2168 return;
2169 }
2170 while (1) {
2171 auto iter = std::find_if(mapTable.begin(), mapTable.end(),
2172 [elementId] (const std::pair<int32_t, int64_t>& p) {
2173 return elementId == p.second;
2174 });
2175 if (iter != mapTable.end()) {
2176 windowId = iter->first;
2177 break;
2178 }
2179 if (event.GetWindowId() == 1 && elementId == 0) {
2180 HILOG_INFO("parent elementId is 0");
2181 break;
2182 }
2183
2184 int32_t treeId = GetTreeIdBySplitElementId(elementId);
2185 // handle seprately because event send by UiExtension children tree may carry the root elemnt of children
2186 // tree, whose componentType is also root
2187 // deal other eventType like this may lead to performance problem
2188 if (treeId != 0) {
2189 // WindowScene
2190 // \
2191 // UiExtensionComponent -> try to find the windowId of the event send by its children node
2192 // \
2193 // root -> node that send event, and it's a UiExtensionNode
2194 // when elementId is element that at the UiExtension tree, try to get the id of UiExtensionComponent
2195 // by GetRootParentId,
2196 elementId = GetRootParentId(windowId, treeId);
2197 } else {
2198 // keep find its parent node, until it's a root node or find its elementId in sceneBoardElementIdMap_
2199 // which saves mapping of windowId&root-elementId of the window.
2200 std::vector<AccessibilityElementInfo> infos = {};
2201 if (GetParentElementRecursively(event.GetWindowId(), elementId, infos) == false || infos.size() == 0) {
2202 HILOG_ERROR("find parent element failed");
2203 break;
2204 }
2205
2206 if (infos[0].GetComponentType() == "root") {
2207 HILOG_ERROR("can not find parent element, has reach root node");
2208 break;
2209 }
2210
2211 elementId = infos[0].GetParentNodeId();
2212 }
2213 }
2214 int originTreeId = GetTreeIdBySplitElementId(event.GetAccessibilityId());
2215 Singleton<AccessibilityWindowManager>::GetInstance().InsertTreeIdWindowIdPair(originTreeId, windowId);
2216 }
2217
UpdateAccessibilityWindowStateByEvent(const AccessibilityEventInfo & event)2218 void AccessibleAbilityManagerService::UpdateAccessibilityWindowStateByEvent(const AccessibilityEventInfo &event)
2219 {
2220 EventType evtType = event.GetEventType();
2221 HILOG_DEBUG("windowId is %{public}d", event.GetWindowId());
2222 int32_t windowId = event.GetWindowId();
2223 if (windowId == 1) {
2224 int32_t innerWindowId = event.GetElementInfo().GetInnerWindowId();
2225 if (innerWindowId > 0) {
2226 windowId = innerWindowId;
2227 } else {
2228 FindInnerWindowId(event, windowId);
2229 }
2230 }
2231
2232 const_cast<AccessibilityEventInfo&>(event).SetElementMainWindowId(windowId);
2233
2234 switch (evtType) {
2235 case TYPE_VIEW_HOVER_ENTER_EVENT:
2236 Singleton<AccessibilityWindowManager>::GetInstance().SetActiveWindow(windowId, false);
2237 Singleton<AccessibilityWindowManager>::GetInstance().SetAccessibilityFocusedWindow(windowId);
2238 break;
2239 case TYPE_VIEW_ACCESSIBILITY_FOCUSED_EVENT:
2240 Singleton<AccessibilityWindowManager>::GetInstance().SetAccessibilityFocusedWindow(windowId);
2241 break;
2242 default:
2243 break;
2244 }
2245 }
2246
UpdateAccessibilityManagerService()2247 void AccessibleAbilityManagerService::UpdateAccessibilityManagerService()
2248 {
2249 HILOG_DEBUG("start.");
2250
2251 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2252 if (!accountData) {
2253 HILOG_ERROR("Account data is null");
2254 return;
2255 }
2256
2257 accountData->UpdateAccountCapabilities();
2258 UpdateInputFilter();
2259 UpdateAccessibilityState();
2260 UpdateShortKeyRegister();
2261 }
2262
UpdateAccessibilityState()2263 void AccessibleAbilityManagerService::UpdateAccessibilityState()
2264 {
2265 HILOG_DEBUG("start.");
2266 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2267 if (!accountData) {
2268 HILOG_ERROR("Account data is null");
2269 return;
2270 }
2271 uint32_t state = accountData->GetAccessibilityState();
2272 if (!(state & STATE_ACCESSIBILITY_ENABLED)) {
2273 Singleton<AccessibilityWindowManager>::GetInstance().ClearAccessibilityFocused();
2274 }
2275
2276 stateObservers_.OnStateObservers(state);
2277 }
2278
UpdateCaptionProperty()2279 void AccessibleAbilityManagerService::UpdateCaptionProperty()
2280 {
2281 return accessibilitySettings_->UpdateCaptionProperty();
2282 }
2283
UpdateSettingsInAtoHosTask()2284 void AccessibleAbilityManagerService::UpdateSettingsInAtoHosTask()
2285 {
2286 HILOG_DEBUG();
2287 if (!handler_) {
2288 HILOG_ERROR("UpdateSettingsInAtoHosTask: handler is nullptr!");
2289 return;
2290 }
2291 handler_->PostTask([=]() {
2292 UpdateSettingsInAtoHos();
2293 }, "UPDATE_SETTINGS_IN_ATOHOS_TASK");
2294 }
2295
UpdateAutoStartAbilities()2296 void AccessibleAbilityManagerService::UpdateAutoStartAbilities()
2297 {
2298 HILOG_DEBUG();
2299 if (!handler_) {
2300 HILOG_ERROR("UpdateAutoStartAbilities: handler is nullptr.");
2301 return;
2302 }
2303
2304 handler_->PostTask([=]() {
2305 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2306 if (!accountData) {
2307 HILOG_ERROR("Account data is null");
2308 return;
2309 }
2310 for (auto &abilityId : removedAutoStartAbilities_) {
2311 if (accountData->GetAbilityAutoStartState(abilityId)) {
2312 accountData->SetAbilityAutoStartState(abilityId, false);
2313 }
2314 }
2315 accountData->UpdateAutoStartEnabledAbilities();
2316 accountData->UpdateAbilities();
2317 }, "UPDATE_AUTO_START_ABILITIES");
2318 }
2319
UpdateSettingsInAtoHos()2320 void AccessibleAbilityManagerService::UpdateSettingsInAtoHos()
2321 {
2322 HILOG_DEBUG();
2323 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2324 if (!accountData) {
2325 HILOG_ERROR("accountData is nullptr.");
2326 return;
2327 }
2328
2329 if (!accountData->GetConfig()->GetStartToHosState() || currentAccountId_ != DEFAULT_ACCOUNT_ID) {
2330 HILOG_INFO("Not first start from a to hos.");
2331 return;
2332 }
2333 accessibilitySettings_->UpdateSettingsInAtoHos();
2334 }
2335
UpdateInputFilter()2336 void AccessibleAbilityManagerService::UpdateInputFilter()
2337 {
2338 HILOG_DEBUG("start.");
2339
2340 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2341 if (!accountData) {
2342 HILOG_ERROR("Account data is null");
2343 return;
2344 }
2345
2346 uint32_t flag = accountData->GetInputFilterFlag();
2347 HILOG_DEBUG("InputInterceptor flag is %{public}d", flag);
2348
2349 inputInterceptor_ = AccessibilityInputInterceptor::GetInstance();
2350 if (!inputInterceptor_) {
2351 HILOG_ERROR("inputInterceptor_ is null.");
2352 return;
2353 }
2354 inputInterceptor_->SetAvailableFunctions(flag);
2355 Utils::RecordStartingA11yEvent(flag);
2356 }
2357
UpdateAllSetting()2358 void AccessibleAbilityManagerService::UpdateAllSetting()
2359 {
2360 accessibilitySettings_->UpdateAllSetting();
2361 }
2362
UpdateShortKeyRegister()2363 void AccessibleAbilityManagerService::UpdateShortKeyRegister()
2364 {
2365 HILOG_DEBUG();
2366
2367 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2368 if (accountData == nullptr) {
2369 HILOG_ERROR("Account data is null!");
2370 return;
2371 }
2372
2373 bool shortKeyState = accountData->GetConfig()->GetShortKeyState();
2374 if (shortKeyState) {
2375 accessibilityShortKey_->Unregister();
2376 accessibilityShortKey_->Register();
2377 } else {
2378 accessibilityShortKey_->Unregister();
2379 }
2380 }
2381
SetScreenMagnificationState(const bool state)2382 RetError AccessibleAbilityManagerService::SetScreenMagnificationState(const bool state)
2383 {
2384 PostDelayUnloadTask();
2385 return accessibilitySettings_->SetScreenMagnificationState(state);
2386 }
2387
SetShortKeyState(const bool state)2388 RetError AccessibleAbilityManagerService::SetShortKeyState(const bool state)
2389 {
2390 PostDelayUnloadTask();
2391 return accessibilitySettings_->SetShortKeyState(state);
2392 }
2393
SetMouseKeyState(const bool state)2394 RetError AccessibleAbilityManagerService::SetMouseKeyState(const bool state)
2395 {
2396 PostDelayUnloadTask();
2397 return accessibilitySettings_->SetMouseKeyState(state);
2398 }
2399
SetMouseAutoClick(const int32_t time)2400 RetError AccessibleAbilityManagerService::SetMouseAutoClick(const int32_t time)
2401 {
2402 PostDelayUnloadTask();
2403 return accessibilitySettings_->SetMouseAutoClick(time);
2404 }
2405
SetShortkeyTarget(const std::string & name)2406 RetError AccessibleAbilityManagerService::SetShortkeyTarget(const std::string &name)
2407 {
2408 PostDelayUnloadTask();
2409 return accessibilitySettings_->SetShortkeyTarget(name);
2410 }
2411
SetShortkeyMultiTarget(const std::vector<std::string> & name)2412 RetError AccessibleAbilityManagerService::SetShortkeyMultiTarget(const std::vector<std::string> &name)
2413 {
2414 PostDelayUnloadTask();
2415 return accessibilitySettings_->SetShortkeyMultiTarget(name);
2416 }
2417
SetHighContrastTextState(const bool state)2418 RetError AccessibleAbilityManagerService::SetHighContrastTextState(const bool state)
2419 {
2420 PostDelayUnloadTask();
2421 return accessibilitySettings_->SetHighContrastTextState(state);
2422 }
2423
SetDaltonizationState(const bool state)2424 RetError AccessibleAbilityManagerService::SetDaltonizationState(const bool state)
2425 {
2426 PostDelayUnloadTask();
2427 return accessibilitySettings_->SetDaltonizationState(state);
2428 }
2429
SetInvertColorState(const bool state)2430 RetError AccessibleAbilityManagerService::SetInvertColorState(const bool state)
2431 {
2432 PostDelayUnloadTask();
2433 return accessibilitySettings_->SetInvertColorState(state);
2434 }
2435
SetAnimationOffState(const bool state)2436 RetError AccessibleAbilityManagerService::SetAnimationOffState(const bool state)
2437 {
2438 PostDelayUnloadTask();
2439 return accessibilitySettings_->SetAnimationOffState(state);
2440 }
2441
SetAudioMonoState(const bool state)2442 RetError AccessibleAbilityManagerService::SetAudioMonoState(const bool state)
2443 {
2444 PostDelayUnloadTask();
2445 return accessibilitySettings_->SetAudioMonoState(state);
2446 }
2447
SetDaltonizationColorFilter(const uint32_t filter)2448 RetError AccessibleAbilityManagerService::SetDaltonizationColorFilter(const uint32_t filter)
2449 {
2450 PostDelayUnloadTask();
2451 return accessibilitySettings_->SetDaltonizationColorFilter(filter);
2452 }
2453
SetContentTimeout(const uint32_t time)2454 RetError AccessibleAbilityManagerService::SetContentTimeout(const uint32_t time)
2455 {
2456 PostDelayUnloadTask();
2457 return accessibilitySettings_->SetContentTimeout(time);
2458 }
2459
SetBrightnessDiscount(const float discount)2460 RetError AccessibleAbilityManagerService::SetBrightnessDiscount(const float discount)
2461 {
2462 PostDelayUnloadTask();
2463 return accessibilitySettings_->SetBrightnessDiscount(discount);
2464 }
2465
SetAudioBalance(const float balance)2466 RetError AccessibleAbilityManagerService::SetAudioBalance(const float balance)
2467 {
2468 PostDelayUnloadTask();
2469 return accessibilitySettings_->SetAudioBalance(balance);
2470 }
2471
SetClickResponseTime(const uint32_t time)2472 RetError AccessibleAbilityManagerService::SetClickResponseTime(const uint32_t time)
2473 {
2474 PostDelayUnloadTask();
2475 return accessibilitySettings_->SetClickResponseTime(time);
2476 }
2477
SetIgnoreRepeatClickState(const bool state)2478 RetError AccessibleAbilityManagerService::SetIgnoreRepeatClickState(const bool state)
2479 {
2480 PostDelayUnloadTask();
2481 return accessibilitySettings_->SetIgnoreRepeatClickState(state);
2482 }
2483
SetIgnoreRepeatClickTime(const uint32_t time)2484 RetError AccessibleAbilityManagerService::SetIgnoreRepeatClickTime(const uint32_t time)
2485 {
2486 PostDelayUnloadTask();
2487 return accessibilitySettings_->SetIgnoreRepeatClickTime(time);
2488 }
2489
GetScreenMagnificationState(bool & state)2490 RetError AccessibleAbilityManagerService::GetScreenMagnificationState(bool &state)
2491 {
2492 PostDelayUnloadTask();
2493 return accessibilitySettings_->GetScreenMagnificationState(state);
2494 }
2495
GetShortKeyState(bool & state)2496 RetError AccessibleAbilityManagerService::GetShortKeyState(bool &state)
2497 {
2498 PostDelayUnloadTask();
2499 return accessibilitySettings_->GetShortKeyState(state);
2500 }
2501
GetMouseKeyState(bool & state)2502 RetError AccessibleAbilityManagerService::GetMouseKeyState(bool &state)
2503 {
2504 PostDelayUnloadTask();
2505 return accessibilitySettings_->GetMouseKeyState(state);
2506 }
2507
GetMouseAutoClick(int32_t & time)2508 RetError AccessibleAbilityManagerService::GetMouseAutoClick(int32_t &time)
2509 {
2510 PostDelayUnloadTask();
2511 return accessibilitySettings_->GetMouseAutoClick(time);
2512 }
2513
GetShortkeyTarget(std::string & name)2514 RetError AccessibleAbilityManagerService::GetShortkeyTarget(std::string &name)
2515 {
2516 PostDelayUnloadTask();
2517 return accessibilitySettings_->GetShortkeyTarget(name);
2518 }
2519
GetShortkeyMultiTarget(std::vector<std::string> & name)2520 RetError AccessibleAbilityManagerService::GetShortkeyMultiTarget(std::vector<std::string> &name)
2521 {
2522 PostDelayUnloadTask();
2523 return accessibilitySettings_->GetShortkeyMultiTarget(name);
2524 }
2525
GetHighContrastTextState(bool & state)2526 RetError AccessibleAbilityManagerService::GetHighContrastTextState(bool &state)
2527 {
2528 PostDelayUnloadTask();
2529 return accessibilitySettings_->GetHighContrastTextState(state);
2530 }
2531
GetDaltonizationState(bool & state)2532 RetError AccessibleAbilityManagerService::GetDaltonizationState(bool &state)
2533 {
2534 PostDelayUnloadTask();
2535 return accessibilitySettings_->GetDaltonizationState(state);
2536 }
2537
GetInvertColorState(bool & state)2538 RetError AccessibleAbilityManagerService::GetInvertColorState(bool &state)
2539 {
2540 PostDelayUnloadTask();
2541 return accessibilitySettings_->GetInvertColorState(state);
2542 }
2543
GetAnimationOffState(bool & state)2544 RetError AccessibleAbilityManagerService::GetAnimationOffState(bool &state)
2545 {
2546 PostDelayUnloadTask();
2547 return accessibilitySettings_->GetAnimationOffState(state);
2548 }
2549
GetAudioMonoState(bool & state)2550 RetError AccessibleAbilityManagerService::GetAudioMonoState(bool &state)
2551 {
2552 PostDelayUnloadTask();
2553 return accessibilitySettings_->GetAudioMonoState(state);
2554 }
2555
GetDaltonizationColorFilter(uint32_t & type)2556 RetError AccessibleAbilityManagerService::GetDaltonizationColorFilter(uint32_t &type)
2557 {
2558 PostDelayUnloadTask();
2559 return accessibilitySettings_->GetDaltonizationColorFilter(type);
2560 }
2561
GetContentTimeout(uint32_t & timer)2562 RetError AccessibleAbilityManagerService::GetContentTimeout(uint32_t &timer)
2563 {
2564 PostDelayUnloadTask();
2565 return accessibilitySettings_->GetContentTimeout(timer);
2566 }
2567
GetBrightnessDiscount(float & brightness)2568 RetError AccessibleAbilityManagerService::GetBrightnessDiscount(float &brightness)
2569 {
2570 PostDelayUnloadTask();
2571 return accessibilitySettings_->GetBrightnessDiscount(brightness);
2572 }
2573
GetAudioBalance(float & balance)2574 RetError AccessibleAbilityManagerService::GetAudioBalance(float &balance)
2575 {
2576 PostDelayUnloadTask();
2577 return accessibilitySettings_->GetAudioBalance(balance);
2578 }
2579
GetClickResponseTime(uint32_t & time)2580 RetError AccessibleAbilityManagerService::GetClickResponseTime(uint32_t &time)
2581 {
2582 PostDelayUnloadTask();
2583 return accessibilitySettings_->GetClickResponseTime(time);
2584 }
2585
GetIgnoreRepeatClickState(bool & state)2586 RetError AccessibleAbilityManagerService::GetIgnoreRepeatClickState(bool &state)
2587 {
2588 PostDelayUnloadTask();
2589 return accessibilitySettings_->GetIgnoreRepeatClickState(state);
2590 }
2591
GetIgnoreRepeatClickTime(uint32_t & time)2592 RetError AccessibleAbilityManagerService::GetIgnoreRepeatClickTime(uint32_t &time)
2593 {
2594 PostDelayUnloadTask();
2595 return accessibilitySettings_->GetIgnoreRepeatClickTime(time);
2596 }
2597
GetAllConfigs(AccessibilityConfigData & configData)2598 void AccessibleAbilityManagerService::GetAllConfigs(AccessibilityConfigData &configData)
2599 {
2600 HILOG_DEBUG();
2601 XCollieHelper timer(TIMER_GET_ALL_CONFIG, XCOLLIE_TIMEOUT);
2602 std::shared_ptr<ffrt::promise<void>> syncPromise = std::make_shared<ffrt::promise<void>>();
2603 std::shared_ptr<AccessibilityConfigData> config = std::make_shared<AccessibilityConfigData>();
2604 if (syncPromise == nullptr || config == nullptr) {
2605 HILOG_WARN("create syncPromise or config failed");
2606 return;
2607 }
2608 ffrt::future syncFuture = syncPromise->get_future();
2609 actionHandler_->PostTask([this, syncPromise, config]() {
2610 HILOG_DEBUG();
2611 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2612 if (!accountData) {
2613 HILOG_ERROR("accountData is nullptr");
2614 syncPromise->set_value();
2615 return;
2616 }
2617
2618 config->highContrastText_ = accountData->GetConfig()->GetHighContrastTextState();
2619 config->daltonizationState_ = accountData->GetConfig()->GetDaltonizationState();
2620 config->invertColor_ = accountData->GetConfig()->GetInvertColorState();
2621 config->animationOff_ = accountData->GetConfig()->GetAnimationOffState();
2622 config->audioMono_ = accountData->GetConfig()->GetAudioMonoState();
2623 config->mouseKey_ = accountData->GetConfig()->GetMouseKeyState();
2624 config->captionState_ = accountData->GetConfig()->GetCaptionState();
2625 config->screenMagnifier_ = accountData->GetConfig()->GetScreenMagnificationState();
2626 config->shortkey_ = accountData->GetConfig()->GetShortKeyState();
2627 config->mouseAutoClick_ = accountData->GetConfig()->GetMouseAutoClick();
2628 config->daltonizationColorFilter_ = accountData->GetConfig()->GetDaltonizationColorFilter();
2629 config->contentTimeout_ = accountData->GetConfig()->GetContentTimeout();
2630 config->brightnessDiscount_ = accountData->GetConfig()->GetBrightnessDiscount();
2631 config->audioBalance_ = accountData->GetConfig()->GetAudioBalance();
2632 config->shortkeyTarget_ = accountData->GetConfig()->GetShortkeyTarget();
2633 config->shortkeyMultiTarget_ = accountData->GetConfig()->GetShortkeyMultiTarget();
2634 config->captionProperty_ = accountData->GetConfig()->GetCaptionProperty();
2635 syncPromise->set_value();
2636 }, "TASK_GET_ALL_CONFIGS");
2637
2638 ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
2639 if (wait != ffrt::future_status::ready) {
2640 HILOG_ERROR("Failed to wait GetAllConfigs result");
2641 return;
2642 }
2643 configData = *config;
2644 return syncFuture.get();
2645 }
2646
EnableShortKeyTargetAbility(const std::string & name)2647 bool AccessibleAbilityManagerService::EnableShortKeyTargetAbility(const std::string &name)
2648 {
2649 HILOG_DEBUG();
2650 HILOG_INFO("EnableShortKeyTargetAbility name = %{public}s", name.c_str());
2651 HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "EnableShortKeyTargetAbility");
2652
2653 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2654 if (!accountData) {
2655 HILOG_ERROR("accountData is nullptr");
2656 return false;
2657 }
2658
2659 std::string targetAbility;
2660 if (name != "") {
2661 targetAbility = name;
2662 } else {
2663 targetAbility = accountData->GetConfig()->GetShortkeyTarget();
2664 HILOG_DEBUG("target ability is [%{public}s]", targetAbility.c_str());
2665 if (targetAbility == "") {
2666 HILOG_ERROR("target ability is null");
2667 return false;
2668 }
2669 }
2670
2671 auto it = AccessibilityConfigTable.find(targetAbility);
2672 if (it != AccessibilityConfigTable.end()) {
2673 return SetTargetAbility(it->second);
2674 }
2675
2676 uint32_t capabilities = CAPABILITY_GESTURE | CAPABILITY_KEY_EVENT_OBSERVER | CAPABILITY_RETRIEVE |
2677 CAPABILITY_TOUCH_GUIDE | CAPABILITY_ZOOM;
2678 RetError enableState = accountData->EnableAbility(targetAbility, capabilities);
2679 if (enableState == RET_ERR_CONNECTION_EXIST) {
2680 HILOG_DEBUG();
2681 Utils::RecordEnableShortkeyAbilityEvent(targetAbility, false);
2682 return InnerDisableAbility(targetAbility) == RET_OK;
2683 } else if (enableState == RET_OK) {
2684 Utils::RecordEnableShortkeyAbilityEvent(targetAbility, true);
2685 return true;
2686 } else {
2687 return false;
2688 }
2689 }
2690
OnShortKeyProcess()2691 void AccessibleAbilityManagerService::OnShortKeyProcess()
2692 {
2693 HILOG_DEBUG();
2694
2695 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2696 if (accountData == nullptr) {
2697 HILOG_ERROR("accountData is nullptr");
2698 return;
2699 }
2700
2701 std::shared_ptr<AccessibilityShortkeyDialog> shortkeyDialog = std::make_shared<AccessibilityShortkeyDialog>();
2702
2703 std::shared_ptr<AccessibilitySettingProvider> service =
2704 AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
2705 if (service == nullptr) {
2706 HILOG_ERROR("service is nullptr");
2707 return;
2708 }
2709 bool oobeState = false;
2710 bool userSetupState = false;
2711 service->GetBoolValue(DEVICE_PROVISIONED, oobeState);
2712 if (accountData->GetConfig()->GetDbHandle()) {
2713 userSetupState = accountData->GetConfig()->GetDbHandle()->GetBoolValue(USER_SETUP_COMPLETED, false);
2714 }
2715 if (oobeState && userSetupState) {
2716 int32_t shortKeyTimeout = accountData->GetConfig()->GetShortKeyTimeout();
2717 if (shortKeyTimeout == SHORT_KEY_TIMEOUT_BEFORE_USE) {
2718 HILOG_INFO("first use short cut key");
2719 accountData->GetConfig()->SetShortKeyTimeout(SHORT_KEY_TIMEOUT_AFTER_USE);
2720 shortkeyDialog->ConnectDialog(ShortKeyDialogType::RECONFIRM);
2721 return;
2722 }
2723 }
2724
2725 std::vector<std::string> shortkeyMultiTarget = accountData->GetConfig()->GetShortkeyMultiTarget();
2726 if (shortkeyMultiTarget.size() == 0) {
2727 EnableShortKeyTargetAbility();
2728 } else if (shortkeyMultiTarget.size() == 1) {
2729 EnableShortKeyTargetAbility(shortkeyMultiTarget[0]);
2730 } else {
2731 // dialog
2732 if (shortkeyDialog->ConnectDialog(ShortKeyDialogType::FUNCTION_SELECT)) {
2733 HILOG_DEBUG("ready to build dialog");
2734 }
2735 }
2736 }
2737
DisableShortKeyTargetAbility()2738 bool AccessibleAbilityManagerService::DisableShortKeyTargetAbility()
2739 {
2740 HILOG_DEBUG();
2741 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2742 if (!accountData) {
2743 HILOG_ERROR("accountData is nullptr");
2744 return false;
2745 }
2746
2747 std::string targetAbility = accountData->GetConfig()->GetShortkeyTarget();
2748 HILOG_DEBUG("target ability is [%{public}s]", targetAbility.c_str());
2749 if (targetAbility == "") {
2750 HILOG_ERROR("target ability is null");
2751 return false;
2752 }
2753 return InnerDisableAbility(targetAbility) == RET_OK;
2754 }
2755
RegisterConfigObserver(const sptr<IAccessibleAbilityManagerConfigObserver> & callback)2756 uint32_t AccessibleAbilityManagerService::RegisterConfigObserver(
2757 const sptr<IAccessibleAbilityManagerConfigObserver> &callback)
2758 {
2759 HILOG_DEBUG();
2760 if (!callback || !actionHandler_) {
2761 HILOG_ERROR("Parameters check failed!");
2762 return ERR_INVALID_VALUE;
2763 }
2764 XCollieHelper timer(TIMER_REGISTER_CONFIG_OBSERVER, XCOLLIE_TIMEOUT);
2765 std::shared_ptr<ffrt::promise<uint32_t>> syncPromisePtr = std::make_shared<ffrt::promise<uint32_t>>();
2766 ffrt::future syncFuture = syncPromisePtr->get_future();
2767 actionHandler_->PostTask([this, syncPromisePtr, callback]() {
2768 HILOG_DEBUG();
2769 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2770 if (!accountData) {
2771 HILOG_ERROR("Account data is null");
2772 syncPromisePtr->set_value(ERR_INVALID_VALUE);
2773 return;
2774 }
2775 if (!configCallbackDeathRecipient_) {
2776 configCallbackDeathRecipient_ = new(std::nothrow) ConfigCallbackDeathRecipient();
2777 if (!configCallbackDeathRecipient_) {
2778 HILOG_ERROR("configCallbackDeathRecipient_ is null");
2779 syncPromisePtr->set_value(ERR_INVALID_VALUE);
2780 return;
2781 }
2782 }
2783 if (!callback->AsObject()) {
2784 HILOG_ERROR("object is null");
2785 syncPromisePtr->set_value(0);
2786 return;
2787 }
2788 callback->AsObject()->AddDeathRecipient(configCallbackDeathRecipient_);
2789 accountData->AddConfigCallback(callback);
2790 HILOG_DEBUG("the size of caption property callbacks is %{public}zu",
2791 accountData->GetConfigCallbacks().size());
2792 syncPromisePtr->set_value(NO_ERROR);
2793 }, "TASK_REGISTER_CONFIG_OBSERVER");
2794
2795 ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
2796 if (wait != ffrt::future_status::ready) {
2797 HILOG_ERROR("Failed to wait RegisterConfigObserver result");
2798 return RET_ERR_TIME_OUT;
2799 }
2800 return syncFuture.get();
2801 }
2802
OnRemoteDied(const wptr<IRemoteObject> & remote)2803 void AccessibleAbilityManagerService::ConfigCallbackDeathRecipient::OnRemoteDied(
2804 const wptr<IRemoteObject> &remote)
2805 {
2806 Singleton<AccessibleAbilityManagerService>::GetInstance().RemoveCallback(CONFIG_CALLBACK, this, remote);
2807 }
2808
OnRemoteDied(const wptr<IRemoteObject> & remote)2809 void AccessibleAbilityManagerService::BundleManagerDeathRecipient::OnRemoteDied(
2810 const wptr<IRemoteObject> &remote)
2811 {
2812 Singleton<AccessibleAbilityManagerService>::GetInstance().OnBundleManagerDied(remote);
2813 }
2814
UpdateConfigState()2815 void AccessibleAbilityManagerService::UpdateConfigState()
2816 {
2817 return accessibilitySettings_->UpdateConfigState();
2818 }
2819
UpdateAudioBalance()2820 void AccessibleAbilityManagerService::UpdateAudioBalance()
2821 {
2822 return accessibilitySettings_->UpdateAudioBalance();
2823 }
2824
UpdateBrightnessDiscount()2825 void AccessibleAbilityManagerService::UpdateBrightnessDiscount()
2826 {
2827 return accessibilitySettings_->UpdateBrightnessDiscount();
2828 }
2829
UpdateContentTimeout()2830 void AccessibleAbilityManagerService::UpdateContentTimeout()
2831 {
2832 return accessibilitySettings_->UpdateContentTimeout();
2833 }
2834
UpdateDaltonizationColorFilter()2835 void AccessibleAbilityManagerService::UpdateDaltonizationColorFilter()
2836 {
2837 return accessibilitySettings_->UpdateDaltonizationColorFilter();
2838 }
2839
UpdateMouseAutoClick()2840 void AccessibleAbilityManagerService::UpdateMouseAutoClick()
2841 {
2842 return accessibilitySettings_->UpdateMouseAutoClick();
2843 }
2844
UpdateShortkeyTarget()2845 void AccessibleAbilityManagerService::UpdateShortkeyTarget()
2846 {
2847 return accessibilitySettings_->UpdateShortkeyTarget();
2848 }
2849
UpdateShortkeyMultiTarget()2850 void AccessibleAbilityManagerService::UpdateShortkeyMultiTarget()
2851 {
2852 return accessibilitySettings_->UpdateShortkeyMultiTarget();
2853 }
2854
UpdateClickResponseTime()2855 void AccessibleAbilityManagerService::UpdateClickResponseTime()
2856 {
2857 return accessibilitySettings_->UpdateClickResponseTime();
2858 }
2859
UpdateIgnoreRepeatClickTime()2860 void AccessibleAbilityManagerService::UpdateIgnoreRepeatClickTime()
2861 {
2862 return accessibilitySettings_->UpdateIgnoreRepeatClickTime();
2863 }
2864
RemoveCallback(CallBackID callback,const sptr<DeathRecipient> & recipient,const wptr<IRemoteObject> & remote)2865 void AccessibleAbilityManagerService::RemoveCallback(CallBackID callback,
2866 const sptr<DeathRecipient> &recipient, const wptr<IRemoteObject> &remote)
2867 {
2868 HILOG_INFO("remove callback[%{public}d]", callback);
2869 if (!handler_) {
2870 HILOG_ERROR("handler is nullptr");
2871 return;
2872 }
2873 handler_->PostTask([=]() {
2874 if (!remote.GetRefPtr()) {
2875 HILOG_ERROR("remote is null");
2876 return;
2877 }
2878 remote->RemoveDeathRecipient(recipient);
2879
2880 if (callback == CONFIG_CALLBACK) {
2881 RemoveSavedConfigCallback(remote);
2882 }
2883 auto accountData = GetCurrentAccountData();
2884 if (!accountData) {
2885 HILOG_ERROR("Current account data is null");
2886 return;
2887 }
2888 switch (callback) {
2889 case STATE_CALLBACK:
2890 stateObservers_.RemoveStateObserver(remote);
2891 break;
2892 case CAPTION_PROPERTY_CALLBACK:
2893 accountData->RemoveCaptionPropertyCallback(remote);
2894 break;
2895 case ENABLE_ABILITY_LISTS_CALLBACK:
2896 accountData->RemoveEnableAbilityListsObserver(remote);
2897 break;
2898 case CONFIG_CALLBACK:
2899 accountData->RemoveConfigCallback(remote);
2900 break;
2901 default:
2902 break;
2903 }
2904 }, "RemoveCallback");
2905 }
2906
RemoveSavedConfigCallback(const wptr<IRemoteObject> & callback)2907 void AccessibleAbilityManagerService::RemoveSavedConfigCallback(const wptr<IRemoteObject>& callback)
2908 {
2909 HILOG_DEBUG("start.");
2910 for (auto itr = defaultConfigCallbacks_.begin(); itr != defaultConfigCallbacks_.end(); itr++) {
2911 if ((*itr)->AsObject() == callback) {
2912 defaultConfigCallbacks_.erase(itr);
2913 break;
2914 }
2915 }
2916 }
2917
OnBundleManagerDied(const wptr<IRemoteObject> & remote)2918 void AccessibleAbilityManagerService::OnBundleManagerDied(const wptr<IRemoteObject> &remote)
2919 {
2920 HILOG_INFO("OnBundleManagerDied ");
2921 if (!handler_) {
2922 HILOG_ERROR("handler is nullptr");
2923 return;
2924 }
2925
2926 handler_->PostTask([=]() {
2927 if (!remote.GetRefPtr() || !bundleManager_) {
2928 HILOG_ERROR("remote is null");
2929 return;
2930 }
2931
2932 bundleManager_->AsObject()->RemoveDeathRecipient(bundleManagerDeathRecipient_);
2933 bundleManager_ = nullptr;
2934 }, "OnBundleManagerDied");
2935 }
2936
AddStateObserver(const sptr<IAccessibleAbilityManagerStateObserver> & stateObserver)2937 void AccessibleAbilityManagerService::StateObservers::AddStateObserver(
2938 const sptr<IAccessibleAbilityManagerStateObserver>& stateObserver)
2939 {
2940 std::lock_guard<ffrt::mutex> lock(stateObserversMutex_);
2941 auto iter = std::find(observersList_.begin(), observersList_.end(), stateObserver);
2942 if (iter == observersList_.end()) {
2943 observersList_.push_back(stateObserver);
2944 HILOG_DEBUG("register state observer successfully");
2945 return;
2946 }
2947
2948 HILOG_INFO("state observer is existed");
2949 }
2950
OnStateObservers(uint32_t state)2951 void AccessibleAbilityManagerService::StateObservers::OnStateObservers(uint32_t state)
2952 {
2953 std::lock_guard<ffrt::mutex> lock(stateObserversMutex_);
2954 for (auto& stateObserver : observersList_) {
2955 if (stateObserver) {
2956 stateObserver->OnStateChanged(state);
2957 }
2958 }
2959 }
2960
RemoveStateObserver(const wptr<IRemoteObject> & remote)2961 void AccessibleAbilityManagerService::StateObservers::RemoveStateObserver(const wptr<IRemoteObject> &remote)
2962 {
2963 std::lock_guard<ffrt::mutex> lock(stateObserversMutex_);
2964 auto iter = std::find_if(observersList_.begin(), observersList_.end(),
2965 [remote](const sptr<IAccessibleAbilityManagerStateObserver>& stateObserver) {
2966 return stateObserver->AsObject() == remote;
2967 });
2968 if (iter != observersList_.end()) {
2969 observersList_.erase(iter);
2970 }
2971 }
2972
Clear()2973 void AccessibleAbilityManagerService::StateObservers::Clear()
2974 {
2975 std::lock_guard<ffrt::mutex> lock(stateObserversMutex_);
2976 observersList_.clear();
2977 }
2978
GetFocusedWindowId(int32_t & focusedWindowId)2979 RetError AccessibleAbilityManagerService::GetFocusedWindowId(int32_t &focusedWindowId)
2980 {
2981 HILOG_DEBUG();
2982 return Singleton<AccessibilityWindowManager>::GetInstance().GetFocusedWindowId(focusedWindowId);
2983 }
2984
InsertWindowIdEventPair(int32_t windowId,const AccessibilityEventInfo & event)2985 void AccessibleAbilityManagerService::InsertWindowIdEventPair(int32_t windowId, const AccessibilityEventInfo &event)
2986 {
2987 HILOG_DEBUG("insert event, windowId: %{public}d", windowId);
2988 windowFocusEventMap_.EnsureInsert(windowId, event);
2989 }
2990
CheckWindowIdEventExist(int32_t windowId)2991 bool AccessibleAbilityManagerService::CheckWindowIdEventExist(int32_t windowId)
2992 {
2993 AccessibilityEventInfo eventInfo;
2994 return windowFocusEventMap_.Find(windowId, eventInfo);
2995 }
2996
CheckWindowRegister(int32_t windowId)2997 bool AccessibleAbilityManagerService::CheckWindowRegister(int32_t windowId)
2998 {
2999 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3000 if (!accountData) {
3001 HILOG_ERROR("accountData is nullptr.");
3002 return false;
3003 }
3004 return accountData->GetAccessibilityWindowConnection(windowId) != nullptr;
3005 }
3006
OnDeviceProvisioned()3007 void AccessibleAbilityManagerService::OnDeviceProvisioned()
3008 {
3009 HILOG_DEBUG();
3010 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3011 if (!accountData) {
3012 HILOG_ERROR("accountData is nullptr");
3013 return;
3014 }
3015 std::shared_ptr<AccessibilitySettingProvider> service =
3016 AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
3017 if (service == nullptr) {
3018 HILOG_ERROR("service is nullptr");
3019 return;
3020 }
3021 service->UnregisterObserver(DEVICE_PROVISIONED);
3022 if (accountData->GetConfig()->GetDbHandle()) {
3023 accountData->GetConfig()->GetDbHandle()->UnregisterObserver(USER_SETUP_COMPLETED);
3024 }
3025 if (accountData->GetDefaultUserScreenReaderState()) {
3026 HILOG_INFO("Modify shortKeyTimeout and shortKeyOnLockScreenState");
3027 accountData->GetConfig()->SetShortKeyTimeout(SHORT_KEY_TIMEOUT_AFTER_USE);
3028 accountData->GetConfig()->SetShortKeyOnLockScreenState(true);
3029 UpdateConfigState();
3030 }
3031 }
3032
InitializeShortKeyState()3033 void AccessibleAbilityManagerService::InitializeShortKeyState()
3034 {
3035 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3036 if (!accountData) {
3037 HILOG_ERROR("accountData is nullptr");
3038 return;
3039 }
3040
3041 bool shortKeyFlag = false;
3042 if (accountData->GetAccountId() != DEFAULT_ACCOUNT_ID && accountData->GetConfig()->GetDbHandle() != nullptr) {
3043 if (accountData->GetConfig()->GetDbHandle()->GetIntValue(SHORTCUT_ENABLED, INVALID_SHORTCUT_STATE) ==
3044 INVALID_SHORTCUT_STATE) {
3045 HILOG_INFO("Initialize the shortcut key state of PrivateSpace");
3046 shortKeyFlag = true;
3047 }
3048 } else if (accountData->GetAccountId() == DEFAULT_ACCOUNT_ID) {
3049 HILOG_INFO("Initialize the shortcut key state of MainSpace");
3050 shortKeyFlag = true;
3051 }
3052
3053 if (shortKeyFlag) {
3054 accountData->GetConfig()->SetShortKeyState(true);
3055 std::vector<std::string> tmpVec { SCREEN_READER_BUNDLE_ABILITY_NAME };
3056 accountData->GetConfig()->SetShortkeyMultiTarget(tmpVec);
3057 UpdateConfigState();
3058 Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateShortKeyRegister();
3059 }
3060 }
3061
RegisterProvisionCallback()3062 void AccessibleAbilityManagerService::RegisterProvisionCallback()
3063 {
3064 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3065 if (!accountData) {
3066 HILOG_ERROR("accountData is nullptr");
3067 return;
3068 }
3069
3070 std::shared_ptr<AccessibilitySettingProvider> service =
3071 AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
3072 if (service == nullptr) {
3073 HILOG_ERROR("service is nullptr");
3074 return;
3075 }
3076 AccessibilitySettingObserver::UpdateFunc func = [ = ](const std::string &state) {
3077 Singleton<AccessibleAbilityManagerService>::GetInstance().OnDeviceProvisioned();
3078 };
3079 service->RegisterObserver(DEVICE_PROVISIONED, func);
3080 if (accountData->GetConfig()->GetDbHandle() != nullptr) {
3081 accountData->GetConfig()->GetDbHandle()->RegisterObserver(USER_SETUP_COMPLETED, func);
3082 }
3083 }
3084
RegisterShortKeyEvent()3085 void AccessibleAbilityManagerService::RegisterShortKeyEvent()
3086 {
3087 HILOG_DEBUG();
3088 if (!handler_) {
3089 HILOG_ERROR("handler_ is nullptr");
3090 return;
3091 }
3092 handler_->PostTask([=]() {
3093 HILOG_DEBUG();
3094 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3095 if (!accountData) {
3096 HILOG_ERROR("accountData is nullptr");
3097 return;
3098 }
3099
3100 std::shared_ptr<AccessibilitySettingProvider> service =
3101 AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
3102 if (service == nullptr) {
3103 HILOG_ERROR("service is nullptr");
3104 return;
3105 }
3106 bool oobeState = false;
3107 bool userSetupState = false;
3108 service->GetBoolValue(DEVICE_PROVISIONED, oobeState);
3109 if (accountData->GetConfig()->GetDbHandle() != nullptr) {
3110 userSetupState = accountData->GetConfig()->GetDbHandle()->GetBoolValue(USER_SETUP_COMPLETED, false);
3111 }
3112 if (accountData->GetAccountId() == DEFAULT_ACCOUNT_ID && (oobeState == false || userSetupState == false)) {
3113 InitializeShortKeyState();
3114 RegisterProvisionCallback();
3115 } else if (accountData->GetAccountId() != DEFAULT_ACCOUNT_ID) {
3116 InitializeShortKeyState();
3117 }
3118 }, "REGISTER_SHORTKEY_OBSERVER");
3119 }
3120
OffZoomGesture()3121 void AccessibleAbilityManagerService::OffZoomGesture()
3122 {
3123 HILOG_INFO();
3124 #ifdef OHOS_BUILD_ENABLE_DISPLAY_MANAGER
3125 AccessibilityDisplayManager &displayMgr = Singleton<AccessibilityDisplayManager>::GetInstance();
3126 uint64_t currentScreen = displayMgr.GetDefaultDisplayId();
3127 float normalScale = 1.0f;
3128 float defaultAnchor = 0.5f;
3129 displayMgr.SetDisplayScale(currentScreen, normalScale, normalScale, defaultAnchor, defaultAnchor);
3130 return;
3131 #else
3132 HILOG_INFO("not support zoom");
3133 return;
3134 #endif
3135 }
3136
OnScreenMagnificationStateChanged()3137 void AccessibleAbilityManagerService::OnScreenMagnificationStateChanged()
3138 {
3139 HILOG_DEBUG();
3140 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3141 if (accountData == nullptr) {
3142 HILOG_ERROR("accountData is nullptr");
3143 return;
3144 }
3145
3146 std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
3147 if (config == nullptr) {
3148 HILOG_ERROR("config is nullptr");
3149 return;
3150 }
3151
3152 if (config->GetDbHandle() == nullptr) {
3153 HILOG_ERROR("datashareHelper is nullptr");
3154 return;
3155 }
3156
3157 bool screenMagnificationEnabled = false;
3158 screenMagnificationEnabled = config->GetDbHandle()->GetBoolValue(SCREEN_MAGNIFICATION_KEY, false);
3159 config->SetScreenMagnificationState(screenMagnificationEnabled);
3160 Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateInputFilter();
3161 if (!screenMagnificationEnabled) {
3162 OffZoomGesture();
3163 }
3164 }
3165
RegisterScreenMagnificationState()3166 void AccessibleAbilityManagerService::RegisterScreenMagnificationState()
3167 {
3168 HILOG_DEBUG();
3169 if (handler_ == nullptr) {
3170 HILOG_ERROR("handler_ is nullptr");
3171 return;
3172 }
3173 handler_->PostTask([=]() {
3174 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3175 if (accountData == nullptr) {
3176 HILOG_ERROR("accountData is nullptr");
3177 return;
3178 }
3179
3180 AccessibilitySettingObserver::UpdateFunc func = [ = ](const std::string &state) {
3181 Singleton<AccessibleAbilityManagerService>::GetInstance().OnScreenMagnificationStateChanged();
3182 };
3183 if (accountData->GetConfig()->GetDbHandle()) {
3184 accountData->GetConfig()->GetDbHandle()->RegisterObserver(SCREEN_MAGNIFICATION_KEY, func);
3185 }
3186 }, "REGISTER_SCREEN_ZOOM_OBSERVER");
3187 }
3188
OnScreenMagnificationTypeChanged()3189 void AccessibleAbilityManagerService::OnScreenMagnificationTypeChanged()
3190 {
3191 HILOG_DEBUG();
3192 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3193 if (accountData == nullptr) {
3194 HILOG_ERROR("accountData is nullptr");
3195 return;
3196 }
3197
3198 std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
3199 if (config == nullptr) {
3200 HILOG_ERROR("config is nullptr");
3201 return;
3202 }
3203
3204 if (config->GetDbHandle() == nullptr) {
3205 HILOG_ERROR("datashareHelper is nullptr");
3206 return;
3207 }
3208
3209 uint32_t screenMagnificationType = 0;
3210 screenMagnificationType =
3211 static_cast<uint32_t>(config->GetDbHandle()->GetIntValue(SCREEN_MAGNIFICATION_TYPE, 0));
3212 config->SetScreenMagnificationType(screenMagnificationType);
3213 Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateInputFilter();
3214 }
3215
RegisterScreenMagnificationType()3216 void AccessibleAbilityManagerService::RegisterScreenMagnificationType()
3217 {
3218 HILOG_DEBUG();
3219 if (handler_ == nullptr) {
3220 HILOG_ERROR("handler_ is nullptr");
3221 return;
3222 }
3223 handler_->PostTask([=]() {
3224 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3225 if (accountData == nullptr) {
3226 HILOG_ERROR("accountData is nullptr");
3227 return;
3228 }
3229
3230 AccessibilitySettingObserver::UpdateFunc func = [ = ](const std::string &state) {
3231 Singleton<AccessibleAbilityManagerService>::GetInstance().OnScreenMagnificationTypeChanged();
3232 };
3233 if (accountData->GetConfig()->GetDbHandle()) {
3234 accountData->GetConfig()->GetDbHandle()->RegisterObserver(SCREEN_MAGNIFICATION_TYPE, func);
3235 }
3236 }, "REGISTER_SCREEN_ZOOM_TYPE_OBSERVER");
3237 }
3238
PostDelayUnloadTask()3239 void AccessibleAbilityManagerService::PostDelayUnloadTask()
3240 {
3241 auto task = [=]() {
3242 sptr<ISystemAbilityManager> systemAbilityManager =
3243 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
3244 if (systemAbilityManager == nullptr) {
3245 HILOG_ERROR("failed to get system ability mgr");
3246 return;
3247 }
3248 if (!IsNeedUnload()) {
3249 Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
3250 return;
3251 }
3252 int32_t ret = systemAbilityManager->UnloadSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
3253 if (ret != ERR_OK) {
3254 HILOG_ERROR("unload system ability failed");
3255 return;
3256 }
3257 SetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false");
3258 };
3259 handler_->RemoveTask(DELAY_UNLOAD_TASK);
3260 handler_->PostTask(task, DELAY_UNLOAD_TASK, UNLOAD_TASK_INTERNAL);
3261 }
3262
IsNeedUnload()3263 bool AccessibleAbilityManagerService::IsNeedUnload()
3264 {
3265 HILOG_DEBUG();
3266 #ifndef ACCESSIBILITY_WATCH_FEATURE
3267 // always return true to avoid stablity problem
3268 return false;
3269 #else // for watch
3270 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3271 if (!accountData) {
3272 HILOG_ERROR("accountData is nullptr");
3273 return true;
3274 }
3275
3276 // do not unload when any extension is enabled
3277 std::vector<std::string> enableAbilityList = accountData->GetEnabledAbilities();
3278 if (enableAbilityList.size() != 0) {
3279 return false;
3280 }
3281 return true;
3282 #endif // ACCESSIBILITY_WATCH_FEATURE
3283 }
3284
GetTreeIdBySplitElementId(const int64_t elementId)3285 int32_t AccessibleAbilityManagerService::GetTreeIdBySplitElementId(const int64_t elementId)
3286 {
3287 if (elementId < 0) {
3288 HILOG_DEBUG("The elementId is -1");
3289 return elementId;
3290 }
3291 int32_t treeId = (static_cast<uint64_t>(elementId) >> ELEMENT_MOVE_BIT);
3292 return treeId;
3293 }
3294
AddRequestId(int32_t windowId,int32_t treeId,int32_t requestId,sptr<IAccessibilityElementOperatorCallback> callback)3295 void AccessibleAbilityManagerService::AddRequestId(int32_t windowId, int32_t treeId, int32_t requestId,
3296 sptr<IAccessibilityElementOperatorCallback> callback)
3297 {
3298 std::lock_guard<ffrt::mutex> lock(mutex_);
3299 HILOG_DEBUG("Add windowId: %{public}d treeId: %{public}d requestId: %{public}d", windowId, treeId, requestId);
3300 if (!windowRequestIdMap_.count(windowId)) {
3301 windowRequestIdMap_[windowId] = {};
3302 }
3303 if (!windowRequestIdMap_[windowId].count(treeId)) {
3304 windowRequestIdMap_[windowId][treeId] = {};
3305 }
3306 if (!windowRequestIdMap_[windowId][treeId].count(requestId)) {
3307 windowRequestIdMap_[windowId][treeId].insert(requestId);
3308 requestIdMap_[requestId] = callback;
3309 }
3310 }
3311
RemoveRequestId(int32_t requestId)3312 void AccessibleAbilityManagerService::RemoveRequestId(int32_t requestId)
3313 {
3314 std::lock_guard<ffrt::mutex> lock(mutex_);
3315 HILOG_DEBUG("RemoveRequestId requestId: %{public}d", requestId);
3316 for (auto &window : windowRequestIdMap_) {
3317 for (auto &tree : window.second) {
3318 auto it = tree.second.find(requestId);
3319 if (it != tree.second.end()) {
3320 HILOG_DEBUG("tree.second.erase requestId:%{public}d", requestId);
3321 tree.second.erase(it);
3322 }
3323 auto ite = requestIdMap_.find(requestId);
3324 if (ite != requestIdMap_.end()) {
3325 HILOG_DEBUG("requestIdMap_.erase requestId:%{public}d", requestId);
3326 requestIdMap_.erase(ite);
3327 }
3328 }
3329 }
3330 }
3331
StopCallbackWait(int32_t windowId)3332 void AccessibleAbilityManagerService::StopCallbackWait(int32_t windowId)
3333 {
3334 HILOG_INFO("StopCallbackWait start windowId: %{public}d", windowId);
3335 if (!windowRequestIdMap_.count(windowId)) {
3336 HILOG_DEBUG("windowId not exists");
3337 return;
3338 }
3339 for (auto iter = windowRequestIdMap_[windowId].begin(); iter != windowRequestIdMap_[windowId].end(); ++iter) {
3340 HILOG_DEBUG("stop callback wait windowId: %{public}d, treeId: %{public}d", windowId, iter->first);
3341 StopCallbackWait(windowId, iter->first);
3342 }
3343 }
3344
StopCallbackWait(int32_t windowId,int32_t treeId)3345 void AccessibleAbilityManagerService::StopCallbackWait(int32_t windowId, int32_t treeId)
3346 {
3347 std::lock_guard<ffrt::mutex> lock(mutex_);
3348 HILOG_DEBUG("StopCallbackWait start windowId: %{public}d treeId: %{public}d", windowId, treeId);
3349 if (!windowRequestIdMap_.count(windowId)) {
3350 return;
3351 }
3352 if (!windowRequestIdMap_[windowId].count(treeId)) {
3353 return;
3354 }
3355 auto requestIds = windowRequestIdMap_[windowId][treeId];
3356 for (auto requestId = requestIds.begin(); requestId != requestIds.end();) {
3357 HILOG_DEBUG("stop callback wait windowId: %{public}d, requestId: %{public}d", windowId, *requestId);
3358 auto iter = requestIdMap_.find(*requestId);
3359 if (iter != requestIdMap_.end()) {
3360 HILOG_DEBUG("requestIdMap_ set callback and erase requestId:%{public}d", *requestId);
3361 sptr<IAccessibilityElementOperatorCallback> callback = requestIdMap_[*requestId];
3362 if (callback != nullptr) {
3363 callback->SetExecuteActionResult(false, *requestId);
3364 }
3365 requestIdMap_.erase(iter);
3366 }
3367 requestId = requestIds.erase(requestId);
3368 }
3369 }
3370
GetRootParentId(int32_t windowId,int32_t treeId)3371 int64_t AccessibleAbilityManagerService::GetRootParentId(int32_t windowId, int32_t treeId)
3372 {
3373 HILOG_INFO("aa search treeParent from aams, windowId: %{public}d, treeId: %{public}d", windowId, treeId);
3374 int64_t elementId = 0;
3375 sptr<AccessibilityWindowConnection> connection = GetAccessibilityWindowConnection(windowId);
3376 if (!connection) {
3377 HILOG_WARN("The operator of windowId[%{public}d] has not been registered.", windowId);
3378 return RET_ERR_NO_CONNECTION;
3379 }
3380 connection->GetRootParentId(treeId, elementId);
3381 return elementId;
3382 }
3383
GetAllTreeId(int32_t windowId,std::vector<int32_t> & treeIds)3384 RetError AccessibleAbilityManagerService::GetAllTreeId(int32_t windowId, std::vector<int32_t> &treeIds)
3385 {
3386 HILOG_DEBUG();
3387 sptr<AccessibilityWindowConnection> connection = GetAccessibilityWindowConnection(windowId);
3388 if (!connection) {
3389 HILOG_WARN("The operator of windowId[%{public}d] has not been registered.", windowId);
3390 return RET_ERR_NO_CONNECTION;
3391 }
3392 connection->GetAllTreeId(treeIds);
3393 return RET_OK;
3394 }
3395
GenerateRequestId()3396 int32_t AccessibleAbilityManagerService::GenerateRequestId()
3397 {
3398 int32_t requestId = requestId_.fetch_add(1, std::memory_order_relaxed);
3399 if (requestId == REQUEST_ID_MAX) {
3400 requestId_ = REQUEST_ID_MIN;
3401 requestId = requestId_.fetch_add(1, std::memory_order_relaxed);
3402 }
3403 return requestId;
3404 }
3405
CheckCallingUid()3406 RetError AccessibleAbilityManagerService::CheckCallingUid()
3407 {
3408 int32_t accountId = Utils::GetUserIdByCallingUid();
3409 if (accountId != currentAccountId_ && accountId != ROOT_UID) {
3410 HILOG_WARN("accountId is diff from currentAccountId_.");
3411 return RET_ERR_SAMGR;
3412 }
3413 return RET_OK;
3414 }
3415
OnDataClone()3416 void AccessibleAbilityManagerService::OnDataClone()
3417 {
3418 std::shared_ptr<AccessibilitySettingProvider> service =
3419 AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
3420 if (service == nullptr) {
3421 HILOG_ERROR("service is nullptr");
3422 return;
3423 }
3424 bool cloneState = false;
3425 service->GetBoolValue(ACCESSIBILITY_CLONE_FLAG, cloneState);
3426 if (cloneState == false) {
3427 return;
3428 }
3429 sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3430 if (accountData == nullptr) {
3431 HILOG_WARN("accountData is nullptr.");
3432 return;
3433 }
3434 if (accountData->GetConfig() != nullptr) {
3435 accountData->GetConfig()->OnDataClone();
3436 UpdateAllSetting();
3437 UpdateAutoStartAbilities();
3438 UpdateInputFilter();
3439 HILOG_INFO("accessibility reload config.");
3440 } else {
3441 HILOG_WARN("config_ is nullptr");
3442 }
3443 }
3444
GetResourceBundleInfo(AccessibilityEventInfo & eventInfo)3445 RetError AccessibleAbilityManagerService::GetResourceBundleInfo(AccessibilityEventInfo &eventInfo)
3446 {
3447 HILOG_DEBUG("BundleName is %{public}s, ModuleName is %{public}s, ResourceId is %{public}d",
3448 eventInfo.GetResourceBundleName().c_str(), eventInfo.GetResourceModuleName().c_str(),
3449 eventInfo.GetResourceId());
3450 if (eventInfo.GetResourceId() > 0) {
3451 sptr<AccessibilityAccountData> accountData =
3452 Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
3453 if (accountData == nullptr) {
3454 HILOG_ERROR("get accountData failed");
3455 return RET_ERR_NULLPTR;
3456 }
3457 int32_t userId = accountData->GetAccountId();
3458
3459 AppExecFwk::BundleInfo bundleInfo;
3460 ErrCode ret = Singleton<AccessibilityResourceBundleManager>::GetInstance().GetBundleInfoV9(
3461 eventInfo.GetResourceBundleName(),
3462 static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE),
3463 bundleInfo, userId);
3464 if (ret != ERR_OK) {
3465 HILOG_ERROR("get BundleInfo failed!");
3466 return RET_ERR_FAILED;
3467 }
3468
3469 std::string resourceValue;
3470 RetError res = GetResourceValue(eventInfo, bundleInfo, userId, resourceValue);
3471 if (res != RET_OK) {
3472 HILOG_ERROR("Get Resource Value failed");
3473 return res;
3474 }
3475 HILOG_DEBUG("resource value is %{public}s", resourceValue.c_str());
3476 eventInfo.SetTextAnnouncedForAccessibility(resourceValue);
3477 }
3478 return RET_OK;
3479 }
3480
GetResourceValue(AccessibilityEventInfo & eventInfo,AppExecFwk::BundleInfo bundleInfo,int32_t userId,std::string & result)3481 RetError AccessibleAbilityManagerService::GetResourceValue(AccessibilityEventInfo &eventInfo,
3482 AppExecFwk::BundleInfo bundleInfo, int32_t userId, std::string &result)
3483 {
3484 std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
3485 if (resConfig == nullptr) {
3486 HILOG_ERROR("create resConfig failed");
3487 return RET_ERR_NULLPTR;
3488 }
3489 UErrorCode status = U_ZERO_ERROR;
3490 icu::Locale locale = icu::Locale::forLanguageTag(Global::I18n::LocaleConfig::GetSystemLanguage(), status);
3491 resConfig->SetLocaleInfo(locale.getLanguage(), locale.getScript(), locale.getCountry());
3492
3493 std::string hapPath;
3494 std::vector<std::string> overlayPaths;
3495 int32_t appType = 0;
3496 std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager(
3497 eventInfo.GetResourceBundleName(), eventInfo.GetResourceModuleName(), hapPath, overlayPaths, *resConfig,
3498 appType, userId));
3499 if (resourceManager == nullptr) {
3500 HILOG_ERROR("create Resource manager failed");
3501 return RET_ERR_NULLPTR;
3502 }
3503
3504 Global::Resource::RState state = resourceManager->UpdateResConfig(*resConfig);
3505 if (state != Global::Resource::RState::SUCCESS) {
3506 HILOG_ERROR("UpdateResConfig failed! errCode: %{public}d", state);
3507 return RET_ERR_FAILED;
3508 }
3509
3510 for (const auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
3511 std::string moduleResPath = hapModuleInfo.hapPath.empty() ? hapModuleInfo.resourcePath : hapModuleInfo.hapPath;
3512 HILOG_DEBUG("hapModuleInfo.hapPath is %{public}s", hapModuleInfo.hapPath.c_str());
3513 if (moduleResPath.empty()) {
3514 HILOG_ERROR("moduleResPath is empty");
3515 continue;
3516 }
3517 if (!resourceManager->AddResource(moduleResPath.c_str())) {
3518 HILOG_ERROR("AddResource is failed");
3519 }
3520 }
3521
3522 std::vector<std::tuple<Global::Resource::ResourceManager::NapiValueType, std::string>> arg;
3523 for (auto ¶m : eventInfo.GetResourceParams()) {
3524 HILOG_DEBUG("resource param valueType is %{public}d, value is %{public}s",
3525 std::get<0>(param), (std::get<1>(param)).c_str());
3526 if (std::get<0>(param) == 0) {
3527 arg.emplace_back(std::make_tuple(Global::Resource::ResourceManager::NapiValueType::NAPI_NUMBER,
3528 std::get<1>(param)));
3529 } else if (std::get<0>(param) == 1) {
3530 arg.emplace_back(std::make_tuple(Global::Resource::ResourceManager::NapiValueType::NAPI_STRING,
3531 std::get<1>(param)));
3532 }
3533 }
3534 Global::Resource::RState res = resourceManager->GetStringFormatById(eventInfo.GetResourceId(), result, arg);
3535 if (res != Global::Resource::RState::SUCCESS) {
3536 HILOG_ERROR("get resource value failed");
3537 return RET_ERR_FAILED;
3538 }
3539 return RET_OK;
3540 }
3541 } // namespace Accessibility
3542 } // namespace OHOS