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