• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "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 &parameter,
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