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