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